Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sphinx-doc/sphinx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2021-03-06 08:43:13 +0300
committerTakeshi KOMIYA <i.tkomiya@gmail.com>2021-03-06 08:58:15 +0300
commit7f0b13af6e023382f8bfdaa0916c614a586ff05c (patch)
treed9d19438e059af720519d7b40cafea920c2855d9 /sphinx/ext
parent930a880294dc935a7320d64ecbe219c18e005536 (diff)
intersphinx: Support pending_xref_condition
Diffstat (limited to 'sphinx/ext')
-rw-r--r--sphinx/ext/intersphinx.py23
1 files changed, 18 insertions, 5 deletions
diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py
index 5569ad9de..a01bcc37a 100644
--- a/sphinx/ext/intersphinx.py
+++ b/sphinx/ext/intersphinx.py
@@ -33,10 +33,11 @@ from typing import IO, Any, Dict, List, Tuple
from urllib.parse import urlsplit, urlunsplit
from docutils import nodes
-from docutils.nodes import Element, TextElement
+from docutils.nodes import TextElement
from docutils.utils import relative_path
import sphinx
+from sphinx.addnodes import pending_xref
from sphinx.application import Sphinx
from sphinx.builders.html import INVENTORY_FILENAME
from sphinx.config import Config
@@ -44,6 +45,7 @@ from sphinx.environment import BuildEnvironment
from sphinx.locale import _, __
from sphinx.util import logging, requests
from sphinx.util.inventory import InventoryFile
+from sphinx.util.nodes import find_pending_xref_condition
from sphinx.util.typing import Inventory
logger = logging.getLogger(__name__)
@@ -257,8 +259,8 @@ def load_mappings(app: Sphinx) -> None:
inventories.main_inventory.setdefault(type, {}).update(objects)
-def missing_reference(app: Sphinx, env: BuildEnvironment, node: Element, contnode: TextElement
- ) -> nodes.reference:
+def missing_reference(app: Sphinx, env: BuildEnvironment, node: pending_xref,
+ contnode: TextElement) -> nodes.reference:
"""Attempt to resolve a missing reference via intersphinx references."""
target = node['reftarget']
inventories = InventoryAdapter(env)
@@ -284,6 +286,17 @@ def missing_reference(app: Sphinx, env: BuildEnvironment, node: Element, contnod
if 'py:attribute' in objtypes:
# Since Sphinx-2.1, properties are stored as py:method
objtypes.append('py:method')
+
+ # determine the contnode by pending_xref_condition
+ content = find_pending_xref_condition(node, 'resolved')
+ if content:
+ # resolved condition found.
+ contnodes = content.children
+ contnode = content.children[0] # type: ignore
+ else:
+ # not resolved. Use the given contnode
+ contnodes = [contnode]
+
to_try = [(inventories.main_inventory, target)]
if domain:
full_qualified_name = env.get_domain(domain).get_full_qualified_name(node)
@@ -316,7 +329,7 @@ def missing_reference(app: Sphinx, env: BuildEnvironment, node: Element, contnod
newnode = nodes.reference('', '', internal=False, refuri=uri, reftitle=reftitle)
if node.get('refexplicit'):
# use whatever title was given
- newnode.append(contnode)
+ newnode.extend(contnodes)
elif dispname == '-' or \
(domain == 'std' and node['reftype'] == 'keyword'):
# use whatever title was given, but strip prefix
@@ -325,7 +338,7 @@ def missing_reference(app: Sphinx, env: BuildEnvironment, node: Element, contnod
newnode.append(contnode.__class__(title[len(in_set) + 1:],
title[len(in_set) + 1:]))
else:
- newnode.append(contnode)
+ newnode.extend(contnodes)
else:
# else use the given display name (used for :ref:)
newnode.append(contnode.__class__(dispname, dispname))