Skip to content

Commit 4d76204

Browse files
committed
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.
1 parent 2d9b9c0 commit 4d76204

File tree

1 file changed

+37
-14
lines changed

1 file changed

+37
-14
lines changed

sphinx/util/docutils.py

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -166,16 +166,14 @@ def patch_docutils(confdir: Optional[str] = None) -> Generator[None, None, None]
166166
yield
167167

168168

169-
class ElementLookupError(Exception):
170-
pass
171-
169+
class CustomReSTDispatcher:
170+
"""Custom reST's mark-up dispatcher.
172171
173-
class sphinx_domains:
174-
"""Monkey-patch directive and role dispatch, so that domain-specific
175-
markup takes precedence.
172+
This replaces docutils's directives and roles dispatch mechanism for reST parser
173+
by original one temporarily.
176174
"""
177-
def __init__(self, env: "BuildEnvironment") -> None:
178-
self.env = env
175+
176+
def __init__(self) -> None:
179177
self.directive_func: Callable = lambda *args: (None, [])
180178
self.roles_func: Callable = lambda *args: (None, [])
181179

@@ -189,13 +187,35 @@ def enable(self) -> None:
189187
self.directive_func = directives.directive
190188
self.role_func = roles.role
191189

192-
directives.directive = self.lookup_directive
193-
roles.role = self.lookup_role
190+
directives.directive = self.directive
191+
roles.role = self.role
194192

195193
def disable(self) -> None:
196194
directives.directive = self.directive_func
197195
roles.role = self.role_func
198196

197+
def directive(self,
198+
directive_name: str, language_module: ModuleType, document: nodes.document
199+
) -> Tuple[Optional[Type[Directive]], List[system_message]]:
200+
return self.directive_func(directive_name, language_module, document)
201+
202+
def role(self, role_name: str, language_module: ModuleType, lineno: int, reporter: Reporter
203+
) -> Tuple[RoleFunction, List[system_message]]:
204+
return self.role_func(role_name, language_module, lineno, reporter)
205+
206+
207+
class ElementLookupError(Exception):
208+
pass
209+
210+
211+
class sphinx_domains(CustomReSTDispatcher):
212+
"""Monkey-patch directive and role dispatch, so that domain-specific
213+
markup takes precedence.
214+
"""
215+
def __init__(self, env: "BuildEnvironment") -> None:
216+
self.env = env
217+
super().__init__()
218+
199219
def lookup_domain_element(self, type: str, name: str) -> Any:
200220
"""Lookup a markup element (directive or role), given its name which can
201221
be a full name (with domain).
@@ -226,17 +246,20 @@ def lookup_domain_element(self, type: str, name: str) -> Any:
226246

227247
raise ElementLookupError
228248

229-
def lookup_directive(self, directive_name: str, language_module: ModuleType, document: nodes.document) -> Tuple[Optional[Type[Directive]], List[system_message]]: # NOQA
249+
def directive(self,
250+
directive_name: str, language_module: ModuleType, document: nodes.document
251+
) -> Tuple[Optional[Type[Directive]], List[system_message]]:
230252
try:
231253
return self.lookup_domain_element('directive', directive_name)
232254
except ElementLookupError:
233-
return self.directive_func(directive_name, language_module, document)
255+
return super().directive(directive_name, language_module, document)
234256

235-
def lookup_role(self, role_name: str, language_module: ModuleType, lineno: int, reporter: Reporter) -> Tuple[RoleFunction, List[system_message]]: # NOQA
257+
def role(self, role_name: str, language_module: ModuleType, lineno: int, reporter: Reporter
258+
) -> Tuple[RoleFunction, List[system_message]]:
236259
try:
237260
return self.lookup_domain_element('role', role_name)
238261
except ElementLookupError:
239-
return self.role_func(role_name, language_module, lineno, reporter)
262+
return super().role(role_name, language_module, lineno, reporter)
240263

241264

242265
class WarningStream:

0 commit comments

Comments
 (0)