From e21552facd7ecac148d99a97ebb8b285a4ee6cec Mon Sep 17 00:00:00 2001 From: Jakob Lykke Andersen Date: Sat, 15 Jan 2022 14:02:21 +0100 Subject: [PATCH] :external+inv:**: instead of :external:inv+**: --- sphinx/ext/intersphinx.py | 27 +++++++++++-------- .../roots/test-ext-intersphinx-role/index.rst | 4 +-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py index 5cbc59a9610..fb93e33d781 100644 --- a/sphinx/ext/intersphinx.py +++ b/sphinx/ext/intersphinx.py @@ -473,12 +473,12 @@ def missing_reference(app: Sphinx, env: BuildEnvironment, node: pending_xref, class IntersphinxDispatcher(CustomReSTDispatcher): """Custom dispatcher for external role. - This enables :external:***: roles on parsing reST document. + This enables :external:***:/:external+***: roles on parsing reST document. """ def role(self, role_name: str, language_module: ModuleType, lineno: int, reporter: Reporter ) -> Tuple[RoleFunction, List[system_message]]: - if role_name.split(':')[0] == 'external': + if len(role_name) > 9 and role_name.startswith('external') and role_name[8] in ':+': return IntersphinxRole(role_name), [] else: return super().role(role_name, language_module, lineno, reporter) @@ -511,16 +511,21 @@ def run(self) -> Tuple[List[Node], List[system_message]]: return result, messages def get_inventory_and_name_suffix(self, name: str) -> Tuple[Optional[str], Optional[str]]: - assert name.startswith('external:'), name + assert name.startswith('external'), name + assert name[8] in ':+', name + typ = name[8] name = name[9:] - inv_names = name.split('+') - inventory = None - if len(inv_names) > 1: - # inv+role - # inv+domain:role - inventory = inv_names[0] - name = name[len(inventory) + 1:] - return inventory, name + if typ == '+': + # we have an explicit inventory name, i.e, + # :external+inv:role: or + # :external+inv:domain:role: + return name.split(':', 1) + else: + assert typ == ':' + # we look in all inventories, i.e., + # :external:role: or + # :external:domain:role: + return None, name def get_role_name(self, name: str) -> Optional[Tuple[str, str]]: names = name.split(':') diff --git a/tests/roots/test-ext-intersphinx-role/index.rst b/tests/roots/test-ext-intersphinx-role/index.rst index 5c2cdbd0081..58edb7a1a01 100644 --- a/tests/roots/test-ext-intersphinx-role/index.rst +++ b/tests/roots/test-ext-intersphinx-role/index.rst @@ -35,9 +35,9 @@ - a function with explicit inventory: - :external:inv+c:func:`CFunc` + :external+inv:c:func:`CFunc` - a class with explicit non-existing inventory, which also has upper-case in name: - :external:invNope+cpp:class:`foo::Bar` + :external+invNope:cpp:class:`foo::Bar` - explicit title: