UNPKG

vitepress-plugin-sidebar-permalink

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