diff --git a/scripts/sidebar.ts b/scripts/sidebar.ts index 7c826c6b..2bc7cefd 100644 --- a/scripts/sidebar.ts +++ b/scripts/sidebar.ts @@ -9,6 +9,7 @@ interface SidebarItem { items?: SidebarItem[]; order?: number; // 添加排序字段 collapsed?: boolean; // 添加折叠状态控制 + activeMatch?: string; // 添加活动匹配模式 } // 配置参数 @@ -16,6 +17,13 @@ const DOCS_DIR = 'docs'; // 文档根目录 const IGNORE_PATHS = ['README.md']; // 忽略的文件名 const DEFAULT_COLLAPSED = true; // 默认折叠状态 +// 一级目录名称映射表 +const CATEGORY_MAP: Record = { + 'mcdocs': 'API文档', + 'mcguide': '开发指南', + 'mconline': '教学课程' +}; + /** * 从名称中提取排序数字 * 例如:'0-概述' 返回 0,'1-基础' 返回 1 @@ -37,10 +45,15 @@ async function generateSidebar(): Promise> { if (IGNORE_PATHS.some(ignore => relativePath.toLowerCase().includes(ignore.toLowerCase()))) continue; const segments = relativePath.split(path.sep); - let currentLevel: SidebarItem[] = sidebar[segments[0]] || []; + const categoryKey = segments[0]; + + // 使用映射表获取显示名称 + const categoryName = CATEGORY_MAP[categoryKey] || categoryKey; + + let currentLevel: SidebarItem[] = sidebar[categoryKey] || []; - if (!sidebar[segments[0]]) { - sidebar[segments[0]] = currentLevel; + if (!sidebar[categoryKey]) { + sidebar[categoryKey] = currentLevel; } // 递归构建层级结构 @@ -48,23 +61,50 @@ async function generateSidebar(): Promise> { const segment = segments[i].replace('.md', ''); const isLast = i === segments.length - 1; - // 处理目录索引(如 /guide/index.md → link: /guide/) - const link = i === 0 ? `/${segment}/` : `/${segments.slice(0, i + 1).join('/').replace('.md', '')}/`; + // 修改链接生成逻辑 + let link; + if (isLast) { + // 为文件生成链接 + const linkSegments = segments.slice(0, i + 1); + + // 如果是 index.md,使用父目录 + if (segment === 'index') { + linkSegments.pop(); + } + + // 确保链接以斜杠开头但不以斜杠结尾 + link = `/${linkSegments.join('/')}`; + if (link.length > 1 && link.endsWith('/')) { + link = link.slice(0, -1); + } + } else if (i === 0) { + link = `/${segment}`; + } + const order = extractOrderNumber(segment); // 提取排序号 if (isLast) { // 添加最终文件项 const title = await getTitleFromFile(path.join(DOCS_DIR, ...segments.slice(0, i + 1))); - currentLevel.push({ text: title, link, order }); + // 添加 activeMatch 以支持更精确的高亮匹配 + const activeMatch = `^${link}(?:/|$)`; + currentLevel.push({ text: title, link, order, activeMatch }); } else { // 查找或创建目录分组 - let group = currentLevel.find(item => item.text === segment); + let displayText = i === 0 ? categoryName : segment; + let group = currentLevel.find(item => + (i === 0 && item.text === categoryName) || + (i !== 0 && item.text === segment) + ); + if (!group) { group = { - text: segment, + text: displayText, items: [], order, - collapsed: i < 2 ? false : DEFAULT_COLLAPSED + collapsed: i < 2 ? false : DEFAULT_COLLAPSED, + // 为目录添加活动匹配模式 + activeMatch: i === 0 ? `^/${segment}(?:/|$)` : undefined }; currentLevel.push(group); }