docutils bridge

This commit is contained in:
Takeshi KOMIYA 2016-09-05 18:27:32 +09:00
parent 85dcd7baa8
commit fb227f24cb
2 changed files with 50 additions and 0 deletions

View File

@ -24,6 +24,7 @@ from sphinx.transforms.i18n import (
PreserveTranslatableMessages, Locale, RemoveTranslatableInline, PreserveTranslatableMessages, Locale, RemoveTranslatableInline,
) )
from sphinx.util import import_object, split_docinfo from sphinx.util import import_object, split_docinfo
from sphinx.util.docutils import LoggingReporter
if False: if False:
# For type annotation # For type annotation
@ -73,6 +74,14 @@ class SphinxBaseReader(standalone.Reader):
# type: () -> List[Transform] # type: () -> List[Transform]
return standalone.Reader.get_transforms(self) + self.transforms return standalone.Reader.get_transforms(self) + self.transforms
def new_document(self):
document = standalone.Reader.new_document(self)
reporter = document.reporter
document.reporter = LoggingReporter(reporter.source, reporter.report_level,
reporter.halt_level, reporter.debug_flag,
reporter.error_handler)
return document
class SphinxStandaloneReader(SphinxBaseReader): class SphinxStandaloneReader(SphinxBaseReader):
""" """

View File

@ -10,12 +10,20 @@
""" """
from __future__ import absolute_import from __future__ import absolute_import
import re
from copy import copy from copy import copy
from contextlib import contextmanager from contextlib import contextmanager
import docutils import docutils
from docutils.utils import Reporter
from docutils.parsers.rst import directives, roles from docutils.parsers.rst import directives, roles
from sphinx.util import logging
logger = logging.getLogger(__name__)
report_re = re.compile('^(.+?:\d+): \((DEBUG|INFO|WARNING|ERROR|SEVERE)/(\d+)?\) (.+?)\n?$')
if False: if False:
# For type annotation # For type annotation
from typing import Any, Callable, Iterator, Tuple # NOQA from typing import Any, Callable, Iterator, Tuple # NOQA
@ -113,3 +121,36 @@ class sphinx_domains(object):
return self.lookup_domain_element('role', name) return self.lookup_domain_element('role', name)
except ElementLookupError: except ElementLookupError:
return self.role_func(name, lang_module, lineno, reporter) return self.role_func(name, lang_module, lineno, reporter)
class WarningStream(object):
level_mapping = {
'DEBUG': logger.debug,
'INFO': logger.info,
'WARNING': logger.warning,
'ERROR': logger.error,
'SEVERE': logger.critical,
}
def write(self, text):
matched = report_re.search(text)
if not matched:
logger.warning(text.rstrip("\r\n"))
else:
location, type, level, message = matched.groups()
if type in self.level_mapping:
logger_method = self.level_mapping.get(type)
logger_method(message, location=location)
else:
logger.warning(text.rstrip("\r\n"))
class LoggingReporter(Reporter):
def __init__(self, source, report_level, halt_level,
debug=False, error_handler='backslashreplace'):
stream = WarningStream()
Reporter.__init__(self, source, report_level, halt_level,
stream, debug, error_handler=error_handler)
def set_conditions(self, category, report_level, halt_level, debug=False):
Reporter.set_conditions(self, category, report_level, halt_level, debug=debug)