@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 +111 -0
- package/package.json +1 -1
- package/plugin/index.js +1 -1
- package/plugin/index.js.map +2 -2
- package/runtime/index.js +1 -1
- package/runtime/index.js.map +3 -3
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
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,
|
package/plugin/index.js.map
CHANGED
|
@@ -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,
|
|
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
|
|
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:
|