From 3adc965dd09490b7efa1cce9f09b0a3b30970277 Mon Sep 17 00:00:00 2001 From: 简律纯 Date: Wed, 19 Apr 2023 17:30:39 +0800 Subject: ✨优化文档 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/composables/useDocus.ts | 88 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 docs/composables/useDocus.ts (limited to 'docs/composables/useDocus.ts') diff --git a/docs/composables/useDocus.ts b/docs/composables/useDocus.ts new file mode 100644 index 0000000..f86c573 --- /dev/null +++ b/docs/composables/useDocus.ts @@ -0,0 +1,88 @@ +export const useDocus = () => { + const docus = computed(() => useAppConfig()?.docus || {}) + const { navPageFromPath, navDirFromPath, navKeyFromPath } = useContentHelpers() + const { navigation, page } = useContent() + const route = useRoute() + + /** + * Returns fallbacked values for `main`, `header`, `aside` and `footer`. + * + * It allows to configure `app.config` per page/_dir. + */ + const config = computed( + () => { + const titleTemplate = docus?.value?.titleTemplate || navKeyFromPath(page?.value?._path, 'titleTemplate', navigation.value || []) || `%s · ${docus?.value?.title || 'Docus'}` + const main = docus?.value?.main || {} + const header = docus?.value?.header || {} + const aside = docus?.value?.aside || {} + const footer = docus?.value?.footer || {} + + return { + // Raw appConfig + ...docus.value, + + // Merged attributes + titleTemplate, + main: { + ...main, + ...navKeyFromPath(route.path, 'main', navigation.value || []), + ...page.value?.main + } as typeof main, + header: { + ...header, + ...navKeyFromPath(route.path, 'header', navigation.value || []), + ...page.value?.header + } as typeof header, + aside: { + ...aside, + ...navKeyFromPath(route.path, 'aside', navigation.value || []), + ...page.value?.aside + } as typeof aside, + footer: { + ...footer, + ...navKeyFromPath(route.path, 'footer', navigation.value || []), + ...page.value?.footer + } as typeof footer + } + } + ) + + /** + * Current aside tree. + */ + const tree = computed(() => { + let nav = navigation.value || [] + const _path = route.path + const level = config?.value?.aside?.level || 0 + const filtered = config?.value?.aside?.exclude || [] + + if (level) { + // Filter if `aside.level` is enabled in docus configuration + const path = _path.split('/') + + // Get level + const leveledPath = path.splice(0, 1 + level).join('/') + + nav = navDirFromPath(leveledPath, nav) || [] + + if (!Array.isArray(nav)) { nav = [nav] } + } + + // No navigation found; try to resolve page url + if (nav.length === 0) { + nav = navPageFromPath(page.value?._path || '/', navigation.value || []) + + if (!nav) { return [] } + + if (!Array.isArray(nav)) { nav = [nav] } + } + + // Filtered using `aside.exclude` in docus configuration + return nav.filter((item: any) => { + if (filtered.includes(item._path)) { return false } + return true + }) + }) + + return { tree, config } +} -- cgit v1.2.3-70-g09d2