@ant-design/agentic-ui 2.16.0 → 2.17.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 (56) hide show
  1. package/dist/MarkdownEditor/editor/elements/Code.js +11 -6
  2. package/dist/MarkdownEditor/editor/elements/Image/index.js +17 -5
  3. package/dist/MarkdownEditor/editor/elements/Media.js +61 -9
  4. package/dist/MarkdownEditor/editor/elements/Table/ReadonlyTableComponent.js +15 -3
  5. package/dist/MarkdownEditor/editor/elements/Table/SimpleTable.js +17 -2
  6. package/dist/MarkdownEditor/editor/elements/Table/Table.js +131 -5
  7. package/dist/MarkdownEditor/editor/parser/parserMarkdownToSlateNode.d.ts +100 -1
  8. package/dist/MarkdownEditor/editor/parser/parserMarkdownToSlateNode.js +945 -284
  9. package/dist/MarkdownEditor/editor/style.js +5 -0
  10. package/dist/MarkdownEditor/editor/types/Table.d.ts +1 -0
  11. package/dist/MarkdownEditor/editor/utils/findMatchingClose.d.ts +36 -0
  12. package/dist/MarkdownEditor/editor/utils/findMatchingClose.js +158 -0
  13. package/dist/MarkdownEditor/editor/utils/markdownToHtml.d.ts +41 -2
  14. package/dist/MarkdownEditor/editor/utils/markdownToHtml.js +159 -7
  15. package/dist/Plugins/chart/AreaChart/index.d.ts +12 -0
  16. package/dist/Plugins/chart/AreaChart/index.js +14 -188
  17. package/dist/Plugins/chart/BarChart/index.d.ts +2 -0
  18. package/dist/Plugins/chart/BarChart/index.js +3 -12
  19. package/dist/Plugins/chart/ChartMark/Container.js +5 -2
  20. package/dist/Plugins/chart/ChartRender.d.ts +1 -0
  21. package/dist/Plugins/chart/ChartRender.js +104 -43
  22. package/dist/Plugins/chart/DonutChart/index.js +4 -2
  23. package/dist/Plugins/chart/DonutChart/types.d.ts +2 -0
  24. package/dist/Plugins/chart/FunnelChart/index.d.ts +2 -0
  25. package/dist/Plugins/chart/FunnelChart/index.js +4 -2
  26. package/dist/Plugins/chart/LineChart/index.d.ts +2 -0
  27. package/dist/Plugins/chart/LineChart/index.js +17 -162
  28. package/dist/Plugins/chart/RadarChart/index.d.ts +2 -0
  29. package/dist/Plugins/chart/RadarChart/index.js +8 -4
  30. package/dist/Plugins/chart/ScatterChart/index.d.ts +2 -0
  31. package/dist/Plugins/chart/ScatterChart/index.js +8 -4
  32. package/dist/Plugins/chart/components/ChartContainer/ChartContainer.d.ts +1 -0
  33. package/dist/Plugins/chart/components/ChartFilter/ChartFilter.d.ts +1 -1
  34. package/dist/Plugins/chart/components/ChartFilter/ChartFilter.js +210 -16
  35. package/dist/Plugins/chart/components/ChartToolBar/ChartToolBar.d.ts +2 -0
  36. package/dist/Plugins/chart/components/ChartToolBar/ChartToolBar.js +9 -2
  37. package/dist/Plugins/chart/components/ChartToolBar/style.js +3 -1
  38. package/dist/Plugins/chart/hooks/index.d.ts +10 -0
  39. package/dist/Plugins/chart/hooks/index.js +8 -0
  40. package/dist/Plugins/chart/hooks/useChartDataFilter.d.ts +46 -0
  41. package/dist/Plugins/chart/hooks/useChartDataFilter.js +182 -0
  42. package/dist/Plugins/chart/hooks/useChartStatistics.d.ts +17 -0
  43. package/dist/Plugins/chart/hooks/useChartStatistics.js +25 -0
  44. package/dist/Plugins/chart/hooks/useChartTheme.d.ts +20 -0
  45. package/dist/Plugins/chart/hooks/useChartTheme.js +30 -0
  46. package/dist/Plugins/chart/hooks/useResponsiveSize.d.ts +23 -0
  47. package/dist/Plugins/chart/hooks/useResponsiveSize.js +94 -0
  48. package/dist/Plugins/chart/index.js +92 -8
  49. package/dist/Plugins/chart/utils/registerChart.d.ts +35 -0
  50. package/dist/Plugins/chart/utils/registerChart.js +54 -0
  51. package/dist/Plugins/chart/utils.d.ts +19 -0
  52. package/dist/Plugins/chart/utils.js +27 -0
  53. package/dist/Plugins/code/components/CodeRenderer.js +53 -2
  54. package/dist/Plugins/code/components/CodeToolbar.js +22 -3
  55. package/dist/Plugins/mermaid/Mermaid.js +66 -66
  56. package/package.json +1 -1
