summaryrefslogtreecommitdiff
path: root/numpydoc/numpydoc.py
diff options
context:
space:
mode:
Diffstat (limited to 'numpydoc/numpydoc.py')
-rw-r--r--numpydoc/numpydoc.py29
1 files changed, 23 insertions, 6 deletions
diff --git a/numpydoc/numpydoc.py b/numpydoc/numpydoc.py
index 8210006..e656fb5 100644
--- a/numpydoc/numpydoc.py
+++ b/numpydoc/numpydoc.py
@@ -43,6 +43,19 @@ logger = logging.getLogger(__name__)
HASH_LEN = 12
+def _traverse_or_findall(node, condition, **kwargs):
+ """Triage node.traverse (docutils <0.18.1) vs node.findall.
+
+ TODO: This check can be removed when the minimum supported docutils version
+ for numpydoc is docutils>=0.18.1
+ """
+ return (
+ node.findall(condition, **kwargs)
+ if hasattr(node, "findall")
+ else node.traverse(condition, **kwargs)
+ )
+
+
def rename_references(app, what, name, obj, options, lines):
# decorate reference numbers so that there are no duplicates
# these are later undecorated in the doctree, in relabel_references
@@ -81,8 +94,12 @@ def _is_cite_in_numpydoc_docstring(citation_node):
return False
sibling_sections = itertools.chain(
- section_node.traverse(
- is_docstring_section, include_self=True, descend=False, siblings=True
+ _traverse_or_findall(
+ section_node,
+ is_docstring_section,
+ include_self=True,
+ descend=False,
+ siblings=True,
)
)
for sibling_section in sibling_sections:
@@ -101,7 +118,7 @@ def _is_cite_in_numpydoc_docstring(citation_node):
def relabel_references(app, doc):
# Change 'hash-ref' to 'ref' in label text
- for citation_node in doc.traverse(citation):
+ for citation_node in _traverse_or_findall(doc, citation):
if not _is_cite_in_numpydoc_docstring(citation_node):
continue
label_node = citation_node[0]
@@ -121,7 +138,7 @@ def relabel_references(app, doc):
and node[0].astext() == f"[{ref_text}]"
)
- for xref_node in ref.parent.traverse(matching_pending_xref):
+ for xref_node in _traverse_or_findall(ref.parent, matching_pending_xref):
xref_node.replace(xref_node[0], Text(f"[{new_text}]"))
ref.replace(ref_text, new_text.copy())
@@ -129,10 +146,10 @@ def relabel_references(app, doc):
def clean_backrefs(app, doc, docname):
# only::latex directive has resulted in citation backrefs without reference
known_ref_ids = set()
- for ref in doc.traverse(reference, descend=True):
+ for ref in _traverse_or_findall(doc, reference, descend=True):
for id_ in ref["ids"]:
known_ref_ids.add(id_)
- for citation_node in doc.traverse(citation, descend=True):
+ for citation_node in _traverse_or_findall(doc, citation, descend=True):
# remove backrefs to non-existent refs
citation_node["backrefs"] = [
id_ for id_ in citation_node["backrefs"] if id_ in known_ref_ids