fix: Handle nested collapsed headings in findCollapsedNodes (#8223)

This commit is contained in:
WEI-HUA CHIEN
2025-01-12 00:59:40 +08:00
committed by GitHub
parent e910ecf559
commit 3998a80ae9

View File

@@ -5,27 +5,26 @@ export function findCollapsedNodes(doc: Node): NodeWithPos[] {
const blocks = findBlockNodes(doc);
const nodes: NodeWithPos[] = [];
let withinCollapsedHeading;
const collapsedStack: number[] = [];
for (const block of blocks) {
if (block.node.type.name === "heading") {
if (
!withinCollapsedHeading ||
block.node.attrs.level <= withinCollapsedHeading
) {
if (block.node.attrs.collapsed) {
if (!withinCollapsedHeading) {
withinCollapsedHeading = block.node.attrs.level;
}
} else {
withinCollapsedHeading = undefined;
}
continue;
}
}
if (collapsedStack.length) {
const top = collapsedStack[collapsedStack.length - 1];
// if the block encountered same or higher level heading, pop the stack
if (block.node.type.name === "heading" && block.node.attrs.level <= top) {
collapsedStack.pop();
if (withinCollapsedHeading) {
nodes.push(block);
// if the block is a heading and it is collapsed, push it to the stack
if (block.node.attrs.collapsed) {
collapsedStack.push(block.node.attrs.level);
}
} else {
// the deepest level or non-heading block should be added to the nodes
nodes.push(block);
}
} else {
if (block.node.type.name === "heading" && block.node.attrs.collapsed) {
collapsedStack.push(block.node.attrs.level);
}
}
}