@@ -402,6 +402,11 @@ var genStyle = function(token) {
402
402
  backgroundColor: 'var(--color-gray-control-fill-secondary)'
403
403
  }
404
404
  },
405
+ '[data-be="media-container"], [data-be="image-container"]': {
406
+ display: 'flex',
407
+ minWidth: 0,
408
+ maxWidth: '100%'
409
+ },
405
410
  '@media screen and (max-width: 600px)': {
406
411
  h1: {
407
412
  fontSize: '1.5em'
@@ -10,6 +10,7 @@ export interface TableNode {
10
10
  rowSpan: number;
11
11
  colSpan: number;
12
12
  }>;
13
+ finish?: boolean;
13
14
  config?: any;
14
15
  columns?: Array<any>;
15
16
  };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 查找匹配的闭合标记
3
+ *
4
+ * 用于流式解析代码块(特别是 Mermaid 代码块)时,判断代码块是否完整。
5
+ * 通过查找匹配的闭合标记来确定代码块是否已经完成输入。
6
+ *
7
+ * @param src - 源字符串
8
+ * @param startIdx - 开始搜索的索引位置
9
+ * @param open - 开始标记(如 "```", "$$", "(" 等)
10
+ * @param close - 结束标记(如 "```", "$$", ")" 等)
11
+ * @returns 匹配的闭合标记的索引位置,如果未找到则返回 -1
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // 查找代码块的闭合标记
16
+ * const code = "```javascript\nconsole.log('hello');\n```";
17
+ * const closeIdx = findMatchingClose(code, 0, "```", "```");
18
+ * // 返回: 42 (第二个 ``` 的位置)
19
+ *
20
+ * // 查找数学公式的闭合标记
21
+ * const math = "$$\\sum_{i=1}^{n} x_i$$";
22
+ * const closeIdx = findMatchingClose(math, 0, "$$", "$$");
23
+ * // 返回: 最后一个 $ 的位置
24
+ * ```
25
+ */
26
+ export declare function findMatchingClose(src: string, startIdx: number, open: string, close: string): number;
27
+ /**
28
+ * 检查代码块是否完整(基于代码内容)
29
+ * 用于流式输入时判断代码块是否已经完成
30
+ *
31
+ * @param code - 代码内容
32
+ * @param language - 代码语言(如 'mermaid', 'javascript' 等)
33
+ * @returns 是否可能完整
34
+ */
35
+ export declare function isCodeBlockLikelyComplete(code: string, language?: string): boolean;
36
+ export default findMatchingClose;
@@ -0,0 +1,158 @@
1
+ /**
2
+ * 查找匹配的闭合标记
3
+ *
4
+ * 用于流式解析代码块(特别是 Mermaid 代码块)时,判断代码块是否完整。
5
+ * 通过查找匹配的闭合标记来确定代码块是否已经完成输入。
6
+ *
7
+ * @param src - 源字符串
8
+ * @param startIdx - 开始搜索的索引位置
9
+ * @param open - 开始标记(如 "```", "$$", "(" 等)
10
+ * @param close - 结束标记(如 "```", "$$", ")" 等)
11
+ * @returns 匹配的闭合标记的索引位置,如果未找到则返回 -1
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // 查找代码块的闭合标记
16
+ * const code = "```javascript\nconsole.log('hello');\n```";
17
+ * const closeIdx = findMatchingClose(code, 0, "```", "```");
18
+ * // 返回: 42 (第二个 ``` 的位置)
19
+ *
20
+ * // 查找数学公式的闭合标记
21
+ * const math = "$$\\sum_{i=1}^{n} x_i$$";
22
+ * const closeIdx = findMatchingClose(math, 0, "$$", "$$");
23
+ * // 返回: 最后一个 $ 的位置
24
+ * ```
25
+ */ export function findMatchingClose(src, startIdx, open, close) {
26
+ var len = src.length;
27
+ // 特殊处理 $$ 因为它是两个字符的分隔符,不应该被解释为嵌套的括号
28
+ if (open === '$$' && close === '$$') {
29
+ var i = startIdx;
30
+ while(i < len - 1){
31
+ if (src[i] === '$' && src[i + 1] === '$') {
32
+ // 确保没有被转义
33
+ var k = i - 1;
34
+ var backslashes = 0;
35
+ while(k >= 0 && src[k] === '\\'){
36
+ backslashes++;
37
+ k--;
38
+ }
39
+ // 如果反斜杠数量是偶数,说明没有被转义
40
+ if (backslashes % 2 === 0) return i;
41
+ }
42
+ i++;
43
+ }
44
+ return -1;
45
+ }
46
+ var openChar = open[open.length - 1];
47
+ var closeSeq = close;
48
+ var depth = 0;
49
+ var i1 = startIdx;
50
+ while(i1 < len){
51
+ // 如果这里有一个未转义的闭合序列
52
+ if (src.slice(i1, i1 + closeSeq.length) === closeSeq) {
53
+ var k1 = i1 - 1;
54
+ var backslashes1 = 0;
55
+ while(k1 >= 0 && src[k1] === '\\'){
56
+ backslashes1++;
57
+ k1--;
58
+ }
59
+ // 如果反斜杠数量是偶数,说明没有被转义
60
+ if (backslashes1 % 2 === 0) {
61
+ if (depth === 0) return i1;
62
+ depth--;
63
+ i1 += closeSeq.length;
64
+ continue;
65
+ }
66
+ }
67
+ var ch = src[i1];
68
+ // 跳过转义字符
69
+ if (ch === '\\') {
70
+ i1 += 2;
71
+ continue;
72
+ }
73
+ // 如果遇到开始字符,增加深度
74
+ if (ch === openChar) {
75
+ depth++;
76
+ } else if (ch === closeSeq[closeSeq.length - 1]) {
77
+ if (depth > 0) depth--;
78
+ }
79
+ i1++;
80
+ }
81
+ return -1;
82
+ }
83
+ /**
84
+ * 检查字符串中是否有未闭合的括号
85
+ */ function checkUnclosedBrackets(code) {
86
+ // 检查圆括号
87
+ var openParen = findMatchingClose(code, 0, '(', ')');
88
+ if (openParen === -1 && code.includes('(')) {
89
+ // 有开括号但没有匹配的闭括号
90
+ return true;
91
+ }
92
+ // 检查方括号
93
+ var openBracket = findMatchingClose(code, 0, '[', ']');
94
+ if (openBracket === -1 && code.includes('[')) {
95
+ return true;
96
+ }
97
+ // 检查花括号
98
+ var openBrace = findMatchingClose(code, 0, '{', '}');
99
+ if (openBrace === -1 && code.includes('{')) {
100
+ return true;
101
+ }
102
+ return false;
103
+ }
104
+ /**
105
+ * 检查 Mermaid 代码是否完整
106
+ */ function isMermaidCodeComplete(code) {
107
+ // 检查是否包含基本的 Mermaid 图表类型关键字
108
+ var hasChartType = code.includes('graph') || code.includes('sequenceDiagram') || code.includes('gantt') || code.includes('pie') || code.includes('classDiagram') || code.includes('stateDiagram') || code.includes('erDiagram') || code.includes('journey') || code.includes('gitgraph') || code.includes('flowchart');
109
+ if (!hasChartType) return false;
110
+ // 检查基本结构完整性
111
+ if (code.length < 10) return false;
112
+ // 检查括号匹配
113
+ var hasUnclosedBrackets = checkUnclosedBrackets(code);
114
+ if (hasUnclosedBrackets) return false;
115
+ // 检查是否以常见的不完整模式结尾
116
+ var incompletePatterns = [
117
+ /graph\s*$/i,
118
+ /-->?\s*$/
119
+ ];
120
+ var endsWithIncomplete = incompletePatterns.some(function(pattern) {
121
+ return pattern.test(code);
122
+ });
123
+ return !endsWithIncomplete;
124
+ }
125
+ /**
126
+ * 检查代码块是否完整(基于代码内容)
127
+ * 用于流式输入时判断代码块是否已经完成
128
+ *
129
+ * @param code - 代码内容
130
+ * @param language - 代码语言(如 'mermaid', 'javascript' 等)
131
+ * @returns 是否可能完整
132
+ */ export function isCodeBlockLikelyComplete(code, language) {
133
+ var trimmed = code.trim();
134
+ if (!trimmed) return false;
135
+ // 对于 Mermaid,使用更严格的检查
136
+ if (language === 'mermaid') {
137
+ return isMermaidCodeComplete(trimmed);
138
+ }
139
+ // 对于其他语言,检查基本的完整性
140
+ // 如果代码很短,可能是正在输入中
141
+ if (trimmed.length < 5) return false;
142
+ // 检查是否以常见的不完整模式结尾
143
+ var incompletePatterns = [
144
+ /\\$/,
145
+ /\/\*[\s\S]*$/,
146
+ /\/\/.*$/,
147
+ /['"`][^'"`]*$/
148
+ ];
149
+ // 检查括号匹配
150
+ var hasUnclosedBrackets = checkUnclosedBrackets(trimmed);
151
+ if (hasUnclosedBrackets) return false;
152
+ // 如果匹配不完整模式,可能还在输入中
153
+ var endsWithIncomplete = incompletePatterns.some(function(pattern) {
154
+ return pattern.test(trimmed);
155
+ });
156
+ return !endsWithIncomplete;
157
+ }
158
+ export default findMatchingClose;
@@ -1,6 +1,24 @@
1
1
  import type { Plugin } from 'unified';
