Skip to content

Commit 68d2ae7

Browse files
authored
collapse only child (#1297)
1 parent faacb9b commit 68d2ae7

File tree

2 files changed

+58
-37
lines changed

2 files changed

+58
-37
lines changed

src/tree.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,22 @@ export function tree<T>(
2525
)([...items, ["/"]]) // add root to avoid implicit truncation
2626
.sort(treeOrder)
2727
.count()
28+
.eachAfter((node: TreeNode<T>) => {
29+
const children = node.children;
30+
if (!children) return;
31+
let height = 0;
32+
for (let i = 0; i < children.length; ++i) {
33+
let child = children[i];
34+
if (child.children?.length === 1) {
35+
child = child.children![0];
36+
children[i] = child;
37+
child.parent = node;
38+
--child.depth;
39+
}
40+
height = Math.max(height, child.height + 1);
41+
}
42+
node.height = height;
43+
})
2844
.eachBefore((node: TreeNode<T>) => {
2945
let p = node;
3046
let indent = "";
@@ -36,7 +52,7 @@ export function tree<T>(
3652
}
3753
lines.push([
3854
indent || "┌",
39-
`${node.id.split("/").pop()?.replace(/\?$/, "")}`,
55+
node.id.slice(node.parent?.id === "/" ? 1 : (node.parent?.id.length ?? 0) + 1).replace(/\?$/, ""),
4056
node.height ? ` (${node.value.toLocaleString("en-US")} page${node.value === 1 ? "" : "s"})` : "",
4157
node
4258
]);

test/tree-test.ts

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,55 @@ function stree(items: string[]): string[] {
66
}
77

88
describe("tree(items, options)", () => {
9-
it("creates implicit internal nodes", () => {
9+
it("collapses single-child nodes", () => {
1010
assert.deepStrictEqual(stree(["/a/b/c/d"]), [
11-
"┌ (1 page) ",
12-
"└── a (1 page) ",
13-
"    └── b (1 page) ",
14-
"       └── c (1 page) ",
15-
"          └── d "
11+
"┌ (1 page) ",
12+
"└── a/b/c/d "
13+
]); // prettier-ignore
14+
});
15+
it("collapses single-child nodes", () => {
16+
assert.deepStrictEqual(stree(["/a/b/c/d", "/a/b/c/e"]), [
17+
"┌ (2 pages) ",
18+
"└── a/b/c (2 pages) ",
19+
"    ├── d ",
20+
"    └── e "
1621
]);
1722
});
23+
it("creates implicit internal nodes", () => {
24+
assert.deepStrictEqual(stree(["/a/b/c/d"]), [
25+
"┌ (1 page) ",
26+
"└── a/b/c/d "
27+
]); // prettier-ignore
28+
});
1829
it("removes the .md extension, if present", () => {
1930
assert.deepStrictEqual(stree(["/a/b/c/a.md", "/a/b/c/b.md", "/a/b/c/c.md", "/a/b/c/d.md"]), [
20-
"┌ (4 pages) ",
21-
"└── a (4 pages) ",
22-
"    └── b (4 pages) ",
23-
"       └── c (4 pages) ",
24-
"          ├── a ",
25-
"          ├── b ",
26-
"          ├── c ",
27-
"          └── d "
31+
"┌ (4 pages) ",
32+
"└── a/b/c (4 pages) ",
33+
"    ├── a ",
34+
"    ├── b ",
35+
"    ├── c ",
36+
"    └── d "
2837
]);
2938
});
3039
it("handles multiple leaves", () => {
3140
assert.deepStrictEqual(stree(["/a/b/c/a", "/a/b/c/b", "/a/b/c/c", "/a/b/c/d"]), [
32-
"┌ (4 pages) ",
33-
"└── a (4 pages) ",
34-
"    └── b (4 pages) ",
35-
"       └── c (4 pages) ",
36-
"          ├── a ",
37-
"          ├── b ",
38-
"          ├── c ",
39-
"          └── d "
41+
"┌ (4 pages) ",
42+
"└── a/b/c (4 pages) ",
43+
"    ├── a ",
44+
"    ├── b ",
45+
"    ├── c ",
46+
"    └── d "
4047
]);
4148
});
4249
it("handles leaves at different levels", () => {
4350
assert.deepStrictEqual(stree(["/a", "/a/b", "/a/b/c", "/a/b/c/d"]), [
44-
"┌ (4 pages) ",
45-
"├── a (3 pages) ",
46-
"│   ├── b (2 pages) ",
47-
"│   │   ├── c (1 page) ",
48-
"│   │   │   └── d ",
49-
"│   │   └── c ",
50-
"│   └── b ",
51-
"└── a "
51+
"┌ (4 pages) ",
52+
"├── a (3 pages) ",
53+
"│   ├── b (2 pages) ",
54+
"│   │   ├── c/d ",
55+
"│   │   └── c ",
56+
"│   └── b ",
57+
"└── a "
5258
]);
5359
});
5460
it("sorts nodes", () => {
@@ -62,12 +68,11 @@ describe("tree(items, options)", () => {
6268
});
6369
it("sorts folders before files", () => {
6470
assert.deepStrictEqual(stree(["/d/a", "/b", "/c", "/a"]), [
65-
"┌ (4 pages) ",
66-
"├── d (1 page) ",
67-
"│   └── a ",
68-
"├── a ",
69-
"├── b ",
70-
"└── c "
71+
"┌ (4 pages) ",
72+
"├── d/a ",
73+
"├── a ",
74+
"├── b ",
75+
"└── c "
7176
]);
7277
});
7378
it("sorts nested folders", () => {

0 commit comments

Comments
 (0)