import Mermaid from "mermaid"; import type { PluginWithOptions } from "markdown-it"; import Murmur from "./murmurhash3_gc.js"; const htmlEntities = (str: string) => String(str) .replace(/&/g, "&") .replace(//g, ">"); const MermaidChart = (code: string) => { try { var needsUniqueId = "render" + Murmur(code, 42).toString(); Mermaid.mermaidAPI.render(needsUniqueId, code, (sc) => { code = sc; }); return `
${code}
`; } catch (err) { return `
${htmlEntities(err.name)}: ${htmlEntities(err.message)}
`; } }; const MermaidPlugIn: PluginWithOptions = (md, opts) => { Mermaid.initialize(Object.assign(MermaidPlugIn, opts)); if (!md.renderer.rules.fence) { throw new Error( "Default markdown renderer was not found while trying to use mermaid-it!" ); } const defaultRenderer = md.renderer.rules.fence.bind(md.renderer.rules); md.renderer.rules.fence = (tokens, idx, opts, env, self) => { const token = tokens[idx]; const code = token.content.trim(); if (token.info.startsWith("mermaid")) { return MermaidChart(code); } return defaultRenderer(tokens, idx, opts, env, self); }; }; // MermaidPlugIn.default = { // startOnLoad: false, // securityLevel: "true", // theme: "default", // flowchart: { // htmlLabels: false, // useMaxWidth: true, // }, // }; export default MermaidPlugIn;