@@ -473,12 +473,12 @@ def missing_reference(app: Sphinx, env: BuildEnvironment, node: pending_xref,
473473class IntersphinxDispatcher (CustomReSTDispatcher ):
474474 """Custom dispatcher for external role.
475475
476- This enables :external:***: roles on parsing reST document.
476+ This enables :external:***:/:external+***: roles on parsing reST document.
477477 """
478478
479479 def role (self , role_name : str , language_module : ModuleType , lineno : int , reporter : Reporter
480480 ) -> Tuple [RoleFunction , List [system_message ]]:
481- if role_name . split ( ':' )[ 0 ] == 'external ' :
481+ if len ( role_name ) > 9 and role_name . startswith ( 'external' ) and role_name [ 8 ] in ':+ ' :
482482 return IntersphinxRole (role_name ), []
483483 else :
484484 return super ().role (role_name , language_module , lineno , reporter )
@@ -511,16 +511,21 @@ def run(self) -> Tuple[List[Node], List[system_message]]:
511511 return result , messages
512512
513513 def get_inventory_and_name_suffix (self , name : str ) -> Tuple [Optional [str ], Optional [str ]]:
514- assert name .startswith ('external:' ), name
514+ assert name .startswith ('external' ), name
515+ assert name [8 ] in ':+' , name
516+ typ = name [8 ]
515517 name = name [9 :]
516- inv_names = name .split ('+' )
517- inventory = None
518- if len (inv_names ) > 1 :
519- # inv+role
520- # inv+domain:role
521- inventory = inv_names [0 ]
522- name = name [len (inventory ) + 1 :]
523- return inventory , name
518+ if typ == '+' :
519+ # we have an explicit inventory name, i.e,
520+ # :external+inv:role: or
521+ # :external+inv:domain:role:
522+ return name .split (':' , 1 )
523+ else :
524+ assert typ == ':'
525+ # we look in all inventories, i.e.,
526+ # :external:role: or
527+ # :external:domain:role:
528+ return None , name
524529
525530 def get_role_name (self , name : str ) -> Optional [Tuple [str , str ]]:
526531 names = name .split (':' )
0 commit comments