fix: properly serialize header in outline

BREAKING CHANGE: default theme config option `outlineBadge` has been
removed. Badges in headers are now always excluded when generating
outline text.
pull/2056/head
Evan You 3 years ago
parent 8e55c819dc
commit 8ab36d05fa

@ -168,6 +168,7 @@ export type SidebarItem = {
- Type: `boolean` - Type: `boolean`
- Default: `true` - Default: `true`
- Can be overridden per page via [frontmatter](./frontmatter-config#aside)
Setting this value to `false` prevents rendering of aside container. Setting this value to `false` prevents rendering of aside container.
@ -175,16 +176,10 @@ Setting this value to `false` prevents rendering of aside container.
- Type: `number | [number, number] | 'deep' | false` - Type: `number | [number, number] | 'deep' | false`
- Default: `2` - Default: `2`
- Can be overridden per page via [frontmatter](./frontmatter-config#outline)
The levels of header to display in the outline. You can specify a particular level by passing a number, or you can provide a level range by passing a tuple containing the bottom and upper limits. When passing `'deep'` which equals `[2, 6]`, all header levels are shown in the outline except `h1`. Set `false` to hide outline. The levels of header to display in the outline. You can specify a particular level by passing a number, or you can provide a level range by passing a tuple containing the bottom and upper limits. When passing `'deep'` which equals `[2, 6]`, all header levels are shown in the outline except `h1`. Set `false` to hide outline.
## outlineBadges
- Type: `boolean`
- Default: `true`
By default the badge text is displayed in the outline. Disable this to hide badge text from outline.
## outlineTitle ## outlineTitle
- Type: `string` - Type: `string`

@ -11,13 +11,13 @@ export type MenuItem = Omit<Header, 'slug' | 'children'> & {
children?: MenuItem[] children?: MenuItem[]
} }
export function getHeaders(range?: DefaultTheme.Config['outline']) { export function getHeaders(range: DefaultTheme.Config['outline']) {
const headers = [...document.querySelectorAll('.VPDoc h2,h3,h4,h5,h6')] const headers = [...document.querySelectorAll('.VPDoc h2,h3,h4,h5,h6')]
.filter((el) => el.id && el.firstChild && el.firstChild.nodeType === 3) .filter((el) => el.id && el.hasChildNodes())
.map((el) => { .map((el) => {
const level = Number(el.tagName[1]) const level = Number(el.tagName[1])
return { return {
title: (el.firstChild as Text).data.trim(), title: serializeHeader(el),
link: '#' + el.id, link: '#' + el.id,
level level
} }
@ -26,6 +26,24 @@ export function getHeaders(range?: DefaultTheme.Config['outline']) {
return resolveHeaders(headers, range) return resolveHeaders(headers, range)
} }
function serializeHeader(h: Element): string {
let ret = ''
for (const node of h.childNodes) {
if (node.nodeType === 1) {
if (
(node as Element).classList.contains('VPBadge') ||
(node as Element).classList.contains('header-anchor')
) {
continue
}
ret += node.textContent
} else if (node.nodeType === 3) {
ret += node.textContent
}
}
return ret
}
export function resolveHeaders( export function resolveHeaders(
headers: MenuItem[], headers: MenuItem[],
range?: DefaultTheme.Config['outline'] range?: DefaultTheme.Config['outline']

@ -22,13 +22,6 @@ export namespace DefaultTheme {
*/ */
outline?: Outline | Outline['level'] | false outline?: Outline | Outline['level'] | false
/**
* Disable this to hide badge text from outline.
*
* @default true
*/
outlineBadges?: boolean
/** /**
* @deprecated * @deprecated
* Use `outline.label` instead. * Use `outline.label` instead.

Loading…
Cancel
Save