mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Support docutils-0.18; Meta directive and meta node has moved
This commit is contained in:
parent
9922923d6f
commit
335f95afde
@ -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,
|
||||
|
@ -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
|
||||
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user