mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
intersphinx: Resolve implicit self-references (#13322)
When intersphinx_resolve_self was added, it only applied to the :external:<inv_name>:`blah` role. This extends the functionality to implicit intersphinx references of the form :ref:`<inv_name>:blah`.
This commit is contained in:
parent
9eb5097a56
commit
790bee64ce
@ -308,6 +308,8 @@ def resolve_reference_detect_inventory(
|
||||
to form ``inv_name:new_target``. If ``inv_name`` is a named inventory, then resolution
|
||||
is tried in that inventory with the new target.
|
||||
"""
|
||||
resolve_self = env.config.intersphinx_resolve_self
|
||||
|
||||
# ordinary direct lookup, use data as is
|
||||
res = resolve_reference_any_inventory(env, True, node, contnode)
|
||||
if res is not None:
|
||||
@ -318,6 +320,14 @@ def resolve_reference_detect_inventory(
|
||||
if ':' not in target:
|
||||
return None
|
||||
inv_name, _, new_target = target.partition(':')
|
||||
|
||||
# check if the target is self-referential
|
||||
self_referential = bool(resolve_self) and resolve_self == inv_name
|
||||
if self_referential:
|
||||
node['reftarget'] = new_target
|
||||
node['intersphinx_self_referential'] = True
|
||||
return None
|
||||
|
||||
if not inventory_exists(env, inv_name):
|
||||
return None
|
||||
node['reftarget'] = new_target
|
||||
|
@ -137,6 +137,23 @@ class ReferencesResolver(SphinxPostTransform):
|
||||
if new_node is not None:
|
||||
return new_node
|
||||
|
||||
# Is this a self-referential intersphinx reference?
|
||||
if 'intersphinx_self_referential' in node:
|
||||
del node.attributes['intersphinx_self_referential']
|
||||
try:
|
||||
new_node = self._resolve_pending_xref_in_domain(
|
||||
domain=domain,
|
||||
node=node,
|
||||
contnode=contnode,
|
||||
ref_doc=ref_doc,
|
||||
typ=typ,
|
||||
target=node['reftarget'],
|
||||
)
|
||||
except NoUri:
|
||||
return None
|
||||
if new_node is not None:
|
||||
return new_node
|
||||
|
||||
# Still not found? Emit a warning if we are in nitpicky mode
|
||||
# or if the node wishes to be warned about.
|
||||
self.warn_missing_reference(ref_doc, typ, target, node, domain)
|
||||
|
@ -70,6 +70,7 @@ def set_config(app, mapping):
|
||||
app.config.intersphinx_mapping = mapping.copy()
|
||||
app.config.intersphinx_cache_limit = 0
|
||||
app.config.intersphinx_disabled_reftypes = []
|
||||
app.config.intersphinx_resolve_self = ''
|
||||
app.config.intersphinx_timeout = None
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user