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:
Adam Turner 2025-02-09 22:29:04 +00:00 committed by GitHub
parent 9eb5097a56
commit 790bee64ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 28 additions and 0 deletions

View File

@ -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

View File

@ -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)

View File

@ -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