Support docutils-0.18; Meta directive and meta node has moved

This commit is contained in:
Takeshi KOMIYA 2021-10-03 18:32:39 +09:00
parent 9922923d6f
commit 335f95afde
3 changed files with 26 additions and 8 deletions

View File

@ -13,6 +13,8 @@ from typing import TYPE_CHECKING, Any, Dict, List, Sequence
from docutils import nodes
from docutils.nodes import Element
from sphinx.util import docutils
if TYPE_CHECKING:
from sphinx.application import Sphinx
@ -563,7 +565,6 @@ def setup(app: "Sphinx") -> Dict[str, Any]:
app.add_node(start_of_file)
app.add_node(highlightlang)
app.add_node(tabular_col_spec)
app.add_node(meta)
app.add_node(pending_xref)
app.add_node(number_reference)
app.add_node(download_reference)
@ -571,6 +572,9 @@ def setup(app: "Sphinx") -> Dict[str, Any]:
app.add_node(literal_strong)
app.add_node(manpage)
if docutils.__version_info__ < (0, 18):
app.add_node(meta)
return {
'version': 'builtin',
'parallel_read_safe': True,

View File

@ -14,7 +14,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Tuple, cast
from docutils import nodes
from docutils.nodes import Node, make_id, system_message
from docutils.parsers.rst import directives
from docutils.parsers.rst.directives import html, images, tables
from docutils.parsers.rst.directives import images, tables
from sphinx import addnodes
from sphinx.deprecation import RemovedInSphinx60Warning
@ -27,6 +27,15 @@ from sphinx.util.nodes import set_source_info
from sphinx.util.osutil import SEP, os_path, relpath
from sphinx.util.typing import OptionSpec
try:
from docutils.nodes import meta as meta_node # type: ignore
from docutils.parsers.rst.directives.misc import Meta as MetaBase # type: ignore
except ImportError:
# docutils-0.17 or older
from docutils.parsers.rst.directives.html import Meta as MetaBase
from docutils.parsers.rst.directives.html import MetaBody
meta_node = MetaBody.meta
if TYPE_CHECKING:
from sphinx.application import Sphinx
@ -60,19 +69,19 @@ class Figure(images.Figure):
return [figure_node]
class Meta(html.Meta, SphinxDirective):
class Meta(MetaBase, SphinxDirective):
def run(self) -> List[Node]:
result = super().run()
for node in result:
if (isinstance(node, nodes.pending) and
isinstance(node.details['nodes'][0], html.MetaBody.meta)):
isinstance(node.details['nodes'][0], meta_node)):
meta = node.details['nodes'][0]
meta.source = self.env.doc2path(self.env.docname)
meta.line = self.lineno
meta.rawcontent = meta['content'] # type: ignore
meta.rawcontent = meta['content']
# docutils' meta nodes aren't picklable because the class is nested
meta.__class__ = addnodes.meta # type: ignore
meta.__class__ = addnodes.meta
return result

View File

@ -11,12 +11,17 @@
import pickle
import pytest
from docutils.parsers.rst.directives.html import MetaBody
from sphinx import addnodes
from sphinx.testing.util import SphinxTestApp
from sphinx.versioning import add_uids, get_ratio, merge_doctrees
try:
from docutils.parsers.rst.directives.html import MetaBody
meta = MetaBody.meta
except ImportError:
from docutils.nodes import meta
app = original = original_uids = None
@ -64,7 +69,7 @@ def test_picklablility():
copy.settings.warning_stream = None
copy.settings.env = None
copy.settings.record_dependencies = None
for metanode in copy.traverse(MetaBody.meta):
for metanode in copy.traverse(meta):
metanode.__class__ = addnodes.meta
loaded = pickle.loads(pickle.dumps(copy, pickle.HIGHEST_PROTOCOL))
assert all(getattr(n, 'uid', False) for n in loaded.traverse(is_paragraph))