diff --git a/theme/src/client/components/VPDoc.vue b/theme/src/client/components/VPDoc.vue index a5099149..78ed99f0 100644 --- a/theme/src/client/components/VPDoc.vue +++ b/theme/src/client/components/VPDoc.vue @@ -6,6 +6,7 @@ import VPDocAside from '@theme/VPDocAside.vue' import VPDocFooter from '@theme/VPDocFooter.vue' import VPEncryptPage from '@theme/VPEncryptPage.vue' import VPDocMeta from '@theme/VPDocMeta.vue' +import VPDocBreadcrumbs from '@theme/VPDocBreadcrumbs.vue' import { useBlogPageData, useData, @@ -116,6 +117,7 @@ watch(
+ +import { computed } from 'vue' +import { useRouteLocale } from 'vuepress/client' +import VPLink from '@theme/VPLink.vue' +import { + useBlogExtract, + useBlogNavTitle, + useBlogPageData, + useData, + useSidebarData, +} from '../composables/index.js' +import type { ResolvedSidebarItem } from '../../shared/index.js' + +interface Breadcrumb { + text: string + link?: string + current?: boolean +} + +const { page } = useData<'post'>() +const routeLocale = useRouteLocale() +const { isBlogPost } = useBlogPageData() +const { categoriesLink, blogLink } = useBlogExtract() +const sidebar = useSidebarData() + +const hasBreadcrumb = computed(() => { + if (isBlogPost.value && page.value.categoryList) + return page.value.categoryList.length > 0 + return sidebar.value.length > 0 +}) +const homeTitle = useBlogNavTitle('home') +const blogTile = useBlogNavTitle('blog') + +const breadcrumbList = computed(() => { + if (!hasBreadcrumb.value) + return [] + const list: Breadcrumb[] = [{ text: homeTitle.value, link: routeLocale.value }] + + if (isBlogPost.value) { + list.push({ text: blogTile.value, link: blogLink.value }) + const categoryList = page.value.categoryList ?? [] + for (const category of categoryList) { + list.push({ + text: category.name, + link: `${categoriesLink.value}?id=${category.id}`, + }) + } + } + else if (sidebar.value.length > 0) { + list.push(...(resolveSidebar(sidebar.value) || [])) + } + list.push({ text: page.value.title, link: page.value.path, current: true }) + return list +}) + +function resolveSidebar( + sidebar: ResolvedSidebarItem[], + result: Breadcrumb[] = [], +): Breadcrumb[] | null { + for (const item of sidebar) { + if (item.link === page.value.path) { + return result + } + else if (item.items) { + const res = resolveSidebar( + item.items, + [...result, { text: item.text!, link: item.link }], + ) + if (res) + return res + } + } + return null +} + + + + + diff --git a/theme/src/client/components/VPDocMeta.vue b/theme/src/client/components/VPDocMeta.vue index ed298519..db794b2c 100644 --- a/theme/src/client/components/VPDocMeta.vue +++ b/theme/src/client/components/VPDocMeta.vue @@ -1,19 +1,11 @@