diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2021-04-04 18:33:34 +0300 |
---|---|---|
committer | Jakob Lykke Andersen <Jakob@caput.dk> | 2022-01-16 11:47:53 +0300 |
commit | b4227dbe1b73f9c5745f240657ecb13c5e41d233 (patch) | |
tree | 53816c8d547fc8fb9f9cb6a8395703ad0b930d34 | |
parent | 26a4f5d2b83fa55d47d31744089ac14edc08397f (diff) |
refactor: Add CustomReSTDispatcher as a base class of custom dispatchers
To create custom reST dispatcher easily, this adds CustomReSTDispatcher
class as a base class of custom dispatchers.
-rw-r--r-- | sphinx/util/docutils.py | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/sphinx/util/docutils.py b/sphinx/util/docutils.py index c3a6ff9e2..5ab766649 100644 --- a/sphinx/util/docutils.py +++ b/sphinx/util/docutils.py @@ -166,16 +166,14 @@ def patch_docutils(confdir: Optional[str] = None) -> Generator[None, None, None] yield -class ElementLookupError(Exception): - pass - +class CustomReSTDispatcher: + """Custom reST's mark-up dispatcher. -class sphinx_domains: - """Monkey-patch directive and role dispatch, so that domain-specific - markup takes precedence. + This replaces docutils's directives and roles dispatch mechanism for reST parser + by original one temporarily. """ - def __init__(self, env: "BuildEnvironment") -> None: - self.env = env + + def __init__(self) -> None: self.directive_func: Callable = lambda *args: (None, []) self.roles_func: Callable = lambda *args: (None, []) @@ -189,13 +187,35 @@ class sphinx_domains: self.directive_func = directives.directive self.role_func = roles.role - directives.directive = self.lookup_directive - roles.role = self.lookup_role + directives.directive = self.directive + roles.role = self.role def disable(self) -> None: directives.directive = self.directive_func roles.role = self.role_func + def directive(self, + directive_name: str, language_module: ModuleType, document: nodes.document + ) -> Tuple[Optional[Type[Directive]], List[system_message]]: + return self.directive_func(directive_name, language_module, document) + + def role(self, role_name: str, language_module: ModuleType, lineno: int, reporter: Reporter + ) -> Tuple[RoleFunction, List[system_message]]: + return self.role_func(role_name, language_module, lineno, reporter) + + +class ElementLookupError(Exception): + pass + + +class sphinx_domains(CustomReSTDispatcher): + """Monkey-patch directive and role dispatch, so that domain-specific + markup takes precedence. + """ + def __init__(self, env: "BuildEnvironment") -> None: + self.env = env + super().__init__() + def lookup_domain_element(self, type: str, name: str) -> Any: """Lookup a markup element (directive or role), given its name which can be a full name (with domain). @@ -226,17 +246,20 @@ class sphinx_domains: raise ElementLookupError - def lookup_directive(self, directive_name: str, language_module: ModuleType, document: nodes.document) -> Tuple[Optional[Type[Directive]], List[system_message]]: # NOQA + def directive(self, + directive_name: str, language_module: ModuleType, document: nodes.document + ) -> Tuple[Optional[Type[Directive]], List[system_message]]: try: return self.lookup_domain_element('directive', directive_name) except ElementLookupError: - return self.directive_func(directive_name, language_module, document) + return super().directive(directive_name, language_module, document) - def lookup_role(self, role_name: str, language_module: ModuleType, lineno: int, reporter: Reporter) -> Tuple[RoleFunction, List[system_message]]: # NOQA + def role(self, role_name: str, language_module: ModuleType, lineno: int, reporter: Reporter + ) -> Tuple[RoleFunction, List[system_message]]: try: return self.lookup_domain_element('role', role_name) except ElementLookupError: - return self.role_func(role_name, language_module, lineno, reporter) + return super().role(role_name, language_module, lineno, reporter) class WarningStream: |