diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2018-12-05 16:53:36 +0300 |
---|---|---|
committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2018-12-05 17:11:16 +0300 |
commit | 8a6179aa61ee17f234f7522b2d6f69ee9ff3d9bf (patch) | |
tree | c29060c0d67092d086b64dde05a8f0be1d2e7ce8 /sphinx/parsers.py | |
parent | ca793d35955d8625ed212cc26b104e69e837b588 (diff) |
Process prolog and epilog on RSTParser (instead Input component)
Diffstat (limited to 'sphinx/parsers.py')
-rw-r--r-- | sphinx/parsers.py | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/sphinx/parsers.py b/sphinx/parsers.py index cf14d6ff6..ac95c1d4d 100644 --- a/sphinx/parsers.py +++ b/sphinx/parsers.py @@ -15,9 +15,11 @@ from docutils.parsers.rst import states from docutils.statemachine import StringList from docutils.transforms.universal import SmartQuotes +from sphinx.util.rst import append_epilog, prepend_prolog + if False: # For type annotation - from typing import Any, Dict, List, Type # NOQA + from typing import Any, Dict, List, Type, Union # NOQA from docutils import nodes # NOQA from docutils.transforms import Transform # NOQA from sphinx.application import Sphinx # NOQA @@ -65,30 +67,40 @@ class RSTParser(docutils.parsers.rst.Parser, Parser): # type: () -> List[Type[Transform]] """Sphinx's reST parser replaces a transform class for smart-quotes by own's - refs: sphinx.io.SphinxStandaloneReader""" + refs: sphinx.io.SphinxStandaloneReader + """ transforms = super(RSTParser, self).get_transforms() transforms.remove(SmartQuotes) return transforms def parse(self, inputstring, document): - # type: (Any, nodes.document) -> None - """Parse text and generate a document tree. - - This accepts StringList as an inputstring parameter. - It enables to handle mixed contents (cf. :confval:`rst_prolog`) correctly. - """ - if isinstance(inputstring, StringList): - self.setup_parse(inputstring, document) - self.statemachine = states.RSTStateMachine( - state_classes=self.state_classes, - initial_state=self.initial_state, - debug=document.reporter.debug_flag) - # Give inputstring directly to statemachine. - self.statemachine.run(inputstring, document, inliner=self.inliner) - self.finish_parse() + # type: (Union[str, StringList], nodes.document) -> None + """Parse text and generate a document tree.""" + self.setup_parse(inputstring, document) + self.statemachine = states.RSTStateMachine( + state_classes=self.state_classes, + initial_state=self.initial_state, + debug=document.reporter.debug_flag) + + # preprocess inputstring + if isinstance(inputstring, str): + lines = docutils.statemachine.string2lines( + inputstring, tab_width=document.settings.tab_width, + convert_whitespace=True) + + inputlines = StringList(lines, document.current_source) else: - # otherwise, inputstring might be a string. It will be handled by superclass. - super(RSTParser, self).parse(inputstring, document) + inputlines = inputstring + + self.decorate(inputlines) + self.statemachine.run(inputlines, document, inliner=self.inliner) + self.finish_parse() + + def decorate(self, content): + # type: (StringList) -> None + """Preprocess reST content before parsing.""" + prepend_prolog(content, self.config.rst_prolog) + append_epilog(content, self.config.rst_epilog) def setup(app): |