|
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