@diplodoc/mermaid-extension 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Readme.md ADDED
@@ -0,0 +1,111 @@
1
+ # Diplodoc Mermaid extension
2
+
3
+ This is extension for Diplodoc platform which adds support for Mermaid diagrams.
4
+
5
+ Extension contains some parts:
6
+ - [Prepared Mermaid runtime](#prepared-mermaid-runtime)
7
+ - [MarkdownIt transform plugin](#markdownit-transform-plugin)
8
+ - [React hook for smart control of Mermaid](#react-hook-for-smart-control-of-mermaid)
9
+
10
+ ## Quickstart
11
+ Attach plugin to transformer
12
+
13
+ ```js
14
+ import mermaid from '@diplodoc/mermaid-extension';
15
+ import transform from '@diplodoc/transform';
16
+
17
+ const {result} = await transform(`
18
+ \`\`\`mermaid
19
+ graph TD
20
+ A[Christmas] -->|Get money| B(Go shopping)
21
+ \`\`\`
22
+ `, {
23
+ plugins: [
24
+ mermaid.transform({ bundle: false })
25
+ ]
26
+ });
27
+ ```
28
+
29
+ Add mermaid runtime to your final page
30
+
31
+ ```html
32
+ <html>
33
+ <head>
34
+ <!-- Read more about '_assets/mermaid-extension.js' in 'MarkdownIt transform plugin' section -->
35
+ <script src="_assets/mermaid-extension.js" async />
36
+ </head>
37
+ <body style="background: #000">
38
+ ${result.html}
39
+ <script>
40
+ // Read more about 'mermaidJsonp' in 'Prepared Mermaid runtime' section
41
+ window.mermaidJsonp = window.mermaidJsonp || [];
42
+ window.mermaidJsonp.push((mermaid) => {
43
+ mermaid.initialize({ theme: 'dark' });
44
+ mermaid.run();
45
+ });
46
+ </script>
47
+ </body>
48
+ </html>
49
+ ```
50
+
51
+ ## Prepared Mermaid runtime
52
+
53
+ The problem with Mermaid is that it has big bundle size.
54
+ The most expected behavior is loading it asynchronously.
55
+ But if we want to disable Mermaid's `startOnLoad` option, then we don't know when the Mermaid will be initialized.
56
+
57
+ **Prepared Mermaid runtime** designed to solve this problem.
58
+ We disable Mermaid's `startOnLoad` option to precise control render step.
59
+ Then we add `mermaidJsonp` global callback to handle Mermaid's loading.
60
+
61
+ Also, we limit exposed Mermaid API by two methods:
62
+ - `initialize` - configure mermaid before next render
63
+ - `run` - start diagrams rendering
64
+
65
+ Usage example:
66
+ ```js
67
+ window.mermaidJsonp = window.mermaidJsonp || [];
68
+
69
+ // This callback will be called when runtime is loaded
70
+ window.mermaidJsonp.push((mermaid) => {
71
+ mermaid.initialize({ theme: 'dark' });
72
+ mermaid.run();
73
+ });
74
+
75
+ // You can configure more that one callback
76
+ window.mermaidJsonp.push((mermaid) => {
77
+ console.log('Render diagrams');
78
+ });
79
+ ```
80
+
81
+ ## MarkdownIt transform plugin
82
+
83
+ Plugin for [@diplodoc/transform](https://github.com/diplodoc-platform/transform) package.
84
+
85
+ Configuration:
86
+ - `runtime` - name on runtime script which will be exposed in results `script` section.<br>
87
+ (Default: `_assets/mermaid-extension.js`)<br>
88
+
89
+ - `bundle` - boolean flag to enable/disable copying of bundled runtime to target directory.<br>
90
+ Where target directore is `<transformer output option>/<plugin runtime option>`<br>
91
+ Default: true<br>
92
+
93
+ - `classes` - additional classes which will be added to Mermaid's diagrams.<br>
94
+ Example: `my-own-class and-other-class`<br>
95
+
96
+ ## React hook for smart control of Mermaid
97
+
98
+ Simplifies Mermaid control with react
99
+
100
+ ```ts
101
+ import React, { useEffect } from 'react'
102
+ import { useMermaid } from '@diplodoc/mermaid-extension/hooks'
103
+
104
+ export const App: React.FC = ({ theme }) => {
105
+ const renderMermaid = useMermaid()
106
+
107
+ useEffect(() => {
108
+ renderMermaid({ theme })
109
+ }, [ theme, renderMermaid ])
110
+ }
111
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diplodoc/mermaid-extension",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Mermaid plugin for Diplodoc transformer and builder",
5
5
  "main": "plugin/index.js",
6
6
  "types": "plugin/index.d.ts",
package/plugin/index.js CHANGED
@@ -91,7 +91,7 @@ var registerTransforms = (md, {
91
91
  };
92
92
  function transform(options = {}) {
93
93
  const { runtime = "_assets/mermaid-extension.js", classes = "yfm-mermaid", bundle = true } = options;
94
- const plugin = function(md, { output }) {
94
+ const plugin = function(md, { output = "." }) {
95
95
  registerTransforms(md, {
96
96
  classes,
97
97
  runtime,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/plugin/index.ts", "../src/plugin/transform.ts"],
4
- "sourcesContent": ["export { transform } from './transform';", "import { join, dirname } from 'node:path';\nimport { mkdirSync, copyFileSync } from 'node:fs';\nimport MarkdownIt from 'markdown-it';\nimport type { MarkdownItPluginCb, MarkdownItPluginOpts } from '@doc-tools/transform/lib/plugins/typings';\nimport type ParserCore from 'markdown-it/lib/parser_core';\nimport type Token from 'markdown-it/lib/token';\n\nexport type PluginOptions = {\n runtime: string;\n classes: string;\n bundle: boolean;\n}\n\nfunction isMermaidBlock(token: Token) {\n return token.type === 'fence' && token.info.match(/^\\s*mermaid(\\s*|$)/);\n}\n\nfunction hidden<B extends Record<string | symbol, unknown>, F extends string | symbol, V>(\n box: B,\n field: F,\n value: V\n) {\n if (!(field in box)) {\n Object.defineProperty(box, field, {\n enumerable: false,\n value: value\n });\n }\n\n return box as B & { [P in F]: V };\n}\n\nfunction copy(from: string, to: string) {\n mkdirSync(dirname(to), { recursive: true });\n copyFileSync(from, to);\n}\n\nconst registerTransforms = (md: MarkdownIt, {\n classes, runtime, bundle, output, updateTokens\n}: PluginOptions & {\n output: string,\n updateTokens: boolean\n}) => {\n const applyTransforms: ParserCore.RuleCore = ({ tokens, env }) => {\n hidden(env, 'bundled', new Set<string>());\n\n const blocks = tokens.filter(isMermaidBlock);\n\n if (updateTokens && blocks.length) {\n blocks.forEach((token) => {\n token.type = 'mermaid';\n token.attrSet('class', `mermaid ${ classes }`);\n });\n }\n\n if (blocks.length) {\n env.meta = env.meta || {};\n env.meta.script = env.meta.script || [];\n env.meta.script.push(runtime);\n\n if (bundle) {\n const file = join(PACKAGE, 'runtime');\n if (!env.bundled.has(file)) {\n env.bundled.add(file);\n\n copy(require.resolve(file), join(output, runtime));\n }\n }\n }\n }\n\n try {\n md.core.ruler.after('fence', 'mermaid', applyTransforms);\n } catch (e) {\n md.core.ruler.push('mermaid', applyTransforms);\n }\n}\n\ntype InputOptions = MarkdownItPluginOpts & {\n destRoot: string;\n};\n\nexport function transform(options: Partial<PluginOptions> = {}) {\n const { runtime = '_assets/mermaid-extension.js', classes = 'yfm-mermaid', bundle = true } = options;\n\n const plugin: MarkdownItPluginCb<{ output: string }> = function(md: MarkdownIt, { output }) {\n registerTransforms(md, {\n classes,\n runtime,\n bundle,\n output,\n updateTokens: true\n });\n\n md.renderer.rules.mermaid = (tokens, idx) => {\n const token = tokens[idx];\n const code = encodeURIComponent(token.content.trim());\n\n return `<div class=\"mermaid\" data-content=\"${ code }\"></div>`;\n };\n };\n\n Object.assign(plugin, {\n collect(input: string, { destRoot }: InputOptions) {\n const md = new MarkdownIt().use((md) => {\n registerTransforms(md, {\n classes,\n runtime,\n bundle,\n output: destRoot,\n updateTokens: false\n });\n });\n\n md.parse(input, {});\n }\n });\n\n return plugin;\n}"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,uBAA8B;AAC9B,qBAAwC;AACxC,yBAAuB;AAWvB,SAAS,eAAe,OAAc;AAClC,SAAO,MAAM,SAAS,WAAW,MAAM,KAAK,MAAM,oBAAoB;AAC1E;AAEA,SAAS,OACL,KACA,OACA,OACF;AACE,MAAI,EAAE,SAAS,MAAM;AACjB,WAAO,eAAe,KAAK,OAAO;AAAA,MAC9B,YAAY;AAAA,MACZ;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,SAAO;AACX;AAEA,SAAS,KAAK,MAAc,IAAY;AACpC,oCAAU,0BAAQ,EAAE,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1C,mCAAa,MAAM,EAAE;AACzB;AAEA,IAAM,qBAAqB,CAAC,IAAgB;AAAA,EACxC;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AACtC,MAGM;AACF,QAAM,kBAAuC,CAAC,EAAE,QAAQ,IAAI,MAAM;AAC9D,WAAO,KAAK,WAAW,oBAAI,IAAY,CAAC;AAExC,UAAM,SAAS,OAAO,OAAO,cAAc;AAE3C,QAAI,gBAAgB,OAAO,QAAQ;AAC/B,aAAO,QAAQ,CAAC,UAAU;AACtB,cAAM,OAAO;AACb,cAAM,QAAQ,SAAS,WAAY,SAAU;AAAA,MACjD,CAAC;AAAA,IACL;AAEA,QAAI,OAAO,QAAQ;AACf,UAAI,OAAO,IAAI,QAAQ,CAAC;AACxB,UAAI,KAAK,SAAS,IAAI,KAAK,UAAU,CAAC;AACtC,UAAI,KAAK,OAAO,KAAK,OAAO;AAE5B,UAAI,QAAQ;AACR,cAAM,WAAO,uBAAK,+BAAS,SAAS;AACpC,YAAI,CAAC,IAAI,QAAQ,IAAI,IAAI,GAAG;AACxB,cAAI,QAAQ,IAAI,IAAI;AAEpB,eAAK,QAAQ,QAAQ,IAAI,OAAG,uBAAK,QAAQ,OAAO,CAAC;AAAA,QACrD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI;AACA,OAAG,KAAK,MAAM,MAAM,SAAS,WAAW,eAAe;AAAA,EAC3D,SAAS,GAAP;AACE,OAAG,KAAK,MAAM,KAAK,WAAW,eAAe;AAAA,EACjD;AACJ;AAMO,SAAS,UAAU,UAAkC,CAAC,GAAG;AAC5D,QAAM,EAAE,UAAU,gCAAgC,UAAU,eAAe,SAAS,KAAK,IAAI;AAE7F,QAAM,SAAiD,SAAS,IAAgB,EAAE,OAAO,GAAG;AACxF,uBAAmB,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,IAClB,CAAC;AAED,OAAG,SAAS,MAAM,UAAU,CAAC,QAAQ,QAAQ;AACzC,YAAM,QAAQ,OAAO,GAAG;AACxB,YAAM,OAAO,mBAAmB,MAAM,QAAQ,KAAK,CAAC;AAEpD,aAAO,sCAAuC;AAAA,IAClD;AAAA,EACJ;AAEA,SAAO,OAAO,QAAQ;AAAA,IAClB,QAAQ,OAAe,EAAE,SAAS,GAAiB;AAC/C,YAAM,KAAK,IAAI,mBAAAA,QAAW,EAAE,IAAI,CAACC,QAAO;AACpC,2BAAmBA,KAAI;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,cAAc;AAAA,QAClB,CAAC;AAAA,MACL,CAAC;AAED,SAAG,MAAM,OAAO,CAAC,CAAC;AAAA,IACtB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;",
4
+ "sourcesContent": ["export { transform } from './transform';", "import { join, dirname } from 'node:path';\nimport { mkdirSync, copyFileSync } from 'node:fs';\nimport MarkdownIt from 'markdown-it';\nimport type { MarkdownItPluginCb, MarkdownItPluginOpts } from '@doc-tools/transform/lib/plugins/typings';\nimport type ParserCore from 'markdown-it/lib/parser_core';\nimport type Token from 'markdown-it/lib/token';\n\nexport type PluginOptions = {\n runtime: string;\n classes: string;\n bundle: boolean;\n}\n\nfunction isMermaidBlock(token: Token) {\n return token.type === 'fence' && token.info.match(/^\\s*mermaid(\\s*|$)/);\n}\n\nfunction hidden<B extends Record<string | symbol, unknown>, F extends string | symbol, V>(\n box: B,\n field: F,\n value: V\n) {\n if (!(field in box)) {\n Object.defineProperty(box, field, {\n enumerable: false,\n value: value\n });\n }\n\n return box as B & { [P in F]: V };\n}\n\nfunction copy(from: string, to: string) {\n mkdirSync(dirname(to), { recursive: true });\n copyFileSync(from, to);\n}\n\nconst registerTransforms = (md: MarkdownIt, {\n classes, runtime, bundle, output, updateTokens\n}: PluginOptions & {\n output: string,\n updateTokens: boolean\n}) => {\n const applyTransforms: ParserCore.RuleCore = ({ tokens, env }) => {\n hidden(env, 'bundled', new Set<string>());\n\n const blocks = tokens.filter(isMermaidBlock);\n\n if (updateTokens && blocks.length) {\n blocks.forEach((token) => {\n token.type = 'mermaid';\n token.attrSet('class', `mermaid ${ classes }`);\n });\n }\n\n if (blocks.length) {\n env.meta = env.meta || {};\n env.meta.script = env.meta.script || [];\n env.meta.script.push(runtime);\n\n if (bundle) {\n const file = join(PACKAGE, 'runtime');\n if (!env.bundled.has(file)) {\n env.bundled.add(file);\n\n copy(require.resolve(file), join(output, runtime));\n }\n }\n }\n }\n\n try {\n md.core.ruler.after('fence', 'mermaid', applyTransforms);\n } catch (e) {\n md.core.ruler.push('mermaid', applyTransforms);\n }\n}\n\ntype InputOptions = MarkdownItPluginOpts & {\n destRoot: string;\n};\n\nexport function transform(options: Partial<PluginOptions> = {}) {\n const { runtime = '_assets/mermaid-extension.js', classes = 'yfm-mermaid', bundle = true } = options;\n\n const plugin: MarkdownItPluginCb<{ output: string }> = function(md: MarkdownIt, { output = '.' }) {\n registerTransforms(md, {\n classes,\n runtime,\n bundle,\n output,\n updateTokens: true\n });\n\n md.renderer.rules.mermaid = (tokens, idx) => {\n const token = tokens[idx];\n const code = encodeURIComponent(token.content.trim());\n\n return `<div class=\"mermaid\" data-content=\"${ code }\"></div>`;\n };\n };\n\n Object.assign(plugin, {\n collect(input: string, { destRoot }: InputOptions) {\n const md = new MarkdownIt().use((md) => {\n registerTransforms(md, {\n classes,\n runtime,\n bundle,\n output: destRoot,\n updateTokens: false\n });\n });\n\n md.parse(input, {});\n }\n });\n\n return plugin;\n}"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,uBAA8B;AAC9B,qBAAwC;AACxC,yBAAuB;AAWvB,SAAS,eAAe,OAAc;AAClC,SAAO,MAAM,SAAS,WAAW,MAAM,KAAK,MAAM,oBAAoB;AAC1E;AAEA,SAAS,OACL,KACA,OACA,OACF;AACE,MAAI,EAAE,SAAS,MAAM;AACjB,WAAO,eAAe,KAAK,OAAO;AAAA,MAC9B,YAAY;AAAA,MACZ;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,SAAO;AACX;AAEA,SAAS,KAAK,MAAc,IAAY;AACpC,oCAAU,0BAAQ,EAAE,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1C,mCAAa,MAAM,EAAE;AACzB;AAEA,IAAM,qBAAqB,CAAC,IAAgB;AAAA,EACxC;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AACtC,MAGM;AACF,QAAM,kBAAuC,CAAC,EAAE,QAAQ,IAAI,MAAM;AAC9D,WAAO,KAAK,WAAW,oBAAI,IAAY,CAAC;AAExC,UAAM,SAAS,OAAO,OAAO,cAAc;AAE3C,QAAI,gBAAgB,OAAO,QAAQ;AAC/B,aAAO,QAAQ,CAAC,UAAU;AACtB,cAAM,OAAO;AACb,cAAM,QAAQ,SAAS,WAAY,SAAU;AAAA,MACjD,CAAC;AAAA,IACL;AAEA,QAAI,OAAO,QAAQ;AACf,UAAI,OAAO,IAAI,QAAQ,CAAC;AACxB,UAAI,KAAK,SAAS,IAAI,KAAK,UAAU,CAAC;AACtC,UAAI,KAAK,OAAO,KAAK,OAAO;AAE5B,UAAI,QAAQ;AACR,cAAM,WAAO,uBAAK,+BAAS,SAAS;AACpC,YAAI,CAAC,IAAI,QAAQ,IAAI,IAAI,GAAG;AACxB,cAAI,QAAQ,IAAI,IAAI;AAEpB,eAAK,QAAQ,QAAQ,IAAI,OAAG,uBAAK,QAAQ,OAAO,CAAC;AAAA,QACrD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI;AACA,OAAG,KAAK,MAAM,MAAM,SAAS,WAAW,eAAe;AAAA,EAC3D,SAAS,GAAP;AACE,OAAG,KAAK,MAAM,KAAK,WAAW,eAAe;AAAA,EACjD;AACJ;AAMO,SAAS,UAAU,UAAkC,CAAC,GAAG;AAC5D,QAAM,EAAE,UAAU,gCAAgC,UAAU,eAAe,SAAS,KAAK,IAAI;AAE7F,QAAM,SAAiD,SAAS,IAAgB,EAAE,SAAS,IAAI,GAAG;AAC9F,uBAAmB,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,IAClB,CAAC;AAED,OAAG,SAAS,MAAM,UAAU,CAAC,QAAQ,QAAQ;AACzC,YAAM,QAAQ,OAAO,GAAG;AACxB,YAAM,OAAO,mBAAmB,MAAM,QAAQ,KAAK,CAAC;AAEpD,aAAO,sCAAuC;AAAA,IAClD;AAAA,EACJ;AAEA,SAAO,OAAO,QAAQ;AAAA,IAClB,QAAQ,OAAe,EAAE,SAAS,GAAiB;AAC/C,YAAM,KAAK,IAAI,mBAAAA,QAAW,EAAE,IAAI,CAACC,QAAO;AACpC,2BAAmBA,KAAI;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,cAAc;AAAA,QAClB,CAAC;AAAA,MACL,CAAC;AAED,SAAG,MAAM,OAAO,CAAC,CAAC;AAAA,IACtB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;",
6
6
  "names": ["MarkdownIt", "md"]
7
7
  }
package/runtime/index.js CHANGED
@@ -1562,7 +1562,7 @@ ${i.themeCSS}`),i.fontFamily!==void 0&&(b+=`
1562
1562
  `)})}g[0]=g[0].replace(/^\r?\n/,"");var E=g[0];return o.forEach(function(w,L){var O=E.match(/(?:^|\n)( *)$/),B=O?O[1]:"",P=w;typeof w=="string"&&w.includes(`
1563
1563
  `)&&(P=String(w).split(`
1564
1564
  `).map(function(j,G){return G===0?j:""+B+j}).join(`
1565
- `)),E+=P+g[L+1]}),E}var Wht=L1n;lu();g1();Tv();var ZOr=is(Zf(),1),JOr=is(Dh(),1);var tNr=is(V1(),1);sc();var rOn=(i,o,h)=>{jt.warn(i),DDt(i)?(h&&h(i.str,i.hash),o.push({...i,message:i.str,error:i})):(h&&h(i),i instanceof Error&&o.push({str:i.message,message:i.message,hash:i.name,error:i}))},zOe=async function(i={querySelector:".mermaid"}){try{await iOn(i)}catch(o){if(DDt(o)&&jt.error(o.str),Nv.parseError&&Nv.parseError(o),!i.suppressErrors)throw jt.error("Use the suppressErrors option to suppress these errors"),o}},iOn=async function({postRenderCallback:i,querySelector:o,nodes:h}={querySelector:".mermaid"}){let g=Mu.getConfig();jt.debug(`${i?"":"No "}Callback function found`);let b;if(h)b=h;else if(o)b=document.querySelectorAll(o);else throw new Error("Nodes and querySelector are both undefined");jt.debug(`Found ${b.length} diagrams`),g?.startOnLoad!==void 0&&(jt.debug("Start On Load: "+g?.startOnLoad),Mu.updateSiteConfig({startOnLoad:g?.startOnLoad}));let x=new Gs.initIdGenerator(g.deterministicIds,g.deterministicIDSeed),E,w=[];for(let L of Array.from(b)){jt.info("Rendering diagram: "+L.id);if(L.getAttribute("data-processed"))continue;L.setAttribute("data-processed","true");let O=`mermaid-${x.next()}`;E=L.innerHTML,E=Wht(Gs.entityDecode(E)).trim().replace(/<br\s*\/?>/gi,"<br/>");let B=Gs.detectInit(E);B&&jt.debug("Detected early reinit: ",B);try{let{svg:P,bindFunctions:j}=await VOe(O,E,L);L.innerHTML=P,i&&await i(O),j&&j(L)}catch(P){rOn(P,w,Nv.parseError)}}if(w.length>0)throw w[0]},HOe=function(i){Mu.initialize(i)},sOn=async function(i,o,h){jt.warn("mermaid.init is deprecated. Please use run instead."),i&&HOe(i);let g={postRenderCallback:h,querySelector:".mermaid"};typeof o=="string"?g.querySelector=o:o&&(o instanceof HTMLElement?g.nodes=[o]:g.nodes=o),await zOe(g)},aOn=async(i,{lazyLoad:o=!0}={})=>{Ndt(...i),o===!1&&await lEe()},$Oe=function(){if(Nv.startOnLoad){let{startOnLoad:i}=Mu.getConfig();i&&Nv.run().catch(o=>jt.error("Mermaid failed to initialize",o))}};if(typeof document<"u"){window.addEventListener("load",$Oe,!1)}var oOn=function(i){Nv.parseError=i},dgt=[],eBt=!1,GOe=async()=>{if(!eBt){for(eBt=!0;dgt.length>0;){let i=dgt.shift();if(i)try{await i()}catch(o){jt.error("Error executing queue",o)}}eBt=!1}},cOn=async(i,o)=>new Promise((h,g)=>{let b=()=>new Promise((x,E)=>{Mu.parse(i,o).then(w=>{x(w),h(w)},w=>{var L;jt.error("Error parsing",w),(L=Nv.parseError)==null||L.call(Nv,w),E(w),g(w)})});dgt.push(b),GOe().catch(g)}),VOe=(i,o,h)=>new Promise((g,b)=>{let x=()=>new Promise((E,w)=>{Mu.render(i,o,h).then(L=>{E(L),g(L)},L=>{var O;jt.error("Error parsing",L),(O=Nv.parseError)==null||O.call(Nv,L),w(L),b(L)})});dgt.push(x),GOe().catch(b)}),Nv={startOnLoad:!0,mermaidAPI:Mu,parse:cOn,render:VOe,init:sOn,run:zOe,registerExternalDiagrams:aOn,initialize:HOe,parseError:void 0,contentLoaded:$Oe,setParseErrorHandler:oOn};Nv.initialize({startOnLoad:!1,theme:"forest"});var nBt=window.mermaidJsonp=window.mermaidJsonp||[],rBt=nBt.splice(0,nBt.length);nBt.push=function(...i){return i.forEach(o=>{rBt.push(o),qOe()}),rBt.length};var iBt=!1;function qOe(){iBt||UOe()}async function UOe(){iBt=!0;let i=rBt.shift();if(i)return await i({run:async()=>{let o=document.querySelectorAll(".mermaid");for(let h of Array.from(o)){let g=`mermaid-${Date.now()}`,b=h.getAttribute("data-content")||"",x=Wht(decodeURIComponent(b)).trim().replace(/<br\s*\/?>/gi,"<br/>"),{svg:E,bindFunctions:w}=await Nv.render(g,x,h);h.innerHTML=E,w&&w(h)}},initialize:o=>{Nv.initialize({startOnLoad:!1,...o})}}),UOe();iBt=!1}qOe();})();
1565
+ `)),E+=P+g[L+1]}),E}var Wht=L1n;lu();g1();Tv();var ZOr=is(Zf(),1),JOr=is(Dh(),1);var tNr=is(V1(),1);sc();var rOn=(i,o,h)=>{jt.warn(i),DDt(i)?(h&&h(i.str,i.hash),o.push({...i,message:i.str,error:i})):(h&&h(i),i instanceof Error&&o.push({str:i.message,message:i.message,hash:i.name,error:i}))},zOe=async function(i={querySelector:".mermaid"}){try{await iOn(i)}catch(o){if(DDt(o)&&jt.error(o.str),Nv.parseError&&Nv.parseError(o),!i.suppressErrors)throw jt.error("Use the suppressErrors option to suppress these errors"),o}},iOn=async function({postRenderCallback:i,querySelector:o,nodes:h}={querySelector:".mermaid"}){let g=Mu.getConfig();jt.debug(`${i?"":"No "}Callback function found`);let b;if(h)b=h;else if(o)b=document.querySelectorAll(o);else throw new Error("Nodes and querySelector are both undefined");jt.debug(`Found ${b.length} diagrams`),g?.startOnLoad!==void 0&&(jt.debug("Start On Load: "+g?.startOnLoad),Mu.updateSiteConfig({startOnLoad:g?.startOnLoad}));let x=new Gs.initIdGenerator(g.deterministicIds,g.deterministicIDSeed),E,w=[];for(let L of Array.from(b)){jt.info("Rendering diagram: "+L.id);if(L.getAttribute("data-processed"))continue;L.setAttribute("data-processed","true");let O=`mermaid-${x.next()}`;E=L.innerHTML,E=Wht(Gs.entityDecode(E)).trim().replace(/<br\s*\/?>/gi,"<br/>");let B=Gs.detectInit(E);B&&jt.debug("Detected early reinit: ",B);try{let{svg:P,bindFunctions:j}=await VOe(O,E,L);L.innerHTML=P,i&&await i(O),j&&j(L)}catch(P){rOn(P,w,Nv.parseError)}}if(w.length>0)throw w[0]},HOe=function(i){Mu.initialize(i)},sOn=async function(i,o,h){jt.warn("mermaid.init is deprecated. Please use run instead."),i&&HOe(i);let g={postRenderCallback:h,querySelector:".mermaid"};typeof o=="string"?g.querySelector=o:o&&(o instanceof HTMLElement?g.nodes=[o]:g.nodes=o),await zOe(g)},aOn=async(i,{lazyLoad:o=!0}={})=>{Ndt(...i),o===!1&&await lEe()},$Oe=function(){if(Nv.startOnLoad){let{startOnLoad:i}=Mu.getConfig();i&&Nv.run().catch(o=>jt.error("Mermaid failed to initialize",o))}};if(typeof document<"u"){window.addEventListener("load",$Oe,!1)}var oOn=function(i){Nv.parseError=i},dgt=[],eBt=!1,GOe=async()=>{if(!eBt){for(eBt=!0;dgt.length>0;){let i=dgt.shift();if(i)try{await i()}catch(o){jt.error("Error executing queue",o)}}eBt=!1}},cOn=async(i,o)=>new Promise((h,g)=>{let b=()=>new Promise((x,E)=>{Mu.parse(i,o).then(w=>{x(w),h(w)},w=>{var L;jt.error("Error parsing",w),(L=Nv.parseError)==null||L.call(Nv,w),E(w),g(w)})});dgt.push(b),GOe().catch(g)}),VOe=(i,o,h)=>new Promise((g,b)=>{let x=()=>new Promise((E,w)=>{Mu.render(i,o,h).then(L=>{E(L),g(L)},L=>{var O;jt.error("Error parsing",L),(O=Nv.parseError)==null||O.call(Nv,L),w(L),b(L)})});dgt.push(x),GOe().catch(b)}),Nv={startOnLoad:!0,mermaidAPI:Mu,parse:cOn,render:VOe,init:sOn,run:zOe,registerExternalDiagrams:aOn,initialize:HOe,parseError:void 0,contentLoaded:$Oe,setParseErrorHandler:oOn};Nv.initialize({startOnLoad:!1,theme:"forest"});var nBt=window.mermaidJsonp=window.mermaidJsonp||[],rBt=nBt.splice(0,nBt.length);nBt.push=function(...i){return i.forEach(o=>{rBt.push(o),qOe()}),rBt.length};var iBt=!1;function qOe(){iBt||UOe()}async function UOe(){iBt=!0;let i=rBt.shift();if(i)return await i({run:async({querySelector:o=".mermaid"}={})=>{let h=document.querySelectorAll(o);for(let g of Array.from(h)){let b=`mermaid-${Date.now()}`,x=g.getAttribute("data-content")||"",E=Wht(decodeURIComponent(x)).trim().replace(/<br\s*\/?>/gi,"<br/>"),{svg:w,bindFunctions:L}=await Nv.render(b,E,g);g.innerHTML=w,L&&L(g)}},initialize:o=>{Nv.initialize({startOnLoad:!1,...o})}}),UOe();iBt=!1}qOe();})();
1566
1566
  /*! Bundled license information:
1567
1567
 
1568
1568
  dompurify/dist/purify.js: