jsdoctoveps
Version:
js -> markdown-> vitepress
87 lines (82 loc) • 3.45 kB
JavaScript
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;
}
}