summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormilde <milde@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2019-09-06 13:16:34 +0000
committermilde <milde@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2019-09-06 13:16:34 +0000
commit17d59666c3a1125e476da31f490b661b4995e736 (patch)
tree71973e3a502b924f4dc56918489816cac45efd60
parent96455289280fa75f2efc880fb459b105c466df26 (diff)
downloaddocutils-17d59666c3a1125e476da31f490b661b4995e736.tar.gz
Do not rely on `nodes.Node.traverse()` returning a "list" instance.
While the current implementation actually returns a list of nodes, the docstring specifies only: "Return an iterable ...". git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8387 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-rw-r--r--docutils/docutils/transforms/references.py2
-rw-r--r--docutils/docutils/transforms/universal.py44
-rw-r--r--docutils/docutils/writers/latex2e/__init__.py12
-rwxr-xr-xdocutils/test/test_transforms/test_strip_comments.py2
4 files changed, 32 insertions, 28 deletions
diff --git a/docutils/docutils/transforms/references.py b/docutils/docutils/transforms/references.py
index d2490a23d..4e8eb16c9 100644
--- a/docutils/docutils/transforms/references.py
+++ b/docutils/docutils/transforms/references.py
@@ -663,7 +663,7 @@ class Substitutions(Transform):
def apply(self):
defs = self.document.substitution_defs
normed = self.document.substitution_names
- subreflist = self.document.traverse(nodes.substitution_reference)
+ subreflist = list(self.document.traverse(nodes.substitution_reference))
nested = {}
for ref in subreflist:
refname = ref['refname']
diff --git a/docutils/docutils/transforms/universal.py b/docutils/docutils/transforms/universal.py
index 8e71842b1..aca1af3e4 100644
--- a/docutils/docutils/transforms/universal.py
+++ b/docutils/docutils/transforms/universal.py
@@ -144,7 +144,7 @@ class FilterMessages(Transform):
default_priority = 870
def apply(self):
- for node in self.document.traverse(nodes.system_message):
+ for node in list(self.document.traverse(nodes.system_message)):
if node['level'] < self.document.reporter.report_level:
node.parent.remove(node)
@@ -176,7 +176,7 @@ class StripComments(Transform):
def apply(self):
if self.document.settings.strip_comments:
- for node in self.document.traverse(nodes.comment):
+ for node in list(self.document.traverse(nodes.comment)):
node.parent.remove(node)
@@ -191,27 +191,31 @@ class StripClassesAndElements(Transform):
default_priority = 420
def apply(self):
- if not (self.document.settings.strip_elements_with_classes
- or self.document.settings.strip_classes):
+ if self.document.settings.strip_elements_with_classes:
+ self.strip_elements = set(
+ self.document.settings.strip_elements_with_classes)
+ # Iterate over a list as removing the current node
+ # corrupts the iterator returned by `traverse`:
+ for node in list(self.document.traverse(self.check_classes)):
+ node.parent.remove(node)
+
+ if not self.document.settings.strip_classes:
return
- # prepare dicts for lookup (not sets, for Python 2.2 compatibility):
- self.strip_elements = dict(
- [(key, None)
- for key in (self.document.settings.strip_elements_with_classes
- or [])])
- self.strip_classes = dict(
- [(key, None) for key in (self.document.settings.strip_classes
- or [])])
- for node in self.document.traverse(self.check_classes):
- node.parent.remove(node)
+ strip_classes = self.document.settings.strip_classes
+ for node in self.document.traverse(nodes.Element):
+ for class_value in strip_classes:
+ try:
+ node['classes'].remove(class_value)
+ except ValueError:
+ pass
def check_classes(self, node):
- if isinstance(node, nodes.Element):
- for class_value in node['classes'][:]:
- if class_value in self.strip_classes:
- node['classes'].remove(class_value)
- if class_value in self.strip_elements:
- return 1
+ if not isinstance(node, nodes.Element):
+ return False
+ for class_value in node['classes'][:]:
+ if class_value in self.strip_elements:
+ return True
+ return False
class SmartQuotes(Transform):
diff --git a/docutils/docutils/writers/latex2e/__init__.py b/docutils/docutils/writers/latex2e/__init__.py
index 50159230c..6c42180f1 100644
--- a/docutils/docutils/writers/latex2e/__init__.py
+++ b/docutils/docutils/writers/latex2e/__init__.py
@@ -1815,13 +1815,11 @@ class LaTeXTranslator(nodes.NodeVisitor):
if self._use_latex_citations:
followup_citation = False
# check for a following citation separated by a space or newline
- next_siblings = node.traverse(descend=False, siblings=True,
- include_self=False)
- if len(next_siblings) > 1:
- next = next_siblings[0]
- if (isinstance(next, nodes.Text) and
- next.astext() in (' ', '\n')):
- if next_siblings[1].__class__ == node.__class__:
+ sibling = node.next_node(descend=False, siblings=True)
+ if (isinstance(sibling, nodes.Text)
+ and sibling.astext() in (' ', '\n')):
+ sibling2 = sibling.next_node(descend=False, siblings=True)
+ if isinstance(sibling2, nodes.citation_reference):
followup_citation = True
if followup_citation:
self.out.append(',')
diff --git a/docutils/test/test_transforms/test_strip_comments.py b/docutils/test/test_transforms/test_strip_comments.py
index 436fbe94f..12226dee0 100755
--- a/docutils/test/test_transforms/test_strip_comments.py
+++ b/docutils/test/test_transforms/test_strip_comments.py
@@ -31,6 +31,8 @@ Title
=====
Paragraph.
+
+.. second comment
""",
"""\
<document source="test data">