blog / src /plugins /rehype-mermaid.mjs
cacode's picture
Upload 434 files
96dd062 verified
import { h } from "hastscript";
import { visit } from "unist-util-visit";
import mermaidRenderScript from "./mermaid-render-script.js?raw";
export function rehypeMermaid() {
return (tree) => {
visit(tree, "element", (node) => {
if (
node.tagName === "div" &&
node.properties &&
node.properties.className &&
node.properties.className.includes("mermaid-container")
) {
const mermaidCode = node.properties["data-mermaid-code"] || "";
const mermaidId = `mermaid-${Math.random().toString(36).slice(-6)}`;
// 创建 Mermaid 容器
const mermaidContainer = h(
"div",
{
class: "mermaid-wrapper",
id: mermaidId,
},
[
h(
"div",
{
class: "mermaid",
"data-mermaid-code": mermaidCode,
},
mermaidCode,
),
],
);
// 创建客户端渲染脚本
const renderScript = h(
"script",
{
type: "text/javascript",
},
mermaidRenderScript,
);
// 替换原始节点
node.tagName = "div";
node.properties = { class: "mermaid-diagram-container" };
node.children = [mermaidContainer, renderScript];
}
});
};
}