UNPKG

jsdoctoveps

Version:

js -> markdown-> vitepress

87 lines (82 loc) 3.45 kB
import fsExtra from "fs-extra" import path from "path" /** * 引入脚本获取 base_config.json 配置 * scanDir 要扫描的目录 */ import { jsonData } from "../.vitepress/obtainJson" let configData = jsonData(); let scanDir = configData.veps_outputDir ? configData.veps_outputDir : "mkdn"; const navList = []; // 目录列表 let navStructure = [{ text: 'Home', link: '/', }]; // 生成的目录结构,home 默认的主页面 let isCreate = false; // 是否生成独立导航栏的校验 /** * acquireDir 主函数:生成导航栏结构 */ export function acquireDir() { let dirList = fsExtra.readdirSync(path.join(__dirname, `../${scanDir}`)); dirList.forEach((item) => { // 过滤目录下的文件 let result = /\.md/g.test(item); // 对目录下的 md 文件进行过滤 if (!result) { navList.push(item); } else { if (!isCreate) { // 若目标是一个文件,则单独创建一个导航栏用于存放当前层级下的 md 文档 isCreate = true; let aimFile = item.split(".") aimFile.pop(); navStructure.push({ text: 'others', link: `/${scanDir}/${aimFile.join('.')}`, }) } } }) return generateStructure(); } // 生成 nav 目录结构 function generateStructure() { for (let i = 0; i < navList.length; i++) { // 遍历结构列表生成对应目录结构 let fileList = fsExtra.readdirSync(path.join(__dirname, `../${scanDir}`, `${navList[i]}`)); if (fileList.length) { // 对空目录进行剔除 let processedPath = proofBelowFile(navList[i], fileList); // 判断当前目录下是否存在 md 文件 if (processedPath) { // 若当前目录下不存在md文件,则不生成对于的导航栏 navStructure.push({ text: navList[i], link: `/${scanDir}/${processedPath}` }) } } } return navStructure; } /** proofBelowFile 校验函数:判断当前目录下是否存在 md 文件(深度遍历) * dir 处理的目标目录 * fileList 目标目录下的文件列表 */ function proofBelowFile(dir, fileList) { // 处理下一层文件为目录的情况 let dirTitle = ""; // 获取目标md文件 let rootPath = path.join(__dirname, `../${scanDir}`, dir); let dirList = []; // 收集目录下的目录 (处理目录下没有md文件的情况) fileList.some((item) => { let isDir = fsExtra.lstatSync(path.join(rootPath, item)).isDirectory(); if (!isDir) { dirTitle = item; return true; } else { dirList.push(item); return false; } }) if (dirTitle) { let aimFile = dirTitle.split(".") aimFile.pop(); return path.join(dir, aimFile.join('.')) } else { // 若当前层级下不存在 md 文件,则进行深度查找 let result = ""; dirList.some((item) => { let dirPath = path.join(dir, item); let list = fsExtra.readdirSync(path.join(__dirname, `../${scanDir}`, dirPath)); result = proofBelowFile(dirPath, list); return result ? true : false; // 若查找到md文件,立刻跳出循环 }) return result; } }