summaryrefslogtreecommitdiff
path: root/sphinx
diff options
context:
space:
mode:
authorAdam Turner <9087854+aa-turner@users.noreply.github.com>2022-05-22 21:09:39 +0100
committerAdam Turner <9087854+AA-Turner@users.noreply.github.com>2022-09-27 18:31:47 +0100
commitbb62d2a2ee7d6d4b79b269c837ebf8d57aee0795 (patch)
tree1ff11cd7b3291a5004c5b8bf0ba83394331ebfd9 /sphinx
parent080517ce55119a6358337b5f939b3942e4de63b4 (diff)
downloadsphinx-git-bb62d2a2ee7d6d4b79b269c837ebf8d57aee0795.tar.gz
Increase minimum Docutils to 0.18
Diffstat (limited to 'sphinx')
-rw-r--r--sphinx/addnodes.py29
-rw-r--r--sphinx/directives/patches.py28
-rw-r--r--sphinx/environment/__init__.py3
-rw-r--r--sphinx/search/__init__.py4
-rw-r--r--sphinx/themes/basic/static/basic.css_t45
-rw-r--r--sphinx/themes/bizstyle/static/bizstyle.css_t2
-rw-r--r--sphinx/themes/classic/static/classic.css_t2
-rw-r--r--sphinx/themes/epub/static/epub.css_t2
-rw-r--r--sphinx/themes/nature/static/nature.css_t2
-rw-r--r--sphinx/themes/nonav/static/nonav.css_t2
-rw-r--r--sphinx/themes/pyramid/static/epub.css_t2
-rw-r--r--sphinx/themes/pyramid/static/pyramid.css_t2
-rw-r--r--sphinx/themes/sphinxdoc/static/sphinxdoc.css_t2
-rw-r--r--sphinx/themes/traditional/static/traditional.css_t2
-rw-r--r--sphinx/transforms/i18n.py9
-rw-r--r--sphinx/util/docutils.py10
-rw-r--r--sphinx/util/nodes.py26
17 files changed, 20 insertions, 152 deletions
diff --git a/sphinx/addnodes.py b/sphinx/addnodes.py
index 4abddf205..fea9c0edd 100644
--- a/sphinx/addnodes.py
+++ b/sphinx/addnodes.py
@@ -2,19 +2,24 @@
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence
-import docutils
from docutils import nodes
from docutils.nodes import Element
+from sphinx.deprecation import RemovedInSphinx70Warning, deprecated_alias
+
if TYPE_CHECKING:
from sphinx.application import Sphinx
-try:
- from docutils.nodes import meta as docutils_meta # type: ignore
-except ImportError:
- # docutils-0.17
- from docutils.parsers.rst.directives.html import MetaBody
- docutils_meta = MetaBody.meta
+deprecated_alias('sphinx.addnodes',
+ {
+ 'meta': nodes.meta, # type: ignore
+ 'docutils_meta': nodes.meta, # type: ignore
+ },
+ RemovedInSphinx70Warning,
+ {
+ 'meta': 'docutils.nodes.meta',
+ 'docutils_meta': 'docutils.nodes.meta',
+ })
class document(nodes.document):
@@ -424,13 +429,6 @@ class tabular_col_spec(nodes.Element):
"""Node for specifying tabular columns, used for LaTeX output."""
-class meta(nodes.Special, nodes.PreBibliographic, nodes.Element):
- """Node for meta directive -- same as docutils' standard meta node,
- but pickleable.
- """
- rawcontent = None
-
-
# inline nodes
class pending_xref(nodes.Inline, nodes.Element):
@@ -557,9 +555,6 @@ 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,
diff --git a/sphinx/directives/patches.py b/sphinx/directives/patches.py
index a0bf26262..833a9ff0b 100644
--- a/sphinx/directives/patches.py
+++ b/sphinx/directives/patches.py
@@ -1,14 +1,14 @@
import os
from os import path
-from typing import TYPE_CHECKING, Any, Dict, List, Sequence, cast
+from typing import TYPE_CHECKING, Any, Dict, List, cast
from docutils import nodes
from docutils.nodes import Node, make_id
from docutils.parsers.rst import directives
from docutils.parsers.rst.directives import images, tables
+from docutils.parsers.rst.directives.misc import Meta # type: ignore[attr-defined]
from docutils.parsers.rst.roles import set_classes
-from sphinx import addnodes
from sphinx.directives import optional_int
from sphinx.domains.math import MathDomain
from sphinx.locale import __
@@ -18,30 +18,6 @@ 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.parsers.rst.directives.misc import Meta as Meta # type: ignore
-except ImportError:
- # docutils-0.17
- from docutils.parsers.rst.directives.html import Meta as MetaBase
-
- class Meta(MetaBase, SphinxDirective): # type: ignore
- def run(self) -> Sequence[Node]: # type: ignore
- result = super().run()
- for node in result:
- # for docutils-0.17. Since docutils-0.18, patching is no longer needed
- # because it uses picklable node; ``docutils.nodes.meta``.
- if (isinstance(node, nodes.pending) and
- isinstance(node.details['nodes'][0], addnodes.docutils_meta)):
- meta = node.details['nodes'][0]
- meta.source = self.env.doc2path(self.env.docname)
- meta.line = self.lineno
- meta.rawcontent = meta['content']
-
- # docutils' meta nodes aren't picklable because the class is nested
- meta.__class__ = addnodes.meta
-
- return result
-
if TYPE_CHECKING:
from sphinx.application import Sphinx
diff --git a/sphinx/environment/__init__.py b/sphinx/environment/__init__.py
index 59904e26f..6c956ecdd 100644
--- a/sphinx/environment/__init__.py
+++ b/sphinx/environment/__init__.py
@@ -9,7 +9,6 @@ from os import path
from typing import (TYPE_CHECKING, Any, Callable, Dict, Generator, Iterator, List, Optional,
Set, Tuple, Union)
-import docutils
from docutils import nodes
from docutils.nodes import Node
@@ -52,8 +51,6 @@ default_settings: Dict[str, Any] = {
'file_insertion_enabled': True,
'smartquotes_locales': [],
}
-if docutils.__version_info__[:2] <= (0, 17):
- default_settings['embed_images'] = False
# This is increased every time an environment attribute is added
# or changed to properly invalidate pickle files.
diff --git a/sphinx/search/__init__.py b/sphinx/search/__init__.py
index 5330d7e7c..45d938949 100644
--- a/sphinx/search/__init__.py
+++ b/sphinx/search/__init__.py
@@ -189,8 +189,8 @@ class WordCollector(nodes.NodeVisitor):
self.lang = lang
def is_meta_keywords(self, node: Element) -> bool:
- if (isinstance(node, (addnodes.meta, addnodes.docutils_meta)) and
- node.get('name') == 'keywords'):
+ if (isinstance(node, nodes.meta) # type: ignore
+ and node.get('name') == 'keywords'):
meta_lang = node.get('lang')
if meta_lang is None: # lang not specified
return True
diff --git a/sphinx/themes/basic/static/basic.css_t b/sphinx/themes/basic/static/basic.css_t
index 2effcd963..401824a5c 100644
--- a/sphinx/themes/basic/static/basic.css_t
+++ b/sphinx/themes/basic/static/basic.css_t
@@ -237,18 +237,6 @@ a.headerlink {
visibility: hidden;
}
-{%- if docutils_version_info[:2] < (0, 18) %}
-a.brackets:before,
-span.brackets > a:before{
- content: "[";
-}
-
-a.brackets:after,
-span.brackets > a:after {
- content: "]";
-}
-{% endif %}
-
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
@@ -337,20 +325,16 @@ p.sidebar-title {
font-weight: bold;
}
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{%- endif %}
div.admonition, div.topic, blockquote {
clear: left;
}
/* -- topics ---------------------------------------------------------------- */
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{%- endif %}
div.topic {
border: 1px solid #ccc;
padding: 7px;
@@ -389,10 +373,8 @@ div.body p.centered {
div.sidebar > :last-child,
aside.sidebar > :last-child,
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents > :last-child,
aside.topic > :last-child,
-{%- endif %}
div.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
@@ -400,10 +382,8 @@ div.admonition > :last-child {
div.sidebar::after,
aside.sidebar::after,
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents::after,
aside.topic::after,
-{%- endif %}
div.topic::after,
div.admonition::after,
blockquote::after {
@@ -629,24 +609,6 @@ ul.simple p {
margin-bottom: 0;
}
-{%- if docutils_version_info[:2] < (0, 18) %}
-dl.footnote > dt,
-dl.citation > dt {
- float: left;
- margin-right: 0.5em;
-}
-
-dl.footnote > dd,
-dl.citation > dd {
- margin-bottom: 0em;
-}
-
-dl.footnote > dd:after,
-dl.citation > dd:after {
- content: "";
- clear: both;
-}
-{%- elif docutils_version_info[:2] >= (0, 18) %}
aside.footnote > span,
div.citation > span {
float: left;
@@ -670,7 +632,6 @@ div.citation > p:last-of-type:after {
content: "";
clear: both;
}
-{%- endif %}
dl.field-list {
display: grid;
@@ -684,12 +645,6 @@ dl.field-list > dt {
padding-right: 5px;
}
-{%- if docutils_version_info[:2] < (0, 18) %}
-dl.field-list > dt:after {
- content: ":";
-}
-{% endif %}
-
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
diff --git a/sphinx/themes/bizstyle/static/bizstyle.css_t b/sphinx/themes/bizstyle/static/bizstyle.css_t
index a524345f9..a96aef577 100644
--- a/sphinx/themes/bizstyle/static/bizstyle.css_t
+++ b/sphinx/themes/bizstyle/static/bizstyle.css_t
@@ -306,10 +306,8 @@ div.quotebar {
border: 1px solid #ccc;
}
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{% endif %}
div.topic {
background-color: #f8f8f8;
}
diff --git a/sphinx/themes/classic/static/classic.css_t b/sphinx/themes/classic/static/classic.css_t
index 789bec811..a15e7eeae 100644
--- a/sphinx/themes/classic/static/classic.css_t
+++ b/sphinx/themes/classic/static/classic.css_t
@@ -290,10 +290,8 @@ div.seealso {
border: 1px solid #ff6;
}
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{% endif %}
div.topic {
background-color: #eee;
}
diff --git a/sphinx/themes/epub/static/epub.css_t b/sphinx/themes/epub/static/epub.css_t
index a30344431..245582f61 100644
--- a/sphinx/themes/epub/static/epub.css_t
+++ b/sphinx/themes/epub/static/epub.css_t
@@ -245,10 +245,8 @@ p.sidebar-title {
/* -- topics ---------------------------------------------------------------- */
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{% endif %}
div.topic {
border: 1px solid #ccc;
padding: 7px 7px 0 7px;
diff --git a/sphinx/themes/nature/static/nature.css_t b/sphinx/themes/nature/static/nature.css_t
index 93f9a5944..57e1ba7cf 100644
--- a/sphinx/themes/nature/static/nature.css_t
+++ b/sphinx/themes/nature/static/nature.css_t
@@ -194,10 +194,8 @@ div.seealso {
border: 1px solid #ff6;
}
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{% endif %}
div.topic {
background-color: #eee;
}
diff --git a/sphinx/themes/nonav/static/nonav.css_t b/sphinx/themes/nonav/static/nonav.css_t
index 933365e07..c66ae99ad 100644
--- a/sphinx/themes/nonav/static/nonav.css_t
+++ b/sphinx/themes/nonav/static/nonav.css_t
@@ -234,10 +234,8 @@ p.sidebar-title {
/* -- topics ---------------------------------------------------------------- */
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{% endif %}
div.topic {
border: 1px solid #ccc;
padding: 7px 7px 0 7px;
diff --git a/sphinx/themes/pyramid/static/epub.css_t b/sphinx/themes/pyramid/static/epub.css_t
index 98741d0b8..12cb97487 100644
--- a/sphinx/themes/pyramid/static/epub.css_t
+++ b/sphinx/themes/pyramid/static/epub.css_t
@@ -254,10 +254,8 @@ div.seealso {
border: 1px solid #ff6;
}
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{% endif %}
div.topic {
background-color: #eee;
}
diff --git a/sphinx/themes/pyramid/static/pyramid.css_t b/sphinx/themes/pyramid/static/pyramid.css_t
index 0ced6b29f..46b613c2b 100644
--- a/sphinx/themes/pyramid/static/pyramid.css_t
+++ b/sphinx/themes/pyramid/static/pyramid.css_t
@@ -245,10 +245,8 @@ div.seealso {
padding: 10px 20px 10px 60px;
}
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{% endif %}
div.topic {
background: #eeeeee;
border: 2px solid #C6C9CB;
diff --git a/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t b/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t
index 1817c48bc..cfd16e317 100644
--- a/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t
+++ b/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t
@@ -266,10 +266,8 @@ div.quotebar {
border: 1px solid #ccc;
}
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{% endif %}
div.topic {
background-color: #f8f8f8;
}
diff --git a/sphinx/themes/traditional/static/traditional.css_t b/sphinx/themes/traditional/static/traditional.css_t
index 8a2f0712f..2202ba807 100644
--- a/sphinx/themes/traditional/static/traditional.css_t
+++ b/sphinx/themes/traditional/static/traditional.css_t
@@ -506,10 +506,8 @@ p.rubric {
/* "Topics" */
-{%- if docutils_version_info[:2] >= (0, 18) %}
nav.contents,
aside.topic,
-{% endif %}
div.topic {
background-color: #eee;
border: 1px solid #ccc;
diff --git a/sphinx/transforms/i18n.py b/sphinx/transforms/i18n.py
index fd32f0dc1..188655845 100644
--- a/sphinx/transforms/i18n.py
+++ b/sphinx/transforms/i18n.py
@@ -19,7 +19,7 @@ from sphinx.transforms import SphinxTransform
from sphinx.util import get_filetype, logging, split_index_msg
from sphinx.util.i18n import docname_to_domain
from sphinx.util.nodes import (IMAGE_TYPE_NODES, LITERAL_TYPE_NODES, NodeMatcher,
- extract_messages, is_pending_meta, traverse_translatable_index)
+ extract_messages, traverse_translatable_index)
if TYPE_CHECKING:
from sphinx.application import Sphinx
@@ -254,12 +254,7 @@ class Locale(SphinxTransform):
continue
# update meta nodes
- if isinstance(node, nodes.pending) and is_pending_meta(node):
- # docutils-0.17
- node.details['nodes'][0]['content'] = msgstr
- continue
- elif isinstance(node, addnodes.docutils_meta):
- # docutils-0.18+
+ if isinstance(node, nodes.meta): # type: ignore
node['content'] = msgstr
continue
diff --git a/sphinx/util/docutils.py b/sphinx/util/docutils.py
index 63c9a06ef..d27ad6ba0 100644
--- a/sphinx/util/docutils.py
+++ b/sphinx/util/docutils.py
@@ -588,16 +588,6 @@ class SphinxTranslator(nodes.NodeVisitor):
logger.warning(__('unknown node type: %r'), node, location=node)
-# Node.findall() is a new interface to traverse a doctree since docutils-0.18.
-# This applies a patch to docutils up to 0.18 inclusive to provide Node.findall()
-# method to use it from our codebase.
-if docutils.__version_info__[:2] <= (0, 17):
- def findall(self, *args, **kwargs):
- return iter(self.traverse(*args, **kwargs))
-
- Node.findall = findall # type: ignore
-
-
# cache a vanilla instance of nodes.document
# Used in new_document() function
__document_cache__: Tuple["Values", Reporter]
diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py
index fdbf94fe6..3549dd190 100644
--- a/sphinx/util/nodes.py
+++ b/sphinx/util/nodes.py
@@ -182,14 +182,6 @@ IGNORED_NODES = (
)
-def is_pending_meta(node: Node) -> bool:
- if (isinstance(node, nodes.pending) and
- isinstance(node.details.get('nodes', [None])[0], addnodes.meta)):
- return True
- else:
- return False
-
-
def is_translatable(node: Node) -> bool:
if isinstance(node, addnodes.translatable):
return True
@@ -225,11 +217,7 @@ def is_translatable(node: Node) -> bool:
return False
return True
- if is_pending_meta(node) or isinstance(node, addnodes.meta):
- # docutils-0.17
- return True
- elif isinstance(node, addnodes.docutils_meta):
- # docutils-0.18+
+ if isinstance(node, nodes.meta): # type: ignore
return True
return False
@@ -244,9 +232,6 @@ LITERAL_TYPE_NODES = (
IMAGE_TYPE_NODES = (
nodes.image,
)
-META_TYPE_NODES = (
- addnodes.meta,
-)
def extract_messages(doctree: Element) -> Iterable[Tuple[Element, str]]:
@@ -267,14 +252,7 @@ def extract_messages(doctree: Element) -> Iterable[Tuple[Element, str]]:
msg = '.. image:: %s' % node['uri']
else:
msg = ''
- elif isinstance(node, META_TYPE_NODES):
- # docutils-0.17
- msg = node.rawcontent
- elif isinstance(node, nodes.pending) and is_pending_meta(node):
- # docutils-0.17
- msg = node.details['nodes'][0].rawcontent
- elif isinstance(node, addnodes.docutils_meta):
- # docutils-0.18+
+ elif isinstance(node, nodes.meta): # type: ignore
msg = node["content"]
else:
msg = node.rawsource.replace('\n', ' ').strip()