From 36c6eafdf17edeaec3c902d15cc757edb3937d5d Mon Sep 17 00:00:00 2001 From: Jakob Lykke Andersen Date: Tue, 13 Jul 2021 13:41:41 +0200 Subject: [PATCH] intersphinx: explicitly parse out inventory specification --- sphinx/ext/intersphinx.py | 13 +++++++++++++ tests/roots/test-ext-intersphinx-role/index.rst | 1 + tests/test_ext_intersphinx.py | 2 ++ 3 files changed, 16 insertions(+) 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 ` :external:cpp:type:`inv: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 = '' for t in targets: assert html.format(t) in content + + assert html.format('index.html#cpp_foo_bar_baz') not in content