def read_doc(app: "Sphinx", env: BuildEnvironment, filename: str) -> nodes.document: """Parse a document and convert to doctree.""" # set up error_handler for the target document error_handler = UnicodeDecodeErrorHandler(env.docname) codecs.register_error('sphinx', error_handler) # type: ignore reader = SphinxStandaloneReader() reader.setup(app) filetype = get_filetype(app.config.source_suffix, filename) parser = app.registry.create_source_parser(app, filetype) if parser.__class__.__name__ == 'CommonMarkParser' and parser.settings_spec == ( ): # a workaround for recommonmark # If recommonmark.AutoStrictify is enabled, the parser invokes reST parser # internally. But recommonmark-0.4.0 does not provide settings_spec for reST # parser. As a workaround, this copies settings_spec for RSTParser to the # CommonMarkParser. parser.settings_spec = RSTParser.settings_spec pub = Publisher(reader=reader, parser=parser, writer=SphinxDummyWriter(), source_class=SphinxFileInput, destination=NullOutput()) pub.process_programmatic_settings(None, env.settings, None) pub.set_source(source_path=filename) pub.publish() return pub.document
def read_doc(self, docname: str) -> None: """Parse a file and add/update inventory entries for the doctree.""" self.env.prepare_settings(docname) # Add confdir/docutils.conf to dependencies list if exists docutilsconf = path.join(self.confdir, 'docutils.conf') if path.isfile(docutilsconf): self.env.note_dependency(docutilsconf) filename = self.env.doc2path(docname) filetype = get_filetype(self.app.config.source_suffix, filename) publisher = self.app.registry.get_publisher(self.app, filetype) with sphinx_domains(self.env), rst.default_role(docname, self.config.default_role): # set up error_handler for the target document codecs.register_error('sphinx', UnicodeDecodeErrorHandler(docname)) # type: ignore publisher.set_source(source_path=filename) publisher.publish() doctree = publisher.document # store time of reading, for outdated files detection # (Some filesystems have coarse timestamp resolution; # therefore time.time() can be older than filesystem's timestamp. # For example, FAT32 has 2sec timestamp resolution.) self.env.all_docs[docname] = max(time.time(), path.getmtime(self.env.doc2path(docname))) # cleanup self.env.temp_data.clear() self.env.ref_context.clear() self.write_doctree(docname, doctree)
def publish_msgstr(app: "Sphinx", source: str, source_path: str, source_line: int, config: Config, settings: Any) -> Element: """Publish msgstr (single line) into docutils document :param sphinx.application.Sphinx app: sphinx application :param str source: source text :param str source_path: source path for warning indication :param source_line: source line for warning indication :param sphinx.config.Config config: sphinx config :param docutils.frontend.Values settings: docutils settings :return: document :rtype: docutils.nodes.document """ try: # clear rst_prolog temporarily rst_prolog = config.rst_prolog config.rst_prolog = None # type: ignore from sphinx.io import SphinxI18nReader reader = SphinxI18nReader() reader.setup(app) filetype = get_filetype(config.source_suffix, source_path) parser = app.registry.create_source_parser(app, filetype) doc = reader.read( source=StringInput(source=source, source_path="%s:%s:<translated>" % (source_path, source_line)), parser=parser, settings=settings, ) try: doc = doc[0] # type: ignore except IndexError: # empty node pass return doc finally: config.rst_prolog = rst_prolog # type: ignore