Skip to content

Commit c22fded

Browse files
committedJun 30, 2024
fix(toc): fix headers is empty in toc
- Set `headers: true` in markdown config - Refactor `useToc` to fit new apis Related Issue: DevCloudFE#1879
1 parent bdc8cee commit c22fded

File tree

3 files changed

+31
-50
lines changed

3 files changed

+31
-50
lines changed
 

‎packages/devui-vue/docs/.vitepress/config.mts

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default defineConfig({
1111

1212
head,
1313
markdown: {
14+
headers: true,
1415
config: (md) => {
1516
md.use(demoblockPlugin as any);
1617
},

‎packages/devui-vue/docs/.vitepress/devui-theme/composables/activeBar.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export function useActiveSidebarLinks(container: Ref<HTMLElement>, marker: Ref<H
4747
let prevActiveLink: HTMLAnchorElement | null = null;
4848

4949
function activateLink(hash: string) {
50-
prevActiveLink && deactiveLink(prevActiveLink);
50+
prevActiveLink && deactivateLink(prevActiveLink);
5151

5252
const activeLink = (prevActiveLink =
5353
hash == null
@@ -64,7 +64,7 @@ export function useActiveSidebarLinks(container: Ref<HTMLElement>, marker: Ref<H
6464
}
6565
}
6666

67-
function deactiveLink(link: HTMLElement) {
67+
function deactivateLink(link: HTMLElement) {
6868
link && link.classList.remove('active');
6969
}
7070

Original file line numberDiff line numberDiff line change
@@ -1,59 +1,39 @@
1-
import { computed } from 'vue'
2-
import { useData } from 'vitepress'
3-
import { joinUrl } from '../utils'
1+
import { computed } from 'vue';
2+
import { useData } from 'vitepress';
43

5-
import type { PageData } from 'vitepress'
4+
import type { PageData, Header } from 'vitepress';
65

7-
type EnhanceArrayElement<T, P> = T extends Array<infer U> ? (U & P)[] : never
6+
type EnhanceArrayElement<T, P> = T extends Array<infer U> ? (U & P)[] : never;
87

98
type Headers = EnhanceArrayElement<
109
PageData['headers'],
1110
{
12-
children?: Headers
11+
children?: Headers;
1312
}
14-
>
13+
>;
1514

1615
export const useToc = () => {
17-
const { page } = useData()
18-
19-
return computed(() => resolveHeaders(page.value.headers))
20-
}
21-
22-
export const resolveLink = (base: string, path: string) => {
23-
if (path === undefined) {
24-
return path
25-
}
26-
// keep relative hash to the same page
27-
if (path.startsWith('#')) {
28-
return path
29-
}
30-
return joinUrl(base, path)
31-
}
32-
33-
export const resolveHeaders = (headers: PageData['headers']) => {
34-
if (!headers) return;
35-
36-
return mapHeaders(groupHeaders(headers))
37-
}
38-
39-
export function groupHeaders(headers: PageData['headers']) {
40-
headers = headers.map((h) => Object.assign({}, h))
41-
let lastH2
42-
43-
headers.forEach((h) => {
44-
if (h.level === 3) {
45-
lastH2 = h
46-
} else if (lastH2) {
47-
;(lastH2.children || (lastH2.children = [])).push(h)
48-
}
49-
})
50-
return headers.filter((h) => h.level === 3)
51-
}
52-
53-
export function mapHeaders(headers: Headers) {
54-
return headers.map((header) => ({
16+
const { page } = useData();
17+
18+
return computed(() => resolveHeaders(page.value.headers));
19+
};
20+
21+
export const resolveHeaders = (_headers: PageData['headers']) => {
22+
if (!_headers) return;
23+
24+
let headers = Array<Header>();
25+
_headers.forEach((h: Header) => {
26+
console.log(h, h.level);
27+
if (h.level === 2) {
28+
headers.push(h);
29+
h.children.forEach((h: Header) => {
30+
if (h.level === 3) headers.push(h);
31+
});
32+
} else if (h.level === 3) headers.push(h);
33+
});
34+
return headers.map((header: Header) => ({
5535
text: header.title,
5636
link: `#${header.slug}`,
57-
children: header.children ? mapHeaders(header.children) : undefined,
58-
}))
59-
}
37+
children: undefined,
38+
}));
39+
};

0 commit comments

Comments
 (0)
Please sign in to comment.