UNPKG

yuque-dl

Version:
2 lines (1 loc) 6.58 kB
import{_ as e,l as o,m as n,d as t}from"./index-Dsnc1DPT.js";import{existsSync as i,readFileSync as r}from"node:fs";import{cac as s}from"cac";import d from"semver";import"rand-user-agent";import{mkdir as c,copyFile as l,readFile as m,writeFile as p,access as a,readdir as u,stat as f}from"node:fs/promises";import"cli-progress";import{resolve as h,join as v,sep as y,dirname as g}from"node:path";import{fileURLToPath as x}from"node:url";import{createServer as k}from"vitepress";import"log4js";import"node:process";import"axios";import"mdast-util-from-markdown";import"mdast-util-to-markdown";import"ora";import"pull-md-img";import"markdown-toc";import"pako";import"node:crypto";import"node:stream";import"node:util";let w;function $(o,n){return e(this,void 0,void 0,(function*(){const t=h(o);if(!(yield M(t)))throw new Error("server root not found");const r=v(t,"/.vitepress");i(r)&&!n.force||(yield function(o){return e(this,void 0,void 0,(function*(){const n=o.split(y).filter(Boolean).at(-1)||"yuque-dl",t=v(o,"/.vitepress");yield c(t,{recursive:!0});const i=g(x(import.meta.url)),r=v(i,"../../server-lib/bundle.js"),s=v(t,"bundle.mjs");yield l(r,s);const d=v(t,"config.mjs"),a=yield function(o){return e(this,void 0,void 0,(function*(){const e=[],n=[".vitepress","img","index.md","progress.json","attachments"];let t=yield u(o);t=t.filter((e=>!n.includes(e)));for(const n of t){const t=v(o,n);if((yield f(t)).isDirectory()){const i=yield M(v(t,"index.md")),r={text:n,collapsed:!0,items:yield N(o,n)};i&&(r.link=`/${n}/`),e.push(r)}else e.push({text:n.slice(0,n.lastIndexOf(".")),link:`/${n}`})}return e}))}(o);E((yield m(h(o,"index.md"),"utf8")).split("\n"),a),b(a);const k=`\n import {fixHtmlTags} from './bundle.mjs'\n export default {\n title: "${n}",\n themeConfig: {\n search: {\n provider: 'local'\n },\n sidebar: ${JSON.stringify(a)}\n },\n vite: {\n optimizeDeps: {\n include: []\n }\n },\n markdown: {\n html: true,\n breaks: true,\n config(md) {\n // 包装原始 render 方法,捕获解析异常\n const originalRender = md.render.bind(md);\n md.render = (src, env) => {\n try {\n let newMd = fixHtmlTags(originalRender(src, env))\n newMd = newMd.replace('<html><head></head><body>', '')\n newMd = newMd.replace('</body></html>', '')\n return newMd\n } catch (error) {\n console.error("Markdown/HTML parsing error:", error);\n return src\n }\n }\n }\n }\n }\n `;yield p(d,k)}))}(t));const s=()=>e(this,void 0,void 0,(function*(){const t=yield k(o,{host:n.host,port:n.port},(()=>e(this,void 0,void 0,(function*(){return w||(w=(()=>e(this,void 0,void 0,(function*(){yield t.close(),yield s()})))().finally((()=>{w=void 0}))),w}))));yield t.listen(),t.printUrls()}));yield s().catch((e=>{console.error(e),process.exit(1)}))}))}function M(o){return e(this,void 0,void 0,(function*(){try{return yield a(o),!0}catch(e){if("ENOENT"===e.code)return!1;throw e}}))}function E(e,o){o.map((o=>{"items"in o&&E(e,o.items);const n=e.findIndex((e=>e.includes(`[${o.text}]`)||e.includes(`# ${o.text}`)));o.index=n}))}function b(e){e.length<=1||(e.forEach((e=>{"items"in e&&b(e.items)})),e.sort(((e,o)=>e.index&&o.index?e.index>o.index?1:-1:0)))}function N(o,...n){return e(this,void 0,void 0,(function*(){const e=yield u(v(o,...n)),t=[];for(const i of e){const e=v(o,...n,i);if((yield f(e)).isDirectory()){const r=yield N(v(o),...n,i);if(r.length>0){const o={text:i,items:r,collapsed:false};(yield M(v(e,"index.md")))&&(o.link="/"+[...n,i].map(decodeURIComponent).join("/")+"/"),t.push(o)}}else{if("index.md"===i||/^-.*\.(md|MD)$/.test(i)||!i.endsWith(".md"))continue;const e=i.replace(/\.md$/,""),o={text:e,link:"/"+[...n.map(decodeURIComponent),`${encodeURI(e)}.html`].join("/")};t.push(o)}}return t}))}const j=s("yuque-dl"),{version:_,engines:I}=JSON.parse(r(new URL("../../package.json",import.meta.url)).toString());function O(e){return e.option("-d, --distDir <dir>","下载的目录{CUSTOM_NEW_LINE(eg: -d download)}",{default:"download"}).option("-i, --ignoreImg","忽略图片不下载",{default:!1}).option("--ignoreAttachments [fileExtension]","忽略附件, 可选带上忽略的附件文件后缀(多种后缀逗号分割){CUSTOM_NEW_LINE(eg: --ignoreAttachments mp4,pdf // 忽略后缀名mp4,pdf的附件)}{CUSTOM_NEW_LINE(eg: --ignoreAttachments // 忽略所有附件)}",{default:!1}).option("-k, --key <key>",'语雀的cookie key, 默认是 "_yuque_session", 在某些企业版本中 key 不一样').option("-t, --token <token>","语雀的cookie key 对应的值").option("--toc","是否输出文档toc目录",{default:!1}).option("--incremental","开启增量下载[初次下载加不加该参数没区别]",{default:!1}).option("--convertMarkdownVideoLinks","转化markdown视频链接为video标签",{default:!1}).option("--hideFooter","是否禁用页脚显示[更新时间、原文地址...]",{default:!1})}!function(){const e=I.node;d.satisfies(process.version,e)||(o.error(`✕ nodejs 版本需 ${e}, 当前版本为 ${process.version}`),process.exit(1))}();O(j.command("<url>","语雀知识库url")).action(((t,i)=>e(void 0,void 0,void 0,(function*(){try{yield n(t,i),process.exit(0)}catch(e){o.error(e.message||"unknown exception"),process.exit(1)}}))));O(j.command("doc <...urls>","下载单个或多个文档")).action(((n,i)=>e(void 0,void 0,void 0,(function*(){try{yield t(n,i),process.exit(0)}catch(e){o.error(e.message||"unknown exception"),process.exit(1)}})))),j.command("server <serverPath>","启动web服务").option("-p, --port <port>"," --port 1234",{default:5173}).option("--host [host]"," --host 0.0.0.0 或 --host",{default:"localhost"}).option("--force","强制重新生成.vitepress",{default:!1}).action(((n,t)=>e(void 0,void 0,void 0,(function*(){try{yield $(n,t)}catch(e){o.error(e.message||"unknown exception"),process.exit(1)}})))),j.help((e=>{var o;const n=e.find((e=>"Options"===e.title));if(n){let e=(null==n?void 0:n.body)||"";e=e.replace(/^(\s*-h, --help\s*)(.*)$/gm,((e,o)=>`${o}显示帮助信息`)),e=e.replace(/^(\s*-v, --version\s*)(.*)$/gm,((e,o)=>`${o}显示当前版本`)),e=e.replace(/\(default:/gm,(()=>"(默认值:"));const t=(null===(o=e.match(/^(\s*-h, --help\s*)/gm))||void 0===o?void 0:o[0].length)||0;e=e.replace(/\{CUSTOM_NEW_LINE\((.*?)\)\}/g,((e,o)=>`\n${"".padStart(t," ")} └─ ${o}`)),n.body=e}})),j.version(_);try{j.parse()}catch(e){o.error(e.message||"unknown exception"),process.exit(1)}