<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/c7f5f9bfde8d32c81c6de33e7e34f48747012b09">https://github.com/macports/macports-ports/commit/c7f5f9bfde8d32c81c6de33e7e34f48747012b09</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new c7f5f9bfde8 py-sphinx: apply upstream docutils fixes
</span>c7f5f9bfde8 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit c7f5f9bfde8d32c81c6de33e7e34f48747012b09
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Tue Nov 2 02:14:10 2021 +1100

<span style='display:block; white-space:pre;color:#404040;'>    py-sphinx: apply upstream docutils fixes
</span>---
 python/py-sphinx/Portfile                  |   4 +-
 python/py-sphinx/files/docutils-0.18.patch | 744 +++++++++++++++++++++++++++++
 2 files changed, 747 insertions(+), 1 deletion(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-sphinx/Portfile b/python/py-sphinx/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 8b5379be879..1c2e8980645 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/python/py-sphinx/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-sphinx/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -6,6 +6,7 @@ PortGroup           select 1.0
</span> 
 name                py-sphinx
 version             4.2.0
<span style='display:block; white-space:pre;background:#e0ffe0;'>+revision            1
</span> categories-append   textproc devel
 license             BSD
 maintainers         {jmr @jmroot} openmaintainer
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -42,7 +43,8 @@ if {$subport ne $name} {
</span>                     port:py${python.version}-snowballstemmer \
                     port:sphinx_select
     if {${python.version} > 35} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        patchfiles-append   setup.py.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        patchfiles-append   setup.py.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            docutils-0.18.patch
</span>     }
     if {${python.version} == 35} {
         version     3.5.2
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-sphinx/files/docutils-0.18.patch b/python/py-sphinx/files/docutils-0.18.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..54aabf2f2aa
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-sphinx/files/docutils-0.18.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,744 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 335f95afdee2dfb03e85b466a4eff66c236b384b Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Takeshi KOMIYA <i.tkomiya@gmail.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sun, 3 Oct 2021 18:32:39 +0900
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Support docutils-0.18; Meta directive and meta node has moved
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/addnodes.py           |  6 +++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/directives/patches.py | 19 ++++++++++++++-----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tests/test_versioning.py     |  9 +++++++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 3 files changed, 26 insertions(+), 8 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/addnodes.py sphinx/addnodes.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8a020b02ef..b43aa81529 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/addnodes.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/addnodes.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -13,6 +13,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from docutils import nodes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from docutils.nodes import Element
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from sphinx.util import docutils
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if TYPE_CHECKING:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     from sphinx.application import Sphinx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -563,7 +565,6 @@ def setup(app: "Sphinx") -> Dict[str, Any]:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     app.add_node(start_of_file)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     app.add_node(highlightlang)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     app.add_node(tabular_col_spec)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    app.add_node(meta)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     app.add_node(pending_xref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     app.add_node(number_reference)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     app.add_node(download_reference)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -571,6 +572,9 @@ def setup(app: "Sphinx") -> Dict[str, Any]:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     app.add_node(literal_strong)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     app.add_node(manpage)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if docutils.__version_info__ < (0, 18):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        app.add_node(meta)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         'version': 'builtin',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         'parallel_read_safe': True,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/directives/patches.py sphinx/directives/patches.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 9a3034daea..a7b77c750b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/directives/patches.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/directives/patches.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -14,7 +14,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from docutils import nodes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from docutils.nodes import Node, make_id, system_message
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from docutils.parsers.rst import directives
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from docutils.parsers.rst.directives import html, images, tables
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from docutils.parsers.rst.directives import images, tables
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from sphinx import addnodes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from sphinx.deprecation import RemovedInSphinx60Warning
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -27,6 +27,15 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from sphinx.util.osutil import SEP, os_path, relpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from sphinx.util.typing import OptionSpec
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from docutils.nodes import meta as meta_node  # type: ignore
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from docutils.parsers.rst.directives.misc import Meta as MetaBase  # type: ignore
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++except ImportError:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    # docutils-0.17 or older
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from docutils.parsers.rst.directives.html import Meta as MetaBase
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from docutils.parsers.rst.directives.html import MetaBody
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    meta_node = MetaBody.meta
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if TYPE_CHECKING:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     from sphinx.application import Sphinx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -60,19 +69,19 @@ def run(self) -> List[Node]:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return [figure_node]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-class Meta(html.Meta, SphinxDirective):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class Meta(MetaBase, SphinxDirective):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def run(self) -> List[Node]:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         result = super().run()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         for node in result:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if (isinstance(node, nodes.pending) and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               isinstance(node.details['nodes'][0], html.MetaBody.meta)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               isinstance(node.details['nodes'][0], meta_node)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 meta = node.details['nodes'][0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 meta.source = self.env.doc2path(self.env.docname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 meta.line = self.lineno
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                meta.rawcontent = meta['content']  # type: ignore
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                meta.rawcontent = meta['content']
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 # docutils' meta nodes aren't picklable because the class is nested
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                meta.__class__ = addnodes.meta  # type: ignore
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                meta.__class__ = addnodes.meta
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return result
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tests/test_versioning.py tests/test_versioning.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 33fb045ce5..8ec1405adb 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- tests/test_versioning.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tests/test_versioning.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11,12 +11,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import pickle
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import pytest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from docutils.parsers.rst.directives.html import MetaBody
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from sphinx import addnodes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from sphinx.testing.util import SphinxTestApp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from sphinx.versioning import add_uids, get_ratio, merge_doctrees
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from docutils.parsers.rst.directives.html import MetaBody
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    meta = MetaBody.meta
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++except ImportError:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    from docutils.nodes import meta
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ app = original = original_uids = None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -64,7 +69,7 @@ def test_picklablility():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     copy.settings.warning_stream = None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     copy.settings.env = None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     copy.settings.record_dependencies = None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for metanode in copy.traverse(MetaBody.meta):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for metanode in copy.traverse(meta):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         metanode.__class__ = addnodes.meta
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     loaded = pickle.loads(pickle.dumps(copy, pickle.HIGHEST_PROTOCOL))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     assert all(getattr(n, 'uid', False) for n in loaded.traverse(is_paragraph))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/environment/__init__.py sphinx/environment/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 15653a3fed..527e81dff6 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/environment/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/environment/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -45,6 +45,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ logger = logging.getLogger(__name__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ default_settings: Dict[str, Any] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    'embed_images': False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'embed_stylesheet': False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'cloak_email_addresses': True,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'pep_base_url': 'https://www.python.org/dev/peps/',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -54,6 +55,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'input_encoding': 'utf-8-sig',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'doctitle_xform': False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'sectsubtitle_xform': False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    'section_self_link': False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'halt_level': 5,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'file_insertion_enabled': True,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'smartquotes_locales': [],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 179e0bf8a22d7199907a405e18028011779d5f15 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Takeshi KOMIYA <i.tkomiya@gmail.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sun, 10 Oct 2021 15:24:12 +0900
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] refactor: Node.traverse() will returns generator since 0.18
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/transforms/i18n.py | 10 +++++-----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/writers/latex.py   |  2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/writers/text.py    |  2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tests/test_util_nodes.py  | 14 +++++++-------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 4 files changed, 14 insertions(+), 14 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/transforms/i18n.py sphinx/transforms/i18n.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3145379cb7..d28376becb 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/transforms/i18n.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/transforms/i18n.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -298,7 +298,7 @@ def list_replace_or_append(lst: List[N], old: N, new: N) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             is_autofootnote_ref = NodeMatcher(nodes.footnote_reference, auto=Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             old_foot_refs: List[nodes.footnote_reference] = node.traverse(is_autofootnote_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             new_foot_refs: List[nodes.footnote_reference] = patch.traverse(is_autofootnote_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if len(old_foot_refs) != len(new_foot_refs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if len(list(old_foot_refs)) != len(list(new_foot_refs)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 old_foot_ref_rawsources = [ref.rawsource for ref in old_foot_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 new_foot_ref_rawsources = [ref.rawsource for ref in new_foot_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.warning(__('inconsistent footnote references in translated message.' +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -341,7 +341,7 @@ def list_replace_or_append(lst: List[N], old: N, new: N) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             is_refnamed_ref = NodeMatcher(nodes.reference, refname=Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             old_refs: List[nodes.reference] = node.traverse(is_refnamed_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             new_refs: List[nodes.reference] = patch.traverse(is_refnamed_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if len(old_refs) != len(new_refs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if len(list(old_refs)) != len(list(new_refs)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 old_ref_rawsources = [ref.rawsource for ref in old_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 new_ref_rawsources = [ref.rawsource for ref in new_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.warning(__('inconsistent references in translated message.' +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -369,7 +369,7 @@ def list_replace_or_append(lst: List[N], old: N, new: N) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             old_foot_refs = node.traverse(is_refnamed_footnote_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             new_foot_refs = patch.traverse(is_refnamed_footnote_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             refname_ids_map: Dict[str, List[str]] = {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if len(old_foot_refs) != len(new_foot_refs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if len(list(old_foot_refs)) != len(list(new_foot_refs)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 old_foot_ref_rawsources = [ref.rawsource for ref in old_foot_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 new_foot_ref_rawsources = [ref.rawsource for ref in new_foot_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.warning(__('inconsistent footnote references in translated message.' +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -388,7 +388,7 @@ def list_replace_or_append(lst: List[N], old: N, new: N) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             old_cite_refs: List[nodes.citation_reference] = node.traverse(is_citation_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             new_cite_refs: List[nodes.citation_reference] = patch.traverse(is_citation_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             refname_ids_map = {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if len(old_cite_refs) != len(new_cite_refs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if len(list(old_cite_refs)) != len(list(new_cite_refs)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 old_cite_ref_rawsources = [ref.rawsource for ref in old_cite_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 new_cite_ref_rawsources = [ref.rawsource for ref in new_cite_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.warning(__('inconsistent citation references in translated message.' +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -408,7 +408,7 @@ def list_replace_or_append(lst: List[N], old: N, new: N) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             old_xrefs = node.traverse(addnodes.pending_xref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             new_xrefs = patch.traverse(addnodes.pending_xref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             xref_reftarget_map = {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if len(old_xrefs) != len(new_xrefs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if len(list(old_xrefs)) != len(list(new_xrefs)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 old_xref_rawsources = [xref.rawsource for xref in old_xrefs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 new_xref_rawsources = [xref.rawsource for xref in new_xrefs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.warning(__('inconsistent term references in translated message.' +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/writers/latex.py sphinx/writers/latex.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a1b1defd72..25c82940c3 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/writers/latex.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/writers/latex.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1011,7 +1011,7 @@ def visit_entry(self, node: Element) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             context = (r'\par' + CR + r'\vskip-\baselineskip'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        r'\vbox{\hbox{\strut}}\end{varwidth}%' + CR + context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.needs_linetrimming = 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if len(node.traverse(nodes.paragraph)) >= 2:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if len(list(node.traverse(nodes.paragraph))) >= 2:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.table.has_oldproblematic = True
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if isinstance(node.parent.parent, nodes.thead) or (cell.col in self.table.stubs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if len(node) == 1 and isinstance(node[0], nodes.paragraph) and node.astext() == '':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/writers/text.py sphinx/writers/text.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index bd0ffa063d..ba310e072e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/writers/text.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/writers/text.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -850,7 +850,7 @@ def depart_list_item(self, node: Element) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.end_state(first='%s. ' % self.list_counter[-1])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def visit_definition_list_item(self, node: Element) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        self._classifier_count_in_li = len(node.traverse(nodes.classifier))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        self._classifier_count_in_li = len(list(node.traverse(nodes.classifier)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def depart_definition_list_item(self, node: Element) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         pass
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tests/test_util_nodes.py tests/test_util_nodes.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index cb2ae70a82..421930cf5a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- tests/test_util_nodes.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tests/test_util_nodes.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -60,31 +60,31 @@ def test_NodeMatcher():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # search by node class
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     matcher = NodeMatcher(nodes.paragraph)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    assert len(doctree.traverse(matcher)) == 3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert len(list(doctree.traverse(matcher))) == 3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # search by multiple node classes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     matcher = NodeMatcher(nodes.paragraph, nodes.literal_block)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    assert len(doctree.traverse(matcher)) == 4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert len(list(doctree.traverse(matcher))) == 4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # search by node attribute
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     matcher = NodeMatcher(block=1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    assert len(doctree.traverse(matcher)) == 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert len(list(doctree.traverse(matcher))) == 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # search by node attribute (Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     matcher = NodeMatcher(block=Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    assert len(doctree.traverse(matcher)) == 3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert len(list(doctree.traverse(matcher))) == 3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # search by both class and attribute
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     matcher = NodeMatcher(nodes.paragraph, block=Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    assert len(doctree.traverse(matcher)) == 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert len(list(doctree.traverse(matcher))) == 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # mismatched
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     matcher = NodeMatcher(nodes.title)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    assert len(doctree.traverse(matcher)) == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert len(list(doctree.traverse(matcher))) == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # search with Any does not match to Text node
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     matcher = NodeMatcher(blah=Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    assert len(doctree.traverse(matcher)) == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    assert len(list(doctree.traverse(matcher))) == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @pytest.mark.parametrize(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From f9a33d2b3af40af4996b9c3064c117551cdcf4a2 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Takeshi KOMIYA <i.tkomiya@gmail.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Mon, 11 Oct 2021 01:52:04 +0900
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Support docutils-0.18: Set auto_id_prefix explicitly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Since docutils-0.18, auto_id_prefix setting will be changed to `'%'`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+from `'id'`.  To keep backward compatibility of node IDs, this sets
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+`'id'` to settings explicitly.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/environment/__init__.py | 1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 1 insertion(+)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/environment/__init__.py sphinx/environment/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 527e81dff6..dc494add12 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/environment/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/environment/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -45,6 +45,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ logger = logging.getLogger(__name__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ default_settings: Dict[str, Any] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    'auto_id_prefix': 'id',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'embed_images': False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'embed_stylesheet': False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     'cloak_email_addresses': True,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 8118f979dc09f1ed027810dbb5abb8a982d7cf23 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Takeshi KOMIYA <i.tkomiya@gmail.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Mon, 11 Oct 2021 01:23:29 +0900
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Support docutils-0.18: allow PreBibliographic nodes before
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ docinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Since 0.18, `meta` directive inserts meta node into the top of the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+document.  It confuses MetadataCollector.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This allows doctree contains PreBibliographic nodes just before docinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+node.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/environment/collectors/metadata.py | 9 ++++++---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 6 insertions(+), 3 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/environment/collectors/metadata.py sphinx/environment/collectors/metadata.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c684e4a4fd..c3a0aa2f48 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/environment/collectors/metadata.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/environment/collectors/metadata.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -33,9 +33,12 @@ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         Keep processing minimal -- just return what docutils says.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         """
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if len(doctree) > 0 and isinstance(doctree[0], nodes.docinfo):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        index = doctree.first_child_not_matching_class(nodes.PreBibliographic)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if index is None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        elif isinstance(doctree[index], nodes.docinfo):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             md = app.env.metadata[app.env.docname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            for node in doctree[0]:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            for node in doctree[index]:  # type: ignore
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 # nodes are multiply inherited...
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 if isinstance(node, nodes.authors):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     authors = cast(List[nodes.author], node)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -58,7 +61,7 @@ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         value = 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     md[name] = value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            doctree.pop(0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            doctree.pop(index)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def setup(app: Sphinx) -> Dict[str, Any]:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 13803a79e7179f40a27f46d5a5a05f1eebbcbb63 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Takeshi KOMIYA <i.tkomiya@gmail.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Wed, 27 Oct 2021 01:49:57 +0900
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Support docutils-0.18: Consume iterator of Element.traverse()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Since 0.18, Element.traverse() returns an iterator instead of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+intermediate object.  As a result, the return value is always considered
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+as truthy value.  And it becomes fragile when the caller modifies the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+doctree on the loop.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/builders/_epub_base.py             |  8 ++++----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/builders/latex/transforms.py       | 10 +++++-----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/domains/index.py                   |  2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/domains/python.py                  |  2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/environment/adapters/toctree.py    |  4 ++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/ext/autosummary/__init__.py        |  2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/ext/linkcode.py                    |  2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/ext/todo.py                        |  2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/ext/viewcode.py                    |  4 ++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/transforms/__init__.py             |  4 ++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/transforms/i18n.py                 |  2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/transforms/post_transforms/code.py |  2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/util/nodes.py                      |  4 ++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/writers/latex.py                   |  2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/writers/manpage.py                 |  4 ++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 15 files changed, 27 insertions(+), 27 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/builders/_epub_base.py sphinx/builders/_epub_base.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2dfc35ecd3..672ce72425 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/builders/_epub_base.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/builders/_epub_base.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -323,14 +323,14 @@ def footnote_spot(tree: nodes.document) -> Tuple[Element, int]:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # a) place them after the last existing footnote
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # b) place them after an (empty) Footnotes rubric
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # c) create an empty Footnotes rubric at the end of the document
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            fns = tree.traverse(nodes.footnote)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            fns = list(tree.traverse(nodes.footnote))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if fns:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 fn = fns[-1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 return fn.parent, fn.parent.index(fn) + 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             for node in tree.traverse(nodes.rubric):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 if len(node) == 1 and node.astext() == FOOTNOTES_RUBRIC_NAME:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     return node.parent, node.parent.index(node) + 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            doc = tree.traverse(nodes.document)[0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            doc = list(tree.traverse(nodes.document))[0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             rub = nodes.rubric()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             rub.append(nodes.Text(FOOTNOTES_RUBRIC_NAME))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             doc.append(rub)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -339,10 +339,10 @@ def footnote_spot(tree: nodes.document) -> Tuple[Element, int]:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if show_urls == 'no':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if show_urls == 'footnote':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            doc = tree.traverse(nodes.document)[0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            doc = list(tree.traverse(nodes.document))[0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             fn_spot, fn_idx = footnote_spot(tree)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             nr = 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in tree.traverse(nodes.reference):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(tree.traverse(nodes.reference)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             uri = node.get('refuri', '')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if (uri.startswith('http:') or uri.startswith('https:') or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     uri.startswith('ftp:')) and uri not in node.astext():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/builders/latex/transforms.py sphinx/builders/latex/transforms.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a07393690d..b85a9827c7 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/builders/latex/transforms.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/builders/latex/transforms.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -45,7 +45,7 @@ class SubstitutionDefinitionsRemover(SphinxPostTransform):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     formats = ('latex',)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def run(self, **kwargs: Any) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in self.document.traverse(nodes.substitution_definition):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(self.document.traverse(nodes.substitution_definition)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             node.parent.remove(node)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -81,7 +81,7 @@ def expand_show_urls(self) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if show_urls is False or show_urls == 'no':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in self.document.traverse(nodes.reference):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(self.document.traverse(nodes.reference)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             uri = node.get('refuri', '')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if uri.startswith(URI_SCHEMES):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 if uri.startswith('mailto:'):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -501,7 +501,7 @@ class BibliographyTransform(SphinxPostTransform):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def run(self, **kwargs: Any) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         citations = thebibliography()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in self.document.traverse(nodes.citation):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(self.document.traverse(nodes.citation)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             node.parent.remove(node)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             citations += node
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -602,9 +602,9 @@ class IndexInSectionTitleTransform(SphinxPostTransform):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     formats = ('latex',)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def run(self, **kwargs: Any) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in self.document.traverse(nodes.title):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(self.document.traverse(nodes.title)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if isinstance(node.parent, nodes.section):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                for i, index in enumerate(node.traverse(addnodes.index)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                for i, index in enumerate(list(node.traverse(addnodes.index))):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     # move the index node next to the section title
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     node.remove(index)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     node.parent.insert(i + 1, index)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/domains/index.py sphinx/domains/index.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 9ecfae439c..975ab7000f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/domains/index.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/domains/index.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -48,7 +48,7 @@ def merge_domaindata(self, docnames: Iterable[str], otherdata: Dict) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def process_doc(self, env: BuildEnvironment, docname: str, document: Node) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         """Process a document after it is read by the environment."""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         entries = self.entries.setdefault(env.docname, [])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in document.traverse(addnodes.index):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(document.traverse(addnodes.index)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 for entry in node['entries']:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     split_index_msg(entry[0], entry[1])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/domains/python.py sphinx/domains/python.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1a3bd60c7b..9bb9a1e723 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/domains/python.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/domains/python.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -328,7 +328,7 @@ def make_xref(self, rolename: str, domain: str, target: str,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 text = target[1:]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             elif prefix == '~':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 text = target.split('.')[-1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            for node in result.traverse(nodes.Text):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            for node in list(result.traverse(nodes.Text)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 node.parent[node.parent.index(node)] = nodes.Text(text)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         elif isinstance(result, pending_xref) and env.config.python_use_unqualified_type_names:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/environment/adapters/toctree.py sphinx/environment/adapters/toctree.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a62e951d7e..53328e8127 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/environment/adapters/toctree.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/environment/adapters/toctree.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -193,13 +193,13 @@ def _entries_from_toctree(toctreenode: addnodes.toctree, parents: List[str],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         for toplevel in children:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             # nodes with length 1 don't have any children anyway
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             if len(toplevel) > 1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                subtrees = toplevel.traverse(addnodes.toctree)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                subtrees = list(toplevel.traverse(addnodes.toctree))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 if subtrees:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                     toplevel[1][:] = subtrees  # type: ignore
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 else:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                     toplevel.pop(1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     # resolve all sub-toctrees
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    for subtocnode in toc.traverse(addnodes.toctree):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    for subtocnode in list(toc.traverse(addnodes.toctree)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         if not (subtocnode.get('hidden', False) and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 not includehidden):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             i = subtocnode.parent.index(subtocnode) + 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/ext/autosummary/__init__.py sphinx/ext/autosummary/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8bd3d50cd2..478b5c9f33 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/ext/autosummary/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/ext/autosummary/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -583,7 +583,7 @@ def parse(doc: List[str], settings: Any) -> nodes.document:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 node = parse(doc, document.settings)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 if summary.endswith(WELL_KNOWN_ABBREVIATIONS):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     pass
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                elif not node.traverse(nodes.system_message):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                elif not list(node.traverse(nodes.system_message)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     # considered as that splitting by period does not break inline markups
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/ext/linkcode.py sphinx/ext/linkcode.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6aaea0e9e5..e88ba4c960 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/ext/linkcode.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/ext/linkcode.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -39,7 +39,7 @@ def doctree_read(app: Sphinx, doctree: Node) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         'js': ['object', 'fullname'],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for objnode in doctree.traverse(addnodes.desc):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for objnode in list(doctree.traverse(addnodes.desc)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         domain = objnode.get('domain')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         uris: Set[str] = set()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         for signode in objnode:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/ext/todo.py sphinx/ext/todo.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6b7c1b73b8..beab0976d3 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/ext/todo.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/ext/todo.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -131,7 +131,7 @@ def __init__(self, app: Sphinx, doctree: nodes.document, docname: str) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def process(self, doctree: nodes.document, docname: str) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         todos: List[todo_node] = sum(self.domain.todos.values(), [])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in doctree.traverse(todolist):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(doctree.traverse(todolist)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if not self.config.todo_include_todos:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 node.parent.remove(node)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/ext/viewcode.py sphinx/ext/viewcode.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5728f60776..bd1346daab 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/ext/viewcode.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/ext/viewcode.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -108,7 +108,7 @@ def has_tag(modname: str, fullname: str, docname: str, refname: str) -> bool:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return False
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for objnode in doctree.traverse(addnodes.desc):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for objnode in list(doctree.traverse(addnodes.desc)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if objnode.get('domain') != 'py':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         names: Set[str] = set()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -191,7 +191,7 @@ def convert_viewcode_anchors(self) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             node.replace_self(refnode)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def remove_viewcode_anchors(self) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in self.document.traverse(viewcode_anchor):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(self.document.traverse(viewcode_anchor)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             node.parent.remove(node)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/transforms/__init__.py sphinx/transforms/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ade46363a4..1347409292 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/transforms/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/transforms/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -128,7 +128,7 @@ class MoveModuleTargets(SphinxTransform):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     default_priority = 210
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def apply(self, **kwargs: Any) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in self.document.traverse(nodes.target):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(self.document.traverse(nodes.target)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if not node['ids']:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if ('ismod' in node and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -303,7 +303,7 @@ class FilterSystemMessages(SphinxTransform):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def apply(self, **kwargs: Any) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         filterlevel = 2 if self.config.keep_warnings else 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in self.document.traverse(nodes.system_message):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(self.document.traverse(nodes.system_message)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if node['level'] < filterlevel:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.debug('%s [filtered system message]', node.astext())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 node.parent.remove(node)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/transforms/i18n.py sphinx/transforms/i18n.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index d28376becb..d0bc8af5d5 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/transforms/i18n.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/transforms/i18n.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -488,7 +488,7 @@ def apply(self, **kwargs: Any) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         matcher = NodeMatcher(nodes.inline, translatable=Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for inline in self.document.traverse(matcher):  # type: nodes.inline
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for inline in list(self.document.traverse(matcher)):  # type: nodes.inline
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             inline.parent.remove(inline)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             inline.parent += inline.children
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/transforms/post_transforms/code.py sphinx/transforms/post_transforms/code.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 52bca8e12d..3c4c0ebab6 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/transforms/post_transforms/code.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/transforms/post_transforms/code.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -42,7 +42,7 @@ def apply(self, **kwargs: Any) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                            self.config.highlight_language)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self.document.walkabout(visitor)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in self.document.traverse(addnodes.highlightlang):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(self.document.traverse(addnodes.highlightlang)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             node.parent.remove(node)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/util/nodes.py sphinx/util/nodes.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 78663e4c70..bc16e44c10 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/util/nodes.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/util/nodes.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -343,7 +343,7 @@ def clean_astext(node: Element) -> str:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     node = node.deepcopy()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for img in node.traverse(nodes.image):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         img['alt'] = ''
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for raw in node.traverse(nodes.raw):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for raw in list(node.traverse(nodes.raw)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         raw.parent.remove(raw)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return node.astext()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -408,7 +408,7 @@ def inline_all_toctrees(builder: "Builder", docnameset: Set[str], docname: str,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Record all docnames in *docnameset*, and output docnames with *colorfunc*.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     """
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     tree = cast(nodes.document, tree.deepcopy())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for toctreenode in tree.traverse(addnodes.toctree):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for toctreenode in list(tree.traverse(addnodes.toctree)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         newnodes = []
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         includefiles = map(str, toctreenode['includefiles'])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         for includefile in includefiles:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/writers/latex.py sphinx/writers/latex.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 869759ee51..3f032e6164 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/writers/latex.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/writers/latex.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -651,7 +651,7 @@ def visit_title(self, node: Element) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 raise nodes.SkipNode
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             else:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 short = ''
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                if node.traverse(nodes.image):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                if list(node.traverse(nodes.image)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     short = ('[%s]' % self.escape(' '.join(clean_astext(node).split())))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/writers/manpage.py sphinx/writers/manpage.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 12fc31281b..da5f4c2412 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/writers/manpage.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/writers/manpage.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -56,7 +56,7 @@ def __init__(self, document: nodes.document) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def apply(self, **kwargs: Any) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         matcher = NodeMatcher(nodes.literal, nodes.emphasis, nodes.strong)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for node in self.document.traverse(matcher):  # type: TextElement
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for node in list(self.document.traverse(matcher)):  # type: TextElement
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if any(matcher(subnode) for subnode in node):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 pos = node.parent.index(node)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 for subnode in reversed(list(node)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -227,7 +227,7 @@ def depart_versionmodified(self, node: Element) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     # overwritten -- don't make whole of term bold if it includes strong node
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def visit_term(self, node: Element) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if node.traverse(nodes.strong):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if list(node.traverse(nodes.strong)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.body.append('\n')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         else:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             super().visit_term(node)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 3f3de7d29abefe4c87e03f527a8d5b9e136d3645 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Takeshi KOMIYA <i.tkomiya@gmail.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sun, 31 Oct 2021 01:33:16 +0900
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Support docutils-0.18: Consume generator of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Element.traverse()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The last fix in i18n module was incorrect because it compares the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+"already consumed" generators.  It should compares the lists of nodes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sphinx/transforms/i18n.py | 30 +++++++++++++++---------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 15 insertions(+), 15 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sphinx/transforms/i18n.py sphinx/transforms/i18n.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index d0bc8af5d5..8ef7987f9a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sphinx/transforms/i18n.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sphinx/transforms/i18n.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -296,9 +296,9 @@ def list_replace_or_append(lst: List[N], old: N, new: N) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     lst.append(new)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             is_autofootnote_ref = NodeMatcher(nodes.footnote_reference, auto=Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            old_foot_refs: List[nodes.footnote_reference] = node.traverse(is_autofootnote_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            new_foot_refs: List[nodes.footnote_reference] = patch.traverse(is_autofootnote_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if len(list(old_foot_refs)) != len(list(new_foot_refs)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            old_foot_refs: List[nodes.footnote_reference] = list(node.traverse(is_autofootnote_ref))  # NOQA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            new_foot_refs: List[nodes.footnote_reference] = list(patch.traverse(is_autofootnote_ref))  # NOQA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if len(old_foot_refs) != len(new_foot_refs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 old_foot_ref_rawsources = [ref.rawsource for ref in old_foot_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 new_foot_ref_rawsources = [ref.rawsource for ref in new_foot_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.warning(__('inconsistent footnote references in translated message.' +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -339,9 +339,9 @@ def list_replace_or_append(lst: List[N], old: N, new: N) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # * use translated refname for section refname.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # * inline reference "`Python <...>`_" has no 'refname'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             is_refnamed_ref = NodeMatcher(nodes.reference, refname=Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            old_refs: List[nodes.reference] = node.traverse(is_refnamed_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            new_refs: List[nodes.reference] = patch.traverse(is_refnamed_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if len(list(old_refs)) != len(list(new_refs)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            old_refs: List[nodes.reference] = list(node.traverse(is_refnamed_ref))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            new_refs: List[nodes.reference] = list(patch.traverse(is_refnamed_ref))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if len(old_refs) != len(new_refs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 old_ref_rawsources = [ref.rawsource for ref in old_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 new_ref_rawsources = [ref.rawsource for ref in new_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.warning(__('inconsistent references in translated message.' +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -366,10 +366,10 @@ def list_replace_or_append(lst: List[N], old: N, new: N) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # refnamed footnote should use original 'ids'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             is_refnamed_footnote_ref = NodeMatcher(nodes.footnote_reference, refname=Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            old_foot_refs = node.traverse(is_refnamed_footnote_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            new_foot_refs = patch.traverse(is_refnamed_footnote_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            old_foot_refs = list(node.traverse(is_refnamed_footnote_ref))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            new_foot_refs = list(patch.traverse(is_refnamed_footnote_ref))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             refname_ids_map: Dict[str, List[str]] = {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if len(list(old_foot_refs)) != len(list(new_foot_refs)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if len(old_foot_refs) != len(new_foot_refs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 old_foot_ref_rawsources = [ref.rawsource for ref in old_foot_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 new_foot_ref_rawsources = [ref.rawsource for ref in new_foot_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.warning(__('inconsistent footnote references in translated message.' +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -385,10 +385,10 @@ def list_replace_or_append(lst: List[N], old: N, new: N) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # citation should use original 'ids'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             is_citation_ref = NodeMatcher(nodes.citation_reference, refname=Any)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            old_cite_refs: List[nodes.citation_reference] = node.traverse(is_citation_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            new_cite_refs: List[nodes.citation_reference] = patch.traverse(is_citation_ref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            old_cite_refs: List[nodes.citation_reference] = list(node.traverse(is_citation_ref))  # NOQA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            new_cite_refs: List[nodes.citation_reference] = list(patch.traverse(is_citation_ref))  # NOQA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             refname_ids_map = {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if len(list(old_cite_refs)) != len(list(new_cite_refs)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if len(old_cite_refs) != len(new_cite_refs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 old_cite_ref_rawsources = [ref.rawsource for ref in old_cite_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 new_cite_ref_rawsources = [ref.rawsource for ref in new_cite_refs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.warning(__('inconsistent citation references in translated message.' +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -405,10 +405,10 @@ def list_replace_or_append(lst: List[N], old: N, new: N) -> None:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # Original pending_xref['reftarget'] contain not-translated
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # target name, new pending_xref must use original one.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             # This code restricts to change ref-targets in the translation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            old_xrefs = node.traverse(addnodes.pending_xref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            new_xrefs = patch.traverse(addnodes.pending_xref)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            old_xrefs = list(node.traverse(addnodes.pending_xref))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            new_xrefs = list(patch.traverse(addnodes.pending_xref))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             xref_reftarget_map = {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if len(list(old_xrefs)) != len(list(new_xrefs)):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if len(old_xrefs) != len(new_xrefs):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 old_xref_rawsources = [xref.rawsource for xref in old_xrefs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 new_xref_rawsources = [xref.rawsource for xref in new_xrefs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 logger.warning(__('inconsistent term references in translated message.' +
</span></pre><pre style='margin:0'>

</pre>