2
2
  export type MarkdownRemarkPlugin = Plugin | [Plugin, ...unknown[]];
3
3
  export type MarkdownToHtmlOptions = MarkdownRemarkPlugin[];
4
+ /**
5
+ * Markdown 转 HTML 的配置选项
6
+ */
7
+ export interface MarkdownToHtmlConfig {
8
+ /** 是否在新标签页打开链接 */
9
+ openLinksInNewTab?: boolean;
10
+ /** 自定义段落标签,默认为 'p' */
11
+ paragraphTag?: string;
12
+ /** 用户自定义的 unified 插件配置 */
13
+ markedConfig?: MarkdownRemarkPlugin[];
14
+ }
15
+ /**
16
+ * HTML 转义函数
17
+ * @param html - 要转义的 HTML 字符串
18
+ * @param encode - 是否编码所有特殊字符(包括 &)
19
+ * @returns 转义后的字符串
20
+ */
21
+ export declare function escapeHtml(html: string, encode?: boolean): string;
4
22
  export declare const DEFAULT_MARKDOWN_REMARK_PLUGINS: readonly MarkdownRemarkPlugin[];
5
23
  /**
6
24
  * 将 Markdown 内容转换为 HTML(异步版本)
@@ -11,19 +29,31 @@ export declare const DEFAULT_MARKDOWN_REMARK_PLUGINS: readonly MarkdownRemarkPlu
11
29
  * - 前置元数据 (Frontmatter)
12
30
  * - 特殊字符修复
13
31
  * - 原始 HTML 标签
32
+ * - 链接在新标签页打开(可选)
33
+ * - 自定义段落标签(可选)
34
+ * - 代码块流式状态支持
14
35
  *
15
36
  * @param markdown - 要转换的 Markdown 字符串
37
+ * @param plugins - 可选的 unified 插件配置
38
+ * @param config - 可选的渲染配置选项
16
39
  * @returns Promise<string> - 从 Markdown 生成的 HTML 字符串
17
40
  *
18
41
  * @example
19
42
  * ```typescript
20
43
  * const html = await markdownToHtml('# 标题\n\n这是**粗体**文本');
21
44
  * console.log(html); // '<h1>标题</h1><p>这是<strong>粗体</strong>文本</p>'
45
+ *
46
+ * // 使用配置选项
47
+ * const htmlWithConfig = await markdownToHtml(
48
+ * '[链接](https://example.com)',
49
+ * undefined,
50
+ * { openLinksInNewTab: true, paragraphTag: 'div' }
51
+ * );
22
52
  * ```
23
53
  *
24
54
  * @throws {Error} 当转换过程中发生错误时返回空字符串
25
55
  */
