summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Lykke Andersen <Jakob@caput.dk>2021-07-13 13:41:41 +0200
committerJakob Lykke Andersen <Jakob@caput.dk>2022-01-16 09:48:06 +0100
commit36c6eafdf17edeaec3c902d15cc757edb3937d5d (patch)
treee11c683652b4d29a79bc6709993fa77ff7b1f8d7
parent454a1c599e9faf58bcb25e28d6943b4645b48d29 (diff)
downloadsphinx-git-36c6eafdf17edeaec3c902d15cc757edb3937d5d.tar.gz
intersphinx: explicitly parse out inventory specification
-rw-r--r--sphinx/ext/intersphinx.py13
-rw-r--r--tests/roots/test-ext-intersphinx-role/index.rst1
-rw-r--r--tests/test_ext_intersphinx.py2
3 files changed, 16 insertions, 0 deletions
diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py
index 3cfbdf1dd..d004f867f 100644
--- a/sphinx/ext/intersphinx.py
+++ b/sphinx/ext/intersphinx.py
@@ -495,10 +495,20 @@ class IntersphinxRole(SphinxRole):
location=(self.env.docname, self.lineno))
return [], []
+ # extract inventory specification
+ inventory = None
+ if self.text.startswith('\\:'):
+ # escaped :, so not a real inventory specification
+ self.text = self.text[1:]
+ elif self.text[0] == ':': # format: :inv:normalRoleArg
+ inventory = self.text.split(':')[1]
+ self.text = self.text[(len(inventory) + 2):]
+
result, messages = self.invoke_role(role_name)
for node in result:
if isinstance(node, pending_xref):
node['intersphinx'] = True
+ node['inventory'] = inventory
return result, messages
@@ -555,6 +565,9 @@ class IntersphinxRoleResolver(ReferencesResolver):
for node in self.document.traverse(pending_xref):
if 'intersphinx' in node:
contnode = cast(nodes.TextElement, node[0].deepcopy())
+ # temporary hax to glue on inventory info again
+ if node['inventory'] is not None:
+ node['reftarget'] = node['inventory'] + ":" + node['reftarget']
newnode = missing_reference(self.app, self.env, node, contnode)
if newnode is None:
# no warning, the normal missing_reference handler will do that
diff --git a/tests/roots/test-ext-intersphinx-role/index.rst b/tests/roots/test-ext-intersphinx-role/index.rst
index 4eeaf807a..164f2cfd4 100644
--- a/tests/roots/test-ext-intersphinx-role/index.rst
+++ b/tests/roots/test-ext-intersphinx-role/index.rst
@@ -20,6 +20,7 @@
:external:cpp:type:`std::uint8_t`
:external:cpp:class:`inv:foo::Bar`
+:external:cpp:func:`:inv2:foo::Bar::baz`
:external:cpp:type:`FoonsTitle <foons>`
:external:cpp:type:`inv:BarType <foons::bartype>` \ No newline at end of file
diff --git a/tests/test_ext_intersphinx.py b/tests/test_ext_intersphinx.py
index a2ff8d7ac..a1118e48d 100644
--- a/tests/test_ext_intersphinx.py
+++ b/tests/test_ext_intersphinx.py
@@ -558,3 +558,5 @@ def test_intersphinx_role(app):
html = '<a class="reference external" href="http://example.org/{}" title="(in foo v2.0)">'
for t in targets:
assert html.format(t) in content
+
+ assert html.format('index.html#cpp_foo_bar_baz') not in content