Refactor parsing by docutils

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

View File

@ -24,8 +24,6 @@ from collections import defaultdict
from six import BytesIO, itervalues, class_types, next from six import BytesIO, itervalues, class_types, next
from six.moves import cPickle as pickle from six.moves import cPickle as pickle
from docutils.io import NullOutput
from docutils.core import Publisher
from docutils.utils import Reporter, get_source_line, normalize_language_tag from docutils.utils import Reporter, get_source_line, normalize_language_tag
from docutils.utils.smartquotes import smartchars from docutils.utils.smartquotes import smartchars
from docutils.parsers.rst import roles from docutils.parsers.rst import roles
@ -33,9 +31,7 @@ from docutils.parsers.rst.languages import en as english
from docutils.frontend import OptionParser from docutils.frontend import OptionParser
from sphinx import addnodes from sphinx import addnodes
from sphinx.io import ( from sphinx.io import read_doc
SphinxStandaloneReader, SphinxDummySourceClass, SphinxDummyWriter, SphinxFileInput
)
from sphinx.util import logging from sphinx.util import logging
from sphinx.util import get_matching_docs, FilenameUniqDict, status_iterator from sphinx.util import get_matching_docs, FilenameUniqDict, status_iterator
from sphinx.util.nodes import is_translatable from sphinx.util.nodes import is_translatable
@ -711,22 +707,7 @@ class BuildEnvironment(object):
location=docname) location=docname)
codecs.register_error('sphinx', self.warn_and_replace) # type: ignore codecs.register_error('sphinx', self.warn_and_replace) # type: ignore
doctree = read_doc(self.app, self, self.doc2path(docname))
# publish manually
reader = SphinxStandaloneReader(self.app,
parsers=self.app.registry.get_source_parsers())
src_path = self.doc2path(docname)
source = SphinxFileInput(app, self, source=None, source_path=src_path,
encoding=self.config.source_encoding)
pub = Publisher(reader=reader,
writer=SphinxDummyWriter(),
source_class=SphinxDummySourceClass,
destination=NullOutput())
pub.set_components(None, 'restructuredtext', None)
pub.process_programmatic_settings(None, self.settings, None)
pub.set_source(source, src_path)
pub.publish()
doctree = pub.document
# post-processing # post-processing
for domain in itervalues(self.domains): for domain in itervalues(self.domains):

View File

@ -8,7 +8,8 @@
:copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details. :license: BSD, see LICENSE for details.
""" """
from docutils.io import FileInput from docutils.io import FileInput, NullOutput
from docutils.core import Publisher
from docutils.readers import standalone from docutils.readers import standalone
from docutils.writers import UnfilteredWriter from docutils.writers import UnfilteredWriter
from six import string_types, text_type, iteritems from six import string_types, text_type, iteritems
@ -185,3 +186,21 @@ class SphinxFileInput(FileInput):
if self.env.config.rst_prolog: if self.env.config.rst_prolog:
data = self.env.config.rst_prolog + '\n' + data data = self.env.config.rst_prolog + '\n' + data
return docinfo + data return docinfo + data
def read_doc(app, env, filename):
"""Parse a document and convert to doctree."""
# type: (Sphinx, BuildEnvironment, unicode) -> nodes.document
reader = SphinxStandaloneReader(app, parsers=app.registry.get_source_parsers())
source = SphinxFileInput(app, env, source=None, source_path=filename,
encoding=env.config.source_encoding)
pub = Publisher(reader=reader,
writer=SphinxDummyWriter(),
source_class=SphinxDummySourceClass,
destination=NullOutput())
pub.set_components(None, 'restructuredtext', None)
pub.process_programmatic_settings(None, env.settings, None)
pub.set_source(source, filename)
pub.publish()
return pub.document