diff options
author | Jakob Lykke Andersen <Jakob@caput.dk> | 2022-01-15 16:02:21 +0300 |
---|---|---|
committer | Jakob Lykke Andersen <Jakob@caput.dk> | 2022-01-16 11:48:11 +0300 |
commit | c11b109d591a74f87de071ec4782ac3ab782ea38 (patch) | |
tree | a8222bb2a7540303cd9d0f745a73d795c103a015 | |
parent | 9589a2bc0531598cdd69f260f2f2c2dbc5852d6e (diff) |
intersphinx role: :external+inv:**: instead of :external:inv+**:
-rw-r--r-- | sphinx/ext/intersphinx.py | 30 | ||||
-rw-r--r-- | tests/roots/test-ext-intersphinx-role/index.rst | 4 |
2 files changed, 20 insertions, 14 deletions
diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py index 5cbc59a96..d35a9d9b9 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) @@ -510,17 +510,23 @@ class IntersphinxRole(SphinxRole): return result, messages - def get_inventory_and_name_suffix(self, name: str) -> Tuple[Optional[str], Optional[str]]: - assert name.startswith('external:'), name + def get_inventory_and_name_suffix(self, name: str) -> Tuple[Optional[str], str]: + 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: + inv, name = name.split(':', 1) + return inv, name + 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 5c2cdbd00..58edb7a1a 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: |