Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix _toctree_copy with multi level 'only' nodes. #13133

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions sphinx/environment/adapters/toctree.py
Original file line number Diff line number Diff line change
Expand Up @@ -465,15 +465,13 @@ def _toctree_add_classes(node: Element, depth: int, docname: str) -> None:
ET = TypeVar('ET', bound=Element)


def _toctree_copy(
node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tags
) -> ET:
def _toctree_copy_children(
copy: ET, node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tags
) -> None:
"""Utility: Cut and deep-copy a TOC at a specified depth."""
keep_bullet_list_sub_nodes = depth <= 1 or (
(depth <= maxdepth or maxdepth <= 0) and (not collapse or 'iscurrent' in node)
)

copy = node.copy()
for subnode in node.children:
if isinstance(subnode, addnodes.compact_paragraph | nodes.list_item):
# for <p> and <li>, just recurse
Expand All @@ -489,18 +487,11 @@ def _toctree_copy(
# copy sub toctree nodes for later processing
copy.append(subnode.copy())
elif isinstance(subnode, addnodes.only):
# only keep children if the only node matches the tags
# Only keep its children if the 'only' node matches the tags. When
# matching, call recursively the current function without
# incrementing the depth as 'only' nodes are not toctree nodes.
if _only_node_keep_children(subnode, tags):
for child in subnode.children:
copy.append(
_toctree_copy(
child,
depth,
maxdepth,
collapse,
tags, # type: ignore[type-var]
)
)
_toctree_copy_children(copy, subnode, depth, maxdepth, collapse, tags)
elif isinstance(subnode, nodes.reference | nodes.title):
# deep copy references and captions
sub_node_copy = subnode.copy()
Expand All @@ -511,6 +502,15 @@ def _toctree_copy(
else:
msg = f'Unexpected node type {subnode.__class__.__name__!r}!'
raise ValueError(msg)

return copy


def _toctree_copy(
node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tags
) -> ET:
copy = node.copy()
_toctree_copy_children(copy, node, depth, maxdepth, collapse, tags)
return copy


Expand Down
Loading