UNPKG

vitepress-mermaid-preview

Version:

Mermaid preview for vitepress

76 lines (73 loc) 2.33 kB
import d from "fs"; import f from "path"; function p(t, e = {}) { const s = t.renderer.rules.fence; t.renderer.rules.fence = (n, o, r, c, a) => { const i = n[o]; if ((i.info.trim() || "text") === "mermaid") { let l = e.showToolbar !== !1; const h = i.content.match(/^---\s*([\s\S]*?)\s*---/); if (h) { const m = h[1].match( /showToolbar:\s*(true|false)/i ); m && (l = m[1] === "true"); } return ` <ClientOnly> <MermaidChart code="${encodeURIComponent(i.content)}" showToolbar="${l ? "1" : "0"}" /> </ClientOnly> `; } return s(n, o, r, c, a); }; } const w = /<PreviewMermaidPath\s*(.*?)\s*\/>/g, C = /<PreviewMermaidPath\s*(.*?)><\/PreviewMermaidPath>/g; function M(t) { const e = /path=['"](.*?)['"]/.exec(t); return e ? e[1] : ""; } function u(t, e, s) { try { const n = /\bshowToolbar\b/i.test(t) || s.showToolbar, o = M(t); let r = "", c = ""; if (e && e.path ? c = f.dirname(e.path) : process.cwd && (c = process.cwd()), o) { const a = f.resolve(c, o); try { if (r = d.readFileSync(a, "utf-8"), !r.trim()) return `<div class="mermaid-error">文件内容为空: ${o}</div>`; } catch (i) { return console.error(`无法读取文件: ${a}`, i), `<div class="mermaid-error">无法加载文件: ${o}</div>`; } } else if (e && e.path) try { r = d.readFileSync(e.path, "utf-8"); } catch (a) { console.error(`无法读取当前MD文件: ${e.path}`, a), r = `# 文件读取失败 无法加载: 当前文档`; } else r = `# 文件读取失败 未指定 path,且无法获取当前文档路径`; return ` <ClientOnly> <MermaidChart code="${encodeURIComponent(r)}" showToolbar="${n ? "1" : "0"}" /> </ClientOnly> `; } catch (n) { return console.error("处理 PreviewMermaidPath 组件时出错:", n), '<div class="mermaid-error">加载 mermaid 图表失败</div>'; } } function P(t, e = {}) { const s = t.render; t.render = function(n, o) { let r = s.call(this, n, o); return r = r.replace(w, (c, a) => u(a, o, e)), r = r.replace(C, (c, a) => u(a, o, e)), r; }; } function g(t, e = {}) { p(t, e), P(t, e); } export { g as vitepressMermaidPreview };