vuepress的侧边栏怎么动态生成

发布于 2022-09-12 00:45:16 字数 189 浏览 18 评论 0

现在用vuepress写博客,我现在的做法是都写在一个README.md文件里,然后配置config.js

sidebar: 'auto', // 侧边栏配置

自动生成侧边栏

但是我现在想每篇都写一个md文件,又不想一篇篇在config.js里配置侧边栏,有什么办法能自动生成侧边栏?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凡间太子 2022-09-19 00:45:16

安利下自己写的插件 vuepress-plugin-auto-sidebar

£冰雨忧蓝° 2022-09-19 00:45:16

\自己去除一下,复制到这边被转义了

const  fs  \=  require("fs");

const  path  \=  require("path");

const  rootpath  \= path.dirname(\_\_dirname);

  

/\*\*

\* string比较工具类

\*/

const  str  \= {

contains: function(string, substr, isIgnoreCase) {

if (isIgnoreCase) {

string \= string.toLowerCase();

substr \= substr.toLowerCase();

}

  

var startChar \= substr.substring(0,  1);

var strLen \= substr.length;

  

for (var j \=  0; j < string.length  \- strLen +  1; j++) {

if (string.charAt(j) \== startChar) {

//如果匹配起始字符,开始查找

if (string.substring(j, j + strLen) \== substr) {

//如果从j开始的字符与str匹配,那ok

return  true;

}

}

}

return  false;

}

};

  

/\*\*

\* 文件助手: 主要用于读取当前文件下的所有目录和文件

\*/

const  filehelper  \= {

getAllFiles: function(rpath) {

let filenames \= \[\];

fs.readdirSync(rpath).forEach(file  \=> {

fullpath \= rpath +  "/"  + file;

var fileinfo \= fs.statSync(fullpath);

// 过滤 .DS\_Store

if (fileinfo.isFile() &&  !str.contains(file,  "DS\_Store",  true)) {

if (file \===  "README.md"  || file \===  "readme.md") {

file \=  "";

} else {

file \= file.replace(".md",  "");

}

filenames.push(file);

}

});

filenames.sort();

return filenames;

},

getAllDirs: function  getAllDirs(mypath  \=  ".") {

const  items  \= fs.readdirSync(mypath);

let result \= \[\];

// 遍历当前目录中所有文件夹

items.map(item  \=> {

let temp \= path.join(mypath, item);

// 过滤无关的文件夹

if (

fs.statSync(temp).isDirectory() &&

!item.startsWith(".") &&

!str.contains(item,  "DS\_Store",  true)

) {

let path \= mypath +  "/"  + item +  "/";

result.push(path);

result \= result.concat(getAllDirs(temp));

}

});

return result;

}

};

// nav的链接路径

var navLinks \= \[\];

  

// 侧边栏

var sidebar \= {};

  

// 导航栏

var nav \=  getNav();

  

function  genSideBar() {

var sidebars \= {};

var allDirs \= filehelper.getAllDirs(rootpath);

allDirs.forEach(item  \=> {

let dirFiles \= filehelper.getAllFiles(item);

let dirname \= item.replace(rootpath,  "");

navLinks.push(dirname);

if (dirFiles.length  \>  1) {

sidebars\[dirname\] \= dirFiles;

}

});

  

sidebar \= sidebars;

}

/\*\*

\* 先生成所有nav文件链接;

\* @param  filepaths

\* @returns  {Array}

\*/

function  genNavLink(filepaths) {

genSideBar();

var navLinks \= \[\];

filepaths.forEach(p  \=> {

var ss \= p.toString().split("/");

var name \= ss\[ss.length  \-  2\];

var parent \= p.replace(name +  "/",  "");

navLinks.push({

text: name,

link: p,

items: \[\],

parent: parent

});

});

  

return navLinks;

}

  

/\*\*

\* 自定义排序文件夹

\* @param  a

\* @param  b

\* @returns  {number}

\*/

function  sortDir(a, b) {

let al \= a.parent.toString().split("/").length;

let bl \= b.parent.toString().split("/").length;

if (al \> bl) {

return  \-1;

}

if (al \=== bl) {

return  0;

}

if (al < bl) {

return  1;

}

}

  

/\*\*

\* 生成最终的 nav配置信息

\* @param  navLinks

\* @returns  {Array}

\*/

  

function  getNav() {

let nnavs \=  genNavLink(navLinks);

nnavs.sort(sortDir);

var iniMap \= {};

var result \= \[\];

var delMap \= {};

nnavs.forEach(l  \=> {

iniMap\[l.link\] \= l;

});

nnavs.forEach(l  \=> {

var parentLink \= l.parent;

if (parentLink !==  "/") {

iniMap\[parentLink\].items.push(l);

delMap\[l.link\] \= l;

}

});

for (var k in iniMap) {

if (delMap\[k\] !=  null) {

delete iniMap\[k\];

continue;

}

result.push(iniMap\[k\]);

}

return result;

}

  

/\*\*

\* Vuepress 最终需要的配置信息, 修改其他信息在此处配置

\*/

var config \= {

title: "title",

description: "description",

lang: "zh-CN",

head: \[\["link", { rel: "icon", href: "/logo.png" }\]\],

themeConfig: {

sidebar: sidebar,

nav: nav,

sidebarDepth: 3

}

};

  

module.exports  \= config;
薄荷→糖丶微凉 2022-09-19 00:45:16

侧边栏有很多的效果,要看你的目录结果,一般情况会根据你md文件的目录层级展示

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文