diff options
| author | milde <milde@929543f6-e4f2-0310-98a6-ba3bd3dd1d04> | 2019-09-06 13:16:34 +0000 |
|---|---|---|
| committer | milde <milde@929543f6-e4f2-0310-98a6-ba3bd3dd1d04> | 2019-09-06 13:16:34 +0000 |
| commit | 17d59666c3a1125e476da31f490b661b4995e736 (patch) | |
| tree | 71973e3a502b924f4dc56918489816cac45efd60 | |
| parent | 96455289280fa75f2efc880fb459b105c466df26 (diff) | |
| download | docutils-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.py | 2 | ||||
| -rw-r--r-- | docutils/docutils/transforms/universal.py | 44 | ||||
| -rw-r--r-- | docutils/docutils/writers/latex2e/__init__.py | 12 | ||||
| -rwxr-xr-x | docutils/test/test_transforms/test_strip_comments.py | 2 |
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"> |
