UNPKG

vitepress-plugin-sidebar-permalink

Version:
2 lines (1 loc) 7.61 kB
import d from"fs";import h from"path";import k from"gray-matter";import{createLogger as A}from"vite";import x from"picocolors";const J="1.6.0",$=A("info",{prefix:`[vitepress-plugin-sidebar-permalink v${J}]`}),C=(e,s="green",r={timestamp:!0})=>{$.info(x[s](e),r)},E=(e,s="yellow",r={timestamp:!0})=>{$.warn(x[s](e),r)},T=(e,s="yellow",r={timestamp:!0})=>{$.info(x[s](e),r)},L=(e,s="red",r={timestamp:!0})=>{$.error(x[s](e),r)},N={info:C,warn:E,warnOnce:T,error:L},M=e=>{const s=e.trimStart().split(/\r?\n/);for(const r of s)if(r.startsWith("# "))return r.substring(2).trim()},P=e=>isNaN(e)||e<0,_=(e,s)=>e.some(r=>r===s||r instanceof RegExp&&r.test(s));function R(e){return!!(!e||/^https?:\/\//i.test(e)||/^(mailto:|tel:)/i.test(e)||!e.startsWith("/pages")&&!e.startsWith("/"))}function j(e,s=e,r=[]){const p=d.readdirSync(e);let u=[];for(const o of p){const g=h.join(e,o),y=h.relative(s,g);r.includes(o)||(d.statSync(g).isDirectory()?u=u.concat(j(g,s,r)):o.endsWith(".md")&&u.push(y.replace(/\\/g,"/")))}return u}function z({docsRoot:e,output:s,ignoreDirs:r=[]}){const p=j(e,e,r),u={};for(const i of p){const f=h.join(e,i),n=d.readFileSync(f,"utf-8"),l=k(n).data;let t="";typeof l.permalink=="string"&&l.permalink.trim()?(t=l.permalink.trim(),t.startsWith("/")&&(t=t.slice(1)),t.endsWith("/")&&(t=t.slice(0,-1)),t=t+".md"):(t=i.replace(/\\/g,"/").replace(/\.md$/,""),t=t.replace(/^\/+/g,"").replace(/\/+$/g,""),t=t+".md"),u[i]=t}const o={};for(const i of Object.keys(u))r.some(f=>i.split("/").includes(f))||(o[i]=u[i]);const g=h.dirname(s);d.existsSync(g)||d.mkdirSync(g,{recursive:!0});let y=!0;if(d.existsSync(s))try{const i=d.readFileSync(s,"utf-8"),f=JSON.parse(i),n=f.rewrites||{},l=Object.keys(n),t=Object.keys(o);JSON.stringify(l)===JSON.stringify(t)&&JSON.stringify(n)===JSON.stringify(o)&&JSON.stringify(f._meta||{docsRoot:"",ignoreDirs:[]})===JSON.stringify({docsRoot:e,ignoreDirs:r})&&(y=!1)}catch{}return y&&(d.writeFileSync(s,JSON.stringify({rewrites:o,_meta:{docsRoot:e,ignoreDirs:r}},null,4),"utf-8"),N.info(`Rewrites generated at ${s}`)),o}const B=z;function q(e,s){const r=j(e,e,s),p=[];for(const u of r){const o=h.join(e,u),g=d.readFileSync(o,"utf-8"),{data:y}=k(g),i=y;i.private===!0&&i.permalink&&p.push(i.permalink)}return p}function I(e,s,r,p={collapsed:!0},u,o){const g=d.readdirSync(e,{withFileTypes:!0});let y=[];const i=[],f=[];for(const n of g)o&&(Array.isArray(o)?o.includes(n.name):o.sidebarIgnores.includes(n.name))||(n.isDirectory()?i.push(n):n.isFile()&&n.name.endsWith(".md")&&f.push(n));i.sort((n,l)=>{const t=parseInt(n.name.match(/^\d+/)?.[0]||"999999",10),c=parseInt(l.name.match(/^\d+/)?.[0]||"999999",10);return t-c});for(const n of i){let l=n.name.replace(/^[\d]+\.?\s*/,"");const t=I(h.join(e,n.name),s,r,p,u,Array.isArray(o)?o:o?.sidebarIgnores);if(t.length){const c={text:l,items:t};p.collapsed&&(c.collapsed=!0),y.push(c)}}f.sort((n,l)=>{const t=parseInt(n.name.match(/^\d+/)?.[0]||"999999",10),c=parseInt(l.name.match(/^\d+/)?.[0]||"999999",10);return t-c});for(const n of f){const l=h.join(e,n.name),t=d.readFileSync(l,"utf-8"),{data:c}=k(t);if(c.sidebar===!1)continue;let m=c.title||n.name.replace(/\.md$/,"");m=m.replace(/^\d+\.?\s*/,"");const S=h.relative(s,l).replace(/\\/g,"/").replace(/\.md$/,"");let a=c.permalink;if(typeof a=="string"&&a.trim())a=a.trim(),a.startsWith("/")||(a="/"+a),a=a.replace(/\/$/,""),a=a.replace(/\.md$/,"");else{const O=S+".md";a=r[O]||"/"+S,a=a.replace(/\.md$/,""),a.startsWith("/")||(a="/"+a)}const b=a.includes("/")?a.split("/").slice(0,-1).join("/")+"/":a;y.push({text:m,link:a,activeMatch:b})}return y}function W(e,s,r,p,u,o,g=1){if(g===-1){const i=I(e,r,p,u,void 0,o.sidebarIgnores),f=j(e,e,o.sidebarIgnores);for(const n of f){const l=h.join(e,n),t=d.readFileSync(l,"utf-8"),{data:c}=k(t);if(c.sidebar===!1)continue;let m=c.permalink||"";if(typeof m=="string"&&m.trim()){m=m.trim(),m=m.replace(/^\/+|\/+$/g,"");const S=`${m}.md`;s[S]=i}}return}const y=d.readdirSync(e,{withFileTypes:!0});for(const i of y){const f=h.join(e,i.name);if(!(i.isFile()&&i.name==="index.md"&&e.endsWith("docs"))){if(i.isDirectory())if(g>0)W(f,s,r,p,u,o,g-1);else{const n=j(f,f,o.sidebarIgnores);if(n.length>0)for(const l of n){const t=h.join(f,l),c=d.readFileSync(t,"utf-8"),{data:m}=k(c);if(m.sidebar===!1)continue;let S=m.permalink||"";if(typeof S=="string"&&S.trim()){S=S.trim(),S=S.replace(/^\/+|\/+$/g,"");const a=`${S}.md`,b=I(e,r,p,u,void 0,o.sidebarIgnores);s[a]=b}}}else if(i.isFile()&&i.name.endsWith(".md")){const n=d.readFileSync(f,"utf-8"),{data:l}=k(n);if(l.sidebar===!1)continue;let t=l.permalink||"";if(typeof t=="string"&&t.trim()){t=t.trim(),t=t.replace(/^\/+|\/+$/g,"");const c=`${t}.md`,m=I(e,r,p,u);s[c]=m}}}}}const F=function(e,s,r={collapsed:!0},p,u){F.logCount=F.logCount||0;const o={},g=new Set,y=e.endsWith("docs")&&h.basename(e)==="docs";if(!u||u.length===0){if(d.existsSync(e)&&d.statSync(e).isDirectory()&&(g.add(e),y)){const i=d.readdirSync(e,{withFileTypes:!0});for(const f of i)if(f.isFile()&&f.name.endsWith(".md")&&f.name!=="index.md"){const n=h.join(e,f.name),l=d.readFileSync(n,"utf-8"),{data:t}=k(l);if(t.sidebar===!1)continue;let c=t.permalink||"";if(typeof c=="string"&&c.trim()){c=c.trim(),c=c.replace(/^\/+|\/+$/g,"");const m=`${c}.md`,S=I(e,e,s,r,void 0,p.sidebarIgnores);o[m]=S}}}for(const i of g)d.existsSync(i)&&d.statSync(i).isDirectory()&&W(i,o,e,s,r,p,y?-1:0)}else{for(const i of u){if(!i.link||R(i.link))continue;const f=i.link.replace(/^[\/]/,"").replace(/[\/]$/,"").replace(/\.md$/,""),n=Object.entries(s).filter(([,l])=>l.replace(/^[\/]/,"").replace(/\.md$/,"")===f).map(([l])=>l);if(n.length){const l=n.reduce((c,m)=>c.length>m.length?c:m);let t=h.dirname(l);if(!h.isAbsolute(t)&&!t.startsWith(e)){const c=t.split(/[\\/]/);let m=!1;if(d.existsSync(e)&&d.statSync(e).isDirectory()){const S=d.readdirSync(e,{withFileTypes:!0});for(const a of S)if(a.isDirectory()&&c.includes(a.name)){t=h.join(e,a.name),m=!0;break}}m||(t=e)}d.existsSync(t)&&d.statSync(t).isDirectory()&&g.add(t)}}for(const i of g)d.existsSync(i)&&d.statSync(i).isDirectory()&&W(i,o,e,s,r,p,y?0:1)}return Object.keys(o).length===0&&(o[""]=[]),F.logCount++,F.logCount===1&&N.info("Injected Sidebar Data Successfully. \u6CE8\u5165\u4FA7\u8FB9\u680F\u6570\u636E\u6210\u529F!"),o};let v={},w={};function G(e={}){const s=e.root??"docs",r=e.dir??h.join("docs","articles"),p=e.rewritesPath??h.join("docs","rewrites.json"),u=[".vitepress","node_modules","public","dist"],{rewriteIgnores:o=[],sidebarIgnores:g=["@pages","index.md"]}=e.ignoreDirs??{},y=Array.from(new Set([...o??[],...u])),i=Array.from(new Set([...g??[],...u])),f={rewriteIgnores:y,sidebarIgnores:i},n=e.options??{collapsed:!0},l=e.navLinks??null;let t={rewrites:{}},c={},m=!1,S=!1,a=!1;try{if(e.rewrites&&Object.keys(e.rewrites).length>0)w=e.rewrites,a||(v=F(r,w,n,f,l),a=!0);else if(d.existsSync(p))try{const b=d.readFileSync(p,"utf-8");w=JSON.parse(b).rewrites||{},Object.keys(w).length>0&&!a&&(v=F(r,w,n,f,l),a=!0)}catch(b){console.warn("Failed to load rewrites.json:",b)}}catch(b){console.warn("Failed to initialize sidebar and rewrites:",b)}return{name:"vitepress-plugin-sidebar-permalink",config(b){if(m)return;m=!0;const O=q(r,y),D=b.vitepress?.site?.themeConfig??{};D.loginInfo??={},D.loginInfo.List=O,b.vitepress.site.themeConfig=D},configureServer(){S||(S=!0,t={rewrites:B({docsRoot:s,output:p,ignoreDirs:y})},w=t.rewrites,a||(c=F(r,w,n,f,l),Object.keys(c).forEach(b=>{v[b]=c[b]}),a=!0))}}}export{G as default,w as generatedRewrites,v as generatedSidebar,j as getAllMdFiles,M as getTitleFromMd,R as isExternalLink,P as isIllegalIndex,_ as isSome,$ as logger};