Add role manipulator directives to sphinx.util.docutils

This commit is contained in:
Takeshi KOMIYA 2018-12-01 18:57:18 +09:00
parent e294b8e036
commit bfd35c6ce1
2 changed files with 20 additions and 4 deletions

View File

@ -21,7 +21,7 @@ from inspect import isclass
from io import StringIO from io import StringIO
from os import path from os import path
from docutils.parsers.rst import Directive, directives, roles from docutils.parsers.rst import Directive, roles
import sphinx import sphinx
from sphinx import package_dir, locale from sphinx import package_dir, locale
@ -651,15 +651,15 @@ class Sphinx:
""" """
logger.debug('[app] adding directive: %r', logger.debug('[app] adding directive: %r',
(name, obj, content, arguments, options)) (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'), logger.warning(__('directive %r is already registered, it will be overridden'),
name, type='app', subtype='add_directive') name, type='app', subtype='add_directive')
if not isclass(obj) or not issubclass(obj, Directive): if not isclass(obj) or not issubclass(obj, Directive):
directive = directive_helper(obj, content, arguments, **options) directive = directive_helper(obj, content, arguments, **options)
directives.register_directive(name, directive) docutils.register_directive(name, directive)
else: else:
directives.register_directive(name, obj) docutils.register_directive(name, obj)
def add_role(self, name, role, override=False): def add_role(self, name, role, override=False):
# type: (unicode, Any, bool) -> None # type: (unicode, Any, bool) -> None

View File

@ -67,6 +67,22 @@ def docutils_namespace():
additional_nodes.discard(node) 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): def is_role_registered(name):
# type: (unicode) -> bool # type: (unicode) -> bool
"""Check the *name* role is already registered.""" """Check the *name* role is already registered."""