feat: add multi sidebar support

pull/49/head
Kia Ishii 5 years ago
parent 582c5255e2
commit de1dfe2b06

@ -1,7 +1,7 @@
import { useSiteData, usePageData, useRoute } from 'vitepress' import { useSiteData, usePageData, useRoute } from 'vitepress'
import { computed, h, FunctionalComponent, VNode } from 'vue' import { computed, h, FunctionalComponent, VNode } from 'vue'
import { Header } from '../../../../types/shared' import { Header } from '../../../../types/shared'
import { isActive } from '../utils' import { isActive, resolvePath } from '../utils'
import { DefaultTheme } from '../config' import { DefaultTheme } from '../config'
import { useActiveSidebarLinks } from '../composables/activeSidebarLink' import { useActiveSidebarLinks } from '../composables/activeSidebarLink'
@ -62,7 +62,12 @@ export default {
} else if (themeSidebar === false) { } else if (themeSidebar === false) {
return [] return []
} else if (typeof themeSidebar === 'object') { } else if (typeof themeSidebar === 'object') {
return resolveMultiSidebar(themeSidebar, route.path, sidebarDepth) return resolveMultiSidebar(
themeSidebar,
route.path,
headers,
sidebarDepth
)
} }
} }
}) })
@ -117,8 +122,19 @@ function resolveArraySidebar(
function resolveMultiSidebar( function resolveMultiSidebar(
config: DefaultTheme.MultiSideBarConfig, config: DefaultTheme.MultiSideBarConfig,
path: string, path: string,
headers: Header[],
depth: number depth: number
): ResolvedSidebar { ): ResolvedSidebar {
const item = config[resolvePath(path)]
if (Array.isArray(item)) {
return resolveArraySidebar(item, depth)
}
if (item === 'auto') {
return resolveAutoSidebar(headers, depth)
}
return [] return []
} }

@ -21,3 +21,22 @@ export function isActive(route: Route, path?: string): boolean {
export function normalize(path: string): string { export function normalize(path: string): string {
return decodeURI(path).replace(hashRE, '').replace(extRE, '') return decodeURI(path).replace(hashRE, '').replace(extRE, '')
} }
/**
* get the path without filename (the last segment). for example, if the given
* path is `/guide/getting-started.html`, this method will return `/guide/`.
* Always with a trailing slash.
*/
export function resolvePath(path: string): string {
const segments = path.split('/')
if (segments[segments.length - 1]) {
segments.pop()
}
return ensureEndingSlash(segments.join('/'))
}
export function ensureEndingSlash(path: string): string {
return /(\.html|\/)$/.test(path) ? path : `${path}/`
}

Loading…
Cancel
Save