mirror of
https://gitee.com/element-plus/element-plus.git
synced 2024-12-14 17:31:02 +08:00
87 lines
2.2 KiB
TypeScript
87 lines
2.2 KiB
TypeScript
|
import { computed } from 'vue'
|
||
|
import { useRoute, useData } from 'vitepress'
|
||
|
import { isArray, ensureStartingSlash, removeExtention } from '../utils'
|
||
|
import { useLang } from './lang'
|
||
|
|
||
|
export const useSidebar = () => {
|
||
|
const route = useRoute()
|
||
|
const { site, page } = useData()
|
||
|
const lang = useLang()
|
||
|
if (!page.value) {
|
||
|
return {
|
||
|
sidebars: computed(() => []),
|
||
|
hasSidebar: computed(() => false),
|
||
|
}
|
||
|
}
|
||
|
const sidebars = computed(() => {
|
||
|
if (page.value.frontmatter.sidebar === false) return []
|
||
|
const sidebars = getSidebarConfig(
|
||
|
site.value.themeConfig.sidebars,
|
||
|
route.data.relativePath,
|
||
|
lang.value
|
||
|
)
|
||
|
return sidebars
|
||
|
})
|
||
|
|
||
|
return {
|
||
|
sidebars,
|
||
|
hasSidebar: computed(() => sidebars.value.length > 0),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export function isSideBarConfig(sidebar) {
|
||
|
return sidebar === false || sidebar === 'auto' || isArray(sidebar)
|
||
|
}
|
||
|
export function isSideBarGroup(item) {
|
||
|
return item.children !== undefined
|
||
|
}
|
||
|
export function isSideBarEmpty(sidebar) {
|
||
|
return isArray(sidebar) ? sidebar.length === 0 : !sidebar
|
||
|
}
|
||
|
|
||
|
type SidebarItem = {
|
||
|
text: string
|
||
|
link: string
|
||
|
}
|
||
|
|
||
|
type SidebarConfig = SidebarItem[]
|
||
|
|
||
|
type Sidebar =
|
||
|
| {
|
||
|
[key: string]: SidebarConfig
|
||
|
}
|
||
|
| false
|
||
|
| 'auto'
|
||
|
|
||
|
export function getSidebarConfig(sidebar: Sidebar, path: string, lang: string) {
|
||
|
if (sidebar === false || Array.isArray(sidebar) || sidebar === 'auto') {
|
||
|
return []
|
||
|
}
|
||
|
|
||
|
path = ensureStartingSlash(path)
|
||
|
for (const dir in sidebar) {
|
||
|
// make sure the multi sidebar key starts with slash too
|
||
|
if (path.startsWith(ensureStartingSlash(`${lang}${dir}`))) {
|
||
|
return sidebar[dir][lang]
|
||
|
}
|
||
|
}
|
||
|
return []
|
||
|
}
|
||
|
/**
|
||
|
* Get flat sidebar links from the sidebar items. This method is useful for
|
||
|
* creating the "next and prev link" feature. It will ignore any items that
|
||
|
* don't have `link` property and removes `.md` or `.html` extension if a
|
||
|
* link contains it.
|
||
|
*/
|
||
|
export function getFlatSideBarLinks(sidebar) {
|
||
|
return sidebar.reduce((links, item) => {
|
||
|
if (item.link) {
|
||
|
links.push({ text: item.text, link: removeExtention(item.link) })
|
||
|
}
|
||
|
if (isSideBarGroup(item)) {
|
||
|
links = [...links, ...getFlatSideBarLinks(item.children)]
|
||
|
}
|
||
|
return links
|
||
|
}, [])
|
||
|
}
|