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 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

View File

@ -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."""