From bfd35c6ce179d121b0795ddb90f594e3c9543e34 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 1 Dec 2018 18:57:18 +0900 Subject: [PATCH] Add role manipulator directives to sphinx.util.docutils --- sphinx/application.py | 8 ++++---- sphinx/util/docutils.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/sphinx/application.py b/sphinx/application.py index ec793b19e..1cabca6ad 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -21,7 +21,7 @@ from inspect import isclass from io import StringIO from os import path -from docutils.parsers.rst import Directive, directives, roles +from docutils.parsers.rst import Directive, roles import sphinx from sphinx import package_dir, locale @@ -651,15 +651,15 @@ class Sphinx: """ logger.debug('[app] adding directive: %r', (name, obj, content, arguments, options)) - if name in directives._directives and not override: + if not override and docutils.is_directive_registered(name): logger.warning(__('directive %r is already registered, it will be overridden'), name, type='app', subtype='add_directive') if not isclass(obj) or not issubclass(obj, Directive): directive = directive_helper(obj, content, arguments, **options) - directives.register_directive(name, directive) + docutils.register_directive(name, directive) else: - directives.register_directive(name, obj) + docutils.register_directive(name, obj) def add_role(self, name, role, override=False): # type: (unicode, Any, bool) -> None diff --git a/sphinx/util/docutils.py b/sphinx/util/docutils.py index 07be9f092..7b1edfc34 100644 --- a/sphinx/util/docutils.py +++ b/sphinx/util/docutils.py @@ -67,6 +67,22 @@ def docutils_namespace(): additional_nodes.discard(node) +def is_directive_registered(name): + # type: (unicode) -> bool + """Check the *name* directive is already registered.""" + return name in directives._directives + + +def register_directive(name, directive): + # type: (unicode, Type[Directive]) -> None + """Register a directive to docutils. + + This modifies global state of docutils. So it is better to use this + inside ``docutils_namespace()`` to prevent side-effects. + """ + directives.register_directive(name, directive) + + def is_role_registered(name): # type: (unicode) -> bool """Check the *name* role is already registered."""