diff --git a/example/.vitepress/index.d.ts b/example/.vitepress/index.d.ts
index 2007114..8aedfc4 100644
--- a/example/.vitepress/index.d.ts
+++ b/example/.vitepress/index.d.ts
@@ -5,3 +5,7 @@ declare module '*.vue' {
const component: DefineComponent<{}, {}, any>;
export default component;
}
+declare module 'vitepress/dist/client/shared';
+declare module 'vitepress/dist/client/theme-default/composables/nav'
+declare module 'vitepress/dist/client/theme-default/composables/sidebar'
+declare module 'vitepress/dist/client/theme-default/composables/flyout'
\ No newline at end of file
diff --git a/example/.vitepress/theme/Layout.vue b/example/.vitepress/theme/Layout.vue
index 5eac021..a97f950 100644
--- a/example/.vitepress/theme/Layout.vue
+++ b/example/.vitepress/theme/Layout.vue
@@ -1,7 +1,7 @@
@@ -21,16 +36,24 @@ defineProps<{
diff --git a/example/.vitepress/theme/components/VPMenuLink.vue b/example/.vitepress/theme/components/VPMenuLink.vue
new file mode 100644
index 0000000..51edb10
--- /dev/null
+++ b/example/.vitepress/theme/components/VPMenuLink.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
diff --git a/example/.vitepress/theme/components/VPNav.vue b/example/.vitepress/theme/components/VPNav.vue
index 3a357e2..6091e8e 100644
--- a/example/.vitepress/theme/components/VPNav.vue
+++ b/example/.vitepress/theme/components/VPNav.vue
@@ -1,7 +1,7 @@
{
}
});
});
+
const sortFilterArray: any = [
...sortArray(subPagesDirectorysArray, 'dir'),
...sortArray(subPages, 'link')
].map((item: any) => ({
text: item.text,
- link: item.link,
+ link: item.link ? `/${item.link}` : undefined,
id: item.id,
parentId: item.parentId
}));
@@ -64,12 +65,15 @@ export default (params: NavParams) => {
childrenKey: 'items'
});
const rootTree = sortArray(
- rootPages.map((item: any) =>
- item.link === 'index.md' ? { ...item, text: 'Home' } : item
- ),
+ rootPages.map((item: any) => ({
+ ...item,
+ text: item.link === 'index.md' ? 'Home' : item.text,
+ link: `/${item.link}`
+ })),
'text'
);
return [...rootTree, ...subTree];
};
+
return buildNav(pagesFiltered);
};
diff --git a/packages/@huyikai/vitepress-helper/src/sidebar.ts b/packages/@huyikai/vitepress-helper/src/sidebar.ts
index 1665e75..8754946 100644
--- a/packages/@huyikai/vitepress-helper/src/sidebar.ts
+++ b/packages/@huyikai/vitepress-helper/src/sidebar.ts
@@ -1,14 +1,11 @@
+import { arrayToTree, treeToArray } from 'tree-conver';
+
import type { InitParams } from './../types/init';
+import { generateTree } from './utils/navHelpers';
import { sortArray } from './utils/commonHelpers';
-interface childrenItemsType {
- text: string;
- key: string;
- parentKey: string | undefined;
- link?: string;
- items: childrenItemsType;
- collapsible: boolean | undefined;
- collapsed: boolean | undefined | null;
-}
+// import { transformSidebar } from './utils/sidebarHelpers';
+import { v4 as uuidv4 } from 'uuid';
+
interface pagesType {
frontMatter: string;
regularPath: string;
@@ -27,80 +24,79 @@ export interface SidebarParams extends InitParams {
}
export default (params: SidebarParams) => {
const { pages, directory, collapsible } = params;
- let rootNameList: Array = [];
- let childrenList: any = [];
+ // const pagesFiltered: Array<{}> = pages.filter((i) =>
+ // i.link.includes(`${directory}/`)
+ // );
+ console.log(directory, collapsible);
- for (let a of pages) {
- // generate root dir name list
- let rootName = a.link
- .replace(`${directory}/`, '')
- .split('/')
- .filter((i: string, n: number) => i.indexOf('.md') < 0 && n < 2)
- .join('/');
- if (rootName.indexOf('/') >= 0) {
- rootNameList.push(rootName);
- }
- let urls = a.link.replace(`${directory}/`, '').split('/');
- for (let i = 0, len = urls.length; i < len; i++) {
- let b = urls[i];
- let obj = {
- text: b.replace('.md', ''),
- key: b,
- parentKey: i > 0 ? urls[i - 1] : undefined,
- link: `/${urls.join('/')}`
- };
- childrenList.push(obj);
- }
- }
- rootNameList = rootNameList.filter((i: string) => !['', '/'].includes(i));
- rootNameList.sort();
+ // const rootNameList = sortArray(
+ // deduplicationArray(
+ // pages
+ // .map((item) => item.link.split('/').slice(1, 3).join('/'))
+ // .filter((item) => !item.includes('.md'))
+ // )
+ // );
- childrenList = sortArray(childrenList, 'text');
- // 去重
- function unique(arr: Array, unikey = '') {
- const res: any = new Map();
- return arr.filter(
- (item: any) =>
- !res.has(unikey ? item[unikey] : item) &&
- res.set(unikey ? item[unikey] : item, 1)
- );
- }
- rootNameList = unique(rootNameList);
- let sidebar: any = {};
- for (let c of rootNameList) {
- sidebar[c] = [
- {
- text: c
- .split('/')
- .filter((i: any) => i)
- .splice(-1, 1)[0],
- key: c
- .split('/')
- .filter((i: any) => i)
- .splice(-1, 1)[0],
- parentKey: undefined
- }
- ];
- }
- for (let t in sidebar) {
- parseList(sidebar[t][0]);
- }
+ const pagesFiltered: Array<{}> = pages.filter((i) =>
+ i.link.includes(`${directory}/`)
+ );
+ const subPages = pagesFiltered
+ .map((item: any) => {
+ const { link, frontMatter } = item;
+ const linkParts = link.split(`${directory}/`)[1].split('/');
+ const dir = linkParts.slice(0, -1).join('/');
+ const text =
+ frontMatter?.title || linkParts.slice(-1).join('').replace('.md', '');
+ const level = linkParts.length - 1;
+
+ return {
+ ...item,
+ id: uuidv4(),
+ text,
+ link: linkParts.join('/'),
+ level,
+ dir
+ };
+ })
+ .filter((page: any) => page.level > 0);
+ const subPageDirectorys = subPages.map((page: any) =>
+ page.link.split('/').slice(0, -1)
+ );
+ const subPagesDirectorysTree = generateTree(subPageDirectorys);
+ const subPagesDirectorysArray: any = treeToArray(subPagesDirectorysTree);
- function parseList(item: childrenItemsType) {
- let children = childrenList.filter(
- (i: childrenItemsType) => item.key === i.parentKey
- );
- children = unique(children, 'key');
- if (children) {
- for (let a of children) {
- parseList(a);
+ subPages.forEach((page: any) => {
+ subPagesDirectorysArray.forEach((item: any) => {
+ if (item.dir === page.dir) {
+ page.parentId = item.id;
}
- !(item.hasOwnProperty('link') && item.key.indexOf('.md') >= 0) &&
- delete item.link;
- item.items = children;
- item.collapsible = collapsible;
- item.collapsed = null;
+ });
+ });
+ const sortFilterArray: any = [
+ ...sortArray(subPagesDirectorysArray, 'dir'),
+ ...sortArray(subPages, 'link')
+ ].map((item: any) => ({
+ text: item.text,
+ link: item.link ? `/${item.link}` : undefined,
+ id: item.id,
+ dir: item.dir,
+ parentId: item.parentId
+ }));
+ const subTree: any = arrayToTree(sortFilterArray, {
+ idKey: 'id',
+ pidKey: 'parentId',
+ childrenKey: 'items'
+ });
+ let result: Record = {};
+ subTree.forEach((item: any) => {
+ if (!result[`/${item.text}/`]) {
+ result[`/${item.text}/`] = [];
}
- }
- return sidebar;
+ result[`/${item.text}/`].push({
+ text: item.text,
+ items: [...item.items]
+ });
+ });
+ console.log('result', JSON.stringify(result));
+ return result;
};
diff --git a/packages/@huyikai/vitepress-helper/src/utils/commonHelpers.ts b/packages/@huyikai/vitepress-helper/src/utils/commonHelpers.ts
index 156335c..6ed78f9 100644
--- a/packages/@huyikai/vitepress-helper/src/utils/commonHelpers.ts
+++ b/packages/@huyikai/vitepress-helper/src/utils/commonHelpers.ts
@@ -1,6 +1,19 @@
-export const sortArray = (array: [], field: string) => {
- const compare = (obj1: any, obj2: any) => {
- return obj1[field].localeCompare(obj2.link);
- };
- return array.sort(compare);
+export const sortArray = (array: Array, field?: string) => {
+ if (field) {
+ const compare = (obj1: any, obj2: any) => {
+ return obj1[field].localeCompare(obj2.link);
+ };
+ return array.sort(compare);
+ } else {
+ return array.sort();
+ }
+};
+
+export const deduplicationArray = (array: Array, unikey = '') => {
+ const res: any = new Map();
+ return array.filter(
+ (item: any) =>
+ !res.has(unikey ? item[unikey] : item) &&
+ res.set(unikey ? item[unikey] : item, 1)
+ );
};
diff --git a/packages/@huyikai/vitepress-helper/src/utils/sidebarHelpers.ts b/packages/@huyikai/vitepress-helper/src/utils/sidebarHelpers.ts
new file mode 100644
index 0000000..edea6f1
--- /dev/null
+++ b/packages/@huyikai/vitepress-helper/src/utils/sidebarHelpers.ts
@@ -0,0 +1,14 @@
+export const transformSidebar = (rootNameList: Array) => {
+ let result: Record = {};
+ rootNameList.forEach((item) => {
+ let parts = item.split('/');
+ if (!result[item]) {
+ result[item] = [];
+ }
+ result[item].push({
+ text: parts[1],
+ items: []
+ });
+ });
+ return result;
+};
diff --git a/packages/@huyikai/vitepress-helper/types/init.d.ts b/packages/@huyikai/vitepress-helper/types/init.d.ts
index 3a74994..897602d 100644
--- a/packages/@huyikai/vitepress-helper/types/init.d.ts
+++ b/packages/@huyikai/vitepress-helper/types/init.d.ts
@@ -1,4 +1,4 @@
export interface InitParams {
- directory?: string;
+ directory: string;
collapsible?: boolean;
}