vitepress-mermaid-preview
Version:
Mermaid preview for vitepress
76 lines (73 loc) • 2.33 kB
JavaScript
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
};