Skip to content

Commit

Permalink
Extract _resolve_pending_xref()
Browse files Browse the repository at this point in the history
  • Loading branch information
AA-Turner committed Feb 9, 2025
1 parent 13c5e0c commit 53bb0d6
Showing 1 changed file with 53 additions and 38 deletions.
91 changes: 53 additions & 38 deletions sphinx/transforms/post_transforms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,43 +72,7 @@ def run(self, **kwargs: Any) -> None:
else:
contnode = cast('Element', node[0].deepcopy())

newnode = None

typ = node['reftype']
target = node['reftarget']
node.setdefault('refdoc', self.env.docname)
refdoc = node.get('refdoc')
domain = None

try:
if node.get('refdomain', False):
# let the domain try to resolve the reference
try:
domain = self.env.domains[node['refdomain']]
except KeyError as exc:
raise NoUri(target, typ) from exc
newnode = domain.resolve_xref(
self.env, refdoc, self.app.builder, typ, target, node, contnode
)
# really hardwired reference types
elif typ == 'any':
newnode = self.resolve_anyref(refdoc, node, contnode)
# no new node found? try the missing-reference event
if newnode is None:
newnode = self.app.emit_firstresult(
'missing-reference',
self.env,
node,
contnode,
allowed_exceptions=(NoUri,),
)
# still not found? warn if node wishes to be warned about or
# we are in nitpicky mode
if newnode is None:
self.warn_missing_reference(refdoc, typ, target, node, domain)
except NoUri:
newnode = None

newnode = self._resolve_pending_xref(node, contnode)
if newnode:
newnodes: list[Node] = [newnode]
else:
Expand All @@ -130,12 +94,63 @@ def run(self, **kwargs: Any) -> None:

node.replace_self(newnodes)

def _resolve_pending_xref(
self, node: addnodes.pending_xref, contnode: Element
) -> nodes.reference | None:
new_node: nodes.reference | None = None

typ = node['reftype']
target = node['reftarget']
ref_doc = node.setdefault('refdoc', self.env.docname)
ref_domain = node.get('refdomain', '')
domain: Domain | None
if ref_domain:
try:
domain = self.env.domains[ref_domain]
except KeyError:
return None
else:
domain = None

try:
# let the domain try to resolve the reference
if domain is not None:
new_node = domain.resolve_xref(
self.env, ref_doc, self.app.builder, typ, target, node, contnode
)
# really hardwired reference types
elif typ == 'any':
new_node = self.resolve_anyref(ref_doc, node, contnode)
except NoUri:
return None
if new_node is not None:
return new_node

try:
# no new node found? try the missing-reference event
new_node = self.app.emit_firstresult(
'missing-reference',
self.env,
node,
contnode,
allowed_exceptions=(NoUri,),
)
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)
return None

def resolve_anyref(
self,
refdoc: str,
node: pending_xref,
contnode: Element,
) -> Element | None:
) -> nodes.reference | None:
"""Resolve reference generated by the "any" role."""
stddomain = self.env.domains.standard_domain
target = node['reftarget']
Expand Down

0 comments on commit 53bb0d6

Please sign in to comment.