26
- export declare const markdownToHtml: (markdown: string, plugins?: MarkdownToHtmlOptions) => Promise<string>;
56
+ export declare const markdownToHtml: (markdown: string, plugins?: MarkdownToHtmlOptions, config?: MarkdownToHtmlConfig) => Promise<string>;
27
57
  /**
28
58
  * 将 Markdown 内容转换为 HTML(同步版本)
29
59
  *
@@ -31,12 +61,21 @@ export declare const markdownToHtml: (markdown: string, plugins?: MarkdownToHtml
31
61
  * 适用于不需要异步处理的场景,但可能会阻塞主线程。
32
62
  *
33
63
  * @param markdown - 要转换的 Markdown 字符串
64
+ * @param plugins - 可选的 unified 插件配置
65
+ * @param config - 可选的渲染配置选项
34
66
  * @returns string - 从 Markdown 生成的 HTML 字符串
35
67
  *
36
68
  * @example
37
69
  * ```typescript
38
70
  * const html = markdownToHtmlSync('## 副标题\n\n- 列表项1\n- 列表项2');
39
71
  * console.log(html); // '<h2>副标题</h2><ul><li>列表项1</li><li>列表项2</li></ul>'
72
+ *
73
+ * // 使用配置选项
74
+ * const htmlWithConfig = markdownToHtmlSync(
75
+ * '[链接](https://example.com)',
76
+ * undefined,
77
+ * { openLinksInNewTab: true }
78
+ * );
40
79
  * ```
41
80
  *
42
81
  * @throws {Error} 当转换过程中发生错误时返回空字符串
@@ -45,4 +84,4 @@ export declare const markdownToHtml: (markdown: string, plugins?: MarkdownToHtml
45
84
  * - 建议在可能的情况下使用异步版本 `markdownToHtml`
46
85
  * - 同步版本可能影响用户界面响应性
47
86
  */
