Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sphinx-doc/sphinx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2021-04-04 18:33:34 +0300
committerJakob Lykke Andersen <Jakob@caput.dk>2022-01-16 11:47:53 +0300
commitb4227dbe1b73f9c5745f240657ecb13c5e41d233 (patch)
tree53816c8d547fc8fb9f9cb6a8395703ad0b930d34
parent26a4f5d2b83fa55d47d31744089ac14edc08397f (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.py51
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: