diff options
author | Jakob Lykke Andersen <Jakob@caput.dk> | 2021-07-13 13:41:41 +0200 |
---|---|---|
committer | Jakob Lykke Andersen <Jakob@caput.dk> | 2022-01-16 09:48:06 +0100 |
commit | 36c6eafdf17edeaec3c902d15cc757edb3937d5d (patch) | |
tree | e11c683652b4d29a79bc6709993fa77ff7b1f8d7 | |
parent | 454a1c599e9faf58bcb25e28d6943b4645b48d29 (diff) | |
download | sphinx-git-36c6eafdf17edeaec3c902d15cc757edb3937d5d.tar.gz |
intersphinx: explicitly parse out inventory specification
-rw-r--r-- | sphinx/ext/intersphinx.py | 13 | ||||
-rw-r--r-- | tests/roots/test-ext-intersphinx-role/index.rst | 1 | ||||
-rw-r--r-- | tests/test_ext_intersphinx.py | 2 |
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 |