@king-design/vue 3.7.0 → 3.8.0-beta.0

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.
Files changed (227) hide show
  1. package/__tests__/__snapshots__/Vue Next Demos.md +399 -0
  2. package/components/bubble/bubble.d.ts +61 -0
  3. package/components/bubble/bubble.js +81 -0
  4. package/components/bubble/bubble.vdt.js +85 -0
  5. package/components/bubble/index.d.ts +1 -0
  6. package/components/bubble/index.js +1 -0
  7. package/components/bubble/index.spec.d.ts +1 -0
  8. package/components/bubble/index.spec.js +771 -0
  9. package/components/bubble/styles.d.ts +5 -0
  10. package/components/bubble/styles.js +53 -0
  11. package/components/bubble/useBubbleDisplay.d.ts +18 -0
  12. package/components/bubble/useBubbleDisplay.js +300 -0
  13. package/components/bubbleList/bubbleList.d.ts +87 -0
  14. package/components/bubbleList/bubbleList.js +75 -0
  15. package/components/bubbleList/bubbleList.vdt.js +143 -0
  16. package/components/bubbleList/index.d.ts +1 -0
  17. package/components/bubbleList/index.js +1 -0
  18. package/components/bubbleList/index.spec.d.ts +1 -0
  19. package/components/bubbleList/index.spec.js +1268 -0
  20. package/components/bubbleList/item.d.ts +16 -0
  21. package/components/bubbleList/item.js +27 -0
  22. package/components/bubbleList/item.vdt.js +36 -0
  23. package/components/bubbleList/styles.d.ts +5 -0
  24. package/components/bubbleList/styles.js +33 -0
  25. package/components/bubbleList/useBubbleList.d.ts +28 -0
  26. package/components/bubbleList/useBubbleList.js +455 -0
  27. package/components/checkbox/index.d.ts +3 -3
  28. package/components/fileCard/fileCard.d.ts +65 -0
  29. package/components/fileCard/fileCard.js +72 -0
  30. package/components/fileCard/fileCard.vdt.js +161 -0
  31. package/components/fileCard/fileCardAssets.d.ts +1 -0
  32. package/components/fileCard/fileCardAssets.js +54 -0
  33. package/components/fileCard/fileCardUtils.d.ts +14 -0
  34. package/components/fileCard/fileCardUtils.js +94 -0
  35. package/components/fileCard/index.d.ts +2 -0
  36. package/components/fileCard/index.js +2 -0
  37. package/components/fileCard/index.spec.d.ts +1 -0
  38. package/components/fileCard/index.spec.js +1096 -0
  39. package/components/fileCard/list.d.ts +29 -0
  40. package/components/fileCard/list.js +46 -0
  41. package/components/fileCard/list.vdt.js +71 -0
  42. package/components/fileCard/styles.d.ts +5 -0
  43. package/components/fileCard/styles.js +83 -0
  44. package/components/fileCard/useFileCard.d.ts +45 -0
  45. package/components/fileCard/useFileCard.js +330 -0
  46. package/components/fileCard/useFileCardList.d.ts +14 -0
  47. package/components/fileCard/useFileCardList.js +49 -0
  48. package/components/form/form.js +2 -1
  49. package/components/media/context.d.ts +6 -0
  50. package/components/media/context.js +2 -0
  51. package/components/media/group.d.ts +12 -0
  52. package/components/media/group.js +32 -0
  53. package/components/media/group.vdt.js +50 -0
  54. package/components/media/index.d.ts +2 -0
  55. package/components/media/index.js +2 -0
  56. package/components/media/index.spec.d.ts +1 -0
  57. package/components/media/index.spec.js +1691 -0
  58. package/components/media/media.d.ts +37 -0
  59. package/components/media/media.js +67 -0
  60. package/components/media/media.vdt.js +202 -0
  61. package/components/media/mediaAssets.d.ts +4 -0
  62. package/components/media/mediaAssets.js +9 -0
  63. package/components/media/mediaUtils.d.ts +6 -0
  64. package/components/media/mediaUtils.js +66 -0
  65. package/components/media/styles.d.ts +13 -0
  66. package/components/media/styles.js +52 -0
  67. package/components/media/types.d.ts +37 -0
  68. package/components/media/types.js +1 -0
  69. package/components/media/useMedia.d.ts +70 -0
  70. package/components/media/useMedia.js +471 -0
  71. package/components/media/useMediaGroup.d.ts +15 -0
  72. package/components/media/useMediaGroup.js +136 -0
  73. package/components/media/useMediaViewer.d.ts +14 -0
  74. package/components/media/useMediaViewer.js +129 -0
  75. package/components/media/viewer.d.ts +24 -0
  76. package/components/media/viewer.js +54 -0
  77. package/components/media/viewer.vdt.js +100 -0
  78. package/components/radio/index.d.ts +3 -3
  79. package/components/sender/icons.d.ts +3 -0
  80. package/components/sender/icons.js +17 -0
  81. package/components/sender/index.d.ts +1 -0
  82. package/components/sender/index.js +1 -0
  83. package/components/sender/index.spec.d.ts +1 -0
  84. package/components/sender/index.spec.js +1597 -0
  85. package/components/sender/sender.d.ts +104 -0
  86. package/components/sender/sender.js +111 -0
  87. package/components/sender/sender.vdt.js +230 -0
  88. package/components/sender/styles.d.ts +5 -0
  89. package/components/sender/styles.js +56 -0
  90. package/components/sender/useAutoResize.d.ts +4 -0
  91. package/components/sender/useAutoResize.js +99 -0
  92. package/components/sender/useSenderDrag.d.ts +6 -0
  93. package/components/sender/useSenderDrag.js +320 -0
  94. package/components/sender/useSenderInput.d.ts +16 -0
  95. package/components/sender/useSenderInput.js +101 -0
  96. package/components/sender/useSenderPaste.d.ts +5 -0
  97. package/components/sender/useSenderPaste.js +36 -0
  98. package/components/sender/useSenderUpload.d.ts +11 -0
  99. package/components/sender/useSenderUpload.js +395 -0
  100. package/components/skeleton/skeleton.d.ts +2 -1
  101. package/components/skeleton/skeleton.js +1 -1
  102. package/components/think/index.d.ts +1 -0
  103. package/components/think/index.js +1 -0
  104. package/components/think/index.spec.d.ts +1 -0
  105. package/components/think/index.spec.js +345 -0
  106. package/components/think/index.vdt.js +82 -0
  107. package/components/think/styles.d.ts +5 -0
  108. package/components/think/styles.js +25 -0
  109. package/components/think/think.d.ts +28 -0
  110. package/components/think/think.js +48 -0
  111. package/components/think/useThinkExpand.d.ts +10 -0
  112. package/components/think/useThinkExpand.js +56 -0
  113. package/components/types.d.ts +4 -2
  114. package/components/upload/ajaxUploader.d.ts +1 -0
  115. package/components/upload/ajaxUploader.js +6 -0
  116. package/components/xmarkdown/index.d.ts +2 -0
  117. package/components/xmarkdown/index.js +1 -0
  118. package/components/xmarkdown/index.spec.d.ts +1 -0
  119. package/components/xmarkdown/index.spec.js +1666 -0
  120. package/components/xmarkdown/markdown/codeBlockRenderer.d.ts +8 -0
  121. package/components/xmarkdown/markdown/codeBlockRenderer.js +52 -0
  122. package/components/xmarkdown/markdown/codeblock.d.ts +8 -0
  123. package/components/xmarkdown/markdown/codeblock.js +74 -0
  124. package/components/xmarkdown/markdown/highlight.d.ts +17 -0
  125. package/components/xmarkdown/markdown/highlight.js +83 -0
  126. package/components/xmarkdown/markdown/index.d.ts +14 -0
  127. package/components/xmarkdown/markdown/index.js +14 -0
  128. package/components/xmarkdown/markdown/mermaid.d.ts +8 -0
  129. package/components/xmarkdown/markdown/mermaid.js +104 -0
  130. package/components/xmarkdown/markdown/renderTree.d.ts +54 -0
  131. package/components/xmarkdown/markdown/renderTree.js +386 -0
  132. package/components/xmarkdown/markdown/renderer.d.ts +18 -0
  133. package/components/xmarkdown/markdown/renderer.js +461 -0
  134. package/components/xmarkdown/markdown/streaming.d.ts +24 -0
  135. package/components/xmarkdown/markdown/streaming.js +513 -0
  136. package/components/xmarkdown/markdown/types.d.ts +124 -0
  137. package/components/xmarkdown/markdown/types.js +6 -0
  138. package/components/xmarkdown/markdown/utils.d.ts +7 -0
  139. package/components/xmarkdown/markdown/utils.js +9 -0
  140. package/components/xmarkdown/markdown.d.ts +1 -0
  141. package/components/xmarkdown/markdown.js +1 -0
  142. package/components/xmarkdown/styles.d.ts +5 -0
  143. package/components/xmarkdown/styles.js +50 -0
  144. package/components/xmarkdown/useMermaid.d.ts +27 -0
  145. package/components/xmarkdown/useMermaid.js +745 -0
  146. package/components/xmarkdown/useXMarkdownContent.d.ts +14 -0
  147. package/components/xmarkdown/useXMarkdownContent.js +218 -0
  148. package/components/xmarkdown/useXMarkdownDisplay.d.ts +26 -0
  149. package/components/xmarkdown/useXMarkdownDisplay.js +569 -0
  150. package/components/xmarkdown/xmarkdown.d.ts +61 -0
  151. package/components/xmarkdown/xmarkdown.js +109 -0
  152. package/components/xmarkdown/xmarkdown.vdt.js +43 -0
  153. package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
  154. package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
  155. package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  156. package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  157. package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  158. package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  159. package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  160. package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  161. package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  162. package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  163. package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  164. package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  165. package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  166. package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  167. package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  168. package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
  169. package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
  170. package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
  171. package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  172. package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  173. package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  174. package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
  175. package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
  176. package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
  177. package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
  178. package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
  179. package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
  180. package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  181. package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  182. package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  183. package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
  184. package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
  185. package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
  186. package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  187. package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  188. package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  189. package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  190. package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  191. package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  192. package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  193. package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  194. package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  195. package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
  196. package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
  197. package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
  198. package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
  199. package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
  200. package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  201. package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
  202. package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
  203. package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  204. package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
  205. package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
  206. package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  207. package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
  208. package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
  209. package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  210. package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  211. package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  212. package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  213. package/dist/i18n/en-US.js +29 -1
  214. package/dist/i18n/en-US.js.map +1 -1
  215. package/dist/i18n/en-US.min.js +1 -1
  216. package/dist/index.js +100506 -37457
  217. package/dist/index.js.map +1 -1
  218. package/dist/index.min.js +1569 -1
  219. package/dist/kpc.css +4 -0
  220. package/dist/ksyun.css +4 -0
  221. package/i18n/en-US.d.ts +27 -0
  222. package/i18n/en-US.js +29 -1
  223. package/index.d.ts +9 -2
  224. package/index.js +9 -2
  225. package/package.json +8 -2
  226. package/styles/global.js +12 -6
  227. package/yarn-error.log +0 -1012
