|
26 | 26 | import concurrent.futures |
27 | 27 | import functools |
28 | 28 | import posixpath |
| 29 | +import re |
29 | 30 | import sys |
30 | 31 | import time |
31 | 32 | from os import path |
@@ -485,6 +486,11 @@ def role(self, role_name: str, language_module: ModuleType, lineno: int, reporte |
485 | 486 |
|
486 | 487 |
|
487 | 488 | class IntersphinxRole(SphinxRole): |
| 489 | + # group 1: just for the optionality of the inventory name |
| 490 | + # group 2: the inventory name (optional) |
| 491 | + # group 3: the domain:role or role part |
| 492 | + _re_inv_ref = re.compile(r"(\+([^:]+))?:(.*)") |
| 493 | + |
488 | 494 | def __init__(self, orig_name: str) -> None: |
489 | 495 | self.orig_name = orig_name |
490 | 496 |
|
@@ -513,20 +519,13 @@ def run(self) -> Tuple[List[Node], List[system_message]]: |
513 | 519 | def get_inventory_and_name_suffix(self, name: str) -> Tuple[Optional[str], str]: |
514 | 520 | assert name.startswith('external'), name |
515 | 521 | assert name[8] in ':+', name |
516 | | - typ = name[8] |
517 | | - name = name[9:] |
518 | | - if typ == '+': |
519 | | - # we have an explicit inventory name, i.e, |
520 | | - # :external+inv:role: or |
521 | | - # :external+inv:domain:role: |
522 | | - inv, name = name.split(':', 1) |
523 | | - return inv, name |
524 | | - else: |
525 | | - assert typ == ':' |
526 | | - # we look in all inventories, i.e., |
527 | | - # :external:role: or |
528 | | - # :external:domain:role: |
529 | | - return None, name |
| 522 | + # either we have an explicit inventory name, i.e, |
| 523 | + # :external+inv:role: or |
| 524 | + # :external+inv:domain:role: |
| 525 | + # or we look in all inventories, i.e., |
| 526 | + # :external:role: or |
| 527 | + # :external:domain:role: |
| 528 | + return IntersphinxRole._re_inv_ref.fullmatch(name, 8).group(2, 3) |
530 | 529 |
|
531 | 530 | def get_role_name(self, name: str) -> Optional[Tuple[str, str]]: |
532 | 531 | names = name.split(':') |
|
0 commit comments