@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,1666 @@
1
+ import _extends from "@babel/runtime-corejs3/helpers/extends";
2
+ import _inheritsLoose from "@babel/runtime-corejs3/helpers/inheritsLoose";
3
+ import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
4
+ import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
5
+ import _concatInstanceProperty from "@babel/runtime-corejs3/core-js/instance/concat";
6
+ import _mapInstanceProperty from "@babel/runtime-corejs3/core-js/instance/map";
7
+ import _includesInstanceProperty from "@babel/runtime-corejs3/core-js/instance/includes";
8
+ import _Array$from from "@babel/runtime-corejs3/core-js/array/from";
9
+ import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js/instance/slice";
10
+ import { Component, createVNode } from 'intact-vue-next';
11
+ import mermaid from 'mermaid/dist/mermaid.min.js';
12
+ import { dispatchEvent, mount, unmount, wait } from '../../test/utils';
13
+ import { XMarkdown } from '.';
14
+ import { createStreamingTailCache, splitMarkdownForStreaming } from './markdown';
15
+ describe('XMarkdown', function () {
16
+ function waitFor(_x, _x2, _x3) {
17
+ return _waitFor.apply(this, arguments);
18
+ }
19
+ function _waitFor() {
20
+ _waitFor = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee29(check, retries, interval) {
21
+ var i;
22
+ return _regeneratorRuntime.wrap(function _callee29$(_context60) {
23
+ while (1) switch (_context60.prev = _context60.next) {
24
+ case 0:
25
+ if (retries === void 0) {
26
+ retries = 30;
27
+ }
28
+ if (interval === void 0) {
29
+ interval = 20;
30
+ }
31
+ i = 0;
32
+ case 3:
33
+ if (!(i < retries)) {
34
+ _context60.next = 11;
35
+ break;
36
+ }
37
+ if (!check()) {
38
+ _context60.next = 6;
39
+ break;
40
+ }
41
+ return _context60.abrupt("return", true);
42
+ case 6:
43
+ _context60.next = 8;
44
+ return wait(interval);
45
+ case 8:
46
+ i++;
47
+ _context60.next = 3;
48
+ break;
49
+ case 11:
50
+ return _context60.abrupt("return", check());
51
+ case 12:
52
+ case "end":
53
+ return _context60.stop();
54
+ }
55
+ }, _callee29);
56
+ }));
57
+ return _waitFor.apply(this, arguments);
58
+ }
59
+ afterEach(function () {
60
+ sinon.restore();
61
+ unmount();
62
+ });
63
+ it('should render markdown blocks, code toolbar and formula', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
64
+ var Demo, _mount, element, ready;
65
+ return _regeneratorRuntime.wrap(function _callee$(_context2) {
66
+ while (1) switch (_context2.prev = _context2.next) {
67
+ case 0:
68
+ Demo = /*#__PURE__*/function (_Component) {
69
+ _inheritsLoose(Demo, _Component);
70
+ function Demo() {
71
+ var _context;
72
+ var _this;
73
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
74
+ args[_key] = arguments[_key];
75
+ }
76
+ _this = _Component.call.apply(_Component, _concatInstanceProperty(_context = [this]).call(_context, args)) || this;
77
+ _this.XMarkdown = XMarkdown;
78
+ return _this;
79
+ }
80
+ Demo.defaults = function defaults() {
81
+ return {
82
+ content: ['# 标题', '', '> 引用内容', '', '$E = mc^2$', '', '| A | B |', '| --- | --- |', '| 1 | 2 |', '', '```ts', 'const value = 1;', '```'].join('\n')
83
+ };
84
+ };
85
+ return Demo;
86
+ }(Component);
87
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown content={this.get('content')} />\n ";
88
+ _mount = mount(Demo), element = _mount[1];
89
+ _context2.next = 5;
90
+ return waitFor(function () {
91
+ return !!element.querySelector('.k-xmarkdown-code-toolbar') && !!element.querySelector('.katex');
92
+ }, 60, 20);
93
+ case 5:
94
+ ready = _context2.sent;
95
+ expect(ready).to.be.true;
96
+ expect(element.querySelector('.k-xmarkdown-content h1')).not.to.eql(null);
97
+ expect(element.querySelector('.k-xmarkdown-content').textContent).to.contain('标题');
98
+ expect(element.querySelector('.k-xmarkdown-content blockquote').textContent).to.contain('引用内容');
99
+ expect(element.querySelector('.k-xmarkdown-content table')).not.to.eql(null);
100
+ expect(element.querySelector('.k-xmarkdown-table-wrap table')).not.to.eql(null);
101
+ expect(element.querySelector('.k-xmarkdown-code-toolbar')).not.to.eql(null);
102
+ expect(element.querySelector('.katex')).not.to.eql(null);
103
+ case 14:
104
+ case "end":
105
+ return _context2.stop();
106
+ }
107
+ }, _callee);
108
+ })));
109
+ it('should sanitize raw html by default', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
110
+ var Demo, _mount2, element;
111
+ return _regeneratorRuntime.wrap(function _callee2$(_context4) {
112
+ while (1) switch (_context4.prev = _context4.next) {
113
+ case 0:
114
+ Demo = /*#__PURE__*/function (_Component2) {
115
+ _inheritsLoose(Demo, _Component2);
116
+ function Demo() {
117
+ var _context3;
118
+ var _this2;
119
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
120
+ args[_key2] = arguments[_key2];
121
+ }
122
+ _this2 = _Component2.call.apply(_Component2, _concatInstanceProperty(_context3 = [this]).call(_context3, args)) || this;
123
+ _this2.XMarkdown = XMarkdown;
124
+ return _this2;
125
+ }
126
+ return Demo;
127
+ }(Component);
128
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown content={'<script>alert(1)</script><b>safe</b>'} />\n ";
129
+ _mount2 = mount(Demo), element = _mount2[1];
130
+ _context4.next = 5;
131
+ return wait(40);
132
+ case 5:
133
+ expect(element.querySelector('script')).to.eql(null);
134
+ expect(element.querySelector('b')).to.eql(null);
135
+ expect(element.querySelector('.k-xmarkdown-content').textContent).to.contain('safe');
136
+ case 8:
137
+ case "end":
138
+ return _context4.stop();
139
+ }
140
+ }, _callee2);
141
+ })));
142
+ it('should ignore empty loading and empty slots', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
143
+ var Demo, _mount3, element;
144
+ return _regeneratorRuntime.wrap(function _callee3$(_context6) {
145
+ while (1) switch (_context6.prev = _context6.next) {
146
+ case 0:
147
+ Demo = /*#__PURE__*/function (_Component3) {
148
+ _inheritsLoose(Demo, _Component3);
149
+ function Demo() {
150
+ var _context5;
151
+ var _this3;
152
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
153
+ args[_key3] = arguments[_key3];
154
+ }
155
+ _this3 = _Component3.call.apply(_Component3, _concatInstanceProperty(_context5 = [this]).call(_context5, args)) || this;
156
+ _this3.XMarkdown = XMarkdown;
157
+ return _this3;
158
+ }
159
+ return Demo;
160
+ }(Component);
161
+ Demo.template = "\n const { XMarkdown } = this;\n <div>\n <XMarkdown className=\"empty-loading\" loading>\n <b:loading>\n <span v-if={false} class=\"empty-loading-slot\">loading</span>\n </b:loading>\n </XMarkdown>\n <XMarkdown className=\"empty-empty\">\n <b:empty>\n <span v-if={false} class=\"empty-empty-slot\">empty</span>\n </b:empty>\n </XMarkdown>\n </div>\n ";
162
+ _mount3 = mount(Demo), element = _mount3[1];
163
+ expect(element.querySelector('.empty-loading .k-xmarkdown-loading')).not.to.eql(null);
164
+ expect(element.querySelector('.empty-loading-slot')).to.eql(null);
165
+ expect(element.querySelector('.empty-empty .k-xmarkdown-empty')).to.eql(null);
166
+ case 6:
167
+ case "end":
168
+ return _context6.stop();
169
+ }
170
+ }, _callee3);
171
+ })));
172
+ it('should render paragraph text with 12px font size', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
173
+ var Demo, _mount4, element, paragraph;
174
+ return _regeneratorRuntime.wrap(function _callee4$(_context8) {
175
+ while (1) switch (_context8.prev = _context8.next) {
176
+ case 0:
177
+ Demo = /*#__PURE__*/function (_Component4) {
178
+ _inheritsLoose(Demo, _Component4);
179
+ function Demo() {
180
+ var _context7;
181
+ var _this4;
182
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
183
+ args[_key4] = arguments[_key4];
184
+ }
185
+ _this4 = _Component4.call.apply(_Component4, _concatInstanceProperty(_context7 = [this]).call(_context7, args)) || this;
186
+ _this4.XMarkdown = XMarkdown;
187
+ return _this4;
188
+ }
189
+ return Demo;
190
+ }(Component);
191
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown content=\"\u6B63\u6587\u5185\u5BB9\" />\n ";
192
+ _mount4 = mount(Demo), element = _mount4[1];
193
+ _context8.next = 5;
194
+ return wait(20);
195
+ case 5:
196
+ paragraph = element.querySelector('.k-xmarkdown-content p');
197
+ expect(getComputedStyle(paragraph).fontSize).to.eql('12px');
198
+ case 7:
199
+ case "end":
200
+ return _context8.stop();
201
+ }
202
+ }, _callee4);
203
+ })));
204
+ it('should render code and table text with 12px font size', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
205
+ var Demo, _mount5, element, ready, inlineCode, codeBlock, table, tableCell;
206
+ return _regeneratorRuntime.wrap(function _callee5$(_context10) {
207
+ while (1) switch (_context10.prev = _context10.next) {
208
+ case 0:
209
+ Demo = /*#__PURE__*/function (_Component5) {
210
+ _inheritsLoose(Demo, _Component5);
211
+ function Demo() {
212
+ var _context9;
213
+ var _this5;
214
+ for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
215
+ args[_key5] = arguments[_key5];
216
+ }
217
+ _this5 = _Component5.call.apply(_Component5, _concatInstanceProperty(_context9 = [this]).call(_context9, args)) || this;
218
+ _this5.XMarkdown = XMarkdown;
219
+ return _this5;
220
+ }
221
+ Demo.defaults = function defaults() {
222
+ return {
223
+ content: ['正文 `inlineCode`', '', '| A | B |', '| --- | --- |', '| 1 | 2 |', '', '```ts', 'const value = 1;', '```'].join('\n')
224
+ };
225
+ };
226
+ return Demo;
227
+ }(Component);
228
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown content={this.get('content')} />\n ";
229
+ _mount5 = mount(Demo), element = _mount5[1];
230
+ _context10.next = 5;
231
+ return waitFor(function () {
232
+ return !!element.querySelector('.k-xmarkdown-code-block');
233
+ });
234
+ case 5:
235
+ ready = _context10.sent;
236
+ expect(ready).to.be.true;
237
+ inlineCode = element.querySelector('.k-xmarkdown-inline-code');
238
+ codeBlock = element.querySelector('.k-xmarkdown-code-block pre');
239
+ table = element.querySelector('.k-xmarkdown-table-wrap > table');
240
+ tableCell = element.querySelector('.k-xmarkdown-table-wrap td');
241
+ expect(getComputedStyle(inlineCode).fontSize).to.eql('12px');
242
+ expect(getComputedStyle(codeBlock).fontSize).to.eql('12px');
243
+ expect(getComputedStyle(table).fontSize).to.eql('12px');
244
+ expect(getComputedStyle(tableCell).fontSize).to.eql('12px');
245
+ case 15:
246
+ case "end":
247
+ return _context10.stop();
248
+ }
249
+ }, _callee5);
250
+ })));
251
+ it('should copy code and emit codeCopy', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
252
+ var writeText, Demo, _mount6, instance, element, ready, button, block;
253
+ return _regeneratorRuntime.wrap(function _callee6$(_context12) {
254
+ while (1) switch (_context12.prev = _context12.next) {
255
+ case 0:
256
+ writeText = sinon.stub().resolves();
257
+ Object.defineProperty(navigator, 'clipboard', {
258
+ value: {
259
+ writeText: writeText
260
+ },
261
+ configurable: true
262
+ });
263
+ Demo = /*#__PURE__*/function (_Component6) {
264
+ _inheritsLoose(Demo, _Component6);
265
+ function Demo() {
266
+ var _context11;
267
+ var _this6;
268
+ for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
269
+ args[_key6] = arguments[_key6];
270
+ }
271
+ _this6 = _Component6.call.apply(_Component6, _concatInstanceProperty(_context11 = [this]).call(_context11, args)) || this;
272
+ _this6.XMarkdown = XMarkdown;
273
+ return _this6;
274
+ }
275
+ Demo.defaults = function defaults() {
276
+ return {
277
+ content: '```ts\nconst value = 1;\n```',
278
+ copiedCode: ''
279
+ };
280
+ };
281
+ return Demo;
282
+ }(Component);
283
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={this.get('content')}\n ev-codeCopy={(code) => this.set('copiedCode', code)}\n />\n ";
284
+ _mount6 = mount(Demo), instance = _mount6[0], element = _mount6[1];
285
+ _context12.next = 7;
286
+ return waitFor(function () {
287
+ return !!element.querySelector('[data-kpc-action="copy-code"]');
288
+ });
289
+ case 7:
290
+ ready = _context12.sent;
291
+ expect(ready).to.be.true;
292
+ button = element.querySelector('[data-kpc-action="copy-code"]');
293
+ block = button.closest('[data-kpc-code-block="true"]');
294
+ dispatchEvent(button, 'click');
295
+ _context12.next = 14;
296
+ return wait(30);
297
+ case 14:
298
+ expect(writeText.calledOnce).to.be.true;
299
+ expect(writeText.firstCall.args[0]).to.eql('const value = 1;');
300
+ expect(instance.get('copiedCode')).to.eql('const value = 1;');
301
+ expect(button.getAttribute('title')).to.eql('已复制');
302
+ expect(block.dataset.kpcSource).to.eql(undefined);
303
+ expect(block.dataset.kpcBlockId).to.not.eql(undefined);
304
+ case 20:
305
+ case "end":
306
+ return _context12.stop();
307
+ }
308
+ }, _callee6);
309
+ })));
310
+ it('should keep unsupported languages as code blocks without syntax highlighting', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7() {
311
+ var Demo, _mount7, element, ready, block, language, code;
312
+ return _regeneratorRuntime.wrap(function _callee7$(_context14) {
313
+ while (1) switch (_context14.prev = _context14.next) {
314
+ case 0:
315
+ Demo = /*#__PURE__*/function (_Component7) {
316
+ _inheritsLoose(Demo, _Component7);
317
+ function Demo() {
318
+ var _context13;
319
+ var _this7;
320
+ for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
321
+ args[_key7] = arguments[_key7];
322
+ }
323
+ _this7 = _Component7.call.apply(_Component7, _concatInstanceProperty(_context13 = [this]).call(_context13, args)) || this;
324
+ _this7.XMarkdown = XMarkdown;
325
+ return _this7;
326
+ }
327
+ Demo.defaults = function defaults() {
328
+ return {
329
+ content: '```unknownlang\n++>---.\n```'
330
+ };
331
+ };
332
+ return Demo;
333
+ }(Component);
334
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown content={this.get('content')} />\n ";
335
+ _mount7 = mount(Demo), element = _mount7[1];
336
+ _context14.next = 5;
337
+ return waitFor(function () {
338
+ return !!element.querySelector('.k-xmarkdown-code-block');
339
+ });
340
+ case 5:
341
+ ready = _context14.sent;
342
+ expect(ready).to.be.true;
343
+ block = element.querySelector('.k-xmarkdown-code-block');
344
+ language = block.querySelector('.k-xmarkdown-code-language');
345
+ code = block.querySelector('pre code');
346
+ expect(language.textContent).to.eql('unknownlang');
347
+ expect(code.textContent).to.contain('++>---.');
348
+ expect(code.className).to.eql('hljs');
349
+ case 13:
350
+ case "end":
351
+ return _context14.stop();
352
+ }
353
+ }, _callee7);
354
+ })));
355
+ it('should hide code toolbar when showCodeHeader is false', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8() {
356
+ var Demo, _mount8, element, ready;
357
+ return _regeneratorRuntime.wrap(function _callee8$(_context16) {
358
+ while (1) switch (_context16.prev = _context16.next) {
359
+ case 0:
360
+ Demo = /*#__PURE__*/function (_Component8) {
361
+ _inheritsLoose(Demo, _Component8);
362
+ function Demo() {
363
+ var _context15;
364
+ var _this8;
365
+ for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
366
+ args[_key8] = arguments[_key8];
367
+ }
368
+ _this8 = _Component8.call.apply(_Component8, _concatInstanceProperty(_context15 = [this]).call(_context15, args)) || this;
369
+ _this8.XMarkdown = XMarkdown;
370
+ return _this8;
371
+ }
372
+ Demo.defaults = function defaults() {
373
+ return {
374
+ content: '```ts\nconst value = 1;\n```'
375
+ };
376
+ };
377
+ return Demo;
378
+ }(Component);
379
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={this.get('content')}\n showCodeHeader={false}\n />\n ";
380
+ _mount8 = mount(Demo), element = _mount8[1];
381
+ _context16.next = 5;
382
+ return waitFor(function () {
383
+ return !!element.querySelector('.k-xmarkdown-code-block');
384
+ });
385
+ case 5:
386
+ ready = _context16.sent;
387
+ expect(ready).to.be.true;
388
+ expect(element.querySelector('.k-xmarkdown-code-toolbar')).to.eql(null);
389
+ expect(element.querySelector('.k-xmarkdown-code-body')).to.eql(null);
390
+ expect(element.querySelector('pre code').textContent).to.contain('const value = 1;');
391
+ case 10:
392
+ case "end":
393
+ return _context16.stop();
394
+ }
395
+ }, _callee8);
396
+ })));
397
+ it('should render mermaid blocks, support zoom controls and toggle source view', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee9() {
398
+ var renderAsync, Demo, _mount9, element, ready, block, root, content, mermaidBody, viewport, diagramToggle, zoomIn, initialScale, resetZoom, toggle;
399
+ return _regeneratorRuntime.wrap(function _callee9$(_context18) {
400
+ while (1) switch (_context18.prev = _context18.next) {
401
+ case 0:
402
+ sinon.stub(mermaid, 'initialize');
403
+ renderAsync = sinon.stub(mermaid, 'renderAsync').resolves('<svg class="mock-mermaid" viewBox="0 0 200 120"><text>diagram</text></svg>');
404
+ Demo = /*#__PURE__*/function (_Component9) {
405
+ _inheritsLoose(Demo, _Component9);
406
+ function Demo() {
407
+ var _context17;
408
+ var _this9;
409
+ for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
410
+ args[_key9] = arguments[_key9];
411
+ }
412
+ _this9 = _Component9.call.apply(_Component9, _concatInstanceProperty(_context17 = [this]).call(_context17, args)) || this;
413
+ _this9.XMarkdown = XMarkdown;
414
+ return _this9;
415
+ }
416
+ Demo.defaults = function defaults() {
417
+ return {
418
+ content: '```mermaid\nflowchart TD\nA-->B\n```'
419
+ };
420
+ };
421
+ return Demo;
422
+ }(Component);
423
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown content={this.get('content')} />\n ";
424
+ _mount9 = mount(Demo), element = _mount9[1];
425
+ _context18.next = 7;
426
+ return waitFor(function () {
427
+ return !!element.querySelector('[data-kpc-mermaid="true"] svg');
428
+ });
429
+ case 7:
430
+ ready = _context18.sent;
431
+ expect(ready).to.be.true;
432
+ block = element.querySelector('[data-kpc-mermaid="true"]');
433
+ root = element.matches('.k-xmarkdown') ? element : element.querySelector('.k-xmarkdown');
434
+ content = root.querySelector('.k-xmarkdown-content');
435
+ mermaidBody = block.querySelector('.k-xmarkdown-mermaid-body');
436
+ viewport = block.querySelector('.k-xmarkdown-mermaid-viewport');
437
+ expect(block.querySelector('.mock-mermaid')).not.to.eql(null);
438
+ expect(renderAsync.firstCall.args[0]).to.match(/^kpc-xmarkdown-mermaid-[a-z0-9]+-xmarkdown-block-0$/);
439
+ expect(block.dataset.kpcSource).to.eql(undefined);
440
+ expect(block.dataset.kpcBlockId).to.not.eql(undefined);
441
+ expect(getComputedStyle(root).maxWidth).to.eql('100%');
442
+ expect(getComputedStyle(content).maxWidth).to.eql('100%');
443
+ expect(getComputedStyle(block).maxWidth).to.eql('100%');
444
+ expect(getComputedStyle(mermaidBody).maxWidth).to.eql('100%');
445
+ expect(getComputedStyle(viewport).maxWidth).to.eql('100%');
446
+ diagramToggle = block.querySelector('[data-kpc-action="set-mermaid-view-diagram"]');
447
+ expect(diagramToggle.getAttribute('aria-pressed')).to.eql('true');
448
+ zoomIn = block.querySelector('[data-kpc-action="zoom-mermaid-in"]');
449
+ initialScale = Number(block.dataset.kpcScale || '1');
450
+ dispatchEvent(zoomIn, 'click');
451
+ _context18.next = 30;
452
+ return wait(40);
453
+ case 30:
454
+ expect(Number(block.dataset.kpcScale)).to.be.greaterThan(initialScale);
455
+ expect(block.querySelector('svg').style.width).not.to.eql('');
456
+ resetZoom = block.querySelector('[data-kpc-action="reset-mermaid-zoom"]');
457
+ dispatchEvent(resetZoom, 'click');
458
+ _context18.next = 36;
459
+ return wait(40);
460
+ case 36:
461
+ expect(Number(block.dataset.kpcScale)).to.eql(initialScale);
462
+ toggle = block.querySelector('[data-kpc-action="set-mermaid-view-source"]');
463
+ dispatchEvent(toggle, 'click');
464
+ _context18.next = 41;
465
+ return wait(20);
466
+ case 41:
467
+ expect(block.dataset.kpcView).to.eql('source');
468
+ expect(toggle.dataset.kpcSelected).to.eql('true');
469
+ expect(toggle.getAttribute('aria-pressed')).to.eql('true');
470
+ case 44:
471
+ case "end":
472
+ return _context18.stop();
473
+ }
474
+ }, _callee9);
475
+ })));
476
+ it('should render mermaid fences as plain code blocks when enableMermaid is false', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee10() {
477
+ var Demo, _mount10, element, ready;
478
+ return _regeneratorRuntime.wrap(function _callee10$(_context20) {
479
+ while (1) switch (_context20.prev = _context20.next) {
480
+ case 0:
481
+ Demo = /*#__PURE__*/function (_Component10) {
482
+ _inheritsLoose(Demo, _Component10);
483
+ function Demo() {
484
+ var _context19;
485
+ var _this10;
486
+ for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
487
+ args[_key10] = arguments[_key10];
488
+ }
489
+ _this10 = _Component10.call.apply(_Component10, _concatInstanceProperty(_context19 = [this]).call(_context19, args)) || this;
490
+ _this10.XMarkdown = XMarkdown;
491
+ return _this10;
492
+ }
493
+ Demo.defaults = function defaults() {
494
+ return {
495
+ content: '```mermaid\nflowchart TD\nA-->B\n```'
496
+ };
497
+ };
498
+ return Demo;
499
+ }(Component);
500
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n enableMermaid={false}\n content={this.get('content')}\n />\n ";
501
+ _mount10 = mount(Demo), element = _mount10[1];
502
+ _context20.next = 5;
503
+ return waitFor(function () {
504
+ return !!element.querySelector('.k-xmarkdown-code-block');
505
+ });
506
+ case 5:
507
+ ready = _context20.sent;
508
+ expect(ready).to.be.true;
509
+ expect(element.querySelector('[data-kpc-mermaid="true"]')).to.eql(null);
510
+ expect(element.querySelector('.k-xmarkdown-code-language').textContent).to.eql('mermaid');
511
+ expect(element.querySelector('pre code').textContent).to.contain('flowchart TD');
512
+ case 10:
513
+ case "end":
514
+ return _context20.stop();
515
+ }
516
+ }, _callee10);
517
+ })));
518
+ it('should merge custom mermaidConfig when rendering mermaid', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee11() {
519
+ var initialize, Demo, _mount11, element, ready;
520
+ return _regeneratorRuntime.wrap(function _callee11$(_context22) {
521
+ while (1) switch (_context22.prev = _context22.next) {
522
+ case 0:
523
+ initialize = sinon.stub(mermaid, 'initialize');
524
+ sinon.stub(mermaid, 'renderAsync').resolves('<svg class="mock-mermaid-config" viewBox="0 0 200 120"><text>diagram</text></svg>');
525
+ Demo = /*#__PURE__*/function (_Component11) {
526
+ _inheritsLoose(Demo, _Component11);
527
+ function Demo() {
528
+ var _context21;
529
+ var _this11;
530
+ for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
531
+ args[_key11] = arguments[_key11];
532
+ }
533
+ _this11 = _Component11.call.apply(_Component11, _concatInstanceProperty(_context21 = [this]).call(_context21, args)) || this;
534
+ _this11.XMarkdown = XMarkdown;
535
+ return _this11;
536
+ }
537
+ Demo.defaults = function defaults() {
538
+ return {
539
+ content: '```mermaid\nflowchart TD\nA-->B\n```',
540
+ mermaidConfig: {
541
+ theme: 'base',
542
+ themeVariables: {
543
+ primaryColor: '#fff4cc'
544
+ }
545
+ }
546
+ };
547
+ };
548
+ return Demo;
549
+ }(Component);
550
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={this.get('content')}\n mermaidConfig={this.get('mermaidConfig')}\n />\n ";
551
+ _mount11 = mount(Demo), element = _mount11[1];
552
+ _context22.next = 7;
553
+ return waitFor(function () {
554
+ return !!element.querySelector('.mock-mermaid-config');
555
+ });
556
+ case 7:
557
+ ready = _context22.sent;
558
+ expect(ready).to.be.true;
559
+ expect(initialize.calledOnce).to.be.true;
560
+ expect(initialize.firstCall.args[0].startOnLoad).to.be.false;
561
+ expect(initialize.firstCall.args[0].securityLevel).to.eql('strict');
562
+ expect(initialize.firstCall.args[0].theme).to.eql('base');
563
+ expect(initialize.firstCall.args[0].themeVariables.primaryColor).to.eql('#fff4cc');
564
+ case 14:
565
+ case "end":
566
+ return _context22.stop();
567
+ }
568
+ }, _callee11);
569
+ })));
570
+ it('should rerender mermaid when mermaidConfig changes', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee12() {
571
+ var initialize, renderAsync, Demo, _mount12, instance, element, ready, rerendered;
572
+ return _regeneratorRuntime.wrap(function _callee12$(_context24) {
573
+ while (1) switch (_context24.prev = _context24.next) {
574
+ case 0:
575
+ initialize = sinon.stub(mermaid, 'initialize');
576
+ renderAsync = sinon.stub(mermaid, 'renderAsync').resolves('<svg class="mock-mermaid-update-config" viewBox="0 0 200 120"><text>diagram</text></svg>');
577
+ Demo = /*#__PURE__*/function (_Component12) {
578
+ _inheritsLoose(Demo, _Component12);
579
+ function Demo() {
580
+ var _context23;
581
+ var _this12;
582
+ for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {
583
+ args[_key12] = arguments[_key12];
584
+ }
585
+ _this12 = _Component12.call.apply(_Component12, _concatInstanceProperty(_context23 = [this]).call(_context23, args)) || this;
586
+ _this12.XMarkdown = XMarkdown;
587
+ return _this12;
588
+ }
589
+ Demo.defaults = function defaults() {
590
+ return {
591
+ content: '```mermaid\nflowchart TD\nA-->B\n```',
592
+ mermaidConfig: {
593
+ theme: 'base',
594
+ themeVariables: {
595
+ primaryColor: '#e8f3ff'
596
+ }
597
+ }
598
+ };
599
+ };
600
+ var _proto = Demo.prototype;
601
+ _proto.updateConfig = function updateConfig() {
602
+ this.set('mermaidConfig.themeVariables.primaryColor', '#fff4cc');
603
+ };
604
+ return Demo;
605
+ }(Component);
606
+ Demo.template = "\n const { XMarkdown } = this;\n <div>\n <XMarkdown\n content={this.get('content')}\n mermaidConfig={this.get('mermaidConfig')}\n />\n </div>\n ";
607
+ _mount12 = mount(Demo), instance = _mount12[0], element = _mount12[1];
608
+ _context24.next = 7;
609
+ return waitFor(function () {
610
+ return !!element.querySelector('.mock-mermaid-update-config');
611
+ });
612
+ case 7:
613
+ ready = _context24.sent;
614
+ expect(ready).to.be.true;
615
+ expect(initialize.callCount).to.eql(1);
616
+ expect(renderAsync.callCount).to.eql(1);
617
+ expect(initialize.firstCall.args[0].themeVariables.primaryColor).to.eql('#e8f3ff');
618
+ instance.updateConfig();
619
+ _context24.next = 15;
620
+ return waitFor(function () {
621
+ return initialize.callCount === 2 && renderAsync.callCount === 2;
622
+ }, 60, 20);
623
+ case 15:
624
+ rerendered = _context24.sent;
625
+ expect(rerendered).to.be.true;
626
+ expect(initialize.secondCall.args[0].themeVariables.primaryColor).to.eql('#fff4cc');
627
+ case 18:
628
+ case "end":
629
+ return _context24.stop();
630
+ }
631
+ }, _callee12);
632
+ })));
633
+ it('should generate different mermaid render ids for sibling markdown instances with same content', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee13() {
634
+ var _context26;
635
+ var renderAsync, Demo, _mount13, element, ready, renderIds, firstMatch;
636
+ return _regeneratorRuntime.wrap(function _callee13$(_context27) {
637
+ while (1) switch (_context27.prev = _context27.next) {
638
+ case 0:
639
+ sinon.stub(mermaid, 'initialize');
640
+ renderAsync = sinon.stub(mermaid, 'renderAsync').resolves('<svg class="mock-mermaid-duplicate" viewBox="0 0 200 120"><text>diagram</text></svg>');
641
+ Demo = /*#__PURE__*/function (_Component13) {
642
+ _inheritsLoose(Demo, _Component13);
643
+ function Demo() {
644
+ var _context25;
645
+ var _this13;
646
+ for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {
647
+ args[_key13] = arguments[_key13];
648
+ }
649
+ _this13 = _Component13.call.apply(_Component13, _concatInstanceProperty(_context25 = [this]).call(_context25, args)) || this;
650
+ _this13.XMarkdown = XMarkdown;
651
+ return _this13;
652
+ }
653
+ Demo.defaults = function defaults() {
654
+ return {
655
+ content: '```mermaid\nflowchart TD\nA-->B\n```'
656
+ };
657
+ };
658
+ return Demo;
659
+ }(Component);
660
+ Demo.template = "\n const { XMarkdown } = this;\n <div class=\"xmarkdown-mermaid-duplicate-demo\">\n <XMarkdown content={this.get('content')} />\n <XMarkdown content={this.get('content')} />\n </div>\n ";
661
+ _mount13 = mount(Demo), element = _mount13[1];
662
+ _context27.next = 7;
663
+ return waitFor(function () {
664
+ return element.querySelectorAll('.mock-mermaid-duplicate').length === 2;
665
+ });
666
+ case 7:
667
+ ready = _context27.sent;
668
+ expect(ready).to.be.true;
669
+ expect(renderAsync.callCount).to.eql(2);
670
+ renderIds = _mapInstanceProperty(_context26 = renderAsync.args).call(_context26, function (args) {
671
+ return args[0];
672
+ });
673
+ expect(renderIds[0]).to.not.eql(renderIds[1]);
674
+ firstMatch = /^kpc-xmarkdown-mermaid-([a-z0-9]+)-xmarkdown-block-0$/.exec(renderIds[0]);
675
+ expect(firstMatch).to.not.eql(null);
676
+ expect(renderIds[1]).to.eql("kpc-xmarkdown-mermaid-" + firstMatch[1] + "-1-xmarkdown-block-0");
677
+ case 15:
678
+ case "end":
679
+ return _context27.stop();
680
+ }
681
+ }, _callee13);
682
+ })));
683
+ it('should render complex mermaid demo content with lightweight stubbed output', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee14() {
684
+ var renderAsync, complexMermaidContent, Demo, _mount14, element, ready, block;
685
+ return _regeneratorRuntime.wrap(function _callee14$(_context29) {
686
+ while (1) switch (_context29.prev = _context29.next) {
687
+ case 0:
688
+ sinon.stub(mermaid, 'initialize');
689
+ renderAsync = sinon.stub(mermaid, 'renderAsync').resolves('<svg class="mock-mermaid-demo" viewBox="0 0 320 180"><text>demo</text></svg>');
690
+ complexMermaidContent = ['```mermaid', 'flowchart LR', ' A[需求输入] --> B{方案评审}', ' B -->|通过| C[组件设计]', ' B -->|补充信息| D[补充需求]', ' D --> B', '', ' C --> E[交互定义]', ' C --> F[渲染实现]', ' E --> G[边界校验]', ' F --> H[发版验证]', '', ' G --> H', '```'].join('\n');
691
+ Demo = /*#__PURE__*/function (_Component14) {
692
+ _inheritsLoose(Demo, _Component14);
693
+ function Demo() {
694
+ var _context28;
695
+ var _this14;
696
+ for (var _len14 = arguments.length, args = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) {
697
+ args[_key14] = arguments[_key14];
698
+ }
699
+ _this14 = _Component14.call.apply(_Component14, _concatInstanceProperty(_context28 = [this]).call(_context28, args)) || this;
700
+ _this14.XMarkdown = XMarkdown;
701
+ return _this14;
702
+ }
703
+ Demo.defaults = function defaults() {
704
+ return {
705
+ content: complexMermaidContent
706
+ };
707
+ };
708
+ return Demo;
709
+ }(Component);
710
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown content={this.get('content')} />\n ";
711
+ _mount14 = mount(Demo), element = _mount14[1];
712
+ _context29.next = 8;
713
+ return waitFor(function () {
714
+ return !!element.querySelector('.mock-mermaid-demo');
715
+ });
716
+ case 8:
717
+ ready = _context29.sent;
718
+ expect(ready).to.be.true;
719
+ block = element.querySelector('[data-kpc-mermaid="true"]');
720
+ expect(block.querySelector('.mock-mermaid-demo')).not.to.eql(null);
721
+ expect(renderAsync.calledOnce).to.be.true;
722
+ expect(renderAsync.firstCall.args[1]).to.contain('A[需求输入] --> B{方案评审}');
723
+ expect(renderAsync.firstCall.args[1]).to.contain('G --> H');
724
+ expect(block.querySelector('.k-xmarkdown-code-language').textContent).to.eql('Mermaid');
725
+ expect(block.querySelector('[data-kpc-action="copy-mermaid"]')).not.to.eql(null);
726
+ expect(block.querySelector('.k-xmarkdown-mermaid-source code').textContent).to.contain('组件设计');
727
+ case 18:
728
+ case "end":
729
+ return _context29.stop();
730
+ }
731
+ }, _callee14);
732
+ })));
733
+ it('should support typing and streaming completion', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee15() {
734
+ var Demo, _mount15, instance, element, hasTail, i, _i, rendered;
735
+ return _regeneratorRuntime.wrap(function _callee15$(_context31) {
736
+ while (1) switch (_context31.prev = _context31.next) {
737
+ case 0:
738
+ Demo = /*#__PURE__*/function (_Component15) {
739
+ _inheritsLoose(Demo, _Component15);
740
+ function Demo() {
741
+ var _context30;
742
+ var _this15;
743
+ for (var _len15 = arguments.length, args = new Array(_len15), _key15 = 0; _key15 < _len15; _key15++) {
744
+ args[_key15] = arguments[_key15];
745
+ }
746
+ _this15 = _Component15.call.apply(_Component15, _concatInstanceProperty(_context30 = [this]).call(_context30, args)) || this;
747
+ _this15.XMarkdown = XMarkdown;
748
+ return _this15;
749
+ }
750
+ Demo.defaults = function defaults() {
751
+ return {
752
+ content: '# 标题\n\n- alpha\n- beta',
753
+ streaming: true,
754
+ typingCount: 0,
755
+ completeCount: 0
756
+ };
757
+ };
758
+ return Demo;
759
+ }(Component);
760
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={this.get('content')}\n streaming={this.get('streaming')}\n typing={{interval: 16, step: 2}}\n ev-typing={() => this.set('typingCount', this.get('typingCount') + 1)}\n ev-typingComplete={() => this.set('completeCount', this.get('completeCount') + 1)}\n />\n ";
761
+ _mount15 = mount(Demo), instance = _mount15[0], element = _mount15[1];
762
+ hasTail = false;
763
+ i = 0;
764
+ case 5:
765
+ if (!(i < 10)) {
766
+ _context31.next = 14;
767
+ break;
768
+ }
769
+ _context31.next = 8;
770
+ return wait(20);
771
+ case 8:
772
+ hasTail = !!element.querySelector('[data-kpc-xmarkdown-tail="true"]');
773
+ if (!hasTail) {
774
+ _context31.next = 11;
775
+ break;
776
+ }
777
+ return _context31.abrupt("break", 14);
778
+ case 11:
779
+ i++;
780
+ _context31.next = 5;
781
+ break;
782
+ case 14:
783
+ expect(hasTail).to.be.true;
784
+ expect(instance.get('typingCount')).to.be.greaterThan(0);
785
+ expect(instance.get('completeCount')).to.eql(0);
786
+ instance.set('streaming', false);
787
+ _i = 0;
788
+ case 19:
789
+ if (!(_i < 20 && instance.get('completeCount') === 0)) {
790
+ _context31.next = 25;
791
+ break;
792
+ }
793
+ _context31.next = 22;
794
+ return wait(20);
795
+ case 22:
796
+ _i++;
797
+ _context31.next = 19;
798
+ break;
799
+ case 25:
800
+ _context31.next = 27;
801
+ return waitFor(function () {
802
+ return element.querySelectorAll('.k-xmarkdown-content li').length === 2;
803
+ });
804
+ case 27:
805
+ rendered = _context31.sent;
806
+ expect(instance.get('completeCount')).to.eql(1);
807
+ expect(rendered).to.be.true;
808
+ expect(element.querySelector('.k-xmarkdown-content h1')).not.to.eql(null);
809
+ expect(element.querySelector('.k-xmarkdown-content').textContent).to.contain('标题');
810
+ expect(element.querySelectorAll('.k-xmarkdown-content li').length).to.eql(2);
811
+ case 33:
812
+ case "end":
813
+ return _context31.stop();
814
+ }
815
+ }, _callee15);
816
+ })));
817
+ it('should split rendered content into stable and tail containers and reuse stable DOM on streaming updates', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee16() {
818
+ var Demo, _mount16, instance, element, ready, stableContainer, tailContainer, h1, paragraph, hasTail, sameH1, promoted;
819
+ return _regeneratorRuntime.wrap(function _callee16$(_context33) {
820
+ while (1) switch (_context33.prev = _context33.next) {
821
+ case 0:
822
+ Demo = /*#__PURE__*/function (_Component16) {
823
+ _inheritsLoose(Demo, _Component16);
824
+ function Demo() {
825
+ var _context32;
826
+ var _this16;
827
+ for (var _len16 = arguments.length, args = new Array(_len16), _key16 = 0; _key16 < _len16; _key16++) {
828
+ args[_key16] = arguments[_key16];
829
+ }
830
+ _this16 = _Component16.call.apply(_Component16, _concatInstanceProperty(_context32 = [this]).call(_context32, args)) || this;
831
+ _this16.XMarkdown = XMarkdown;
832
+ return _this16;
833
+ }
834
+ Demo.defaults = function defaults() {
835
+ return {
836
+ content: '# 标题\n\n一段稳定的话。\n\n',
837
+ streaming: true
838
+ };
839
+ };
840
+ return Demo;
841
+ }(Component);
842
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={this.get('content')}\n streaming={this.get('streaming')}\n />\n ";
843
+ _mount16 = mount(Demo), instance = _mount16[0], element = _mount16[1];
844
+ _context33.next = 5;
845
+ return waitFor(function () {
846
+ return !!element.querySelector('.k-xmarkdown-stable h1');
847
+ });
848
+ case 5:
849
+ ready = _context33.sent;
850
+ expect(ready).to.be.true;
851
+ stableContainer = element.querySelector('.k-xmarkdown-stable');
852
+ tailContainer = element.querySelector('.k-xmarkdown-tail');
853
+ expect(stableContainer).not.to.eql(null);
854
+ expect(tailContainer).not.to.eql(null);
855
+ expect(stableContainer.querySelector('h1')).not.to.eql(null);
856
+ expect(tailContainer.innerHTML).to.eql('');
857
+ h1 = stableContainer.querySelector('h1');
858
+ paragraph = stableContainer.querySelector('p');
859
+ h1.__kpcStableProbe = 'kept';
860
+ paragraph.__kpcStableParagraphProbe = 'kept';
861
+ instance.set('content', '# 标题\n\n一段稳定的话。\n\n# 新标题');
862
+ _context33.next = 20;
863
+ return waitFor(function () {
864
+ return !!tailContainer.querySelector('[data-kpc-xmarkdown-tail="true"]');
865
+ }, 30, 20);
866
+ case 20:
867
+ hasTail = _context33.sent;
868
+ expect(hasTail).to.be.true;
869
+ sameH1 = stableContainer.querySelector('h1');
870
+ expect(sameH1.__kpcStableProbe).to.eql('kept');
871
+ expect(tailContainer.querySelector('[data-kpc-xmarkdown-tail="true"]')).not.to.eql(null);
872
+ expect(stableContainer.querySelector('[data-kpc-xmarkdown-tail="true"]')).to.eql(null);
873
+ instance.set('content', '# 标题\n\n一段稳定的话。\n\n# 新标题\n\n第二段稳定的话。');
874
+ _context33.next = 29;
875
+ return waitFor(function () {
876
+ return !tailContainer.querySelector('[data-kpc-xmarkdown-tail="true"]') && stableContainer.querySelectorAll('h1').length === 2;
877
+ }, 30, 20);
878
+ case 29:
879
+ promoted = _context33.sent;
880
+ expect(promoted).to.be.true;
881
+ expect(stableContainer.querySelector('h1').__kpcStableProbe).to.eql('kept');
882
+ expect(stableContainer.querySelector('p').__kpcStableParagraphProbe).to.eql('kept');
883
+ case 33:
884
+ case "end":
885
+ return _context33.stop();
886
+ }
887
+ }, _callee16);
888
+ })));
889
+ it('should keep previous stable DOM across multiple append-only promotions', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee17() {
890
+ var Demo, _mount17, instance, element, ready, stableContainer, tailContainer, firstHeading, firstParagraph, firstTailReady, firstPromotionReady, secondHeading, secondParagraph, secondTailReady, secondPromotionReady;
891
+ return _regeneratorRuntime.wrap(function _callee17$(_context35) {
892
+ while (1) switch (_context35.prev = _context35.next) {
893
+ case 0:
894
+ Demo = /*#__PURE__*/function (_Component17) {
895
+ _inheritsLoose(Demo, _Component17);
896
+ function Demo() {
897
+ var _context34;
898
+ var _this17;
899
+ for (var _len17 = arguments.length, args = new Array(_len17), _key17 = 0; _key17 < _len17; _key17++) {
900
+ args[_key17] = arguments[_key17];
901
+ }
902
+ _this17 = _Component17.call.apply(_Component17, _concatInstanceProperty(_context34 = [this]).call(_context34, args)) || this;
903
+ _this17.XMarkdown = XMarkdown;
904
+ return _this17;
905
+ }
906
+ Demo.defaults = function defaults() {
907
+ return {
908
+ content: '# 标题\n\n第一段稳定内容。\n\n',
909
+ streaming: true
910
+ };
911
+ };
912
+ return Demo;
913
+ }(Component);
914
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={this.get('content')}\n streaming={this.get('streaming')}\n />\n ";
915
+ _mount17 = mount(Demo), instance = _mount17[0], element = _mount17[1];
916
+ _context35.next = 5;
917
+ return waitFor(function () {
918
+ return !!element.querySelector('.k-xmarkdown-stable h1');
919
+ });
920
+ case 5:
921
+ ready = _context35.sent;
922
+ expect(ready).to.be.true;
923
+ stableContainer = element.querySelector('.k-xmarkdown-stable');
924
+ tailContainer = element.querySelector('.k-xmarkdown-tail');
925
+ firstHeading = stableContainer.querySelector('h1');
926
+ firstParagraph = stableContainer.querySelector('p');
927
+ firstHeading.__kpcFirstStableHeading = 'kept';
928
+ firstParagraph.__kpcFirstStableParagraph = 'kept';
929
+ instance.set('content', '# 标题\n\n第一段稳定内容。\n\n# 第二个标题');
930
+ _context35.next = 16;
931
+ return waitFor(function () {
932
+ return !!tailContainer.querySelector('[data-kpc-xmarkdown-tail="true"]');
933
+ }, 30, 20);
934
+ case 16:
935
+ firstTailReady = _context35.sent;
936
+ expect(firstTailReady).to.be.true;
937
+ instance.set('content', '# 标题\n\n第一段稳定内容。\n\n# 第二个标题\n\n第二段稳定内容。\n\n');
938
+ _context35.next = 21;
939
+ return waitFor(function () {
940
+ return stableContainer.querySelectorAll('h1').length === 2;
941
+ }, 30, 20);
942
+ case 21:
943
+ firstPromotionReady = _context35.sent;
944
+ expect(firstPromotionReady).to.be.true;
945
+ expect(stableContainer.querySelector('h1').__kpcFirstStableHeading).to.eql('kept');
946
+ expect(stableContainer.querySelector('p').__kpcFirstStableParagraph).to.eql('kept');
947
+ secondHeading = stableContainer.querySelectorAll('h1')[1];
948
+ secondParagraph = stableContainer.querySelectorAll('p')[1];
949
+ secondHeading.__kpcSecondStableHeading = 'kept';
950
+ secondParagraph.__kpcSecondStableParagraph = 'kept';
951
+ instance.set('content', '# 标题\n\n第一段稳定内容。\n\n# 第二个标题\n\n第二段稳定内容。\n\n## 第三个标题');
952
+ _context35.next = 32;
953
+ return waitFor(function () {
954
+ return !!tailContainer.querySelector('[data-kpc-xmarkdown-tail="true"]');
955
+ }, 30, 20);
956
+ case 32:
957
+ secondTailReady = _context35.sent;
958
+ expect(secondTailReady).to.be.true;
959
+ instance.set('content', '# 标题\n\n第一段稳定内容。\n\n# 第二个标题\n\n第二段稳定内容。\n\n## 第三个标题\n\n第三段稳定内容。');
960
+ _context35.next = 37;
961
+ return waitFor(function () {
962
+ return stableContainer.querySelectorAll('h1').length === 2 && stableContainer.querySelectorAll('h2').length === 1;
963
+ }, 30, 20);
964
+ case 37:
965
+ secondPromotionReady = _context35.sent;
966
+ expect(secondPromotionReady).to.be.true;
967
+ expect(stableContainer.querySelector('h1').__kpcFirstStableHeading).to.eql('kept');
968
+ expect(stableContainer.querySelector('p').__kpcFirstStableParagraph).to.eql('kept');
969
+ expect(stableContainer.querySelectorAll('h1')[1].__kpcSecondStableHeading).to.eql('kept');
970
+ expect(stableContainer.querySelectorAll('p')[1].__kpcSecondStableParagraph).to.eql('kept');
971
+ case 43:
972
+ case "end":
973
+ return _context35.stop();
974
+ }
975
+ }, _callee17);
976
+ })));
977
+ it('should put unclosed block-level formula into tail container during streaming', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee18() {
978
+ var Demo, _mount18, instance, element, ready, stableContainer, tailContainer, formulaRendered;
979
+ return _regeneratorRuntime.wrap(function _callee18$(_context37) {
980
+ while (1) switch (_context37.prev = _context37.next) {
981
+ case 0:
982
+ Demo = /*#__PURE__*/function (_Component18) {
983
+ _inheritsLoose(Demo, _Component18);
984
+ function Demo() {
985
+ var _context36;
986
+ var _this18;
987
+ for (var _len18 = arguments.length, args = new Array(_len18), _key18 = 0; _key18 < _len18; _key18++) {
988
+ args[_key18] = arguments[_key18];
989
+ }
990
+ _this18 = _Component18.call.apply(_Component18, _concatInstanceProperty(_context36 = [this]).call(_context36, args)) || this;
991
+ _this18.XMarkdown = XMarkdown;
992
+ return _this18;
993
+ }
994
+ Demo.defaults = function defaults() {
995
+ return {
996
+ // $$ 后面没有闭合的 $$
997
+ content: '# 标题\n\n$$\n\\operatorname{score}(x)=\\sum_{i=1}^{n}',
998
+ streaming: true
999
+ };
1000
+ };
1001
+ return Demo;
1002
+ }(Component);
1003
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={this.get('content')}\n streaming={this.get('streaming')}\n />\n ";
1004
+ _mount18 = mount(Demo), instance = _mount18[0], element = _mount18[1];
1005
+ _context37.next = 5;
1006
+ return waitFor(function () {
1007
+ return !!element.querySelector('.k-xmarkdown-stable h1');
1008
+ });
1009
+ case 5:
1010
+ ready = _context37.sent;
1011
+ expect(ready).to.be.true;
1012
+ stableContainer = element.querySelector('.k-xmarkdown-stable');
1013
+ tailContainer = element.querySelector('.k-xmarkdown-tail'); // 标题应该在 stable 中
1014
+ expect(stableContainer.querySelector('h1')).not.to.eql(null);
1015
+ // 块级公式 $$ 应该在 tail 中(因为未闭合)
1016
+ expect(tailContainer.textContent).to.contain('$$');
1017
+ expect(tailContainer.querySelector('[data-kpc-xmarkdown-tail="true"]')).not.to.eql(null);
1018
+ // 闭合公式后,整个公式应该渲染在 stable 中
1019
+ instance.set('content', '# 标题\n\n$$\n\\operatorname{score}(x)=\\sum_{i=1}^{n}\n$$');
1020
+ _context37.next = 15;
1021
+ return waitFor(function () {
1022
+ var _tailContainer$textCo;
1023
+ // 公式闭合后,tail 应该为空或没有 $$
1024
+ return tailContainer.innerHTML === '' || !((_tailContainer$textCo = tailContainer.textContent) != null && _includesInstanceProperty(_tailContainer$textCo).call(_tailContainer$textCo, '$$'));
1025
+ }, 30, 20);
1026
+ case 15:
1027
+ formulaRendered = _context37.sent;
1028
+ expect(formulaRendered).to.be.true;
1029
+ case 17:
1030
+ case "end":
1031
+ return _context37.stop();
1032
+ }
1033
+ }, _callee18);
1034
+ })));
1035
+ it('should keep incomplete inline tokens in tail cache during streaming', function () {
1036
+ var cache = createStreamingTailCache();
1037
+ var result = splitMarkdownForStreaming('请看[文', cache);
1038
+ expect(result.stableSource).to.eql('请看');
1039
+ expect(result.tailText).to.eql('[文');
1040
+ result = splitMarkdownForStreaming('请看[文档](https://example.com)', cache);
1041
+ expect(result.stableSource).to.eql('请看[文档](https://example.com)');
1042
+ expect(result.tailText).to.eql('');
1043
+ result = splitMarkdownForStreaming('请看[文档](https://example.com)\n<notice-card tit', cache);
1044
+ expect(result.stableSource).to.eql('请看[文档](https://example.com)\n');
1045
+ expect(result.tailText).to.eql('<notice-card tit');
1046
+ });
1047
+ it('should render raw html when allowHtml and sanitizeOptions are enabled', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee19() {
1048
+ var Demo, _mount19, element, ready;
1049
+ return _regeneratorRuntime.wrap(function _callee19$(_context39) {
1050
+ while (1) switch (_context39.prev = _context39.next) {
1051
+ case 0:
1052
+ Demo = /*#__PURE__*/function (_Component19) {
1053
+ _inheritsLoose(Demo, _Component19);
1054
+ function Demo() {
1055
+ var _context38;
1056
+ var _this19;
1057
+ for (var _len19 = arguments.length, args = new Array(_len19), _key19 = 0; _key19 < _len19; _key19++) {
1058
+ args[_key19] = arguments[_key19];
1059
+ }
1060
+ _this19 = _Component19.call.apply(_Component19, _concatInstanceProperty(_context38 = [this]).call(_context38, args)) || this;
1061
+ _this19.XMarkdown = XMarkdown;
1062
+ return _this19;
1063
+ }
1064
+ Demo.defaults = function defaults() {
1065
+ return {
1066
+ content: ['<mark data-track="demo-mark">safe</mark>', '<notice-card title="发布建议">先补文档,再补单测。</notice-card>'].join('\n'),
1067
+ sanitizeOptions: {
1068
+ ADD_TAGS: ['notice-card'],
1069
+ ADD_ATTR: ['title', 'data-track']
1070
+ }
1071
+ };
1072
+ };
1073
+ return Demo;
1074
+ }(Component);
1075
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n allowHtml\n content={this.get('content')}\n sanitizeOptions={this.get('sanitizeOptions')}\n />\n ";
1076
+ _mount19 = mount(Demo), element = _mount19[1];
1077
+ _context39.next = 5;
1078
+ return waitFor(function () {
1079
+ return !!element.querySelector('notice-card');
1080
+ });
1081
+ case 5:
1082
+ ready = _context39.sent;
1083
+ expect(ready).to.be.true;
1084
+ expect(element.querySelector('mark').getAttribute('data-track')).to.eql('demo-mark');
1085
+ expect(element.querySelector('notice-card').getAttribute('title')).to.eql('发布建议');
1086
+ expect(element.querySelector('notice-card').textContent).to.contain('先补文档,再补单测。');
1087
+ case 10:
1088
+ case "end":
1089
+ return _context39.stop();
1090
+ }
1091
+ }, _callee19);
1092
+ })));
1093
+ it('should keep formula text when enableFormula is false', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee20() {
1094
+ var Demo, _mount20, element;
1095
+ return _regeneratorRuntime.wrap(function _callee20$(_context41) {
1096
+ while (1) switch (_context41.prev = _context41.next) {
1097
+ case 0:
1098
+ Demo = /*#__PURE__*/function (_Component20) {
1099
+ _inheritsLoose(Demo, _Component20);
1100
+ function Demo() {
1101
+ var _context40;
1102
+ var _this20;
1103
+ for (var _len20 = arguments.length, args = new Array(_len20), _key20 = 0; _key20 < _len20; _key20++) {
1104
+ args[_key20] = arguments[_key20];
1105
+ }
1106
+ _this20 = _Component20.call.apply(_Component20, _concatInstanceProperty(_context40 = [this]).call(_context40, args)) || this;
1107
+ _this20.XMarkdown = XMarkdown;
1108
+ return _this20;
1109
+ }
1110
+ return Demo;
1111
+ }(Component);
1112
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n enableFormula={false}\n content={'$E = mc^2$'}\n />\n ";
1113
+ _mount20 = mount(Demo), element = _mount20[1];
1114
+ _context41.next = 5;
1115
+ return wait(60);
1116
+ case 5:
1117
+ expect(element.querySelector('.katex')).to.eql(null);
1118
+ expect(element.querySelector('.k-xmarkdown-content').textContent).to.contain('$E = mc^2$');
1119
+ case 7:
1120
+ case "end":
1121
+ return _context41.stop();
1122
+ }
1123
+ }, _callee20);
1124
+ })));
1125
+ it('should support custom formulaDelimiters and formulaMacros', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee21() {
1126
+ var Demo, _mount21, element, ready;
1127
+ return _regeneratorRuntime.wrap(function _callee21$(_context43) {
1128
+ while (1) switch (_context43.prev = _context43.next) {
1129
+ case 0:
1130
+ Demo = /*#__PURE__*/function (_Component21) {
1131
+ _inheritsLoose(Demo, _Component21);
1132
+ function Demo() {
1133
+ var _context42;
1134
+ var _this21;
1135
+ for (var _len21 = arguments.length, args = new Array(_len21), _key21 = 0; _key21 < _len21; _key21++) {
1136
+ args[_key21] = arguments[_key21];
1137
+ }
1138
+ _this21 = _Component21.call.apply(_Component21, _concatInstanceProperty(_context42 = [this]).call(_context42, args)) || this;
1139
+ _this21.XMarkdown = XMarkdown;
1140
+ return _this21;
1141
+ }
1142
+ Demo.defaults = function defaults() {
1143
+ return {
1144
+ formulaMacros: {
1145
+ '\\\\RR': '\\\\mathbb{R}'
1146
+ }
1147
+ };
1148
+ };
1149
+ return Demo;
1150
+ }(Component);
1151
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={'\\\\[f: \\\\RR \\\\to \\\\RR\\\\]'}\n formulaDelimiters={'brackets'}\n formulaMacros={this.get('formulaMacros')}\n />\n ";
1152
+ _mount21 = mount(Demo), element = _mount21[1];
1153
+ _context43.next = 5;
1154
+ return waitFor(function () {
1155
+ return !!element.querySelector('.katex');
1156
+ }, 60, 20);
1157
+ case 5:
1158
+ ready = _context43.sent;
1159
+ expect(ready).to.be.true;
1160
+ expect(element.querySelector('.k-xmarkdown-content').textContent).not.to.contain('\\[');
1161
+ case 8:
1162
+ case "end":
1163
+ return _context43.stop();
1164
+ }
1165
+ }, _callee21);
1166
+ })));
1167
+ it('should support tagAttrs and tagRenderers for custom tags', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee22() {
1168
+ var _context45;
1169
+ var Demo, _mount22, element, ready, link;
1170
+ return _regeneratorRuntime.wrap(function _callee22$(_context46) {
1171
+ while (1) switch (_context46.prev = _context46.next) {
1172
+ case 0:
1173
+ Demo = /*#__PURE__*/function (_Component22) {
1174
+ _inheritsLoose(Demo, _Component22);
1175
+ function Demo() {
1176
+ var _context44;
1177
+ var _this22;
1178
+ for (var _len22 = arguments.length, args = new Array(_len22), _key22 = 0; _key22 < _len22; _key22++) {
1179
+ args[_key22] = arguments[_key22];
1180
+ }
1181
+ _this22 = _Component22.call.apply(_Component22, _concatInstanceProperty(_context44 = [this]).call(_context44, args)) || this;
1182
+ _this22.XMarkdown = XMarkdown;
1183
+ _this22.tagAttrs = {
1184
+ a: function a() {
1185
+ return {
1186
+ className: 'xmarkdown-enhanced-link',
1187
+ 'data-track': 'demo-link'
1188
+ };
1189
+ }
1190
+ };
1191
+ _this22.tagRenderers = {
1192
+ 'notice-card': function noticeCard(context) {
1193
+ return createVNode('section', {
1194
+ className: 'xmarkdown-custom-card'
1195
+ }, [createVNode('h4', {
1196
+ className: 'xmarkdown-custom-card-title'
1197
+ }, context.attrs.title || '提示'), createVNode('div', {
1198
+ className: 'xmarkdown-custom-card-body'
1199
+ }, context.textContent)]);
1200
+ },
1201
+ table: function table() {
1202
+ return createVNode('section', {
1203
+ className: 'xmarkdown-custom-table'
1204
+ }, 'custom table');
1205
+ }
1206
+ };
1207
+ return _this22;
1208
+ }
1209
+ Demo.defaults = function defaults() {
1210
+ return {
1211
+ content: ['# 标签增强示例', '', '<notice-card title="发布建议">先补 Demo,再补单测。</notice-card>', '', '| 阶段 | 状态 |', '| --- | --- |', '| 联调 | 进行中 |', '', '更多信息请查看 [文档](https://example.com)。'].join('\n'),
1212
+ sanitizeOptions: {
1213
+ ADD_TAGS: ['notice-card'],
1214
+ ADD_ATTR: ['title']
1215
+ }
1216
+ };
1217
+ };
1218
+ return Demo;
1219
+ }(Component);
1220
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n allowHtml\n content={this.get('content')}\n sanitizeOptions={this.get('sanitizeOptions')}\n tagAttrs={this.tagAttrs}\n tagRenderers={this.tagRenderers}\n />\n ";
1221
+ _mount22 = mount(Demo), element = _mount22[1];
1222
+ _context46.next = 5;
1223
+ return waitFor(function () {
1224
+ return !!element.querySelector('.xmarkdown-custom-card');
1225
+ });
1226
+ case 5:
1227
+ ready = _context46.sent;
1228
+ expect(ready).to.be.true;
1229
+ expect(element.querySelector('notice-card')).to.eql(null);
1230
+ expect(element.querySelector('table')).to.eql(null);
1231
+ expect(element.querySelector('.xmarkdown-custom-card-title').textContent).to.eql('发布建议');
1232
+ expect(element.querySelector('.xmarkdown-custom-card-body').textContent).to.contain('先补 Demo,再补单测。');
1233
+ expect(element.querySelector('.xmarkdown-custom-table').textContent).to.contain('custom table');
1234
+ expect(_mapInstanceProperty(_context45 = _Array$from(element.querySelector('.k-xmarkdown-stable').children)).call(_context45, function (item) {
1235
+ return item.tagName.toLowerCase();
1236
+ })).to.eql(['h1', 'section', 'div', 'p']);
1237
+ expect(element.querySelector('.k-xmarkdown-stable p:empty')).to.eql(null);
1238
+ link = element.querySelector('.xmarkdown-enhanced-link');
1239
+ expect(link.getAttribute('data-track')).to.eql('demo-link');
1240
+ expect(link.getAttribute('target')).to.eql('_blank');
1241
+ expect(link.getAttribute('rel')).to.eql('noopener noreferrer');
1242
+ case 18:
1243
+ case "end":
1244
+ return _context46.stop();
1245
+ }
1246
+ }, _callee22);
1247
+ })));
1248
+ it('should support codeBlockRenderers for code blocks and mermaid blocks', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee23() {
1249
+ var initialize, renderAsync, codeContexts, mermaidContexts, Demo, _mount23, element, ready;
1250
+ return _regeneratorRuntime.wrap(function _callee23$(_context48) {
1251
+ while (1) switch (_context48.prev = _context48.next) {
1252
+ case 0:
1253
+ initialize = sinon.stub(mermaid, 'initialize');
1254
+ renderAsync = sinon.stub(mermaid, 'renderAsync');
1255
+ codeContexts = [];
1256
+ mermaidContexts = [];
1257
+ Demo = /*#__PURE__*/function (_Component23) {
1258
+ _inheritsLoose(Demo, _Component23);
1259
+ function Demo() {
1260
+ var _context47;
1261
+ var _this23;
1262
+ for (var _len23 = arguments.length, args = new Array(_len23), _key23 = 0; _key23 < _len23; _key23++) {
1263
+ args[_key23] = arguments[_key23];
1264
+ }
1265
+ _this23 = _Component23.call.apply(_Component23, _concatInstanceProperty(_context47 = [this]).call(_context47, args)) || this;
1266
+ _this23.XMarkdown = XMarkdown;
1267
+ _this23.codeBlockRenderers = {
1268
+ ts: function ts(context) {
1269
+ codeContexts.push(context);
1270
+ return createVNode('section', {
1271
+ className: 'xmarkdown-custom-code-block'
1272
+ }, [createVNode('span', {
1273
+ className: 'xmarkdown-custom-code-title'
1274
+ }, context.blockType + ":" + context.language), createVNode('pre', {
1275
+ className: 'xmarkdown-custom-code-body'
1276
+ }, context.source)]);
1277
+ },
1278
+ mermaid: function mermaid(context) {
1279
+ mermaidContexts.push(context);
1280
+ return createVNode('section', {
1281
+ className: 'xmarkdown-custom-mermaid-block'
1282
+ }, [createVNode('h4', {
1283
+ className: 'xmarkdown-custom-mermaid-title'
1284
+ }, 'custom mermaid'), createVNode('code', {
1285
+ className: 'xmarkdown-custom-mermaid-body'
1286
+ }, context.source)]);
1287
+ }
1288
+ };
1289
+ return _this23;
1290
+ }
1291
+ Demo.defaults = function defaults() {
1292
+ return {
1293
+ content: ['```ts', 'const value: number = 1;', '```', '', '```mermaid', 'flowchart TD', 'A-->B', '```'].join('\n')
1294
+ };
1295
+ };
1296
+ return Demo;
1297
+ }(Component);
1298
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={this.get('content')}\n codeBlockRenderers={this.codeBlockRenderers}\n />\n ";
1299
+ _mount23 = mount(Demo), element = _mount23[1];
1300
+ _context48.next = 9;
1301
+ return waitFor(function () {
1302
+ return !!element.querySelector('.xmarkdown-custom-code-block') && !!element.querySelector('.xmarkdown-custom-mermaid-block');
1303
+ });
1304
+ case 9:
1305
+ ready = _context48.sent;
1306
+ expect(ready).to.be.true;
1307
+ expect(initialize.called).to.be.false;
1308
+ expect(renderAsync.called).to.be.false;
1309
+ expect(codeContexts[0].language).to.eql('ts');
1310
+ expect(codeContexts[0].normalizedLanguage).to.eql('typescript');
1311
+ expect(codeContexts[0].blockType).to.eql('code');
1312
+ expect(mermaidContexts[0].language).to.eql('mermaid');
1313
+ expect(mermaidContexts[0].blockType).to.eql('mermaid');
1314
+ expect(element.querySelector('[data-kpc-mermaid="true"]')).to.eql(null);
1315
+ expect(element.querySelector('.k-xmarkdown-code-toolbar')).to.eql(null);
1316
+ case 20:
1317
+ case "end":
1318
+ return _context48.stop();
1319
+ }
1320
+ }, _callee23);
1321
+ })));
1322
+ it('should refresh renderer when codeBlockRenderers change', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee24() {
1323
+ var Demo, _mount24, instance, element, initialReady, refreshed;
1324
+ return _regeneratorRuntime.wrap(function _callee24$(_context50) {
1325
+ while (1) switch (_context50.prev = _context50.next) {
1326
+ case 0:
1327
+ Demo = /*#__PURE__*/function (_Component24) {
1328
+ _inheritsLoose(Demo, _Component24);
1329
+ function Demo() {
1330
+ var _context49;
1331
+ var _this24;
1332
+ for (var _len24 = arguments.length, args = new Array(_len24), _key24 = 0; _key24 < _len24; _key24++) {
1333
+ args[_key24] = arguments[_key24];
1334
+ }
1335
+ _this24 = _Component24.call.apply(_Component24, _concatInstanceProperty(_context49 = [this]).call(_context49, args)) || this;
1336
+ _this24.XMarkdown = XMarkdown;
1337
+ return _this24;
1338
+ }
1339
+ Demo.defaults = function defaults() {
1340
+ return {
1341
+ content: '```ts\nconst value = 1;\n```',
1342
+ codeBlockRenderers: undefined
1343
+ };
1344
+ };
1345
+ return Demo;
1346
+ }(Component);
1347
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={this.get('content')}\n codeBlockRenderers={this.get('codeBlockRenderers')}\n />\n ";
1348
+ _mount24 = mount(Demo), instance = _mount24[0], element = _mount24[1];
1349
+ _context50.next = 5;
1350
+ return waitFor(function () {
1351
+ return !!element.querySelector('.k-xmarkdown-code-toolbar');
1352
+ });
1353
+ case 5:
1354
+ initialReady = _context50.sent;
1355
+ expect(initialReady).to.be.true;
1356
+ expect(element.querySelector('.xmarkdown-refresh-code-block')).to.eql(null);
1357
+ instance.set('codeBlockRenderers', {
1358
+ ts: function ts(context) {
1359
+ return createVNode('section', {
1360
+ className: 'xmarkdown-refresh-code-block'
1361
+ }, context.source);
1362
+ }
1363
+ });
1364
+ _context50.next = 11;
1365
+ return waitFor(function () {
1366
+ return !!element.querySelector('.xmarkdown-refresh-code-block');
1367
+ });
1368
+ case 11:
1369
+ refreshed = _context50.sent;
1370
+ expect(refreshed).to.be.true;
1371
+ expect(element.querySelector('.k-xmarkdown-code-toolbar')).to.eql(null);
1372
+ case 14:
1373
+ case "end":
1374
+ return _context50.stop();
1375
+ }
1376
+ }, _callee24);
1377
+ })));
1378
+ it('should support plugins for markdown extension and render tree transform', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee25() {
1379
+ var Demo, _mount25, element, ready;
1380
+ return _regeneratorRuntime.wrap(function _callee25$(_context52) {
1381
+ while (1) switch (_context52.prev = _context52.next) {
1382
+ case 0:
1383
+ Demo = /*#__PURE__*/function (_Component25) {
1384
+ _inheritsLoose(Demo, _Component25);
1385
+ function Demo() {
1386
+ var _context51;
1387
+ var _this25;
1388
+ for (var _len25 = arguments.length, args = new Array(_len25), _key25 = 0; _key25 < _len25; _key25++) {
1389
+ args[_key25] = arguments[_key25];
1390
+ }
1391
+ _this25 = _Component25.call.apply(_Component25, _concatInstanceProperty(_context51 = [this]).call(_context51, args)) || this;
1392
+ _this25.XMarkdown = XMarkdown;
1393
+ _this25.plugins = [{
1394
+ extendMarkdown: function extendMarkdown(markdown) {
1395
+ markdown.core.ruler.push('xmarkdown-heading-plugin', function (state) {
1396
+ state.tokens.forEach(function (token) {
1397
+ if (token.type === 'heading_open') {
1398
+ token.attrPush(['data-plugin-source', 'markdown-it']);
1399
+ }
1400
+ });
1401
+ });
1402
+ }
1403
+ }, {
1404
+ transformRenderTree: function transformRenderTree(nodes) {
1405
+ return _mapInstanceProperty(nodes).call(nodes, function (node) {
1406
+ if (node.type !== 'element' || node.tag !== 'blockquote') {
1407
+ return node;
1408
+ }
1409
+ return _extends({}, node, {
1410
+ attrs: _extends({}, node.attrs, {
1411
+ 'data-plugin-transform': 'render-tree'
1412
+ })
1413
+ });
1414
+ });
1415
+ }
1416
+ }];
1417
+ return _this25;
1418
+ }
1419
+ Demo.defaults = function defaults() {
1420
+ return {
1421
+ content: ['# 插件标题', '', '> 插件引用'].join('\n')
1422
+ };
1423
+ };
1424
+ return Demo;
1425
+ }(Component);
1426
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={this.get('content')}\n plugins={this.plugins}\n />\n ";
1427
+ _mount25 = mount(Demo), element = _mount25[1];
1428
+ _context52.next = 5;
1429
+ return waitFor(function () {
1430
+ return !!element.querySelector('.k-xmarkdown-content blockquote');
1431
+ });
1432
+ case 5:
1433
+ ready = _context52.sent;
1434
+ expect(ready).to.be.true;
1435
+ expect(element.querySelector('h1').getAttribute('data-plugin-source')).to.eql('markdown-it');
1436
+ expect(element.querySelector('blockquote').getAttribute('data-plugin-transform')).to.eql('render-tree');
1437
+ case 9:
1438
+ case "end":
1439
+ return _context52.stop();
1440
+ }
1441
+ }, _callee25);
1442
+ })));
1443
+ it('should refresh renderer when plugins change', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee26() {
1444
+ var Demo, _mount26, instance, element, initialReady, refreshed;
1445
+ return _regeneratorRuntime.wrap(function _callee26$(_context54) {
1446
+ while (1) switch (_context54.prev = _context54.next) {
1447
+ case 0:
1448
+ Demo = /*#__PURE__*/function (_Component26) {
1449
+ _inheritsLoose(Demo, _Component26);
1450
+ function Demo() {
1451
+ var _context53;
1452
+ var _this26;
1453
+ for (var _len26 = arguments.length, args = new Array(_len26), _key26 = 0; _key26 < _len26; _key26++) {
1454
+ args[_key26] = arguments[_key26];
1455
+ }
1456
+ _this26 = _Component26.call.apply(_Component26, _concatInstanceProperty(_context53 = [this]).call(_context53, args)) || this;
1457
+ _this26.XMarkdown = XMarkdown;
1458
+ return _this26;
1459
+ }
1460
+ Demo.defaults = function defaults() {
1461
+ return {
1462
+ plugins: []
1463
+ };
1464
+ };
1465
+ return Demo;
1466
+ }(Component);
1467
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={'# \u63D2\u4EF6\u5237\u65B0'}\n plugins={this.get('plugins')}\n />\n ";
1468
+ _mount26 = mount(Demo), instance = _mount26[0], element = _mount26[1];
1469
+ _context54.next = 5;
1470
+ return waitFor(function () {
1471
+ return !!element.querySelector('h1');
1472
+ });
1473
+ case 5:
1474
+ initialReady = _context54.sent;
1475
+ expect(initialReady).to.be.true;
1476
+ expect(element.querySelector('h1').getAttribute('data-refresh-plugin')).to.eql(null);
1477
+ instance.set('plugins', [{
1478
+ extendMarkdown: function extendMarkdown(markdown) {
1479
+ markdown.core.ruler.push('xmarkdown-refresh-plugin', function (state) {
1480
+ state.tokens.forEach(function (token) {
1481
+ if (token.type === 'heading_open') {
1482
+ token.attrPush(['data-refresh-plugin', 'updated']);
1483
+ }
1484
+ });
1485
+ });
1486
+ }
1487
+ }]);
1488
+ _context54.next = 11;
1489
+ return waitFor(function () {
1490
+ return element.querySelector('h1').getAttribute('data-refresh-plugin') === 'updated';
1491
+ });
1492
+ case 11:
1493
+ refreshed = _context54.sent;
1494
+ expect(refreshed).to.be.true;
1495
+ case 13:
1496
+ case "end":
1497
+ return _context54.stop();
1498
+ }
1499
+ }, _callee26);
1500
+ })));
1501
+ it('should support plugins transforming citation markers from business data', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee27() {
1502
+ var citations, Demo, transformCitationNodes, splitCitationText, _mount27, element, ready;
1503
+ return _regeneratorRuntime.wrap(function _callee27$(_context57) {
1504
+ while (1) switch (_context57.prev = _context57.next) {
1505
+ case 0:
1506
+ splitCitationText = function _splitCitationText(text) {
1507
+ var nextNodes = [];
1508
+ var pattern = /\[(\d+)\]/g;
1509
+ var lastIndex = 0;
1510
+ var match;
1511
+ while (match = pattern.exec(text)) {
1512
+ var index = Number(match[1]);
1513
+ var citation = citations[index - 1];
1514
+ if (match.index > lastIndex) {
1515
+ nextNodes.push({
1516
+ type: 'text',
1517
+ content: _sliceInstanceProperty(text).call(text, lastIndex, match.index)
1518
+ });
1519
+ }
1520
+ nextNodes.push(citation ? {
1521
+ type: 'element',
1522
+ tag: 'a',
1523
+ attrs: {
1524
+ href: citation.link,
1525
+ 'data-citation-index': String(index)
1526
+ },
1527
+ children: [{
1528
+ type: 'text',
1529
+ content: String(index)
1530
+ }]
1531
+ } : {
1532
+ type: 'text',
1533
+ content: match[0]
1534
+ });
1535
+ lastIndex = match.index + match[0].length;
1536
+ }
1537
+ if (!nextNodes.length) {
1538
+ return [{
1539
+ type: 'text',
1540
+ content: text
1541
+ }];
1542
+ }
1543
+ if (lastIndex < text.length) {
1544
+ nextNodes.push({
1545
+ type: 'text',
1546
+ content: _sliceInstanceProperty(text).call(text, lastIndex)
1547
+ });
1548
+ }
1549
+ return nextNodes;
1550
+ };
1551
+ transformCitationNodes = function _transformCitationNod(nodes, appendSection) {
1552
+ var _context56;
1553
+ if (appendSection === void 0) {
1554
+ appendSection = false;
1555
+ }
1556
+ var nextNodes = [];
1557
+ nodes.forEach(function (node) {
1558
+ if (node.type === 'text') {
1559
+ nextNodes.push.apply(nextNodes, splitCitationText(node.content));
1560
+ return;
1561
+ }
1562
+ if (node.type !== 'element') {
1563
+ nextNodes.push(node);
1564
+ return;
1565
+ }
1566
+ nextNodes.push(_extends({}, node, {
1567
+ children: transformCitationNodes(node.children)
1568
+ }));
1569
+ });
1570
+ if (!appendSection || !citations.length) return nextNodes;
1571
+ return _concatInstanceProperty(_context56 = []).call(_context56, nextNodes, [{
1572
+ type: 'element',
1573
+ tag: 'section',
1574
+ attrs: {
1575
+ 'data-citation-section': 'true'
1576
+ },
1577
+ children: [{
1578
+ type: 'text',
1579
+ content: "Sources: " + citations.length
1580
+ }]
1581
+ }]);
1582
+ };
1583
+ citations = [{
1584
+ title: '引用来源一',
1585
+ link: 'https://example.com/source-1'
1586
+ }];
1587
+ Demo = /*#__PURE__*/function (_Component27) {
1588
+ _inheritsLoose(Demo, _Component27);
1589
+ function Demo() {
1590
+ var _context55;
1591
+ var _this27;
1592
+ for (var _len27 = arguments.length, args = new Array(_len27), _key27 = 0; _key27 < _len27; _key27++) {
1593
+ args[_key27] = arguments[_key27];
1594
+ }
1595
+ _this27 = _Component27.call.apply(_Component27, _concatInstanceProperty(_context55 = [this]).call(_context55, args)) || this;
1596
+ _this27.XMarkdown = XMarkdown;
1597
+ _this27.plugins = [{
1598
+ transformRenderTree: function transformRenderTree(nodes) {
1599
+ return transformCitationNodes(nodes, true);
1600
+ }
1601
+ }];
1602
+ return _this27;
1603
+ }
1604
+ return Demo;
1605
+ }(Component);
1606
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={'\u6B63\u6587\u5F15\u7528[1][2]'}\n plugins={this.plugins}\n />\n ";
1607
+ _mount27 = mount(Demo), element = _mount27[1];
1608
+ _context57.next = 8;
1609
+ return waitFor(function () {
1610
+ return !!element.querySelector('[data-citation-index="1"]');
1611
+ });
1612
+ case 8:
1613
+ ready = _context57.sent;
1614
+ expect(ready).to.be.true;
1615
+ expect(element.querySelectorAll('[data-citation-index]').length).to.eql(1);
1616
+ expect(element.querySelector('[data-citation-index="1"]').getAttribute('href')).to.eql('https://example.com/source-1');
1617
+ expect(element.querySelector('.k-xmarkdown-content').textContent).to.contain('[2]');
1618
+ expect(element.querySelector('[data-citation-section="true"]').textContent).to.contain('Sources: 1');
1619
+ case 14:
1620
+ case "end":
1621
+ return _context57.stop();
1622
+ }
1623
+ }, _callee27);
1624
+ })));
1625
+ it('should avoid duplicate markdown rendering during initial mount', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee28() {
1626
+ var transformRenderTree, Demo, _mount28, element, ready;
1627
+ return _regeneratorRuntime.wrap(function _callee28$(_context59) {
1628
+ while (1) switch (_context59.prev = _context59.next) {
1629
+ case 0:
1630
+ transformRenderTree = sinon.spy(function (nodes) {
1631
+ return nodes;
1632
+ });
1633
+ Demo = /*#__PURE__*/function (_Component28) {
1634
+ _inheritsLoose(Demo, _Component28);
1635
+ function Demo() {
1636
+ var _context58;
1637
+ var _this28;
1638
+ for (var _len28 = arguments.length, args = new Array(_len28), _key28 = 0; _key28 < _len28; _key28++) {
1639
+ args[_key28] = arguments[_key28];
1640
+ }
1641
+ _this28 = _Component28.call.apply(_Component28, _concatInstanceProperty(_context58 = [this]).call(_context58, args)) || this;
1642
+ _this28.XMarkdown = XMarkdown;
1643
+ _this28.plugins = [{
1644
+ transformRenderTree: transformRenderTree
1645
+ }];
1646
+ return _this28;
1647
+ }
1648
+ return Demo;
1649
+ }(Component);
1650
+ Demo.template = "\n const { XMarkdown } = this;\n <XMarkdown\n content={'# \u521D\u59CB\u5316\u6E32\u67D3'}\n plugins={this.plugins}\n />\n ";
1651
+ _mount28 = mount(Demo), element = _mount28[1];
1652
+ _context59.next = 6;
1653
+ return waitFor(function () {
1654
+ return !!element.querySelector('h1');
1655
+ });
1656
+ case 6:
1657
+ ready = _context59.sent;
1658
+ expect(ready).to.be.true;
1659
+ expect(transformRenderTree.callCount).to.eql(1);
1660
+ case 9:
1661
+ case "end":
1662
+ return _context59.stop();
1663
+ }
1664
+ }, _callee28);
1665
+ })));
1666
+ });