diff --git a/sphinx/directives/patches.py b/sphinx/directives/patches.py index a4a046917..6a88db09a 100644 --- a/sphinx/directives/patches.py +++ b/sphinx/directives/patches.py @@ -9,7 +9,9 @@ from docutils import nodes 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): @@ -35,5 +37,23 @@ class Figure(images.Figure): 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): directives.register_directive('figure', Figure) + directives.register_directive('meta', Meta) diff --git a/sphinx/environment.py b/sphinx/environment.py index 95ca3904b..7947838f4 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -31,7 +31,6 @@ from docutils.core import Publisher from docutils.utils import Reporter, relative_path, get_source_line from docutils.parsers.rst import roles, directives from docutils.parsers.rst.languages import en as english -from docutils.parsers.rst.directives.html import MetaBody from docutils.frontend import OptionParser from sphinx import addnodes @@ -776,9 +775,6 @@ class BuildEnvironment: doctree.settings.warning_stream = None doctree.settings.env = 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 self.temp_data.clear()