typedoc-plugin-mermaid
Version:
A plugin for TypeDoc that generates graphs for mermaid.js diagrams by using @mermaid annotation.
69 lines (61 loc) • 3.76 kB
JavaScript
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("html-escaper"),d=require("typedoc");function c(i){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(i){for(const t in i)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(i,t);Object.defineProperty(e,t,r.get?r:{enumerable:!0,get:()=>i[t]})}}return e.default=i,Object.freeze(e)}const p=c(l);var o=Object.freeze,u=Object.defineProperty,h=(i,e)=>o(u(i,"raw",{value:o(i.slice())})),s;const f=String.raw`
<style>
:root.mermaid-enabled .mermaid-block > pre {
display: none;
}
:root:not(.mermaid-enabled) .mermaid-block > .mermaid {
display: none !important;
}
.mermaid-block > .mermaid[data-inserted].dark {
display: var(--mermaid-dark-display);
}
.mermaid-block > .mermaid[data-inserted].light {
display: var(--mermaid-light-display);
}
:root {
--mermaid-dark-display: none;
--mermaid-light-display: block;
}
@media (prefers-color-scheme: light) {
:root {
--mermaid-dark-display: none;
--mermaid-light-display: block;
}
}
@media (prefers-color-scheme: dark) {
:root {
--mermaid-dark-display: block;
--mermaid-light-display: none;
}
}
body.light, :root[data-theme="light"] {
--mermaid-dark-display: none;
--mermaid-light-display: block;
}
body.dark, :root[data-theme="dark"] {
--mermaid-dark-display: block;
--mermaid-light-display: none;
}
</style>
`;function g(i){return String.raw(s||(s=h([`
<script type="module">
import mermaid from "https://unpkg.com/mermaid@`,`/dist/mermaid.esm.min.mjs";
document.documentElement.classList.add("mermaid-enabled");
mermaid.initialize({startOnLoad:true});
requestAnimationFrame(function check() {
let some = false;
document.querySelectorAll("div.mermaid:not([data-inserted])").forEach(div => {
some = true;
if (div.querySelector("svg")) {
div.dataset.inserted = true;
}
});
if (some) {
requestAnimationFrame(check);
}
});
<\/script>
`])),i)}const m='<div class="mermaid-block">',k="</div>";class y{constructor(e){this.app=e}initialize(){this.app.options.addDeclaration({help:"[Mermaid Plugin] The version of mermaid.js to use.",name:"mermaidVersion",type:d.ParameterType.String,defaultValue:"latest"}),this.app.converter.on(d.Converter.EVENT_RESOLVE_BEGIN,e=>{this.onConverterResolveBegin(e)}),this.app.renderer.on(d.PageEvent.END,e=>{this.onEndPage(e)}),this.app.renderer.on(d.MarkdownEvent.PARSE,e=>{this.onParseMarkdown(e)},1e3)}onConverterResolveBegin(e){for(const t of e.project.getReflectionsByKind(d.ReflectionKind.All)){const{comment:r}=t;r&&(r.summary.filter(a=>a.kind==="code").forEach(a=>{a.text=this.handleMermaidCodeBlocks(a.text)}),r.getTags("@mermaid").forEach(a=>{const n=a.content[0];n!=null&&n.text&&(n.text=this.handleMermaidTag(n.text))}))}}handleMermaidTag(e){var a;const t=((a=/^.*/.exec(e))==null?void 0:a[0])??"",r=e.slice(t.length);return`#### ${t}
${this.toMermaidBlock(r)}`}handleMermaidCodeBlocks(e){return e.replace(/^```mermaid[ \t\r]*\n([\s\S]*?)^```[ \t]*$/gm,(t,r)=>this.toMermaidBlock(r))}toMermaidBlock(e){const t=p.escape(e.trim()),r=`<div class="mermaid dark">%%{init:{"theme":"dark"}}%%
${t}</div>`,a=`<div class="mermaid light">%%{init:{"theme":"default"}}%%
${t}</div>`,n=`<pre><code class="language-mermaid">${t}</code></pre>`;return m+r+a+n+k}onEndPage(e){e.contents!==void 0&&(e.contents=this.insertMermaidScript(e.contents))}onParseMarkdown(e){e.parsedText=this.handleMermaidCodeBlocks(e.parsedText)}insertMermaidScript(e){if(!e.includes(m))return e;const t=e.indexOf("</head>");e=e.slice(0,t)+f+e.slice(t);const r=e.lastIndexOf("</body>");return e.slice(0,r)+g(this.app.options.getValue("mermaidVersion"))+e.slice(r)}}function b(i){new y(i).initialize()}exports.load=b;
;