Preserve filename and line number for meta nodes

This commit is contained in:
Takeshi KOMIYA 2016-08-22 15:53:20 +09:00
parent 97c6cc4e10
commit e1e5ae4b65
2 changed files with 21 additions and 5 deletions

View File

@ -9,7 +9,9 @@
from docutils import nodes from docutils import nodes
from docutils.parsers.rst import directives from docutils.parsers.rst import directives
from docutils.parsers.rst.directives import images from docutils.parsers.rst.directives import images, html
from sphinx import addnodes
class Figure(images.Figure): class Figure(images.Figure):
@ -35,5 +37,23 @@ class Figure(images.Figure):
return [figure_node] return [figure_node]
class Meta(html.Meta):
def run(self):
env = self.state.document.settings.env
result = html.Meta.run(self)
for node in result:
if (isinstance(node, nodes.pending) and
isinstance(node.details['nodes'][0], html.MetaBody.meta)):
meta = node.details['nodes'][0]
meta.source = env.doc2path(env.docname)
meta.line = self.lineno
# docutils' meta nodes aren't picklable because the class is nested
meta.__class__ = addnodes.meta
return result
def setup(app): def setup(app):
directives.register_directive('figure', Figure) directives.register_directive('figure', Figure)
directives.register_directive('meta', Meta)

View File

@ -31,7 +31,6 @@ from docutils.core import Publisher
from docutils.utils import Reporter, relative_path, get_source_line from docutils.utils import Reporter, relative_path, get_source_line
from docutils.parsers.rst import roles, directives from docutils.parsers.rst import roles, directives
from docutils.parsers.rst.languages import en as english from docutils.parsers.rst.languages import en as english
from docutils.parsers.rst.directives.html import MetaBody
from docutils.frontend import OptionParser from docutils.frontend import OptionParser
from sphinx import addnodes from sphinx import addnodes
@ -776,9 +775,6 @@ class BuildEnvironment:
doctree.settings.warning_stream = None doctree.settings.warning_stream = None
doctree.settings.env = None doctree.settings.env = None
doctree.settings.record_dependencies = None doctree.settings.record_dependencies = None
for metanode in doctree.traverse(MetaBody.meta):
# docutils' meta nodes aren't picklable because the class is nested
metanode.__class__ = addnodes.meta
# cleanup # cleanup
self.temp_data.clear() self.temp_data.clear()