-
Notifications
You must be signed in to change notification settings - Fork 90
Expand file tree
/
Copy pathbreadcrumbs.ts
More file actions
49 lines (41 loc) · 1.09 KB
/
breadcrumbs.ts
File metadata and controls
49 lines (41 loc) · 1.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import Page from '../models/page.js';
type BreadcrumbItem = {
title: string;
href: string | null;
isEllipsis?: boolean;
};
function hrefForPage(p: Page): string {
if (p.uri) {
return `/${p.uri}`;
}
return `/page/${p._id}`;
}
/**
* At most 3 segments after "Documentation": first ancestor, optional middle ellipsis, current page.
* Shallow trees (≤2 segments) show everything without ellipsis.
*/
function collapseToFirstEllipsisCurrent(items: BreadcrumbItem[]): BreadcrumbItem[] {
if (items.length <= 2) {
return items;
}
return [
items[0],
{ title: '…', href: null, isEllipsis: true },
items[items.length - 1],
];
}
/**
* Breadcrumb trail: ancestors (linked) + current page (plain text, last).
*/
export async function buildPageBreadcrumbs(page: Page): Promise<BreadcrumbItem[]> {
const ancestors = await page.getAncestorChain();
const items: BreadcrumbItem[] = ancestors.map(a => ({
title: a.title ?? '',
href: hrefForPage(a),
}));
items.push({
title: page.title ?? '',
href: null,
});
return collapseToFirstEllipsisCurrent(items);
}