Add default_role contextmanager to enable default-role temporarily

This commit is contained in:
Takeshi KOMIYA 2017-10-31 23:04:25 +09:00
parent 1200ab48e1
commit f7dd8e94e2
2 changed files with 27 additions and 16 deletions

View File

@ -26,13 +26,11 @@ from six.moves import cPickle as pickle
from docutils.utils import Reporter, get_source_line, normalize_language_tag
from docutils.utils.smartquotes import smartchars
from docutils.parsers.rst import roles
from docutils.parsers.rst.languages import en as english
from docutils.frontend import OptionParser
from sphinx import addnodes
from sphinx.io import read_doc
from sphinx.util import logging
from sphinx.util import logging, rst
from sphinx.util import get_matching_docs, FilenameUniqDict, status_iterator
from sphinx.util.nodes import is_translatable
from sphinx.util.osutil import SEP, ensuredir
@ -80,8 +78,6 @@ default_settings = {
ENV_VERSION = 52 + (sys.version_info[0] - 2)
dummy_reporter = Reporter('', 4, 4)
versioning_conditions = {
'none': False,
'text': is_translatable,
@ -696,16 +692,7 @@ class BuildEnvironment(object):
if path.isfile(docutilsconf):
self.note_dependency(docutilsconf)
with sphinx_domains(self):
if self.config.default_role:
role_fn, messages = roles.role(self.config.default_role, english,
0, dummy_reporter)
if role_fn:
roles._roles[''] = role_fn
else:
logger.warning('default role %s not found', self.config.default_role,
location=docname)
with sphinx_domains(self), rst.default_role(docname, self.config.default_role):
codecs.register_error('sphinx', self.warn_and_replace) # type: ignore
doctree = read_doc(self.app, self, self.doc2path(docname))
@ -745,7 +732,6 @@ class BuildEnvironment(object):
# cleanup
self.temp_data.clear()
self.ref_context.clear()
roles._roles.pop('', None) # if a document has set a local default role
self.write_doctree(docname, doctree)

View File

@ -8,12 +8,37 @@
:copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
from __future__ import absolute_import
import re
from contextlib import contextmanager
from docutils.parsers.rst import roles
from docutils.parsers.rst.languages import en as english
from docutils.utils import Reporter
from sphinx.util import logging
symbols_re = re.compile(r'([!-/:-@\[-`{-~])')
logger = logging.getLogger(__name__)
def escape(text):
# type: (unicode) -> unicode
return symbols_re.sub(r'\\\1', text) # type: ignore
@contextmanager
def default_role(docname, name):
# type: (unicode, unicode) -> None
if name:
dummy_reporter = Reporter('', 4, 4)
role_fn, _ = roles.role(name, english, 0, dummy_reporter)
if role_fn:
roles._roles[''] = role_fn
else:
logger.warning('default role %s not found', name, location=docname)
yield
roles._roles.pop('', None) # if a document has set a local default role