48
- export declare const markdownToHtmlSync: (markdown: string, plugins?: MarkdownToHtmlOptions) => string;
87
+ export declare const markdownToHtmlSync: (markdown: string, plugins?: MarkdownToHtmlOptions, config?: MarkdownToHtmlConfig) => string;
@@ -165,7 +165,41 @@ import remarkMath from "remark-math";
165
165
  import remarkParse from "remark-parse";
166
166
  import remarkRehype from "remark-rehype";
167
167
  import { unified } from "unified";
168
+ import { visit } from "unist-util-visit";
168
169
  import { fixStrongWithSpecialChars } from "../parser/remarkParse";
170
+ // HTML 转义相关的正则表达式和工具
171
+ var ESCAPE_TEST_NO_ENCODE = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;
172
+ var ESCAPE_TEST = /[&<>"']/;
173
+ var ESCAPE_REPLACE = /[&<>"']/g;
174
+ var ESCAPE_REPLACE_NO_ENCODE = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g;
175
+ var ENDING_NEWLINE = /\n$/;
176
+ var ESCAPE_REPLACEMENTS = {
177
+ '&': '&amp;',
178
+ '<': '&lt;',
179
+ '>': '&gt;',
180
+ '"': '&quot;',
181
+ "'": '&#39;'
182
+ };
183
+ var getEscapeReplacement = function(ch) {
184
+ return ESCAPE_REPLACEMENTS[ch];
185
+ };
186
+ /**
187
+ * HTML 转义函数
188
+ * @param html - 要转义的 HTML 字符串
189
+ * @param encode - 是否编码所有特殊字符(包括 &)
190
+ * @returns 转义后的字符串
191
+ */ export function escapeHtml(html, encode) {
192
+ if (encode) {
193
+ if (ESCAPE_TEST.test(html)) {
194
+ return html.replace(ESCAPE_REPLACE, getEscapeReplacement);
195
+ }
196
+ } else {
197
+ if (ESCAPE_TEST_NO_ENCODE.test(html)) {
198
+ return html.replace(ESCAPE_REPLACE_NO_ENCODE, getEscapeReplacement);
199
+ }
200
+ }
201
+ return html;
202
+ }
169
203
  var INLINE_MATH_WITH_SINGLE_DOLLAR = {
170
204
  singleDollarTextMath: true
171
205
  };
@@ -173,6 +207,90 @@ var FRONTMATTER_LANGUAGES = [
173
207
  'yaml'
174
208
  ];
175
209
  var remarkRehypePlugin = remarkRehype;
210
+ /**
211
+ * 配置链接渲染器,在新标签页打开链接
212
+ */ function rehypeLinkTarget() {
213
+ return function() {
214
+ return function(tree) {
215
+ visit(tree, 'element', function(node) {
216
+ if (node.tagName === 'a' && node.properties) {
217
+ node.properties.target = '_blank';
218
+ node.properties.rel = 'noopener noreferrer';
219
+ }
220
+ });
221
+ };
222
+ };
223
+ }
224
+ /**
225
+ * 配置段落渲染器,支持自定义段落标签
226
+ */ function rehypeParagraphTag() {
227
+ var tagName = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 'p';
228
+ return function() {
229
+ return function(tree) {
230
+ visit(tree, 'element', function(node) {
231
+ if (node.tagName === 'p') {
232
+ node.tagName = tagName;
233
+ }
234
+ });
235
+ };
236
+ };
237
+ }
238
+ /**
239
+ * 从代码节点中提取原始文本
240
+ */ function getCodeText(node) {
241
+ if (!node.children) return '';
242
+ return node.children.map(function(child) {
243
+ if (child.type === 'text' && 'value' in child) {
244
+ return String(child.value);
245
+ }
246
+ if (child.type === 'element') {
247
+ return getCodeText(child);
248
+ }
249
+ return '';
250
+ }).join('');
251
+ }
252
+ /**
253
+ * 配置代码块渲染器,添加流式状态支持
254
+ */ function rehypeCodeBlock() {
255
+ return function() {
256
+ return function(tree) {
257
+ visit(tree, 'element', function(node) {
258
+ var _node_children;
259
+ if (node.tagName === 'pre' && ((_node_children = node.children) === null || _node_children === void 0 ? void 0 : _node_children[0])) {
260
+ var codeNode = node.children[0];
261
+ if (codeNode.tagName === 'code' && codeNode.properties) {
262
+ // 检查是否为代码块(而非行内代码)
263
+ // 代码块通常在 pre 标签内,且有 className 包含 language-
264
+ var hasLanguageClass = codeNode.properties.className ? Array.isArray(codeNode.properties.className) ? codeNode.properties.className.some(function(cls) {
265
+ return String(cls).startsWith('language-');
266
+ }) : String(codeNode.properties.className).startsWith('language-') : false;
267
+ // 或者通过检查代码内容长度来判断(代码块通常较长)
268
+ var codeText = getCodeText(codeNode);
269
+ var isBlock = hasLanguageClass || codeText.includes('\n') && codeText.length > 10;
270
+ if (isBlock) {
271
+ // 添加 data-block 属性
272
+ codeNode.properties['data-block'] = 'true';
273
+ // 默认设置为 done,在实际流式场景中可以通过外部传入状态
274
+ // 这里我们检查代码是否看起来完整(有换行且不以换行结尾可能表示未完成)
275
+ var endsWithNewline = codeText.match(ENDING_NEWLINE);
276
+ var streamStatus = endsWithNewline ? 'done' : 'loading';
277
+ // 添加 data-state 属性
278
+ codeNode.properties['data-state'] = streamStatus;
279
+ // 转义代码内容(移除末尾换行后重新添加,确保格式一致)
280
+ if (codeNode.children && codeNode.children.length > 0) {
281
+ var textNode = codeNode.children[0];
282
+ if (textNode.type === 'text' && 'value' in textNode) {
283
+ var code = String(textNode.value).replace(ENDING_NEWLINE, '');
284
+ textNode.value = escapeHtml(code, true) + '\n';
285
+ }
286
+ }
287
+ }
288
+ }
289
+ }
290
+ });
291
+ };
292
+ };
293
+ }
176
294
  export var DEFAULT_MARKDOWN_REMARK_PLUGINS = [
177
295
  remarkParse,
178
296
  remarkGfm,
@@ -214,11 +332,24 @@ var resolveRemarkPlugins = function(plugins) {
214
332
  }
215
333
  return plugins;
216
334
  };
217
- var createMarkdownProcessor = function(plugins) {
335
+ var createMarkdownProcessor = function(plugins, config) {
218
336
  var processor = unified();
219
337
  var remarkPlugins = resolveRemarkPlugins(plugins);
220
338
  applyPlugins(processor, remarkPlugins);
221
- processor.use(rehypeRaw).use(rehypeKatex).use(rehypeStringify);
339
+ processor.use(rehypeRaw).use(rehypeKatex);
340
+ // 应用配置选项
341
+ if (config === null || config === void 0 ? void 0 : config.openLinksInNewTab) {
342
+ processor.use(rehypeLinkTarget());
343
+ }
344
+ if ((config === null || config === void 0 ? void 0 : config.paragraphTag) && config.paragraphTag !== 'p') {
345
+ processor.use(rehypeParagraphTag(config.paragraphTag));
346
+ }
347
+ processor.use(rehypeCodeBlock());
348
+ // 用户自定义配置(最后应用,可以覆盖默认配置)
349
+ if (config === null || config === void 0 ? void 0 : config.markedConfig) {
350
+ applyPlugins(processor, config.markedConfig);
351
+ }
352
+ processor.use(rehypeStringify);
222
353
  return processor;
223
354
  };
224
355
  /**
@@ -230,19 +361,31 @@ var createMarkdownProcessor = function(plugins) {
230
361
  * - 前置元数据 (Frontmatter)
231
362
  * - 特殊字符修复
232
363
  * - 原始 HTML 标签
364
+ * - 链接在新标签页打开(可选)
365
+ * - 自定义段落标签(可选)
366
+ * - 代码块流式状态支持
233
367
  *
234
368
  * @param markdown - 要转换的 Markdown 字符串
369
+ * @param plugins - 可选的 unified 插件配置
370
+ * @param config - 可选的渲染配置选项
235
371
  * @returns Promise<string> - 从 Markdown 生成的 HTML 字符串
236
372
  *
237
373
  * @example
238
374
  * ```typescript
239
375
  * const html = await markdownToHtml('# 标题\n\n这是**粗体**文本');
240
376
  * console.log(html); // '<h1>标题</h1><p>这是<strong>粗体</strong>文本</p>'
377
+ *
378
+ * // 使用配置选项
379
+ * const htmlWithConfig = await markdownToHtml(
380
+ * '[链接](https://example.com)',
381
+ * undefined,
382
+ * { openLinksInNewTab: true, paragraphTag: 'div' }
383
+ * );
241
384
  * ```
242
385
  *
243
386
  * @throws {Error} 当转换过程中发生错误时返回空字符串
244
387
  */ export var markdownToHtml = /*#__PURE__*/ function() {
245
- var _ref = _async_to_generator(function(markdown, plugins) {
388
+ var _ref = _async_to_generator(function(markdown, plugins, config) {
246
389
  var htmlContent, error;
247
390
  return _ts_generator(this, function(_state) {
248
391
  switch(_state.label){
@@ -255,7 +398,7 @@ var createMarkdownProcessor = function(plugins) {
255
398
  ]);
256
399
  return [
257
400
  4,
258
- createMarkdownProcessor(plugins).process(markdown)
401
+ createMarkdownProcessor(plugins, config).process(markdown)
259
402
  ];
260
403
  case 1:
261
404
  htmlContent = _state.sent();
@@ -277,7 +420,7 @@ var createMarkdownProcessor = function(plugins) {
277
420
  }
278
421
  });
279
422
  });
280
- return function markdownToHtml(markdown, plugins) {
423
+ return function markdownToHtml(markdown, plugins, config) {
281
424
  return _ref.apply(this, arguments);
282
425
  };
283
426
  }();
@@ -288,12 +431,21 @@ var createMarkdownProcessor = function(plugins) {
288
431
  * 适用于不需要异步处理的场景,但可能会阻塞主线程。
289
432
  *
290
433
  * @param markdown - 要转换的 Markdown 字符串
434
+ * @param plugins - 可选的 unified 插件配置
435
+ * @param config - 可选的渲染配置选项
291
436
  * @returns string - 从 Markdown 生成的 HTML 字符串
292
437
  *
293
438
  * @example
294
439
  * ```typescript
295
440
  * const html = markdownToHtmlSync('## 副标题\n\n- 列表项1\n- 列表项2');
296
441
  * console.log(html); // '<h2>副标题</h2><ul><li>列表项1</li><li>列表项2</li></ul>'
442
+ *
443
+ * // 使用配置选项
444
+ * const htmlWithConfig = markdownToHtmlSync(
445
+ * '[链接](https://example.com)',
446
+ * undefined,
447
+ * { openLinksInNewTab: true }
448
+ * );
297
449
  * ```
298
450
  *
299
451
  * @throws {Error} 当转换过程中发生错误时返回空字符串
@@ -301,9 +453,9 @@ var createMarkdownProcessor = function(plugins) {
301
453
  * @remarks
302
454
  * - 建议在可能的情况下使用异步版本 `markdownToHtml`
303
455
  * - 同步版本可能影响用户界面响应性
304
- */ export var markdownToHtmlSync = function(markdown, plugins) {
456
+ */ export var markdownToHtmlSync = function(markdown, plugins, config) {
305
457
  try {
306
- var file = createMarkdownProcessor(plugins).processSync(markdown);
458
+ var file = createMarkdownProcessor(plugins, config).processSync(markdown);
307
459
  return String(file);
308
460
  } catch (error) {
309
461
  console.error('Error converting markdown to HTML:', error);
@@ -2,6 +2,16 @@ import React from 'react';
2
2
  import { ChartContainerProps } from '../components';
3
3
  import { StatisticConfigType } from '../hooks/useChartStatistic';
4
4
  import { ChartDataItem } from '../utils';
5
+ /**
6
+ * @fileoverview 面积图组件文件
7
+ *
8
+ * 该文件提供了面积图组件的实现,基于 Chart.js 和 react-chartjs-2。
9
+ * 支持数据可视化、交互、配置、统计等功能。
10
+ *
11
+ * @author md-editor
12
+ * @version 1.0.0
13
+ * @since 2024
14
+ */
5
15
  /**
6
16
  * 面积图数据项类型
7
17
  *
@@ -129,6 +139,8 @@ export interface AreaChartProps extends ChartContainerProps {
129
139
  renderFilterInToolbar?: boolean;
130
140
  /** ChartStatistic组件配置:object表示单个配置,array表示多个配置 */
131
141
  statistic?: StatisticConfigType;
142
+ /** 是否显示加载状态(当图表未闭合时显示) */
143
+ loading?: boolean;
132
144
  }
133
145
  /**
134
146
  * 面积图组件