65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								import path from "node:path";
							 | 
						|||
| 
								 | 
							
								import fs from "node:fs";
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								const DIR_PATH = path.resolve("docs");
							 | 
						|||
| 
								 | 
							
								const WHITE_LIST = ["index.md", ".vitepress", "node_modules", ".idea", "assets", "public"];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								const isDirectory = (path) => fs.lstatSync(path).isDirectory();
							 | 
						|||
| 
								 | 
							
								const intersections = (arr1, arr2) =>
							 | 
						|||
| 
								 | 
							
								  Array.from(new Set(arr1.filter((item) => !new Set(arr2).has(item))));
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								// 新增:按文件系统原始顺序排序
							 | 
						|||
| 
								 | 
							
								const keepOriginalOrder = (files, dirPath) => {
							 | 
						|||
| 
								 | 
							
								  return files
							 | 
						|||
| 
								 | 
							
								    .map(file => ({
							 | 
						|||
| 
								 | 
							
								      name: file,
							 | 
						|||
| 
								 | 
							
								      time: fs.statSync(path.join(dirPath, file)).birthtimeMs // 获取创建时间戳
							 | 
						|||
| 
								 | 
							
								    }))
							 | 
						|||
| 
								 | 
							
								    .sort((a, b) => a.time - b.time) // 按创建时间排序
							 | 
						|||
| 
								 | 
							
								    .map(item => item.name);
							 | 
						|||
| 
								 | 
							
								};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								function getList(params, path1, pathname) {
							 | 
						|||
| 
								 | 
							
								  const res = [];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  // 修改点1:使用 keepOriginalOrder 保持原始顺序
							 | 
						|||
| 
								 | 
							
								  const orderedParams = keepOriginalOrder(params, path1);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  for (let file of orderedParams) {  // 修改点2:改用 for...of 遍历
							 | 
						|||
| 
								 | 
							
								    const dir = path.join(path1, file);
							 | 
						|||
| 
								 | 
							
								    const isDir = isDirectory(dir);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    if (isDir) {
							 | 
						|||
| 
								 | 
							
								      const files = fs.readdirSync(dir);
							 | 
						|||
| 
								 | 
							
								      res.push({
							 | 
						|||
| 
								 | 
							
								        text: file,
							 | 
						|||
| 
								 | 
							
								        collapsible: true,
							 | 
						|||
| 
								 | 
							
								        items: getList(files, dir, `${pathname}/${file}`),
							 | 
						|||
| 
								 | 
							
								      });
							 | 
						|||
| 
								 | 
							
								    } else {
							 | 
						|||
| 
								 | 
							
								      const suffix = path.extname(file);
							 | 
						|||
| 
								 | 
							
								      if (suffix !== ".md") continue;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								      const name = path.basename(file, '.md');
							 | 
						|||
| 
								 | 
							
								      res.push({
							 | 
						|||
| 
								 | 
							
								        text: name,
							 | 
						|||
| 
								 | 
							
								        link: `${pathname}/${name}`,
							 | 
						|||
| 
								 | 
							
								      });
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								  }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  // 修改点3:完全移除 sort() 调用
							 | 
						|||
| 
								 | 
							
								  return res;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								export const set_sidebar = (pathname) => {
							 | 
						|||
| 
								 | 
							
								  try {
							 | 
						|||
| 
								 | 
							
								    const dirPath = path.join(DIR_PATH, pathname);
							 | 
						|||
| 
								 | 
							
								    const files = fs.readdirSync(dirPath);
							 | 
						|||
| 
								 | 
							
								    const items = intersections(files, WHITE_LIST);
							 | 
						|||
| 
								 | 
							
								    return getList(items, dirPath, pathname);
							 | 
						|||
| 
								 | 
							
								  } catch (error) {
							 | 
						|||
| 
								 | 
							
								    console.error(`Error generating sidebar for ${pathname}:`, error);
							 | 
						|||
| 
								 | 
							
								    return [];
							 | 
						|||
| 
								 | 
							
								  }
							 | 
						|||
| 
								 | 
							
								};
							 |