|
22 | 22 | from sphinx.transforms import SphinxTransform
|
23 | 23 | from sphinx.util import logging
|
24 | 24 | from sphinx.util.docutils import SphinxTranslator
|
25 |
| -from sphinx.util.nodes import process_only_nodes |
| 25 | +from sphinx.util.nodes import find_pending_xref_condition, process_only_nodes |
26 | 26 |
|
27 | 27 | logger = logging.getLogger(__name__)
|
28 | 28 |
|
| 29 | +if False: |
| 30 | + # For type annotation |
| 31 | + from docutils.nodes import Node |
| 32 | + |
29 | 33 |
|
30 | 34 | class SphinxPostTransform(SphinxTransform):
|
31 | 35 | """A base class of post-transforms.
|
@@ -97,8 +101,21 @@ def run(self, **kwargs: Any) -> None:
|
97 | 101 | if newnode is None:
|
98 | 102 | self.warn_missing_reference(refdoc, typ, target, node, domain)
|
99 | 103 | except NoUri:
|
100 |
| - newnode = contnode |
101 |
| - node.replace_self(newnode or contnode) |
| 104 | + newnode = None |
| 105 | + |
| 106 | + if newnode: |
| 107 | + newnodes = [newnode] # type: List[Node] |
| 108 | + else: |
| 109 | + newnodes = [contnode] |
| 110 | + if newnode is None and isinstance(node[0], addnodes.pending_xref_condition): |
| 111 | + matched = find_pending_xref_condition(node, "*") |
| 112 | + if matched: |
| 113 | + newnodes = matched.children |
| 114 | + else: |
| 115 | + logger.warning(__('Could not determine the fallback text for the ' |
| 116 | + 'cross-reference. Might be a bug.'), location=node) |
| 117 | + |
| 118 | + node.replace_self(newnodes) |
102 | 119 |
|
103 | 120 | def resolve_anyref(self, refdoc: str, node: pending_xref, contnode: Element) -> Element:
|
104 | 121 | """Resolve reference generated by the "any" role."""
|
|
0 commit comments