@hejiayue/x-markdown-test 0.0.1-beta.151 → 0.0.1-beta.152
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/dist/style.css +438 -1
- package/dist/types/config.d.ts +33 -0
- package/dist/types/hooks/useMermaid.d.ts +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/x-markdown.cjs.js +35 -1
- package/dist/x-markdown.cjs.js.map +1 -1
- package/dist/x-markdown.cjs10.js +52 -1
- package/dist/x-markdown.cjs10.js.map +1 -1
- package/dist/x-markdown.cjs11.js +57 -1
- package/dist/x-markdown.cjs11.js.map +1 -1
- package/dist/x-markdown.cjs12.js +18 -0
- package/dist/x-markdown.cjs12.js.map +1 -0
- package/dist/x-markdown.cjs14.js +92 -1
- package/dist/x-markdown.cjs14.js.map +1 -1
- package/dist/x-markdown.cjs15.js +36 -1
- package/dist/x-markdown.cjs15.js.map +1 -1
- package/dist/x-markdown.cjs16.js +9 -1
- package/dist/x-markdown.cjs16.js.map +1 -1
- package/dist/x-markdown.cjs17.js +10 -1
- package/dist/x-markdown.cjs17.js.map +1 -1
- package/dist/x-markdown.cjs18.js +11 -1
- package/dist/x-markdown.cjs18.js.map +1 -1
- package/dist/x-markdown.cjs19.js +11 -1
- package/dist/x-markdown.cjs19.js.map +1 -1
- package/dist/x-markdown.cjs2.js +86 -1
- package/dist/x-markdown.cjs2.js.map +1 -1
- package/dist/x-markdown.cjs20.js +211 -0
- package/dist/x-markdown.cjs20.js.map +1 -0
- package/dist/x-markdown.cjs22.js +13 -1
- package/dist/x-markdown.cjs22.js.map +1 -1
- package/dist/x-markdown.cjs23.js +79 -0
- package/dist/x-markdown.cjs23.js.map +1 -0
- package/dist/x-markdown.cjs25.js +409 -0
- package/dist/x-markdown.cjs25.js.map +1 -0
- package/dist/x-markdown.cjs27.js +199 -1
- package/dist/x-markdown.cjs27.js.map +1 -1
- package/dist/x-markdown.cjs28.js +135 -1
- package/dist/x-markdown.cjs28.js.map +1 -1
- package/dist/x-markdown.cjs3.js +97 -1
- package/dist/x-markdown.cjs3.js.map +1 -1
- package/dist/x-markdown.cjs30.js +11 -1
- package/dist/x-markdown.cjs30.js.map +1 -1
- package/dist/x-markdown.cjs31.js +122 -1
- package/dist/x-markdown.cjs31.js.map +1 -1
- package/dist/x-markdown.cjs32.js +11 -0
- package/dist/x-markdown.cjs32.js.map +1 -0
- package/dist/x-markdown.cjs33.js +128 -1
- package/dist/x-markdown.cjs33.js.map +1 -1
- package/dist/x-markdown.cjs4.js +153 -1
- package/dist/x-markdown.cjs4.js.map +1 -1
- package/dist/x-markdown.cjs5.js +43 -1
- package/dist/x-markdown.cjs5.js.map +1 -1
- package/dist/x-markdown.cjs6.js +27 -1
- package/dist/x-markdown.cjs6.js.map +1 -1
- package/dist/x-markdown.cjs7.js +310 -1
- package/dist/x-markdown.cjs7.js.map +1 -1
- package/dist/x-markdown.cjs8.js +30 -1
- package/dist/x-markdown.cjs8.js.map +1 -1
- package/dist/x-markdown.cjs9.js +435 -1
- package/dist/x-markdown.cjs9.js.map +1 -1
- package/dist/x-markdown.es.js +11 -28
- package/dist/x-markdown.es10.js +10 -10
- package/dist/x-markdown.es10.js.map +1 -1
- package/dist/x-markdown.es11.js +4 -5
- package/dist/x-markdown.es11.js.map +1 -1
- package/dist/x-markdown.es12.js +12 -0
- package/dist/x-markdown.es12.js.map +1 -0
- package/dist/x-markdown.es14.js +85 -29
- package/dist/x-markdown.es14.js.map +1 -1
- package/dist/x-markdown.es15.js +32 -4
- package/dist/x-markdown.es15.js.map +1 -1
- package/dist/x-markdown.es16.js +5 -5
- package/dist/x-markdown.es16.js.map +1 -1
- package/dist/x-markdown.es17.js +5 -6
- package/dist/x-markdown.es17.js.map +1 -1
- package/dist/x-markdown.es18.js +6 -6
- package/dist/x-markdown.es18.js.map +1 -1
- package/dist/x-markdown.es19.js +7 -206
- package/dist/x-markdown.es19.js.map +1 -1
- package/dist/x-markdown.es2.js +6 -7
- package/dist/x-markdown.es2.js.map +1 -1
- package/dist/x-markdown.es20.js +207 -0
- package/dist/x-markdown.es20.js.map +1 -0
- package/dist/x-markdown.es22.js +7 -72
- package/dist/x-markdown.es22.js.map +1 -1
- package/dist/x-markdown.es23.js +75 -0
- package/dist/x-markdown.es23.js.map +1 -0
- package/dist/{x-markdown.es24.js → x-markdown.es25.js} +12 -10
- package/dist/x-markdown.es25.js.map +1 -0
- package/dist/x-markdown.es27.js +182 -7
- package/dist/x-markdown.es27.js.map +1 -1
- package/dist/x-markdown.es28.js +7 -8
- package/dist/x-markdown.es28.js.map +1 -1
- package/dist/x-markdown.es3.js +7 -8
- package/dist/x-markdown.es3.js.map +1 -1
- package/dist/x-markdown.es30.js +7 -77
- package/dist/x-markdown.es30.js.map +1 -1
- package/dist/x-markdown.es31.js +112 -124
- package/dist/x-markdown.es31.js.map +1 -1
- package/dist/x-markdown.es32.js +7 -0
- package/dist/x-markdown.es32.js.map +1 -0
- package/dist/x-markdown.es33.js +124 -5
- package/dist/x-markdown.es33.js.map +1 -1
- package/dist/x-markdown.es4.js +5 -7
- package/dist/x-markdown.es4.js.map +1 -1
- package/dist/x-markdown.es5.js +9 -10
- package/dist/x-markdown.es5.js.map +1 -1
- package/dist/x-markdown.es6.js +5 -5
- package/dist/x-markdown.es6.js.map +1 -1
- package/dist/x-markdown.es7.js +61 -74
- package/dist/x-markdown.es7.js.map +1 -1
- package/dist/x-markdown.es8.js +4 -5
- package/dist/x-markdown.es8.js.map +1 -1
- package/dist/x-markdown.es9.js +22 -14
- package/dist/x-markdown.es9.js.map +1 -1
- package/package.json +3 -14
- package/dist/types/vite-plugin.d.ts +0 -29
- package/dist/vite-plugin.cjs +0 -128
- package/dist/vite-plugin.cjs.map +0 -1
- package/dist/vite-plugin.js +0 -128
- package/dist/vite-plugin.js.map +0 -1
- package/dist/x-markdown.cjs13.js +0 -2
- package/dist/x-markdown.cjs13.js.map +0 -1
- package/dist/x-markdown.cjs21.js +0 -2
- package/dist/x-markdown.cjs21.js.map +0 -1
- package/dist/x-markdown.cjs24.js +0 -2
- package/dist/x-markdown.cjs24.js.map +0 -1
- package/dist/x-markdown.cjs26.js +0 -2
- package/dist/x-markdown.cjs26.js.map +0 -1
- package/dist/x-markdown.es13.js +0 -89
- package/dist/x-markdown.es13.js.map +0 -1
- package/dist/x-markdown.es21.js +0 -11
- package/dist/x-markdown.es21.js.map +0 -1
- package/dist/x-markdown.es24.js.map +0 -1
- package/dist/x-markdown.es26.js +0 -160
- package/dist/x-markdown.es26.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.cjs8.js","sources":["../src/hooks/useMarkdown.ts"],"sourcesContent":["import { flow } from 'lodash-es'\r\n\r\nexport function useProcessMarkdown(markdown: string) {\r\n return preprocessLaTeX(markdown)\r\n}\r\n\r\nexport function preprocessLaTeX(markdown: string) {\r\n if (typeof markdown !== 'string') return markdown\r\n\r\n const codeBlockRegex = /```[\\s\\S]*?```/g\r\n const codeBlocks = markdown.match(codeBlockRegex) || []\r\n const escapeReplacement = (str: string) => str.replace(/\\$/g, '_ELX_DOLLAR_')\r\n let processedMarkdown = markdown.replace(codeBlockRegex, 'ELX_CODE_BLOCK_PLACEHOLDER')\r\n\r\n processedMarkdown = flow([\r\n (str: string) => str.replace(/\\\\\\[(.*?)\\\\\\]/g, (_, equation) => `$$${equation}$$`),\r\n (str: string) => str.replace(/\\\\\\[([\\s\\S]*?)\\\\\\]/g, (_, equation) => `$$${equation}$$`),\r\n (str: string) => str.replace(/\\\\\\((.*?)\\\\\\)/g, (_, equation) => `$$${equation}$$`),\r\n (str: string) => str.replace(/(^|[^\\\\])\\$(.+?)\\$/g, (_, prefix, equation) => `${prefix}$${equation}$`),\r\n ])(processedMarkdown)\r\n\r\n codeBlocks.forEach((block) => {\r\n processedMarkdown = processedMarkdown.replace('ELX_CODE_BLOCK_PLACEHOLDER', escapeReplacement(block))\r\n })\r\n\r\n processedMarkdown = processedMarkdown.replace(/_ELX_DOLLAR_/g, '$')\r\n\r\n return processedMarkdown\r\n}\r\n"],"names":["
|
|
1
|
+
{"version":3,"file":"x-markdown.cjs8.js","sources":["../src/hooks/useMarkdown.ts"],"sourcesContent":["import { flow } from 'lodash-es'\r\n\r\nexport function useProcessMarkdown(markdown: string) {\r\n return preprocessLaTeX(markdown)\r\n}\r\n\r\nexport function preprocessLaTeX(markdown: string) {\r\n if (typeof markdown !== 'string') return markdown\r\n\r\n const codeBlockRegex = /```[\\s\\S]*?```/g\r\n const codeBlocks = markdown.match(codeBlockRegex) || []\r\n const escapeReplacement = (str: string) => str.replace(/\\$/g, '_ELX_DOLLAR_')\r\n let processedMarkdown = markdown.replace(codeBlockRegex, 'ELX_CODE_BLOCK_PLACEHOLDER')\r\n\r\n processedMarkdown = flow([\r\n (str: string) => str.replace(/\\\\\\[(.*?)\\\\\\]/g, (_, equation) => `$$${equation}$$`),\r\n (str: string) => str.replace(/\\\\\\[([\\s\\S]*?)\\\\\\]/g, (_, equation) => `$$${equation}$$`),\r\n (str: string) => str.replace(/\\\\\\((.*?)\\\\\\)/g, (_, equation) => `$$${equation}$$`),\r\n (str: string) => str.replace(/(^|[^\\\\])\\$(.+?)\\$/g, (_, prefix, equation) => `${prefix}$${equation}$`),\r\n ])(processedMarkdown)\r\n\r\n codeBlocks.forEach((block) => {\r\n processedMarkdown = processedMarkdown.replace('ELX_CODE_BLOCK_PLACEHOLDER', escapeReplacement(block))\r\n })\r\n\r\n processedMarkdown = processedMarkdown.replace(/_ELX_DOLLAR_/g, '$')\r\n\r\n return processedMarkdown\r\n}\r\n"],"names":["flow"],"mappings":";;;;;;AAEO,SAAS,mBAAmB,QAAA,EAAkB;AACnD,EAAA,OAAO,gBAAgB,QAAQ,CAAA;AACjC;AAEO,SAAS,gBAAgB,QAAA,EAAkB;AAChD,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,QAAA;AAEzC,EAAA,MAAM,cAAA,GAAiB,iBAAA;AACvB,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,cAAc,KAAK,EAAC;AACtD,EAAA,MAAM,oBAAoB,CAAC,GAAA,KAAgB,GAAA,CAAI,OAAA,CAAQ,OAAO,cAAc,CAAA;AAC5E,EAAA,IAAI,iBAAA,GAAoB,QAAA,CAAS,OAAA,CAAQ,cAAA,EAAgB,4BAA4B,CAAA;AAErF,EAAA,iBAAA,GAAoBA,aAAA,CAAK;AAAA,IACvB,CAAC,GAAA,KAAgB,GAAA,CAAI,OAAA,CAAQ,gBAAA,EAAkB,CAAC,CAAA,EAAG,QAAA,KAAa,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,IACjF,CAAC,GAAA,KAAgB,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,CAAC,CAAA,EAAG,QAAA,KAAa,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,IACtF,CAAC,GAAA,KAAgB,GAAA,CAAI,OAAA,CAAQ,gBAAA,EAAkB,CAAC,CAAA,EAAG,QAAA,KAAa,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,IACjF,CAAC,GAAA,KAAgB,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,CAAC,CAAA,EAAG,MAAA,EAAQ,QAAA,KAAa,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAG;AAAA,GACtG,EAAE,iBAAiB,CAAA;AAEpB,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC5B,IAAA,iBAAA,GAAoB,iBAAA,CAAkB,OAAA,CAAQ,4BAAA,EAA8B,iBAAA,CAAkB,KAAK,CAAC,CAAA;AAAA,EACtG,CAAC,CAAA;AAED,EAAA,iBAAA,GAAoB,iBAAA,CAAkB,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAA;AAElE,EAAA,OAAO,iBAAA;AACT;;;;;"}
|
package/dist/x-markdown.cjs9.js
CHANGED
|
@@ -1,2 +1,436 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
|
|
5
|
+
const lodashEs = require('lodash-es');
|
|
6
|
+
const vue = require('vue');
|
|
7
|
+
const config = require('./x-markdown.cjs12.js');
|
|
8
|
+
|
|
9
|
+
const consoleHintsEnabled = () => {
|
|
10
|
+
if (typeof __X_MARKDOWN_CONSOLE_HINTS_ENABLED__ === "boolean") {
|
|
11
|
+
return __X_MARKDOWN_CONSOLE_HINTS_ENABLED__;
|
|
12
|
+
}
|
|
13
|
+
return true;
|
|
14
|
+
};
|
|
15
|
+
function downloadSvgAsPng(svg) {
|
|
16
|
+
if (!svg) return;
|
|
17
|
+
try {
|
|
18
|
+
const svgDataUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
|
|
19
|
+
const img = new Image();
|
|
20
|
+
img.onload = () => {
|
|
21
|
+
try {
|
|
22
|
+
const canvas = document.createElement("canvas");
|
|
23
|
+
const ctx = canvas.getContext("2d", { willReadFrequently: false });
|
|
24
|
+
if (!ctx) return;
|
|
25
|
+
const scale = 2;
|
|
26
|
+
canvas.width = img.width * scale;
|
|
27
|
+
canvas.height = img.height * scale;
|
|
28
|
+
ctx.imageSmoothingEnabled = true;
|
|
29
|
+
ctx.imageSmoothingQuality = "high";
|
|
30
|
+
ctx.fillStyle = "#ffffff";
|
|
31
|
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
32
|
+
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
|
33
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString().slice(0, 19).replace(/:/g, "-");
|
|
34
|
+
try {
|
|
35
|
+
canvas.toBlob(
|
|
36
|
+
(blob) => {
|
|
37
|
+
if (!blob) return;
|
|
38
|
+
const url = URL.createObjectURL(blob);
|
|
39
|
+
const link = document.createElement("a");
|
|
40
|
+
link.href = url;
|
|
41
|
+
link.download = `mermaid-diagram-${timestamp}.png`;
|
|
42
|
+
document.body.appendChild(link);
|
|
43
|
+
link.click();
|
|
44
|
+
document.body.removeChild(link);
|
|
45
|
+
URL.revokeObjectURL(url);
|
|
46
|
+
},
|
|
47
|
+
"image/png",
|
|
48
|
+
0.95
|
|
49
|
+
);
|
|
50
|
+
} catch (toBlobError) {
|
|
51
|
+
console.error("Failed to convert canvas to blob:", toBlobError);
|
|
52
|
+
try {
|
|
53
|
+
const dataUrl = canvas.toDataURL("image/png", 0.95);
|
|
54
|
+
const link = document.createElement("a");
|
|
55
|
+
link.href = dataUrl;
|
|
56
|
+
link.download = `mermaid-diagram-${timestamp}.png`;
|
|
57
|
+
document.body.appendChild(link);
|
|
58
|
+
link.click();
|
|
59
|
+
document.body.removeChild(link);
|
|
60
|
+
} catch (dataUrlError) {
|
|
61
|
+
console.error("Failed to convert canvas to data URL:", dataUrlError);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
} catch (canvasError) {
|
|
65
|
+
console.error("Canvas operation failed:", canvasError);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
img.onerror = (error) => {
|
|
69
|
+
console.error("Failed to load image:", error);
|
|
70
|
+
};
|
|
71
|
+
img.src = svgDataUrl;
|
|
72
|
+
} catch (error) {
|
|
73
|
+
console.error("Failed to download SVG:", error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
let mermaidPromise = null;
|
|
77
|
+
let hasShownMermaidHint = false;
|
|
78
|
+
let mermaidAvailableCache = null;
|
|
79
|
+
let mermaidCheckPromise = null;
|
|
80
|
+
const showMermaidHint = () => {
|
|
81
|
+
if (hasShownMermaidHint) return;
|
|
82
|
+
if (!consoleHintsEnabled()) return;
|
|
83
|
+
hasShownMermaidHint = true;
|
|
84
|
+
console.log(
|
|
85
|
+
"%c[x-markdown]%c 图表可选: %cpnpm add mermaid%c (需配置 mermaidLoader)",
|
|
86
|
+
"font-weight: bold; color: #9333ea;",
|
|
87
|
+
"color: #666;",
|
|
88
|
+
"color: #9333ea; font-family: monospace;",
|
|
89
|
+
"color: #999;"
|
|
90
|
+
);
|
|
91
|
+
};
|
|
92
|
+
async function checkMermaidAvailable(loader) {
|
|
93
|
+
if (mermaidAvailableCache !== null) {
|
|
94
|
+
return mermaidAvailableCache;
|
|
95
|
+
}
|
|
96
|
+
if (mermaidCheckPromise) {
|
|
97
|
+
return mermaidCheckPromise;
|
|
98
|
+
}
|
|
99
|
+
mermaidCheckPromise = (async () => {
|
|
100
|
+
try {
|
|
101
|
+
if (!loader) {
|
|
102
|
+
mermaidAvailableCache = false;
|
|
103
|
+
showMermaidHint();
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
const mod = await loader();
|
|
107
|
+
const mermaidInstance = mod?.default;
|
|
108
|
+
const hasMermaidAPI = mermaidInstance && (typeof mermaidInstance.render === "function" || typeof mermaidInstance.initialize === "function" || typeof mermaidInstance.run === "function");
|
|
109
|
+
mermaidAvailableCache = hasMermaidAPI;
|
|
110
|
+
if (!hasMermaidAPI) {
|
|
111
|
+
showMermaidHint();
|
|
112
|
+
}
|
|
113
|
+
return mermaidAvailableCache;
|
|
114
|
+
} catch {
|
|
115
|
+
mermaidAvailableCache = false;
|
|
116
|
+
showMermaidHint();
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
})();
|
|
120
|
+
return mermaidCheckPromise;
|
|
121
|
+
}
|
|
122
|
+
async function loadMermaid(loader) {
|
|
123
|
+
if (typeof window === "undefined") return null;
|
|
124
|
+
if (!mermaidPromise) {
|
|
125
|
+
mermaidPromise = (async () => {
|
|
126
|
+
try {
|
|
127
|
+
if (!loader) {
|
|
128
|
+
showMermaidHint();
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const mod = await loader();
|
|
132
|
+
if (mod && mod.default === null) {
|
|
133
|
+
showMermaidHint();
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
const mermaidInstance = mod?.default;
|
|
137
|
+
if (!mermaidInstance || typeof mermaidInstance.initialize !== "function") {
|
|
138
|
+
showMermaidHint();
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return mermaidInstance;
|
|
142
|
+
} catch {
|
|
143
|
+
showMermaidHint();
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
})();
|
|
147
|
+
}
|
|
148
|
+
return mermaidPromise;
|
|
149
|
+
}
|
|
150
|
+
const renderQueue = [];
|
|
151
|
+
let isProcessingQueue = false;
|
|
152
|
+
async function processRenderQueue() {
|
|
153
|
+
if (isProcessingQueue) return;
|
|
154
|
+
isProcessingQueue = true;
|
|
155
|
+
while (renderQueue.length > 0) {
|
|
156
|
+
const task = renderQueue.shift();
|
|
157
|
+
if (task) {
|
|
158
|
+
try {
|
|
159
|
+
await task();
|
|
160
|
+
} catch (err) {
|
|
161
|
+
console.error("Mermaid render queue error:", err);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
isProcessingQueue = false;
|
|
166
|
+
}
|
|
167
|
+
function addToRenderQueue(task) {
|
|
168
|
+
renderQueue.push(task);
|
|
169
|
+
processRenderQueue();
|
|
170
|
+
}
|
|
171
|
+
function useMermaid(content, options = {}) {
|
|
172
|
+
const config$1 = config.useXMarkdownConfig();
|
|
173
|
+
const optionsRef = vue.computed(() => typeof options === "object" && "value" in options ? options.value : options);
|
|
174
|
+
const mermaidConfig = vue.computed(() => ({
|
|
175
|
+
suppressErrorRendering: true,
|
|
176
|
+
startOnLoad: false,
|
|
177
|
+
securityLevel: "loose",
|
|
178
|
+
theme: optionsRef.value.theme || "default",
|
|
179
|
+
...optionsRef.value.config || {}
|
|
180
|
+
}));
|
|
181
|
+
const data = vue.ref("");
|
|
182
|
+
const error = vue.ref(null);
|
|
183
|
+
const isLoading = vue.ref(false);
|
|
184
|
+
let isUnmounted = false;
|
|
185
|
+
const getRenderContainer = () => {
|
|
186
|
+
const containerOption = optionsRef.value.container;
|
|
187
|
+
if (containerOption) {
|
|
188
|
+
return typeof containerOption === "object" && "value" in containerOption ? containerOption.value : containerOption;
|
|
189
|
+
}
|
|
190
|
+
return null;
|
|
191
|
+
};
|
|
192
|
+
const throttledRender = lodashEs.throttle(
|
|
193
|
+
() => {
|
|
194
|
+
const contentValue = typeof content === "string" ? content : content.value;
|
|
195
|
+
if (!contentValue?.trim()) {
|
|
196
|
+
data.value = "";
|
|
197
|
+
error.value = null;
|
|
198
|
+
isLoading.value = false;
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
isLoading.value = true;
|
|
202
|
+
addToRenderQueue(async () => {
|
|
203
|
+
if (isUnmounted) return;
|
|
204
|
+
try {
|
|
205
|
+
const mermaidInstance = await loadMermaid(config$1.mermaid);
|
|
206
|
+
if (!mermaidInstance) {
|
|
207
|
+
data.value = contentValue;
|
|
208
|
+
error.value = null;
|
|
209
|
+
isLoading.value = false;
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
mermaidInstance.initialize(mermaidConfig.value);
|
|
213
|
+
const isValid = await mermaidInstance.parse(contentValue.trim());
|
|
214
|
+
if (!isValid) {
|
|
215
|
+
data.value = "";
|
|
216
|
+
error.value = new Error("Mermaid parse error: Invalid syntax");
|
|
217
|
+
isLoading.value = false;
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const renderId = `${optionsRef.value.id || "mermaid"}-${Math.random().toString(36).substring(2, 11)}`;
|
|
221
|
+
const container = getRenderContainer();
|
|
222
|
+
if (!container) {
|
|
223
|
+
isLoading.value = false;
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const { svg } = await mermaidInstance.render(renderId, contentValue, container);
|
|
227
|
+
data.value = svg;
|
|
228
|
+
error.value = null;
|
|
229
|
+
isLoading.value = false;
|
|
230
|
+
} catch (err) {
|
|
231
|
+
data.value = "";
|
|
232
|
+
error.value = err;
|
|
233
|
+
isLoading.value = false;
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
},
|
|
237
|
+
100,
|
|
238
|
+
{ leading: false, trailing: true }
|
|
239
|
+
);
|
|
240
|
+
vue.watch(
|
|
241
|
+
[() => typeof content === "string" ? content : content.value, () => mermaidConfig.value],
|
|
242
|
+
() => {
|
|
243
|
+
throttledRender();
|
|
244
|
+
},
|
|
245
|
+
{ immediate: true }
|
|
246
|
+
);
|
|
247
|
+
vue.onUnmounted(() => {
|
|
248
|
+
isUnmounted = true;
|
|
249
|
+
});
|
|
250
|
+
return {
|
|
251
|
+
data,
|
|
252
|
+
error,
|
|
253
|
+
isLoading
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
function useMermaidZoom(options) {
|
|
257
|
+
const { container } = options;
|
|
258
|
+
const scale = vue.ref(1);
|
|
259
|
+
const posX = vue.ref(0);
|
|
260
|
+
const posY = vue.ref(0);
|
|
261
|
+
const isDragging = vue.ref(false);
|
|
262
|
+
let removeEvents = null;
|
|
263
|
+
const getSvg = () => container.value?.querySelector(".syntax-mermaid__content svg");
|
|
264
|
+
const updateTransform = (svg) => {
|
|
265
|
+
svg.style.transformOrigin = "center center";
|
|
266
|
+
svg.style.transform = `translate(${posX.value}px, ${posY.value}px) scale(${scale.value})`;
|
|
267
|
+
};
|
|
268
|
+
const resetState = () => {
|
|
269
|
+
scale.value = 1;
|
|
270
|
+
posX.value = 0;
|
|
271
|
+
posY.value = 0;
|
|
272
|
+
isDragging.value = false;
|
|
273
|
+
};
|
|
274
|
+
const addInteractionEvents = (containerEl) => {
|
|
275
|
+
let startX = 0;
|
|
276
|
+
let startY = 0;
|
|
277
|
+
let isInteractingWithMermaid = false;
|
|
278
|
+
const onStart = (clientX, clientY) => {
|
|
279
|
+
isDragging.value = true;
|
|
280
|
+
startX = clientX - posX.value;
|
|
281
|
+
startY = clientY - posY.value;
|
|
282
|
+
document.body.style.userSelect = "none";
|
|
283
|
+
};
|
|
284
|
+
const onMove = (clientX, clientY) => {
|
|
285
|
+
if (isDragging.value && isInteractingWithMermaid) {
|
|
286
|
+
posX.value = clientX - startX;
|
|
287
|
+
posY.value = clientY - startY;
|
|
288
|
+
const svg = getSvg();
|
|
289
|
+
if (svg) {
|
|
290
|
+
updateTransform(svg);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
const onEnd = () => {
|
|
295
|
+
isDragging.value = false;
|
|
296
|
+
isInteractingWithMermaid = false;
|
|
297
|
+
document.body.style.userSelect = "";
|
|
298
|
+
};
|
|
299
|
+
const onMouseDown = (e) => {
|
|
300
|
+
if (e.button !== 0) return;
|
|
301
|
+
if (e.target === containerEl || containerEl.contains(e.target)) {
|
|
302
|
+
e.preventDefault();
|
|
303
|
+
isInteractingWithMermaid = true;
|
|
304
|
+
onStart(e.clientX, e.clientY);
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
const onMouseMove = (e) => {
|
|
308
|
+
if (isInteractingWithMermaid) {
|
|
309
|
+
onMove(e.clientX, e.clientY);
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
const handleWheelZoom = (e) => {
|
|
313
|
+
const svg = getSvg();
|
|
314
|
+
if (!svg) return;
|
|
315
|
+
const containerRect = containerEl.getBoundingClientRect();
|
|
316
|
+
const svgRect = svg.getBoundingClientRect();
|
|
317
|
+
const mouseX = e.clientX - containerRect.left;
|
|
318
|
+
const mouseY = e.clientY - containerRect.top;
|
|
319
|
+
const svgCenterX = svgRect.left - containerRect.left + svgRect.width / 2;
|
|
320
|
+
const svgCenterY = svgRect.top - containerRect.top + svgRect.height / 2;
|
|
321
|
+
const offsetX = (mouseX - svgCenterX - posX.value) / scale.value;
|
|
322
|
+
const offsetY = (mouseY - svgCenterY - posY.value) / scale.value;
|
|
323
|
+
const delta = e.deltaY > 0 ? -0.05 : 0.05;
|
|
324
|
+
const newScale = Math.min(Math.max(scale.value + delta, 0.1), 10);
|
|
325
|
+
if (newScale === scale.value) return;
|
|
326
|
+
scale.value = newScale;
|
|
327
|
+
posX.value = mouseX - svgCenterX - offsetX * scale.value;
|
|
328
|
+
posY.value = mouseY - svgCenterY - offsetY * scale.value;
|
|
329
|
+
updateTransform(svg);
|
|
330
|
+
};
|
|
331
|
+
const throttledWheelZoom = lodashEs.throttle(handleWheelZoom, 20, { leading: true, trailing: true });
|
|
332
|
+
const onWheel = (e) => {
|
|
333
|
+
if (e.target === containerEl || containerEl.contains(e.target)) {
|
|
334
|
+
e.preventDefault();
|
|
335
|
+
throttledWheelZoom(e);
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
const onTouchStart = (e) => {
|
|
339
|
+
if (e.target === containerEl || containerEl.contains(e.target)) {
|
|
340
|
+
if (e.touches.length === 1) {
|
|
341
|
+
e.preventDefault();
|
|
342
|
+
isInteractingWithMermaid = true;
|
|
343
|
+
onStart(e.touches[0].clientX, e.touches[0].clientY);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
const onTouchMove = (e) => {
|
|
348
|
+
if (isInteractingWithMermaid) {
|
|
349
|
+
e.preventDefault();
|
|
350
|
+
onMove(e.touches[0].clientX, e.touches[0].clientY);
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
containerEl.addEventListener("mousedown", onMouseDown);
|
|
354
|
+
document.addEventListener("mousemove", onMouseMove);
|
|
355
|
+
document.addEventListener("mouseup", onEnd);
|
|
356
|
+
containerEl.addEventListener("wheel", onWheel, { passive: false });
|
|
357
|
+
containerEl.addEventListener("touchstart", onTouchStart, { passive: false });
|
|
358
|
+
containerEl.addEventListener("touchmove", onTouchMove, { passive: false });
|
|
359
|
+
document.addEventListener("touchend", onEnd);
|
|
360
|
+
return () => {
|
|
361
|
+
containerEl.removeEventListener("mousedown", onMouseDown);
|
|
362
|
+
document.removeEventListener("mousemove", onMouseMove);
|
|
363
|
+
document.removeEventListener("mouseup", onEnd);
|
|
364
|
+
containerEl.removeEventListener("wheel", onWheel);
|
|
365
|
+
containerEl.removeEventListener("touchstart", onTouchStart);
|
|
366
|
+
containerEl.removeEventListener("touchmove", onTouchMove);
|
|
367
|
+
document.removeEventListener("touchend", onEnd);
|
|
368
|
+
document.body.style.userSelect = "";
|
|
369
|
+
};
|
|
370
|
+
};
|
|
371
|
+
const zoomIn = () => {
|
|
372
|
+
const svg = getSvg();
|
|
373
|
+
if (svg) {
|
|
374
|
+
scale.value = Math.min(scale.value + 0.2, 10);
|
|
375
|
+
updateTransform(svg);
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
const zoomOut = () => {
|
|
379
|
+
const svg = getSvg();
|
|
380
|
+
if (svg) {
|
|
381
|
+
scale.value = Math.max(scale.value - 0.2, 0.1);
|
|
382
|
+
updateTransform(svg);
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
const reset = () => {
|
|
386
|
+
const svg = getSvg();
|
|
387
|
+
if (svg) {
|
|
388
|
+
resetState();
|
|
389
|
+
updateTransform(svg);
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
const fullscreen = () => {
|
|
393
|
+
if (!container.value) return;
|
|
394
|
+
if (document.fullscreenElement) {
|
|
395
|
+
document.exitFullscreen();
|
|
396
|
+
} else {
|
|
397
|
+
container.value.requestFullscreen?.();
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
const initialize = () => {
|
|
401
|
+
if (!container.value) return;
|
|
402
|
+
resetState();
|
|
403
|
+
removeEvents = addInteractionEvents(container.value);
|
|
404
|
+
const svg = getSvg();
|
|
405
|
+
if (svg) {
|
|
406
|
+
updateTransform(svg);
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
const destroy = () => {
|
|
410
|
+
removeEvents?.();
|
|
411
|
+
removeEvents = null;
|
|
412
|
+
resetState();
|
|
413
|
+
};
|
|
414
|
+
vue.watch(
|
|
415
|
+
() => container.value,
|
|
416
|
+
() => {
|
|
417
|
+
destroy();
|
|
418
|
+
resetState();
|
|
419
|
+
}
|
|
420
|
+
);
|
|
421
|
+
vue.onUnmounted(destroy);
|
|
422
|
+
return {
|
|
423
|
+
zoomIn,
|
|
424
|
+
zoomOut,
|
|
425
|
+
reset,
|
|
426
|
+
fullscreen,
|
|
427
|
+
destroy,
|
|
428
|
+
initialize
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
exports.checkMermaidAvailable = checkMermaidAvailable;
|
|
433
|
+
exports.downloadSvgAsPng = downloadSvgAsPng;
|
|
434
|
+
exports.useMermaid = useMermaid;
|
|
435
|
+
exports.useMermaidZoom = useMermaidZoom;
|
|
2
436
|
//# sourceMappingURL=x-markdown.cjs9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.cjs9.js","sources":["../src/hooks/useMermaid.ts"],"sourcesContent":["import type { Ref } from 'vue'\r\nimport { throttle } from 'lodash-es'\r\nimport { computed, ref, watch, onUnmounted } from 'vue'\r\nimport type { MermaidZoomControls, UseMermaidZoomOptions, UseMermaidResult } from '../components/Mermaid/types'\r\n\r\n// 获取是否启用控制台提示的辅助函数\r\nconst consoleHintsEnabled = () => {\r\n if (typeof __X_MARKDOWN_CONSOLE_HINTS_ENABLED__ === 'boolean') {\r\n return __X_MARKDOWN_CONSOLE_HINTS_ENABLED__\r\n }\r\n return true // 默认启用\r\n}\r\n\r\nexport function downloadSvgAsPng(svg: string): void {\r\n if (!svg) return\r\n\r\n try {\r\n const svgDataUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\r\n const img = new Image()\r\n\r\n img.onload = () => {\r\n try {\r\n const canvas = document.createElement('canvas')\r\n const ctx = canvas.getContext('2d', { willReadFrequently: false })\r\n if (!ctx) return\r\n\r\n const scale = 2\r\n canvas.width = img.width * scale\r\n canvas.height = img.height * scale\r\n ctx.imageSmoothingEnabled = true\r\n ctx.imageSmoothingQuality = 'high'\r\n\r\n ctx.fillStyle = '#ffffff'\r\n ctx.fillRect(0, 0, canvas.width, canvas.height)\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\r\n\r\n const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-')\r\n\r\n try {\r\n canvas.toBlob(\r\n (blob) => {\r\n if (!blob) return\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = `mermaid-diagram-${timestamp}.png`\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n },\r\n 'image/png',\r\n 0.95,\r\n )\r\n } catch (toBlobError) {\r\n console.error('Failed to convert canvas to blob:', toBlobError)\r\n try {\r\n const dataUrl = canvas.toDataURL('image/png', 0.95)\r\n const link = document.createElement('a')\r\n link.href = dataUrl\r\n link.download = `mermaid-diagram-${timestamp}.png`\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n } catch (dataUrlError) {\r\n console.error('Failed to convert canvas to data URL:', dataUrlError)\r\n }\r\n }\r\n } catch (canvasError) {\r\n console.error('Canvas operation failed:', canvasError)\r\n }\r\n }\r\n\r\n img.onerror = (error) => {\r\n console.error('Failed to load image:', error)\r\n }\r\n\r\n img.src = svgDataUrl\r\n } catch (error) {\r\n console.error('Failed to download SVG:', error)\r\n }\r\n}\r\n\r\ninterface UseMermaidOptions {\r\n id?: string\r\n theme?: 'default' | 'dark' | 'forest' | 'neutral' | string\r\n config?: any\r\n container?: HTMLElement | Ref<HTMLElement | null> | null\r\n}\r\n\r\ntype UseMermaidOptionsInput = UseMermaidOptions | Ref<UseMermaidOptions>\r\n\r\nlet mermaidPromise: Promise<any> | null = null\r\nlet hasShownMermaidHint = false\r\nlet mermaidAvailableCache: boolean | null = null\r\nlet mermaidCheckPromise: Promise<boolean | null> | null = null\r\n\r\n/**\r\n * 显示 mermaid 安装提示\r\n */\r\nconst showMermaidHint = () => {\r\n if (hasShownMermaidHint) return\r\n if (!consoleHintsEnabled()) return\r\n\r\n hasShownMermaidHint = true\r\n\r\n console.log(\r\n '%c[x-markdown]%c 图表可选: %cpnpm add mermaid%c',\r\n 'font-weight: bold; color: #9333ea;',\r\n 'color: #666;',\r\n 'color: #9333ea; font-family: monospace;',\r\n 'color: #999;'\r\n )\r\n}\r\n\r\n/**\r\n * 同步检查缓存状态(不触发检测)\r\n * @returns 缓存状态,null 表示未检测\r\n */\r\nexport function getMermaidAvailableCache(): boolean | null {\r\n return mermaidAvailableCache\r\n}\r\n\r\n/**\r\n * 检测 mermaid 是否可用(全局缓存,只检测一次)\r\n */\r\nexport async function checkMermaidAvailable(): Promise<boolean> {\r\n // 如果已经有缓存结果,直接返回\r\n if (mermaidAvailableCache !== null) {\r\n return mermaidAvailableCache\r\n }\r\n\r\n // 如果正在检测,返回检测 Promise\r\n if (mermaidCheckPromise) {\r\n return mermaidCheckPromise as Promise<boolean>\r\n }\r\n\r\n // 开始检测\r\n mermaidCheckPromise = (async () => {\r\n try {\r\n const mod = await import('mermaid')\r\n // 检查模块是否有实际的 mermaid 功能\r\n // 虚拟模块返回 { default: null },所以需要检查 default 是否存在且有效\r\n const mermaidInstance = (mod as any)?.default\r\n // 检查是否有 mermaid 的关键方法或属性\r\n const hasMermaidAPI = mermaidInstance && (\r\n typeof mermaidInstance.render === 'function' ||\r\n typeof mermaidInstance.initialize === 'function' ||\r\n typeof mermaidInstance.run === 'function'\r\n )\r\n mermaidAvailableCache = hasMermaidAPI\r\n\r\n // 当 mermaid 不可用时,显示提示\r\n if (!hasMermaidAPI) {\r\n showMermaidHint()\r\n }\r\n\r\n return mermaidAvailableCache\r\n } catch {\r\n // 静默失败,mermaid 不可用\r\n mermaidAvailableCache = false\r\n showMermaidHint()\r\n return false\r\n }\r\n })()\r\n\r\n return mermaidCheckPromise as Promise<boolean>\r\n}\r\n\r\nasync function loadMermaid() {\r\n if (typeof window === 'undefined') return null\r\n if (!mermaidPromise) {\r\n mermaidPromise = (async () => {\r\n try {\r\n const mod = await import('mermaid')\r\n // 检查是否是虚拟模块(虚拟模块返回 { default: null })\r\n if (mod && (mod as any).default === null) {\r\n showMermaidHint()\r\n return null\r\n }\r\n \r\n const mermaidInstance = (mod as any)?.default\r\n // 检查是否有 mermaid 的关键方法,确保模块可用\r\n if (!mermaidInstance || typeof mermaidInstance.initialize !== 'function') {\r\n showMermaidHint()\r\n return null\r\n }\r\n \r\n return mermaidInstance\r\n } catch {\r\n // 静默失败,显示友好提示\r\n showMermaidHint()\r\n return null\r\n }\r\n })()\r\n }\r\n return mermaidPromise\r\n}\r\n\r\ntype RenderTask = () => Promise<void>\r\nconst renderQueue: RenderTask[] = []\r\nlet isProcessingQueue = false\r\n\r\nasync function processRenderQueue() {\r\n if (isProcessingQueue) return\r\n isProcessingQueue = true\r\n\r\n while (renderQueue.length > 0) {\r\n const task = renderQueue.shift()\r\n if (task) {\r\n try {\r\n await task()\r\n } catch (err) {\r\n console.error('Mermaid render queue error:', err)\r\n }\r\n }\r\n }\r\n\r\n isProcessingQueue = false\r\n}\r\n\r\nfunction addToRenderQueue(task: RenderTask) {\r\n renderQueue.push(task)\r\n processRenderQueue()\r\n}\r\n\r\nexport function useMermaid(content: string | Ref<string>, options: UseMermaidOptionsInput = {}): UseMermaidResult {\r\n const optionsRef = computed(() => (typeof options === 'object' && 'value' in options ? options.value : options))\r\n const mermaidConfig = computed(() => ({\r\n suppressErrorRendering: true,\r\n startOnLoad: false,\r\n securityLevel: 'loose',\r\n theme: optionsRef.value.theme || 'default',\r\n ...(optionsRef.value.config || {}),\r\n }))\r\n const data = ref('')\r\n const error = ref<unknown>(null)\r\n const isLoading = ref(false)\r\n\r\n let isUnmounted = false\r\n\r\n const getRenderContainer = () => {\r\n const containerOption = optionsRef.value.container\r\n if (containerOption) {\r\n return typeof containerOption === 'object' && 'value' in containerOption ? containerOption.value : containerOption\r\n }\r\n return null\r\n }\r\n\r\n const throttledRender = throttle(\r\n () => {\r\n const contentValue = typeof content === 'string' ? content : content.value\r\n if (!contentValue?.trim()) {\r\n data.value = ''\r\n error.value = null\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n isLoading.value = true\r\n\r\n addToRenderQueue(async () => {\r\n if (isUnmounted) return\r\n\r\n try {\r\n const mermaidInstance = await loadMermaid()\r\n if (!mermaidInstance) {\r\n data.value = contentValue\r\n error.value = null\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n mermaidInstance.initialize(mermaidConfig.value)\r\n\r\n const isValid = await mermaidInstance.parse(contentValue.trim())\r\n if (!isValid) {\r\n data.value = ''\r\n error.value = new Error('Mermaid parse error: Invalid syntax')\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n const renderId = `${optionsRef.value.id || 'mermaid'}-${Math.random().toString(36).substring(2, 11)}`\r\n const container = getRenderContainer()\r\n if (!container) {\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n const { svg } = await mermaidInstance.render(renderId, contentValue, container)\r\n data.value = svg\r\n error.value = null\r\n isLoading.value = false\r\n } catch (err) {\r\n // Mermaid render error\r\n data.value = ''\r\n error.value = err\r\n isLoading.value = false\r\n }\r\n })\r\n },\r\n 100,\r\n { leading: false, trailing: true },\r\n )\r\n\r\n watch(\r\n [() => (typeof content === 'string' ? content : content.value), () => mermaidConfig.value],\r\n () => {\r\n throttledRender()\r\n },\r\n { immediate: true },\r\n )\r\n\r\n onUnmounted(() => {\r\n isUnmounted = true\r\n })\r\n\r\n return {\r\n data,\r\n error,\r\n isLoading,\r\n }\r\n}\r\n\r\nexport function useMermaidZoom(options: UseMermaidZoomOptions): MermaidZoomControls {\r\n const { container } = options\r\n\r\n const scale = ref(1)\r\n const posX = ref(0)\r\n const posY = ref(0)\r\n const isDragging = ref(false)\r\n\r\n let removeEvents: (() => void) | null = null\r\n\r\n const getSvg = () => container.value?.querySelector('.syntax-mermaid__content svg') as HTMLElement\r\n\r\n const updateTransform = (svg: HTMLElement) => {\r\n svg.style.transformOrigin = 'center center'\r\n svg.style.transform = `translate(${posX.value}px, ${posY.value}px) scale(${scale.value})`\r\n }\r\n\r\n const resetState = () => {\r\n scale.value = 1\r\n posX.value = 0\r\n posY.value = 0\r\n isDragging.value = false\r\n }\r\n\r\n const addInteractionEvents = (containerEl: HTMLElement) => {\r\n let startX = 0\r\n let startY = 0\r\n let isInteractingWithMermaid = false\r\n\r\n const onStart = (clientX: number, clientY: number) => {\r\n isDragging.value = true\r\n startX = clientX - posX.value\r\n startY = clientY - posY.value\r\n document.body.style.userSelect = 'none'\r\n }\r\n\r\n const onMove = (clientX: number, clientY: number) => {\r\n if (isDragging.value && isInteractingWithMermaid) {\r\n posX.value = clientX - startX\r\n posY.value = clientY - startY\r\n const svg = getSvg()\r\n if (svg) {\r\n updateTransform(svg)\r\n }\r\n }\r\n }\r\n\r\n const onEnd = () => {\r\n isDragging.value = false\r\n isInteractingWithMermaid = false\r\n document.body.style.userSelect = ''\r\n }\r\n\r\n const onMouseDown = (e: MouseEvent) => {\r\n if (e.button !== 0) return\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n e.preventDefault()\r\n isInteractingWithMermaid = true\r\n onStart(e.clientX, e.clientY)\r\n }\r\n }\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n if (isInteractingWithMermaid) {\r\n onMove(e.clientX, e.clientY)\r\n }\r\n }\r\n\r\n const handleWheelZoom = (e: WheelEvent) => {\r\n const svg = getSvg()\r\n if (!svg) return\r\n\r\n const containerRect = containerEl.getBoundingClientRect()\r\n const svgRect = svg.getBoundingClientRect()\r\n\r\n const mouseX = e.clientX - containerRect.left\r\n const mouseY = e.clientY - containerRect.top\r\n\r\n const svgCenterX = svgRect.left - containerRect.left + svgRect.width / 2\r\n const svgCenterY = svgRect.top - containerRect.top + svgRect.height / 2\r\n\r\n const offsetX = (mouseX - svgCenterX - posX.value) / scale.value\r\n const offsetY = (mouseY - svgCenterY - posY.value) / scale.value\r\n\r\n const delta = e.deltaY > 0 ? -0.05 : 0.05\r\n const newScale = Math.min(Math.max(scale.value + delta, 0.1), 10)\r\n\r\n if (newScale === scale.value) return\r\n\r\n scale.value = newScale\r\n\r\n posX.value = mouseX - svgCenterX - offsetX * scale.value\r\n posY.value = mouseY - svgCenterY - offsetY * scale.value\r\n\r\n updateTransform(svg)\r\n }\r\n\r\n const throttledWheelZoom = throttle(handleWheelZoom, 20, { leading: true, trailing: true })\r\n\r\n const onWheel = (e: WheelEvent) => {\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n e.preventDefault()\r\n throttledWheelZoom(e)\r\n }\r\n }\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n if (e.touches.length === 1) {\r\n e.preventDefault()\r\n isInteractingWithMermaid = true\r\n onStart(e.touches[0].clientX, e.touches[0].clientY)\r\n }\r\n }\r\n }\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n if (isInteractingWithMermaid) {\r\n e.preventDefault()\r\n onMove(e.touches[0].clientX, e.touches[0].clientY)\r\n }\r\n }\r\n\r\n containerEl.addEventListener('mousedown', onMouseDown)\r\n document.addEventListener('mousemove', onMouseMove)\r\n document.addEventListener('mouseup', onEnd)\r\n containerEl.addEventListener('wheel', onWheel, { passive: false })\r\n containerEl.addEventListener('touchstart', onTouchStart, { passive: false })\r\n containerEl.addEventListener('touchmove', onTouchMove, { passive: false })\r\n document.addEventListener('touchend', onEnd)\r\n\r\n return () => {\r\n containerEl.removeEventListener('mousedown', onMouseDown)\r\n document.removeEventListener('mousemove', onMouseMove)\r\n document.removeEventListener('mouseup', onEnd)\r\n containerEl.removeEventListener('wheel', onWheel)\r\n containerEl.removeEventListener('touchstart', onTouchStart)\r\n containerEl.removeEventListener('touchmove', onTouchMove)\r\n document.removeEventListener('touchend', onEnd)\r\n document.body.style.userSelect = ''\r\n }\r\n }\r\n\r\n const zoomIn = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n scale.value = Math.min(scale.value + 0.2, 10)\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const zoomOut = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n scale.value = Math.max(scale.value - 0.2, 0.1)\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const reset = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n resetState()\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const fullscreen = () => {\r\n if (!container.value) return\r\n\r\n if (document.fullscreenElement) {\r\n document.exitFullscreen()\r\n } else {\r\n container.value.requestFullscreen?.()\r\n }\r\n }\r\n\r\n const initialize = () => {\r\n if (!container.value) return\r\n\r\n resetState()\r\n\r\n removeEvents = addInteractionEvents(container.value)\r\n\r\n const svg = getSvg()\r\n if (svg) {\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const destroy = () => {\r\n removeEvents?.()\r\n removeEvents = null\r\n resetState()\r\n }\r\n\r\n watch(\r\n () => container.value,\r\n () => {\r\n destroy()\r\n resetState()\r\n },\r\n )\r\n\r\n onUnmounted(destroy)\r\n\r\n return {\r\n zoomIn,\r\n zoomOut,\r\n reset,\r\n fullscreen,\r\n destroy,\r\n initialize,\r\n }\r\n}\r\n"],"names":["mermaidPromise","hasShownMermaidHint","mermaidAvailableCache","mermaidCheckPromise","showMermaidHint","__X_MARKDOWN_CONSOLE_HINTS_ENABLED__","console","log","renderQueue","isProcessingQueue","async","mod","import","mermaidInstance","default","hasMermaidAPI","render","initialize","run","svg","svgDataUrl","encodeURIComponent","img","Image","onload","canvas","document","createElement","ctx","getContext","willReadFrequently","scale","width","height","imageSmoothingEnabled","imageSmoothingQuality","fillStyle","fillRect","drawImage","timestamp","Date","toISOString","slice","replace","toBlob","blob","url","URL","createObjectURL","link","href","download","body","appendChild","click","removeChild","revokeObjectURL","toBlobError","error","dataUrl","toDataURL","dataUrlError","canvasError","onerror","src","content","options","optionsRef","computed","value","mermaidConfig","suppressErrorRendering","startOnLoad","securityLevel","theme","config","data","ref","isLoading","isUnmounted","throttledRender","throttle","contentValue","trim","task","window","loadMermaid","parse","Error","renderId","id","Math","random","toString","substring","container","containerOption","getRenderContainer","err","push","length","shift","processRenderQueue","leading","trailing","watch","immediate","onUnmounted","posX","posY","isDragging","removeEvents","getSvg","querySelector","updateTransform","style","transformOrigin","transform","resetState","destroy","zoomIn","min","zoomOut","max","reset","fullscreen","fullscreenElement","exitFullscreen","requestFullscreen","containerEl","startX","startY","isInteractingWithMermaid","onStart","clientX","clientY","userSelect","onMove","onEnd","onMouseDown","e","button","target","contains","preventDefault","onMouseMove","throttledWheelZoom","containerRect","getBoundingClientRect","svgRect","mouseX","left","mouseY","top","svgCenterX","svgCenterY","offsetX","offsetY","delta","deltaY","newScale","onWheel","onTouchStart","touches","onTouchMove","addEventListener","passive","removeEventListener","addInteractionEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"x-markdown.cjs9.js","sources":["../src/hooks/useMermaid.ts"],"sourcesContent":["import type { Ref } from 'vue'\nimport { throttle } from 'lodash-es'\nimport { computed, ref, watch, onUnmounted } from 'vue'\nimport type { MermaidZoomControls, UseMermaidZoomOptions, UseMermaidResult } from '../components/Mermaid/types'\nimport { useXMarkdownConfig } from '../config'\n\n// 获取是否启用控制台提示的辅助函数\nconst consoleHintsEnabled = () => {\n if (typeof __X_MARKDOWN_CONSOLE_HINTS_ENABLED__ === 'boolean') {\n return __X_MARKDOWN_CONSOLE_HINTS_ENABLED__\n }\n return true // 默认启用\n}\n\nexport function downloadSvgAsPng(svg: string): void {\n if (!svg) return\n\n try {\n const svgDataUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n const img = new Image()\n\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d', { willReadFrequently: false })\n if (!ctx) return\n\n const scale = 2\n canvas.width = img.width * scale\n canvas.height = img.height * scale\n ctx.imageSmoothingEnabled = true\n ctx.imageSmoothingQuality = 'high'\n\n ctx.fillStyle = '#ffffff'\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\n\n const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-')\n\n try {\n canvas.toBlob(\n (blob) => {\n if (!blob) return\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = `mermaid-diagram-${timestamp}.png`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(url)\n },\n 'image/png',\n 0.95,\n )\n } catch (toBlobError) {\n console.error('Failed to convert canvas to blob:', toBlobError)\n try {\n const dataUrl = canvas.toDataURL('image/png', 0.95)\n const link = document.createElement('a')\n link.href = dataUrl\n link.download = `mermaid-diagram-${timestamp}.png`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n } catch (dataUrlError) {\n console.error('Failed to convert canvas to data URL:', dataUrlError)\n }\n }\n } catch (canvasError) {\n console.error('Canvas operation failed:', canvasError)\n }\n }\n\n img.onerror = (error) => {\n console.error('Failed to load image:', error)\n }\n\n img.src = svgDataUrl\n } catch (error) {\n console.error('Failed to download SVG:', error)\n }\n}\n\ninterface UseMermaidOptions {\n id?: string\n theme?: 'default' | 'dark' | 'forest' | 'neutral' | string\n config?: any\n container?: HTMLElement | Ref<HTMLElement | null> | null\n}\n\ntype UseMermaidOptionsInput = UseMermaidOptions | Ref<UseMermaidOptions>\n\nlet mermaidPromise: Promise<any> | null = null\nlet hasShownMermaidHint = false\nlet mermaidAvailableCache: boolean | null = null\nlet mermaidCheckPromise: Promise<boolean | null> | null = null\n\n/**\n * 显示 mermaid 安装提示\n */\nconst showMermaidHint = () => {\n if (hasShownMermaidHint) return\n if (!consoleHintsEnabled()) return\n\n hasShownMermaidHint = true\n\n console.log(\n '%c[x-markdown]%c 图表可选: %cpnpm add mermaid%c (需配置 mermaidLoader)',\n 'font-weight: bold; color: #9333ea;',\n 'color: #666;',\n 'color: #9333ea; font-family: monospace;',\n 'color: #999;',\n )\n}\n\n/**\n * 同步检查缓存状态(不触发检测)\n * @returns 缓存状态,null 表示未检测\n */\nexport function getMermaidAvailableCache(): boolean | null {\n return mermaidAvailableCache\n}\n\n/**\n * 检测 mermaid 是否可用(全局缓存,只检测一次)\n */\nexport async function checkMermaidAvailable(loader?: () => Promise<any>): Promise<boolean> {\n // 如果已经有缓存结果,直接返回\n if (mermaidAvailableCache !== null) {\n return mermaidAvailableCache\n }\n\n // 如果正在检测,返回检测 Promise\n if (mermaidCheckPromise) {\n return mermaidCheckPromise as Promise<boolean>\n }\n\n // 开始检测\n mermaidCheckPromise = (async () => {\n try {\n if (!loader) {\n mermaidAvailableCache = false\n showMermaidHint()\n return false\n }\n const mod = await loader()\n // 检查模块是否有实际的 mermaid 功能\n // 虚拟模块返回 { default: null },所以需要检查 default 是否存在且有效\n const mermaidInstance = (mod as any)?.default\n // 检查是否有 mermaid 的关键方法或属性\n const hasMermaidAPI =\n mermaidInstance &&\n (typeof mermaidInstance.render === 'function' ||\n typeof mermaidInstance.initialize === 'function' ||\n typeof mermaidInstance.run === 'function')\n mermaidAvailableCache = hasMermaidAPI\n\n // 当 mermaid 不可用时,显示提示\n if (!hasMermaidAPI) {\n showMermaidHint()\n }\n\n return mermaidAvailableCache\n } catch {\n // 静默失败,mermaid 不可用\n mermaidAvailableCache = false\n showMermaidHint()\n return false\n }\n })()\n\n return mermaidCheckPromise as Promise<boolean>\n}\n\nasync function loadMermaid(loader?: () => Promise<any>) {\n if (typeof window === 'undefined') return null\n if (!mermaidPromise) {\n mermaidPromise = (async () => {\n try {\n if (!loader) {\n showMermaidHint()\n return null\n }\n const mod = await loader()\n // 检查是否是虚拟模块(虚拟模块返回 { default: null })\n if (mod && (mod as any).default === null) {\n showMermaidHint()\n return null\n }\n\n const mermaidInstance = (mod as any)?.default\n // 检查是否有 mermaid 的关键方法,确保模块可用\n if (!mermaidInstance || typeof mermaidInstance.initialize !== 'function') {\n showMermaidHint()\n return null\n }\n\n return mermaidInstance\n } catch {\n // 静默失败,显示友好提示\n showMermaidHint()\n return null\n }\n })()\n }\n return mermaidPromise\n}\n\ntype RenderTask = () => Promise<void>\nconst renderQueue: RenderTask[] = []\nlet isProcessingQueue = false\n\nasync function processRenderQueue() {\n if (isProcessingQueue) return\n isProcessingQueue = true\n\n while (renderQueue.length > 0) {\n const task = renderQueue.shift()\n if (task) {\n try {\n await task()\n } catch (err) {\n console.error('Mermaid render queue error:', err)\n }\n }\n }\n\n isProcessingQueue = false\n}\n\nfunction addToRenderQueue(task: RenderTask) {\n renderQueue.push(task)\n processRenderQueue()\n}\n\nexport function useMermaid(content: string | Ref<string>, options: UseMermaidOptionsInput = {}): UseMermaidResult {\n const config = useXMarkdownConfig()\n const optionsRef = computed(() => (typeof options === 'object' && 'value' in options ? options.value : options))\n const mermaidConfig = computed(() => ({\n suppressErrorRendering: true,\n startOnLoad: false,\n securityLevel: 'loose',\n theme: optionsRef.value.theme || 'default',\n ...(optionsRef.value.config || {}),\n }))\n const data = ref('')\n const error = ref<unknown>(null)\n const isLoading = ref(false)\n\n let isUnmounted = false\n\n const getRenderContainer = () => {\n const containerOption = optionsRef.value.container\n if (containerOption) {\n return typeof containerOption === 'object' && 'value' in containerOption ? containerOption.value : containerOption\n }\n return null\n }\n\n const throttledRender = throttle(\n () => {\n const contentValue = typeof content === 'string' ? content : content.value\n if (!contentValue?.trim()) {\n data.value = ''\n error.value = null\n isLoading.value = false\n return\n }\n\n isLoading.value = true\n\n addToRenderQueue(async () => {\n if (isUnmounted) return\n\n try {\n const mermaidInstance = await loadMermaid(config.mermaid)\n if (!mermaidInstance) {\n data.value = contentValue\n error.value = null\n isLoading.value = false\n return\n }\n\n mermaidInstance.initialize(mermaidConfig.value)\n\n const isValid = await mermaidInstance.parse(contentValue.trim())\n if (!isValid) {\n data.value = ''\n error.value = new Error('Mermaid parse error: Invalid syntax')\n isLoading.value = false\n return\n }\n\n const renderId = `${optionsRef.value.id || 'mermaid'}-${Math.random().toString(36).substring(2, 11)}`\n const container = getRenderContainer()\n if (!container) {\n isLoading.value = false\n return\n }\n\n const { svg } = await mermaidInstance.render(renderId, contentValue, container)\n data.value = svg\n error.value = null\n isLoading.value = false\n } catch (err) {\n // Mermaid render error\n data.value = ''\n error.value = err\n isLoading.value = false\n }\n })\n },\n 100,\n { leading: false, trailing: true },\n )\n\n watch(\n [() => (typeof content === 'string' ? content : content.value), () => mermaidConfig.value],\n () => {\n throttledRender()\n },\n { immediate: true },\n )\n\n onUnmounted(() => {\n isUnmounted = true\n })\n\n return {\n data,\n error,\n isLoading,\n }\n}\n\nexport function useMermaidZoom(options: UseMermaidZoomOptions): MermaidZoomControls {\n const { container } = options\n\n const scale = ref(1)\n const posX = ref(0)\n const posY = ref(0)\n const isDragging = ref(false)\n\n let removeEvents: (() => void) | null = null\n\n const getSvg = () => container.value?.querySelector('.syntax-mermaid__content svg') as HTMLElement\n\n const updateTransform = (svg: HTMLElement) => {\n svg.style.transformOrigin = 'center center'\n svg.style.transform = `translate(${posX.value}px, ${posY.value}px) scale(${scale.value})`\n }\n\n const resetState = () => {\n scale.value = 1\n posX.value = 0\n posY.value = 0\n isDragging.value = false\n }\n\n const addInteractionEvents = (containerEl: HTMLElement) => {\n let startX = 0\n let startY = 0\n let isInteractingWithMermaid = false\n\n const onStart = (clientX: number, clientY: number) => {\n isDragging.value = true\n startX = clientX - posX.value\n startY = clientY - posY.value\n document.body.style.userSelect = 'none'\n }\n\n const onMove = (clientX: number, clientY: number) => {\n if (isDragging.value && isInteractingWithMermaid) {\n posX.value = clientX - startX\n posY.value = clientY - startY\n const svg = getSvg()\n if (svg) {\n updateTransform(svg)\n }\n }\n }\n\n const onEnd = () => {\n isDragging.value = false\n isInteractingWithMermaid = false\n document.body.style.userSelect = ''\n }\n\n const onMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\n e.preventDefault()\n isInteractingWithMermaid = true\n onStart(e.clientX, e.clientY)\n }\n }\n\n const onMouseMove = (e: MouseEvent) => {\n if (isInteractingWithMermaid) {\n onMove(e.clientX, e.clientY)\n }\n }\n\n const handleWheelZoom = (e: WheelEvent) => {\n const svg = getSvg()\n if (!svg) return\n\n const containerRect = containerEl.getBoundingClientRect()\n const svgRect = svg.getBoundingClientRect()\n\n const mouseX = e.clientX - containerRect.left\n const mouseY = e.clientY - containerRect.top\n\n const svgCenterX = svgRect.left - containerRect.left + svgRect.width / 2\n const svgCenterY = svgRect.top - containerRect.top + svgRect.height / 2\n\n const offsetX = (mouseX - svgCenterX - posX.value) / scale.value\n const offsetY = (mouseY - svgCenterY - posY.value) / scale.value\n\n const delta = e.deltaY > 0 ? -0.05 : 0.05\n const newScale = Math.min(Math.max(scale.value + delta, 0.1), 10)\n\n if (newScale === scale.value) return\n\n scale.value = newScale\n\n posX.value = mouseX - svgCenterX - offsetX * scale.value\n posY.value = mouseY - svgCenterY - offsetY * scale.value\n\n updateTransform(svg)\n }\n\n const throttledWheelZoom = throttle(handleWheelZoom, 20, { leading: true, trailing: true })\n\n const onWheel = (e: WheelEvent) => {\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\n e.preventDefault()\n throttledWheelZoom(e)\n }\n }\n\n const onTouchStart = (e: TouchEvent) => {\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\n if (e.touches.length === 1) {\n e.preventDefault()\n isInteractingWithMermaid = true\n onStart(e.touches[0].clientX, e.touches[0].clientY)\n }\n }\n }\n\n const onTouchMove = (e: TouchEvent) => {\n if (isInteractingWithMermaid) {\n e.preventDefault()\n onMove(e.touches[0].clientX, e.touches[0].clientY)\n }\n }\n\n containerEl.addEventListener('mousedown', onMouseDown)\n document.addEventListener('mousemove', onMouseMove)\n document.addEventListener('mouseup', onEnd)\n containerEl.addEventListener('wheel', onWheel, { passive: false })\n containerEl.addEventListener('touchstart', onTouchStart, { passive: false })\n containerEl.addEventListener('touchmove', onTouchMove, { passive: false })\n document.addEventListener('touchend', onEnd)\n\n return () => {\n containerEl.removeEventListener('mousedown', onMouseDown)\n document.removeEventListener('mousemove', onMouseMove)\n document.removeEventListener('mouseup', onEnd)\n containerEl.removeEventListener('wheel', onWheel)\n containerEl.removeEventListener('touchstart', onTouchStart)\n containerEl.removeEventListener('touchmove', onTouchMove)\n document.removeEventListener('touchend', onEnd)\n document.body.style.userSelect = ''\n }\n }\n\n const zoomIn = () => {\n const svg = getSvg()\n if (svg) {\n scale.value = Math.min(scale.value + 0.2, 10)\n updateTransform(svg)\n }\n }\n\n const zoomOut = () => {\n const svg = getSvg()\n if (svg) {\n scale.value = Math.max(scale.value - 0.2, 0.1)\n updateTransform(svg)\n }\n }\n\n const reset = () => {\n const svg = getSvg()\n if (svg) {\n resetState()\n updateTransform(svg)\n }\n }\n\n const fullscreen = () => {\n if (!container.value) return\n\n if (document.fullscreenElement) {\n document.exitFullscreen()\n } else {\n container.value.requestFullscreen?.()\n }\n }\n\n const initialize = () => {\n if (!container.value) return\n\n resetState()\n\n removeEvents = addInteractionEvents(container.value)\n\n const svg = getSvg()\n if (svg) {\n updateTransform(svg)\n }\n }\n\n const destroy = () => {\n removeEvents?.()\n removeEvents = null\n resetState()\n }\n\n watch(\n () => container.value,\n () => {\n destroy()\n resetState()\n },\n )\n\n onUnmounted(destroy)\n\n return {\n zoomIn,\n zoomOut,\n reset,\n fullscreen,\n destroy,\n initialize,\n }\n}\n"],"names":["config","useXMarkdownConfig","computed","ref","throttle","watch","onUnmounted"],"mappings":";;;;;;;;AAOA,MAAM,sBAAsB,MAAM;AAChC,EAAA,IAAI,OAAO,yCAAyC,SAAA,EAAW;AAC7D,IAAA,OAAO,oCAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,SAAS,iBAAiB,GAAA,EAAmB;AAClD,EAAA,IAAI,CAAC,GAAA,EAAK;AAEV,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,CAAA,iCAAA,EAAoC,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AAC9E,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AAEtB,IAAA,GAAA,CAAI,SAAS,MAAM;AACjB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,QAAA,MAAM,MAAM,MAAA,CAAO,UAAA,CAAW,MAAM,EAAE,kBAAA,EAAoB,OAAO,CAAA;AACjE,QAAA,IAAI,CAAC,GAAA,EAAK;AAEV,QAAA,MAAM,KAAA,GAAQ,CAAA;AACd,QAAA,MAAA,CAAO,KAAA,GAAQ,IAAI,KAAA,GAAQ,KAAA;AAC3B,QAAA,MAAA,CAAO,MAAA,GAAS,IAAI,MAAA,GAAS,KAAA;AAC7B,QAAA,GAAA,CAAI,qBAAA,GAAwB,IAAA;AAC5B,QAAA,GAAA,CAAI,qBAAA,GAAwB,MAAA;AAE5B,QAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,QAAA,GAAA,CAAI,SAAS,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAC9C,QAAA,GAAA,CAAI,UAAU,GAAA,EAAK,CAAA,EAAG,GAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAEpD,QAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAEzE,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,MAAA;AAAA,YACL,CAAC,IAAA,KAAS;AACR,cAAA,IAAI,CAAC,IAAA,EAAM;AACX,cAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,cAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,cAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AACZ,cAAA,IAAA,CAAK,QAAA,GAAW,mBAAmB,SAAS,CAAA,IAAA,CAAA;AAC5C,cAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,cAAA,IAAA,CAAK,KAAA,EAAM;AACX,cAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,cAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,YACzB,CAAA;AAAA,YACA,WAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,SAAS,WAAA,EAAa;AACpB,UAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,WAAW,CAAA;AAC9D,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,WAAA,EAAa,IAAI,CAAA;AAClD,YAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,YAAA,IAAA,CAAK,IAAA,GAAO,OAAA;AACZ,YAAA,IAAA,CAAK,QAAA,GAAW,mBAAmB,SAAS,CAAA,IAAA,CAAA;AAC5C,YAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,YAAA,IAAA,CAAK,KAAA,EAAM;AACX,YAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,UAChC,SAAS,YAAA,EAAc;AACrB,YAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,YAAY,CAAA;AAAA,UACrE;AAAA,QACF;AAAA,MACF,SAAS,WAAA,EAAa;AACpB,QAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,WAAW,CAAA;AAAA,MACvD;AAAA,IACF,CAAA;AAEA,IAAA,GAAA,CAAI,OAAA,GAAU,CAAC,KAAA,KAAU;AACvB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAAA,IAC9C,CAAA;AAEA,IAAA,GAAA,CAAI,GAAA,GAAM,UAAA;AAAA,EACZ,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAAA,EAChD;AACF;AAWA,IAAI,cAAA,GAAsC,IAAA;AAC1C,IAAI,mBAAA,GAAsB,KAAA;AAC1B,IAAI,qBAAA,GAAwC,IAAA;AAC5C,IAAI,mBAAA,GAAsD,IAAA;AAK1D,MAAM,kBAAkB,MAAM;AAC5B,EAAA,IAAI,mBAAA,EAAqB;AACzB,EAAA,IAAI,CAAC,qBAAoB,EAAG;AAE5B,EAAA,mBAAA,GAAsB,IAAA;AAEtB,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,iEAAA;AAAA,IACA,oCAAA;AAAA,IACA,cAAA;AAAA,IACA,yCAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAaA,eAAsB,sBAAsB,MAAA,EAA+C;AAEzF,EAAA,IAAI,0BAA0B,IAAA,EAAM;AAClC,IAAA,OAAO,qBAAA;AAAA,EACT;AAGA,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,OAAO,mBAAA;AAAA,EACT;AAGA,EAAA,mBAAA,GAAA,CAAuB,YAAY;AACjC,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,qBAAA,GAAwB,KAAA;AACxB,QAAA,eAAA,EAAgB;AAChB,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,EAAO;AAGzB,MAAA,MAAM,kBAAmB,GAAA,EAAa,OAAA;AAEtC,MAAA,MAAM,aAAA,GACJ,eAAA,KACC,OAAO,eAAA,CAAgB,MAAA,KAAW,UAAA,IACjC,OAAO,eAAA,CAAgB,UAAA,KAAe,UAAA,IACtC,OAAO,eAAA,CAAgB,GAAA,KAAQ,UAAA,CAAA;AACnC,MAAA,qBAAA,GAAwB,aAAA;AAGxB,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,eAAA,EAAgB;AAAA,MAClB;AAEA,MAAA,OAAO,qBAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAEN,MAAA,qBAAA,GAAwB,KAAA;AACxB,MAAA,eAAA,EAAgB;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,OAAO,mBAAA;AACT;AAEA,eAAe,YAAY,MAAA,EAA6B;AACtD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,cAAA,GAAA,CAAkB,YAAY;AAC5B,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,eAAA,EAAgB;AAChB,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,GAAA,GAAM,MAAM,MAAA,EAAO;AAEzB,QAAA,IAAI,GAAA,IAAQ,GAAA,CAAY,OAAA,KAAY,IAAA,EAAM;AACxC,UAAA,eAAA,EAAgB;AAChB,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,kBAAmB,GAAA,EAAa,OAAA;AAEtC,QAAA,IAAI,CAAC,eAAA,IAAmB,OAAO,eAAA,CAAgB,eAAe,UAAA,EAAY;AACxE,UAAA,eAAA,EAAgB;AAChB,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO,eAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAEN,QAAA,eAAA,EAAgB;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,GAAG;AAAA,EACL;AACA,EAAA,OAAO,cAAA;AACT;AAGA,MAAM,cAA4B,EAAC;AACnC,IAAI,iBAAA,GAAoB,KAAA;AAExB,eAAe,kBAAA,GAAqB;AAClC,EAAA,IAAI,iBAAA,EAAmB;AACvB,EAAA,iBAAA,GAAoB,IAAA;AAEpB,EAAA,OAAO,WAAA,CAAY,SAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAA,GAAO,YAAY,KAAA,EAAM;AAC/B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,EAAK;AAAA,MACb,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,GAAG,CAAA;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,iBAAA,GAAoB,KAAA;AACtB;AAEA,SAAS,iBAAiB,IAAA,EAAkB;AAC1C,EAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AACrB,EAAA,kBAAA,EAAmB;AACrB;AAEO,SAAS,UAAA,CAAW,OAAA,EAA+B,OAAA,GAAkC,EAAC,EAAqB;AAChH,EAAA,MAAMA,WAASC,yBAAA,EAAmB;AAClC,EAAA,MAAM,UAAA,GAAaC,YAAA,CAAS,MAAO,OAAO,OAAA,KAAY,YAAY,OAAA,IAAW,OAAA,GAAU,OAAA,CAAQ,KAAA,GAAQ,OAAQ,CAAA;AAC/G,EAAA,MAAM,aAAA,GAAgBA,aAAS,OAAO;AAAA,IACpC,sBAAA,EAAwB,IAAA;AAAA,IACxB,WAAA,EAAa,KAAA;AAAA,IACb,aAAA,EAAe,OAAA;AAAA,IACf,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,IACjC,GAAI,UAAA,CAAW,KAAA,CAAM,MAAA,IAAU;AAAC,GAClC,CAAE,CAAA;AACF,EAAA,MAAM,IAAA,GAAOC,QAAI,EAAE,CAAA;AACnB,EAAA,MAAM,KAAA,GAAQA,QAAa,IAAI,CAAA;AAC/B,EAAA,MAAM,SAAA,GAAYA,QAAI,KAAK,CAAA;AAE3B,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,MAAM,eAAA,GAAkB,WAAW,KAAA,CAAM,SAAA;AACzC,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,OAAO,OAAO,eAAA,KAAoB,QAAA,IAAY,OAAA,IAAW,eAAA,GAAkB,gBAAgB,KAAA,GAAQ,eAAA;AAAA,IACrG;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkBC,iBAAA;AAAA,IACtB,MAAM;AACJ,MAAA,MAAM,YAAA,GAAe,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,OAAA,CAAQ,KAAA;AACrE,MAAA,IAAI,CAAC,YAAA,EAAc,IAAA,EAAK,EAAG;AACzB,QAAA,IAAA,CAAK,KAAA,GAAQ,EAAA;AACb,QAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAElB,MAAA,gBAAA,CAAiB,YAAY;AAC3B,QAAA,IAAI,WAAA,EAAa;AAEjB,QAAA,IAAI;AACF,UAAA,MAAM,eAAA,GAAkB,MAAM,WAAA,CAAYJ,QAAA,CAAO,OAAO,CAAA;AACxD,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAA,IAAA,CAAK,KAAA,GAAQ,YAAA;AACb,YAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,YAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAClB,YAAA;AAAA,UACF;AAEA,UAAA,eAAA,CAAgB,UAAA,CAAW,cAAc,KAAK,CAAA;AAE9C,UAAA,MAAM,UAAU,MAAM,eAAA,CAAgB,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA;AAC/D,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAA,IAAA,CAAK,KAAA,GAAQ,EAAA;AACb,YAAA,KAAA,CAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,qCAAqC,CAAA;AAC7D,YAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAClB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,WAAW,CAAA,EAAG,UAAA,CAAW,KAAA,CAAM,EAAA,IAAM,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACnG,UAAA,MAAM,YAAY,kBAAA,EAAmB;AACrC,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAClB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,EAAE,KAAI,GAAI,MAAM,gBAAgB,MAAA,CAAO,QAAA,EAAU,cAAc,SAAS,CAAA;AAC9E,UAAA,IAAA,CAAK,KAAA,GAAQ,GAAA;AACb,UAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,UAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,QACpB,SAAS,GAAA,EAAK;AAEZ,UAAA,IAAA,CAAK,KAAA,GAAQ,EAAA;AACb,UAAA,KAAA,CAAM,KAAA,GAAQ,GAAA;AACd,UAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,QACpB;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,GAAA;AAAA,IACA,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,IAAA;AAAK,GACnC;AAEA,EAAAK,SAAA;AAAA,IACE,CAAC,MAAO,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,OAAA,CAAQ,KAAA,EAAQ,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,IACzF,MAAM;AACJ,MAAA,eAAA,EAAgB;AAAA,IAClB,CAAA;AAAA,IACA,EAAE,WAAW,IAAA;AAAK,GACpB;AAEA,EAAAC,eAAA,CAAY,MAAM;AAChB,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,eAAe,OAAA,EAAqD;AAClF,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AAEtB,EAAA,MAAM,KAAA,GAAQH,QAAI,CAAC,CAAA;AACnB,EAAA,MAAM,IAAA,GAAOA,QAAI,CAAC,CAAA;AAClB,EAAA,MAAM,IAAA,GAAOA,QAAI,CAAC,CAAA;AAClB,EAAA,MAAM,UAAA,GAAaA,QAAI,KAAK,CAAA;AAE5B,EAAA,IAAI,YAAA,GAAoC,IAAA;AAExC,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,KAAA,EAAO,cAAc,8BAA8B,CAAA;AAElF,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAAqB;AAC5C,IAAA,GAAA,CAAI,MAAM,eAAA,GAAkB,eAAA;AAC5B,IAAA,GAAA,CAAI,KAAA,CAAM,SAAA,GAAY,CAAA,UAAA,EAAa,IAAA,CAAK,KAAK,OAAO,IAAA,CAAK,KAAK,CAAA,UAAA,EAAa,KAAA,CAAM,KAAK,CAAA,CAAA,CAAA;AAAA,EACxF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,KAAA,CAAM,KAAA,GAAQ,CAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,UAAA,CAAW,KAAA,GAAQ,KAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,WAAA,KAA6B;AACzD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,wBAAA,GAA2B,KAAA;AAE/B,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,EAAiB,OAAA,KAAoB;AACpD,MAAA,UAAA,CAAW,KAAA,GAAQ,IAAA;AACnB,MAAA,MAAA,GAAS,UAAU,IAAA,CAAK,KAAA;AACxB,MAAA,MAAA,GAAS,UAAU,IAAA,CAAK,KAAA;AACxB,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,MAAA;AAAA,IACnC,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,OAAA,EAAiB,OAAA,KAAoB;AACnD,MAAA,IAAI,UAAA,CAAW,SAAS,wBAAA,EAA0B;AAChD,QAAA,IAAA,CAAK,QAAQ,OAAA,GAAU,MAAA;AACvB,QAAA,IAAA,CAAK,QAAQ,OAAA,GAAU,MAAA;AACvB,QAAA,MAAM,MAAM,MAAA,EAAO;AACnB,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,UAAA,CAAW,KAAA,GAAQ,KAAA;AACnB,MAAA,wBAAA,GAA2B,KAAA;AAC3B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,EAAA;AAAA,IACnC,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,MAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,MAAA,IAAI,EAAE,MAAA,KAAW,WAAA,IAAe,YAAY,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AACtE,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,wBAAA,GAA2B,IAAA;AAC3B,QAAA,OAAA,CAAQ,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,OAAO,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,MAAA,IAAI,wBAAA,EAA0B;AAC5B,QAAA,MAAA,CAAO,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,OAAO,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACzC,MAAA,MAAM,MAAM,MAAA,EAAO;AACnB,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,MAAM,aAAA,GAAgB,YAAY,qBAAA,EAAsB;AACxD,MAAA,MAAM,OAAA,GAAU,IAAI,qBAAA,EAAsB;AAE1C,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,aAAA,CAAc,IAAA;AACzC,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,aAAA,CAAc,GAAA;AAEzC,MAAA,MAAM,aAAa,OAAA,CAAQ,IAAA,GAAO,aAAA,CAAc,IAAA,GAAO,QAAQ,KAAA,GAAQ,CAAA;AACvE,MAAA,MAAM,aAAa,OAAA,CAAQ,GAAA,GAAM,aAAA,CAAc,GAAA,GAAM,QAAQ,MAAA,GAAS,CAAA;AAEtE,MAAA,MAAM,OAAA,GAAA,CAAW,MAAA,GAAS,UAAA,GAAa,IAAA,CAAK,SAAS,KAAA,CAAM,KAAA;AAC3D,MAAA,MAAM,OAAA,GAAA,CAAW,MAAA,GAAS,UAAA,GAAa,IAAA,CAAK,SAAS,KAAA,CAAM,KAAA;AAE3D,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,IAAA;AACrC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAM,KAAA,GAAQ,KAAA,EAAO,GAAG,CAAA,EAAG,EAAE,CAAA;AAEhE,MAAA,IAAI,QAAA,KAAa,MAAM,KAAA,EAAO;AAE9B,MAAA,KAAA,CAAM,KAAA,GAAQ,QAAA;AAEd,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA,GAAS,UAAA,GAAa,OAAA,GAAU,KAAA,CAAM,KAAA;AACnD,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA,GAAS,UAAA,GAAa,OAAA,GAAU,KAAA,CAAM,KAAA;AAEnD,MAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,IACrB,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqBC,kBAAS,eAAA,EAAiB,EAAA,EAAI,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAA;AAE1F,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,MAAA,IAAI,EAAE,MAAA,KAAW,WAAA,IAAe,YAAY,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AACtE,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,kBAAA,CAAmB,CAAC,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAkB;AACtC,MAAA,IAAI,EAAE,MAAA,KAAW,WAAA,IAAe,YAAY,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AACtE,QAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC1B,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,wBAAA,GAA2B,IAAA;AAC3B,UAAA,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAO,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,MAAA,IAAI,wBAAA,EAA0B;AAC5B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAO,CAAA;AAAA,MACnD;AAAA,IACF,CAAA;AAEA,IAAA,WAAA,CAAY,gBAAA,CAAiB,aAAa,WAAW,CAAA;AACrD,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAClD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,WAAA,CAAY,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,OAAO,CAAA;AACjE,IAAA,WAAA,CAAY,iBAAiB,YAAA,EAAc,YAAA,EAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAC3E,IAAA,WAAA,CAAY,iBAAiB,WAAA,EAAa,WAAA,EAAa,EAAE,OAAA,EAAS,OAAO,CAAA;AACzE,IAAA,QAAA,CAAS,gBAAA,CAAiB,YAAY,KAAK,CAAA;AAE3C,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,CAAY,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACxD,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACrD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,MAAA,WAAA,CAAY,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAChD,MAAA,WAAA,CAAY,mBAAA,CAAoB,cAAc,YAAY,CAAA;AAC1D,MAAA,WAAA,CAAY,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACxD,MAAA,QAAA,CAAS,mBAAA,CAAoB,YAAY,KAAK,CAAA;AAC9C,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,EAAA;AAAA,IACnC,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,MAAM,MAAA,EAAO;AACnB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,KAAA,CAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,KAAK,EAAE,CAAA;AAC5C,MAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,MAAM,MAAM,MAAA,EAAO;AACnB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,KAAA,CAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AAC7C,MAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,MAAM,MAAM,MAAA,EAAO;AACnB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,UAAA,EAAW;AACX,MAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AAEtB,IAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,MAAA,QAAA,CAAS,cAAA,EAAe;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,MAAM,iBAAA,IAAoB;AAAA,IACtC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AAEtB,IAAA,UAAA,EAAW;AAEX,IAAA,YAAA,GAAe,oBAAA,CAAqB,UAAU,KAAK,CAAA;AAEnD,IAAA,MAAM,MAAM,MAAA,EAAO;AACnB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,YAAA,IAAe;AACf,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,UAAA,EAAW;AAAA,EACb,CAAA;AAEA,EAAAC,SAAA;AAAA,IACE,MAAM,SAAA,CAAU,KAAA;AAAA,IAChB,MAAM;AACJ,MAAA,OAAA,EAAQ;AACR,MAAA,UAAA,EAAW;AAAA,IACb;AAAA,GACF;AAEA,EAAAC,eAAA,CAAY,OAAO,CAAA;AAEnB,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;;;;;;;"}
|
package/dist/x-markdown.es.js
CHANGED
|
@@ -1,29 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export {
|
|
12
|
-
MarkdownRenderer,
|
|
13
|
-
MarkdownRendererAsync,
|
|
14
|
-
VueMarkdown,
|
|
15
|
-
VueMarkdownAsync,
|
|
16
|
-
createProcessor,
|
|
17
|
-
getVNodeInfos,
|
|
18
|
-
preprocessLaTeX,
|
|
19
|
-
render,
|
|
20
|
-
renderChildren,
|
|
21
|
-
useComponents,
|
|
22
|
-
useHighlight,
|
|
23
|
-
useMarkdownProcessor,
|
|
24
|
-
useMermaid,
|
|
25
|
-
usePlugins,
|
|
26
|
-
useProcessMarkdown,
|
|
27
|
-
useTheme
|
|
28
|
-
};
|
|
1
|
+
export { VueMarkdown, VueMarkdownAsync } from './x-markdown.es2.js';
|
|
2
|
+
export { MarkdownRenderer, MarkdownRendererAsync } from './x-markdown.es3.js';
|
|
3
|
+
export { getVNodeInfos, render, renderChildren } from './x-markdown.es4.js';
|
|
4
|
+
export { createProcessor, useMarkdownProcessor } from './x-markdown.es5.js';
|
|
5
|
+
export { useComponents } from './x-markdown.es6.js';
|
|
6
|
+
export { useHighlight } from './x-markdown.es7.js';
|
|
7
|
+
export { preprocessLaTeX, useProcessMarkdown } from './x-markdown.es8.js';
|
|
8
|
+
export { useMermaid } from './x-markdown.es9.js';
|
|
9
|
+
export { usePlugins } from './x-markdown.es10.js';
|
|
10
|
+
export { useTheme } from './x-markdown.es11.js';
|
|
11
|
+
export { provideXMarkdown } from './x-markdown.es12.js';
|
|
29
12
|
//# sourceMappingURL=x-markdown.es.js.map
|