UNPKG

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
"use strict";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;