@@ -0,0 +1,569 @@
1
+ import _concatInstanceProperty from "@babel/runtime-corejs3/core-js/instance/concat";
2
+ import _Promise from "@babel/runtime-corejs3/core-js/promise";
3
+ import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js/instance/starts-with";
4
+ import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js/instance/slice";
5
+ import _Object$assign from "@babel/runtime-corejs3/core-js/object/assign";
6
+ /**
7
+ * 内容显示逻辑
8
+ *
9
+ * 负责:
10
+ * - 打字动画效果
11
+ * - 流式渲染处理
12
+ * - Markdown 渲染和缓存
13
+ * - 数学公式运行时加载
14
+ */
15
+ import { useInstance } from 'intact-vue-next';
16
+ import { containsFormulaSyntax, createStreamingTailCache, createMarkdownRenderer, renderMarkdownTail, splitMarkdownForStreaming } from './markdown';
17
+ export function useXMarkdownDisplay(getPrefixCls) {
18
+ var instance = useInstance();
19
+ var mounted = false;
20
+ // 打字动画状态
21
+ var typingTimer = null;
22
+ var lastCompletedContent = null;
23
+ var hasPendingCompletion = !!instance.get('loading') || !!instance.get('streaming');
24
+ var previousContent = instance.get('content');
25
+ var previousLoading = !!instance.get('loading');
26
+ var previousStreaming = !!instance.get('streaming');
27
+ // Markdown 渲染缓存
28
+ var lastStableMarkdownSource = '';
29
+ var lastStableMarkdownBlocks = [];
30
+ var lastStableMarkdownResult = {
31
+ nodes: [],
32
+ blocks: {}
33
+ };
34
+ var streamingTailCache = createStreamingTailCache();
35
+ var renderedBlockId = 0;
36
+ // 数学公式运行时
37
+ var formulaRuntime = null;
38
+ var formulaRuntimePromise = null;
39
+ // 渲染器实例
40
+ var renderer = createMarkdownRenderer(getRenderOptions());
41
+ /**
42
+ * 获取渲染配置
43
+ */
44
+ function getRenderOptions() {
45
+ return {
46
+ prefixCls: getPrefixCls(),
47
+ allowHtml: !!instance.get('allowHtml'),
48
+ showCodeHeader: instance.get('showCodeHeader') !== false,
49
+ enableMermaid: instance.get('enableMermaid') !== false,
50
+ enableFormula: instance.get('enableFormula') !== false,
51
+ formulaDelimiters: instance.get('formulaDelimiters'),
52
+ formulaMacros: instance.get('formulaMacros'),
53
+ sanitizeOptions: instance.get('sanitizeOptions'),
54
+ plugins: instance.get('plugins'),
55
+ tagAttrs: instance.get('tagAttrs'),
56
+ tagRenderers: instance.get('tagRenderers'),
57
+ codeBlockRenderers: instance.get('codeBlockRenderers'),
58
+ streaming: !!instance.get('streaming'),
59
+ typing: !!instance.get('typing'),
60
+ formulaRuntime: formulaRuntime,
61
+ normalizeRendererOutput: function normalizeRendererOutput(value) {
62
+ var normalize = instance.constructor.normalize;
63
+ return normalize ? normalize(value) : value;
64
+ }
65
+ };
66
+ }
67
+ /**
68
+ * 刷新渲染器
69
+ */
70
+ function refreshRenderer() {
71
+ renderer = createMarkdownRenderer(getRenderOptions());
72
+ resetMarkdownCache();
73
+ }
74
+ /**
75
+ * 设置显示内容
76
+ */
77
+ function setDisplayContent(value) {
78
+ if (instance.get('$displayContent') === value) return false;
79
+ instance.set('$displayContent', value);
80
+ syncRenderedMarkdown();
81
+ return true;
82
+ }
83
+ /**
84
+ * 设置打字动画状态
85
+ */
86
+ function setTypingActive(value) {
87
+ if (instance.get('$typingActive') === value) return;
88
+ instance.set('$typingActive', value);
89
+ }
90
+ /**
91
+ * 设置渲染结果
92
+ */
93
+ function setRenderedResult(stable, tailNodes, source) {
94
+ var _context;
95
+ instance.set({
96
+ $renderedStableNodes: stable.nodes,
97
+ $renderedTailNodes: tailNodes,
98
+ $renderedMarkdownSource: source,
99
+ $renderedBlocks: stable.blocks,
100
+ $renderedNodes: _concatInstanceProperty(_context = []).call(_context, stable.nodes, tailNodes)
101
+ });
102
+ }
103
+ /**
104
+ * 确保数学公式运行时已加载
105
+ */
106
+ function ensureFormulaRuntime(source) {
107
+ if (instance.get('enableFormula') === false || formulaRuntime || formulaRuntimePromise || !containsFormulaSyntax(source, instance.get('formulaDelimiters'))) {
108
+ return;
109
+ }
110
+ formulaRuntimePromise = _Promise.all([import('katex'), import('markdown-it-texmath'), import('katex/dist/katex.min.css')]).then(function (_ref) {
111
+ var katexModule = _ref[0],
112
+ texmathModule = _ref[1];
113
+ if (instance.$unmounted) return;
114
+ formulaRuntime = {
115
+ katex: katexModule.default || katexModule,
116
+ texmath: texmathModule.default || texmathModule
117
+ };
118
+ formulaRuntimePromise = null;
119
+ refreshRenderer();
120
+ syncRenderedMarkdown(true);
121
+ }).catch(function () {
122
+ formulaRuntimePromise = null;
123
+ });
124
+ }
125
+ /**
126
+ * 获取打字动画配置
127
+ */
128
+ function getTypingOptions() {
129
+ var typing = instance.get('typing');
130
+ if (typing && typeof typing === 'object') {
131
+ return {
132
+ interval: Math.max(typing.interval || 24, 16),
133
+ step: Math.max(typing.step || 2, 1)
134
+ };
135
+ }
136
+ return {
137
+ interval: 24,
138
+ step: 2
139
+ };
140
+ }
141
+ /**
142
+ * 停止打字动画
143
+ */
144
+ function stopTyping() {
145
+ if (typingTimer) {
146
+ clearTimeout(typingTimer);
147
+ typingTimer = null;
148
+ }
149
+ setTypingActive(false);
150
+ }
151
+ /**
152
+ * 重置 Markdown 缓存
153
+ */
154
+ function resetMarkdownCache() {
155
+ lastStableMarkdownSource = '';
156
+ lastStableMarkdownBlocks = [];
157
+ lastStableMarkdownResult = {
158
+ nodes: [],
159
+ blocks: {}
160
+ };
161
+ streamingTailCache = createStreamingTailCache();
162
+ }
163
+ /**
164
+ * 重置完成状态
165
+ */
166
+ function resetTypingComplete() {
167
+ lastCompletedContent = null;
168
+ }
169
+ /**
170
+ * 触发打字完成事件
171
+ */
172
+ function triggerTypingComplete(content) {
173
+ if (lastCompletedContent === content) return;
174
+ lastCompletedContent = content;
175
+ hasPendingCompletion = false;
176
+ instance.trigger('typingComplete', content);
177
+ }
178
+ /**
179
+ * 完成打字动画
180
+ */
181
+ function finishTyping(content) {
182
+ stopTyping();
183
+ syncRenderedMarkdown(true);
184
+ triggerTypingComplete(content);
185
+ }
186
+ /**
187
+ * 同步完成状态
188
+ */
189
+ function syncCompletionState() {
190
+ var content = instance.get('content');
191
+ var loading = !!instance.get('loading');
192
+ var streaming = !!instance.get('streaming');
193
+ if (content !== previousContent || loading && !previousLoading || streaming && !previousStreaming) {
194
+ hasPendingCompletion = true;
195
+ }
196
+ previousContent = content;
197
+ previousLoading = loading;
198
+ previousStreaming = streaming;
199
+ }
200
+ /**
201
+ * 判断是否应该触发 typingComplete 事件
202
+ */
203
+ function shouldEmitTypingComplete(content) {
204
+ return content.length > 0 || hasPendingCompletion;
205
+ }
206
+ /**
207
+ * 获取当前显示内容
208
+ */
209
+ function getDisplayedContent() {
210
+ return instance.get('$displayContent') || '';
211
+ }
212
+ /**
213
+ * 获取共享前缀
214
+ */
215
+ function getSharedPrefix(content) {
216
+ var displayedContent = getDisplayedContent();
217
+ if (!displayedContent || _startsWithInstanceProperty(content).call(content, displayedContent)) {
218
+ return displayedContent;
219
+ }
220
+ var i = 0;
221
+ while (i < displayedContent.length && i < content.length && displayedContent[i] === content[i]) {
222
+ i++;
223
+ }
224
+ return _sliceInstanceProperty(displayedContent).call(displayedContent, 0, i);
225
+ }
226
+ /**
227
+ * 立即渲染 Markdown
228
+ */
229
+ function renderMarkdownImmediately(source) {
230
+ lastStableMarkdownResult = renderStableMarkdown(source);
231
+ setRenderedResult(lastStableMarkdownResult, [], source);
232
+ }
233
+ /**
234
+ * 渲染 stable 区 Markdown
235
+ */
236
+ function renderStableMarkdown(source) {
237
+ if (source === lastStableMarkdownSource) {
238
+ return lastStableMarkdownResult;
239
+ }
240
+ var sourceBlocks = renderer.parseBlocks(source);
241
+ var renderedBlocks = reuseStableMarkdownBlocks(sourceBlocks);
242
+ lastStableMarkdownBlocks = renderedBlocks;
243
+ lastStableMarkdownSource = source;
244
+ lastStableMarkdownResult = mergeRenderedBlocks(renderedBlocks);
245
+ return lastStableMarkdownResult;
246
+ }
247
+ /**
248
+ * 复用 stable 区未变化的 block
249
+ */
250
+ function reuseStableMarkdownBlocks(sourceBlocks) {
251
+ var renderedBlocks = [];
252
+ var index = 0;
253
+ // 匹配复用的 block
254
+ while (index < sourceBlocks.length && index < lastStableMarkdownBlocks.length) {
255
+ var sourceBlock = sourceBlocks[index];
256
+ var renderedBlock = lastStableMarkdownBlocks[index];
257
+ if (!canReuseStableBlock(sourceBlock, renderedBlock)) break; // 如果不能复用,则跳出循环
258
+ renderedBlocks.push(renderedBlock);
259
+ index++;
260
+ }
261
+ // 渲染新增的 block
262
+ for (; index < sourceBlocks.length; index++) {
263
+ renderedBlocks.push(renderer.renderBlock(sourceBlocks[index], registerRenderedBlock));
264
+ }
265
+ return renderedBlocks;
266
+ }
267
+ /**
268
+ * 判断 block 是否可以直接复用
269
+ */
270
+ function canReuseStableBlock(sourceBlock, renderedBlock) {
271
+ return !!renderedBlock && sourceBlock.key === renderedBlock.key && sourceBlock.source === renderedBlock.source;
272
+ }
273
+ /**
274
+ * 注册代码块和 Mermaid 块元信息
275
+ */
276
+ function registerRenderedBlock(type, source, language) {
277
+ return "xmarkdown-block-" + renderedBlockId++;
278
+ }
279
+ /**
280
+ * 合并 stable block 的渲染结果
281
+ */
282
+ function mergeRenderedBlocks(renderedBlocks) {
283
+ var nodes = [];
284
+ var blocks = {};
285
+ renderedBlocks.forEach(function (block) {
286
+ nodes.push.apply(nodes, block.nodes);
287
+ _Object$assign(blocks, block.blocks);
288
+ });
289
+ return {
290
+ nodes: nodes,
291
+ blocks: blocks
292
+ };
293
+ }
294
+ /**
295
+ * 判断是否需要渐进式渲染
296
+ */
297
+ function shouldRenderMarkdownProgressively() {
298
+ return !!instance.get('streaming') || isTypingActive();
299
+ }
300
+ /**
301
+ * 渐进式渲染 Markdown
302
+ */
303
+ function renderMarkdownProgressively(source) {
304
+ var _splitMarkdownForStre = splitMarkdownForStreaming(source, streamingTailCache),
305
+ stableSource = _splitMarkdownForStre.stableSource,
306
+ tailText = _splitMarkdownForStre.tailText,
307
+ openFence = _splitMarkdownForStre.openFence;
308
+ var renderedStableResult = {
309
+ nodes: [],
310
+ blocks: {}
311
+ };
312
+ if (stableSource) {
313
+ renderedStableResult = renderStableMarkdown(stableSource);
314
+ } else if (lastStableMarkdownSource || lastStableMarkdownResult.nodes.length) {
315
+ resetMarkdownCache();
316
+ }
317
+ setRenderedResult(renderedStableResult, renderMarkdownTail(tailText, openFence, getRenderOptions()), source);
318
+ }
319
+ /**
320
+ * 同步 Markdown 渲染
321
+ */
322
+ function syncRenderedMarkdown(immediate) {
323
+ if (immediate === void 0) {
324
+ immediate = false;
325
+ }
326
+ var source = getDisplayedContent();
327
+ ensureFormulaRuntime(source);
328
+ if (!source) {
329
+ resetMarkdownCache();
330
+ setRenderedResult({
331
+ nodes: [],
332
+ blocks: {}
333
+ }, [], '');
334
+ return;
335
+ }
336
+ if (immediate || !shouldRenderMarkdownProgressively()) {
337
+ renderMarkdownImmediately(source);
338
+ return;
339
+ }
340
+ renderMarkdownProgressively(source);
341
+ }
342
+ /**
343
+ * 开始打字动画
344
+ */
345
+ function startTyping(immediate) {
346
+ if (immediate === void 0) {
347
+ immediate = false;
348
+ }
349
+ if (typingTimer) return;
350
+ if (immediate) {
351
+ setTypingActive(true);
352
+ runTyping();
353
+ return;
354
+ }
355
+ var _getTypingOptions = getTypingOptions(),
356
+ interval = _getTypingOptions.interval;
357
+ setTypingActive(true);
358
+ typingTimer = window.setTimeout(function () {
359
+ typingTimer = null;
360
+ runTyping();
361
+ }, interval);
362
+ }
363
+ /**
364
+ * 运行打字动画
365
+ */
366
+ function runTyping() {
367
+ syncCompletionState();
368
+ var content = instance.get('content');
369
+ var nextValue = content === undefined || content === null ? '' : String(content);
370
+ // 加载状态处理
371
+ if (instance.get('loading')) {
372
+ stopTyping();
373
+ resetTypingComplete();
374
+ if (!setDisplayContent('')) {
375
+ syncRenderedMarkdown();
376
+ }
377
+ return;
378
+ }
379
+ // 无内容或禁用打字
380
+ if (!instance.get('typing') || !nextValue) {
381
+ stopTyping();
382
+ if (!setDisplayContent(nextValue)) {
383
+ syncRenderedMarkdown();
384
+ }
385
+ if (!instance.get('streaming') && shouldEmitTypingComplete(nextValue)) {
386
+ triggerTypingComplete(nextValue);
387
+ }
388
+ return;
389
+ }
390
+ // 内容变化检测
391
+ var sharedPrefix = getSharedPrefix(nextValue);
392
+ if (sharedPrefix !== getDisplayedContent()) {
393
+ resetTypingComplete();
394
+ setDisplayContent(sharedPrefix);
395
+ }
396
+ var currentValue = getDisplayedContent();
397
+ var _getTypingOptions2 = getTypingOptions(),
398
+ interval = _getTypingOptions2.interval,
399
+ step = _getTypingOptions2.step;
400
+ // 逐步显示内容
401
+ if (currentValue !== nextValue) {
402
+ var nextLength = Math.min(currentValue.length + step, nextValue.length);
403
+ var renderedContent = _sliceInstanceProperty(nextValue).call(nextValue, 0, nextLength);
404
+ setDisplayContent(renderedContent);
405
+ instance.trigger('typing', renderedContent, nextValue);
406
+ }
407
+ // 完成检测
408
+ if (getDisplayedContent() === nextValue) {
409
+ if (instance.get('streaming')) {
410
+ stopTyping();
411
+ syncRenderedMarkdown();
412
+ return;
413
+ }
414
+ finishTyping(nextValue);
415
+ return;
416
+ }
417
+ // 继续动画
418
+ setTypingActive(true);
419
+ typingTimer = window.setTimeout(function () {
420
+ typingTimer = null;
421
+ runTyping();
422
+ }, interval);
423
+ }
424
+ /**
425
+ * 同步显示内容(入口函数)
426
+ */
427
+ function syncDisplayContent() {
428
+ syncCompletionState();
429
+ // 加载状态
430
+ if (instance.get('loading')) {
431
+ stopTyping();
432
+ resetTypingComplete();
433
+ if (!setDisplayContent('')) {
434
+ syncRenderedMarkdown();
435
+ }
436
+ return;
437
+ }
438
+ var content = instance.get('content');
439
+ var nextValue = content === undefined || content === null ? '' : String(content);
440
+ var typing = instance.get('typing');
441
+ var streaming = instance.get('streaming');
442
+ // 空内容或禁用打字效果,直接显示
443
+ if (!nextValue || !typing) {
444
+ stopTyping();
445
+ if (!setDisplayContent(nextValue)) {
446
+ syncRenderedMarkdown();
447
+ }
448
+ if (!streaming && shouldEmitTypingComplete(nextValue)) {
449
+ triggerTypingComplete(nextValue);
450
+ }
451
+ return;
452
+ }
453
+ // 内容变化检测
454
+ var sharedPrefix = getSharedPrefix(nextValue);
455
+ // 内容发生"非追加"变化时
456
+ if (sharedPrefix !== getDisplayedContent()) {
457
+ stopTyping();
458
+ resetTypingComplete();
459
+ setDisplayContent(sharedPrefix);
460
+ }
461
+ // 已完成
462
+ if (getDisplayedContent() === nextValue) {
463
+ if (!streaming) {
464
+ finishTyping(nextValue);
465
+ } else {
466
+ stopTyping();
467
+ syncRenderedMarkdown();
468
+ }
469
+ return;
470
+ }
471
+ startTyping(!getDisplayedContent());
472
+ }
473
+ /**
474
+ * 初始化
475
+ */
476
+ function bootstrap() {
477
+ var content = instance.get('content');
478
+ setTypingActive(false);
479
+ setDisplayContent(!instance.get('loading') && !instance.get('typing') && content !== undefined && content !== null ? String(content) : '');
480
+ // 监听核心属性变化
481
+ ['content', 'loading', 'streaming', 'typing'].forEach(function (key) {
482
+ instance.watch(key, function () {
483
+ if (!mounted) return;
484
+ syncDisplayContent();
485
+ });
486
+ });
487
+ // 监听渲染配置变化
488
+ ['allowHtml', 'showCodeHeader', 'enableMermaid', 'mermaidConfig', 'enableFormula', 'formulaDelimiters', 'formulaMacros', 'sanitizeOptions', 'plugins', 'tagAttrs', 'tagRenderers', 'codeBlockRenderers'].forEach(function (key) {
489
+ instance.watch(key, function () {
490
+ if (!mounted) return;
491
+ refreshRenderer();
492
+ syncRenderedMarkdown(true);
493
+ });
494
+ });
495
+ }
496
+ bootstrap();
497
+ // 公共方法
498
+ function hasContentProp() {
499
+ var content = instance.get('content');
500
+ return content !== undefined && content !== null;
501
+ }
502
+ function hasNonEmptyContentProp() {
503
+ var content = instance.get('content');
504
+ if (content === undefined || content === null) return false;
505
+ return String(content).length > 0;
506
+ }
507
+ function hasVisibleContent() {
508
+ return !!getDisplayedContent();
509
+ }
510
+ function shouldShowLoadingShell() {
511
+ var loading = instance.get('loading');
512
+ if (loading) return true;
513
+ var visible = hasVisibleContent();
514
+ if (visible) return false;
515
+ if (instance.get('streaming')) return true;
516
+ return !!instance.get('typing') && hasNonEmptyContentProp();
517
+ }
518
+ function shouldShowEmpty() {
519
+ return !shouldShowLoadingShell() && !hasNonEmptyContentProp() && !hasVisibleContent();
520
+ }
521
+ function getRenderedNodes() {
522
+ return instance.get('$renderedNodes') || [];
523
+ }
524
+ function getRenderedStableNodes() {
525
+ return instance.get('$renderedStableNodes') || [];
526
+ }
527
+ function getRenderedTailNodes() {
528
+ return instance.get('$renderedTailNodes') || [];
529
+ }
530
+ function getRenderedContent() {
531
+ var _context2;
532
+ return _concatInstanceProperty(_context2 = []).call(_context2, getRenderedStableNodes(), getRenderedTailNodes());
533
+ }
534
+ function getRenderedBlockData(id) {
535
+ var blocks = instance.get('$renderedBlocks');
536
+ return blocks ? blocks[id] : undefined;
537
+ }
538
+ function isTypingActive() {
539
+ return !!instance.get('$typingActive');
540
+ }
541
+ return {
542
+ onMounted: function onMounted() {
543
+ mounted = true;
544
+ if (!hasVisibleContent() && (hasContentProp() || !!instance.get('loading'))) {
545
+ syncDisplayContent();
546
+ }
547
+ },
548
+ onBeforeUnmount: function onBeforeUnmount() {
549
+ mounted = false;
550
+ stopTyping();
551
+ resetMarkdownCache();
552
+ },
553
+ // 状态判断
554
+ hasContentProp: hasContentProp,
555
+ hasNonEmptyContentProp: hasNonEmptyContentProp,
556
+ hasVisibleContent: hasVisibleContent,
557
+ shouldShowLoadingShell: shouldShowLoadingShell,
558
+ shouldShowEmpty: shouldShowEmpty,
559
+ // 内容获取
560
+ getDisplayedContent: getDisplayedContent,
561
+ getRenderedContent: getRenderedContent,
562
+ getRenderedStableNodes: getRenderedStableNodes,
563
+ getRenderedTailNodes: getRenderedTailNodes,
564
+ getRenderedBlockData: getRenderedBlockData,
565
+ getRenderedNodes: getRenderedNodes,
566
+ // 状态查询
567
+ isTypingActive: isTypingActive
568
+ };
569
+ }
@@ -0,0 +1,61 @@
1
+ import { Component, TypeDefs } from 'intact-vue-next';
2
+ import type { MermaidConfig } from 'mermaid';
3
+ import type { Events } from '../types';
4
+ import type { XMarkdownCodeBlockRenderers, XMarkdownFormulaDelimiter, XMarkdownPlugin, XMarkdownTagAttrs, XMarkdownTagRenderers } from './markdown';
5
+ export interface XMarkdownTyping {
6
+ interval?: number;
7
+ step?: number;
8
+ }
9
+ export interface XMarkdownProps {
10
+ content?: string | number;
11
+ loading?: boolean;
12
+ typing?: boolean | XMarkdownTyping;
13
+ streaming?: boolean;
14
+ allowHtml?: boolean;
15
+ showCodeHeader?: boolean;
16
+ enableMermaid?: boolean;
17
+ mermaidConfig?: Partial<MermaidConfig>;
18
+ enableFormula?: boolean;
19
+ formulaDelimiters?: XMarkdownFormulaDelimiter | XMarkdownFormulaDelimiter[];
20
+ formulaMacros?: Record<string, string>;
21
+ sanitizeOptions?: Record<string, any>;
22
+ plugins?: XMarkdownPlugin[];
23
+ tagAttrs?: XMarkdownTagAttrs;
24
+ tagRenderers?: XMarkdownTagRenderers;
25
+ codeBlockRenderers?: XMarkdownCodeBlockRenderers;
26
+ }
27
+ export interface XMarkdownEvents {
28
+ typing: [string, string];
29
+ typingComplete: [string];
30
+ codeCopy: [string, string];
31
+ mermaidError: [Error, string];
32
+ }
33
+ export interface XMarkdownBlocks {
34
+ loading: null;
35
+ empty: null;
36
+ }
37
+ export declare class XMarkdown extends Component<XMarkdownProps, XMarkdownEvents, XMarkdownBlocks> {
38
+ static template: string | import('intact-vue-next').Template<any>;
39
+ static typeDefs: Required<TypeDefs<XMarkdownProps>>;
40
+ static defaults: () => Partial<XMarkdownProps>;
41
+ static events: Events<XMarkdownEvents>;
42
+ private config;
43
+ private display;
44
+ private contentModel;
45
+ /**
46
+ * 挂载后同步展示与交互状态
47
+ */
48
+ mounted(): void;
49
+ /**
50
+ * 更新后同步交互内容
51
+ */
52
+ updated(): void;
53
+ /**
54
+ * 卸载前清理资源
55
+ */
56
+ beforeUnmount(): void;
57
+ /**
58
+ * 获取组件前缀类名
59
+ */
60
+ private getPrefixCls;
61
+ }