@ant-design/agentic-ui 2.29.59 → 2.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Bubble/List/index.d.ts +11 -0
- package/dist/Bubble/List/index.js +13 -1
- package/dist/Bubble/MessagesContent/EXCEPTION.js +11 -2
- package/dist/Bubble/MessagesContent/MarkdownPreview.js +34 -4
- package/dist/Bubble/MessagesContent/index.js +39 -10
- package/dist/Bubble/MessagesContent/style.js +55 -22
- package/dist/Bubble/UserBubble.js +3 -1
- package/dist/Bubble/type.d.ts +11 -0
- package/dist/Hooks/useLanguage.d.ts +1 -0
- package/dist/I18n/locales.d.ts +1 -0
- package/dist/I18n/locales.js +5 -3
- package/dist/MarkdownEditor/BaseMarkdownEditor.js +37 -5
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/AgenticUiTaskBlock.d.ts +4 -0
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/AgenticUiTaskBlock.js +74 -0
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/AgenticUiToolUseBarBlock.d.ts +4 -0
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/AgenticUiToolUseBarBlock.js +114 -0
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/agenticUiEmbedUtils.d.ts +20 -0
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/agenticUiEmbedUtils.js +169 -0
- package/dist/MarkdownEditor/editor/elements/Table/EditableTable.d.ts +11 -0
- package/dist/MarkdownEditor/editor/elements/Table/EditableTable.js +207 -0
- package/dist/MarkdownEditor/editor/elements/Table/Table.js +10 -276
- package/dist/MarkdownEditor/editor/elements/Table/TableCellIndex/index.js +7 -227
- package/dist/MarkdownEditor/editor/elements/Table/TableCellIndexSpacer/index.js +20 -229
- package/dist/MarkdownEditor/editor/elements/Table/commands/tableCommands.d.ts +9 -0
- package/dist/MarkdownEditor/editor/elements/Table/commands/tableCommands.js +242 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/editableTableWidth.d.ts +20 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/editableTableWidth.js +60 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/useEditableTableColWidths.d.ts +6 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/useEditableTableColWidths.js +20 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/useEditableTableContentWidth.d.ts +10 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/useEditableTableContentWidth.js +103 -0
- package/dist/MarkdownEditor/editor/elements/index.js +7 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseCode.js +33 -2
- package/dist/MarkdownEditor/editor/parser/parserSlateNodeToMarkdown.js +3 -0
- package/dist/MarkdownEditor/editor/plugins/handlePaste.js +4 -1
- package/dist/MarkdownEditor/plugin.d.ts +15 -0
- package/dist/MarkdownEditor/style.js +258 -326
- package/dist/MarkdownEditor/types.d.ts +14 -0
- package/dist/MarkdownInputField/AttachmentButton/AttachmentButtonPopover.js +1 -1
- package/dist/MarkdownInputField/AttachmentButton/AttachmentFileList/AttachmentFileIcon.js +2 -2
- package/dist/MarkdownInputField/AttachmentButton/AttachmentFileList/AttachmentFileListItem.js +11 -8
- package/dist/MarkdownInputField/AttachmentButton/index.js +7 -2
- package/dist/MarkdownInputField/AttachmentButton/types.d.ts +5 -1
- package/dist/MarkdownInputField/AttachmentButton/utils.d.ts +7 -0
- package/dist/MarkdownInputField/AttachmentButton/utils.js +9 -1
- package/dist/MarkdownInputField/FileMapView/FileMapViewItem.js +10 -5
- package/dist/MarkdownInputField/FileUploadManager/index.d.ts +9 -0
- package/dist/MarkdownInputField/FileUploadManager/index.js +20 -4
- package/dist/MarkdownInputField/MarkdownInputField.js +5 -3
- package/dist/MarkdownInputField/SendActions/index.d.ts +9 -0
- package/dist/MarkdownInputField/SendActions/index.js +3 -2
- package/dist/MarkdownInputField/hooks/useMarkdownInputFieldRefs.js +10 -3
- package/dist/MarkdownInputField/utils/renderHelpers.d.ts +8 -1
- package/dist/MarkdownInputField/utils/renderHelpers.js +5 -1
- package/dist/MarkdownRenderer/AnimationText.d.ts +19 -0
- package/dist/MarkdownRenderer/AnimationText.js +226 -0
- package/dist/MarkdownRenderer/CharacterQueue.d.ts +36 -0
- package/dist/MarkdownRenderer/CharacterQueue.js +188 -0
- package/dist/MarkdownRenderer/MarkdownRenderer.d.ts +13 -0
- package/dist/MarkdownRenderer/MarkdownRenderer.js +362 -0
- package/dist/MarkdownRenderer/index.d.ts +11 -0
- package/dist/MarkdownRenderer/index.js +9 -0
- package/dist/MarkdownRenderer/renderers/AgenticUiTaskBlockRenderer.d.ts +6 -0
- package/dist/MarkdownRenderer/renderers/AgenticUiTaskBlockRenderer.js +66 -0
- package/dist/MarkdownRenderer/renderers/AgenticUiToolUseBarBlockRenderer.d.ts +6 -0
- package/dist/MarkdownRenderer/renderers/AgenticUiToolUseBarBlockRenderer.js +134 -0
- package/dist/MarkdownRenderer/renderers/ChartRenderer.d.ts +12 -0
- package/dist/MarkdownRenderer/renderers/ChartRenderer.js +395 -0
- package/dist/MarkdownRenderer/renderers/CodeRenderer.d.ts +7 -0
- package/dist/MarkdownRenderer/renderers/CodeRenderer.js +218 -0
- package/dist/MarkdownRenderer/renderers/MermaidRenderer.d.ts +7 -0
- package/dist/MarkdownRenderer/renderers/MermaidRenderer.js +43 -0
- package/dist/MarkdownRenderer/renderers/SchemaRenderer.d.ts +15 -0
- package/dist/MarkdownRenderer/renderers/SchemaRenderer.js +115 -0
- package/dist/MarkdownRenderer/renderers/index.d.ts +4 -0
- package/dist/MarkdownRenderer/renderers/index.js +4 -0
- package/dist/MarkdownRenderer/style.d.ts +16 -0
- package/dist/MarkdownRenderer/style.js +47 -0
- package/dist/MarkdownRenderer/types.d.ts +74 -0
- package/dist/MarkdownRenderer/types.js +1 -0
- package/dist/MarkdownRenderer/useMarkdownToReact.d.ts +23 -0
- package/dist/MarkdownRenderer/useMarkdownToReact.js +1241 -0
- package/dist/MarkdownRenderer/useStreaming.d.ts +29 -0
- package/dist/MarkdownRenderer/useStreaming.js +399 -0
- package/dist/Plugins/chart/AreaChart/index.js +4 -2
- package/dist/Plugins/chart/ChartRender.js +1 -0
- package/dist/Plugins/chart/LineChart/index.js +4 -2
- package/dist/Plugins/chart/components/ChartContainer/ChartErrorBoundary.d.ts +8 -0
- package/dist/Plugins/chart/components/ChartContainer/ChartErrorBoundary.js +31 -6
- package/dist/Plugins/chart/index.js +3 -1
- package/dist/Plugins/mermaid/style.js +0 -3
- package/dist/TaskList/TaskList.js +3 -12
- package/dist/TaskList/components/TaskListItem.js +3 -12
- package/dist/ThoughtChainList/ThoughtChainListItem.js +2 -4
- package/dist/ThoughtChainList/index.js +4 -21
- package/dist/ToolUseBarThink/index.js +20 -59
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/package.json +2 -1
|
@@ -0,0 +1,1241 @@
|
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
2
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
+
return arr2;
|
|
5
|
+
}
|
|
6
|
+
function _array_with_holes(arr) {
|
|
7
|
+
if (Array.isArray(arr)) return arr;
|
|
8
|
+
}
|
|
9
|
+
function _array_without_holes(arr) {
|
|
10
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
11
|
+
}
|
|
12
|
+
function _define_property(obj, key, value) {
|
|
13
|
+
if (key in obj) {
|
|
14
|
+
Object.defineProperty(obj, key, {
|
|
15
|
+
value: value,
|
|
16
|
+
enumerable: true,
|
|
17
|
+
configurable: true,
|
|
18
|
+
writable: true
|
|
19
|
+
});
|
|
20
|
+
} else {
|
|
21
|
+
obj[key] = value;
|
|
22
|
+
}
|
|
23
|
+
return obj;
|
|
24
|
+
}
|
|
25
|
+
function _iterable_to_array(iter) {
|
|
26
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
27
|
+
}
|
|
28
|
+
function _non_iterable_rest() {
|
|
29
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
30
|
+
}
|
|
31
|
+
function _non_iterable_spread() {
|
|
32
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
33
|
+
}
|
|
34
|
+
function _object_spread(target) {
|
|
35
|
+
for(var i = 1; i < arguments.length; i++){
|
|
36
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
37
|
+
var ownKeys = Object.keys(source);
|
|
38
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
39
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
40
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
ownKeys.forEach(function(key) {
|
|
44
|
+
_define_property(target, key, source[key]);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return target;
|
|
48
|
+
}
|
|
49
|
+
function ownKeys(object, enumerableOnly) {
|
|
50
|
+
var keys = Object.keys(object);
|
|
51
|
+
if (Object.getOwnPropertySymbols) {
|
|
52
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
53
|
+
if (enumerableOnly) {
|
|
54
|
+
symbols = symbols.filter(function(sym) {
|
|
55
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
keys.push.apply(keys, symbols);
|
|
59
|
+
}
|
|
60
|
+
return keys;
|
|
61
|
+
}
|
|
62
|
+
function _object_spread_props(target, source) {
|
|
63
|
+
source = source != null ? source : {};
|
|
64
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
65
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
66
|
+
} else {
|
|
67
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
68
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return target;
|
|
72
|
+
}
|
|
73
|
+
function _object_without_properties(source, excluded) {
|
|
74
|
+
if (source == null) return {};
|
|
75
|
+
var target = {}, sourceKeys, key, i;
|
|
76
|
+
if (typeof Reflect !== "undefined" && Reflect.ownKeys) {
|
|
77
|
+
sourceKeys = Reflect.ownKeys(source);
|
|
78
|
+
for(i = 0; i < sourceKeys.length; i++){
|
|
79
|
+
key = sourceKeys[i];
|
|
80
|
+
if (excluded.indexOf(key) >= 0) continue;
|
|
81
|
+
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
82
|
+
target[key] = source[key];
|
|
83
|
+
}
|
|
84
|
+
return target;
|
|
85
|
+
}
|
|
86
|
+
target = _object_without_properties_loose(source, excluded);
|
|
87
|
+
if (Object.getOwnPropertySymbols) {
|
|
88
|
+
sourceKeys = Object.getOwnPropertySymbols(source);
|
|
89
|
+
for(i = 0; i < sourceKeys.length; i++){
|
|
90
|
+
key = sourceKeys[i];
|
|
91
|
+
if (excluded.indexOf(key) >= 0) continue;
|
|
92
|
+
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
93
|
+
target[key] = source[key];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return target;
|
|
97
|
+
}
|
|
98
|
+
function _object_without_properties_loose(source, excluded) {
|
|
99
|
+
if (source == null) return {};
|
|
100
|
+
var target = {}, sourceKeys = Object.getOwnPropertyNames(source), key, i;
|
|
101
|
+
for(i = 0; i < sourceKeys.length; i++){
|
|
102
|
+
key = sourceKeys[i];
|
|
103
|
+
if (excluded.indexOf(key) >= 0) continue;
|
|
104
|
+
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
105
|
+
target[key] = source[key];
|
|
106
|
+
}
|
|
107
|
+
return target;
|
|
108
|
+
}
|
|
109
|
+
function _to_array(arr) {
|
|
110
|
+
return _array_with_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_rest();
|
|
111
|
+
}
|
|
112
|
+
function _to_consumable_array(arr) {
|
|
113
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
114
|
+
}
|
|
115
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
116
|
+
if (!o) return;
|
|
117
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
118
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
119
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
120
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
121
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
122
|
+
}
|
|
123
|
+
import { Checkbox, Image } from "antd";
|
|
124
|
+
import { toJsxRuntime } from "hast-util-to-jsx-runtime";
|
|
125
|
+
import React, { useMemo, useRef } from "react";
|
|
126
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
127
|
+
import rehypeKatex from "rehype-katex";
|
|
128
|
+
import rehypeRaw from "rehype-raw";
|
|
129
|
+
import remarkDirective from "remark-directive";
|
|
130
|
+
import remarkFrontmatter from "remark-frontmatter";
|
|
131
|
+
import remarkGfm from "remark-gfm";
|
|
132
|
+
import remarkMath from "remark-math";
|
|
133
|
+
import remarkParse from "remark-parse";
|
|
134
|
+
import remarkRehype from "remark-rehype";
|
|
135
|
+
import { unified } from "unified";
|
|
136
|
+
import { visit } from "unist-util-visit";
|
|
137
|
+
import { JINJA_DOLLAR_PLACEHOLDER } from "../MarkdownEditor/editor/parser/constants";
|
|
138
|
+
import { remarkDirectiveContainer } from "../MarkdownEditor/editor/parser/remarkDirectiveContainer";
|
|
139
|
+
import { convertParagraphToImage, fixStrongWithSpecialChars, protectJinjaDollarInText } from "../MarkdownEditor/editor/parser/remarkParse";
|
|
140
|
+
import { REMARK_REHYPE_DIRECTIVE_HANDLERS } from "../MarkdownEditor/editor/utils/markdownToHtml";
|
|
141
|
+
import { ToolUseBarThink } from "../ToolUseBarThink";
|
|
142
|
+
import AnimationText from "./AnimationText";
|
|
143
|
+
var INLINE_MATH_WITH_SINGLE_DOLLAR = {
|
|
144
|
+
singleDollarTextMath: true
|
|
145
|
+
};
|
|
146
|
+
var FRONTMATTER_LANGUAGES = [
|
|
147
|
+
'yaml'
|
|
148
|
+
];
|
|
149
|
+
var REMARK_DIRECTIVE_CONTAINER_OPTIONS = {
|
|
150
|
+
className: 'markdown-container',
|
|
151
|
+
titleElement: {
|
|
152
|
+
className: [
|
|
153
|
+
'markdown-container__title'
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
var remarkRehypePlugin = remarkRehype;
|
|
158
|
+
var FOOTNOTE_REF_PATTERN = /\[\^([^\]]+)\]/g;
|
|
159
|
+
var CHART_COMMENT_PATTERN = /^<!--\s*(\[[\s\S]*\]|\{[\s\S]*\})\s*-->$/;
|
|
160
|
+
var extractCellText = function extractCellText1(cell) {
|
|
161
|
+
if (!(cell === null || cell === void 0 ? void 0 : cell.children)) return '';
|
|
162
|
+
return cell.children.map(function(child) {
|
|
163
|
+
if (child.type === 'text') return child.value || '';
|
|
164
|
+
if (child.children) return extractCellText(child);
|
|
165
|
+
return '';
|
|
166
|
+
}).join('').trim();
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* 从 mdast table 节点提取列名和数据
|
|
170
|
+
*/ var extractTableData = function extractTableData(tableNode) {
|
|
171
|
+
var _loop = function(i) {
|
|
172
|
+
var row = tableNode.children[i];
|
|
173
|
+
if (!(row === null || row === void 0 ? void 0 : row.children)) return "continue";
|
|
174
|
+
var record = {
|
|
175
|
+
key: "row-".concat(i)
|
|
176
|
+
};
|
|
177
|
+
row.children.forEach(function(cell, j) {
|
|
178
|
+
if (j < columns.length) {
|
|
179
|
+
var val = extractCellText(cell);
|
|
180
|
+
var num = Number(val);
|
|
181
|
+
record[columns[j].dataIndex] = isNaN(num) || val === '' ? val : num;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
dataSource.push(record);
|
|
185
|
+
};
|
|
186
|
+
var _tableNode_children, _headerRow_children;
|
|
187
|
+
if (!((_tableNode_children = tableNode.children) === null || _tableNode_children === void 0 ? void 0 : _tableNode_children.length)) return null;
|
|
188
|
+
var headerRow = tableNode.children[0];
|
|
189
|
+
if (!(headerRow === null || headerRow === void 0 ? void 0 : (_headerRow_children = headerRow.children) === null || _headerRow_children === void 0 ? void 0 : _headerRow_children.length)) return null;
|
|
190
|
+
var columns = headerRow.children.map(function(cell) {
|
|
191
|
+
var text = extractCellText(cell);
|
|
192
|
+
return {
|
|
193
|
+
title: text,
|
|
194
|
+
dataIndex: text,
|
|
195
|
+
key: text
|
|
196
|
+
};
|
|
197
|
+
});
|
|
198
|
+
var dataSource = [];
|
|
199
|
+
for(var i = 1; i < tableNode.children.length; i++)_loop(i);
|
|
200
|
+
return {
|
|
201
|
+
columns: columns,
|
|
202
|
+
dataSource: dataSource
|
|
203
|
+
};
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* remark 插件:将 "HTML 注释(图表配置)+ 表格" 组合转为 chart 代码块。
|
|
207
|
+
*
|
|
208
|
+
* 在 MarkdownEditor 中,parseTableOrChart 负责此逻辑。
|
|
209
|
+
* 在 MarkdownRenderer 中,此插件在 mdast 层面完成等价转换。
|
|
210
|
+
*
|
|
211
|
+
* 匹配模式:
|
|
212
|
+
* ```
|
|
213
|
+
* <!-- [{"chartType":"line","x":"month","y":"value",...}] -->
|
|
214
|
+
* | month | value |
|
|
215
|
+
* |-------|-------|
|
|
216
|
+
* | 2024 | 100 |
|
|
217
|
+
* ```
|
|
218
|
+
*/ var remarkChartFromComment = function remarkChartFromComment() {
|
|
219
|
+
return function(tree) {
|
|
220
|
+
var children = tree.children;
|
|
221
|
+
if (!children || !Array.isArray(children)) return;
|
|
222
|
+
var toRemove = [];
|
|
223
|
+
for(var i = 0; i < children.length - 1; i++){
|
|
224
|
+
var _node_value;
|
|
225
|
+
var node = children[i];
|
|
226
|
+
var next = children[i + 1];
|
|
227
|
+
if (node.type !== 'html' || next.type !== 'table') continue;
|
|
228
|
+
var match = (_node_value = node.value) === null || _node_value === void 0 ? void 0 : _node_value.match(CHART_COMMENT_PATTERN);
|
|
229
|
+
if (!match) continue;
|
|
230
|
+
var chartConfig = void 0;
|
|
231
|
+
try {
|
|
232
|
+
chartConfig = JSON.parse(match[1]);
|
|
233
|
+
} catch (unused) {
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
if (!Array.isArray(chartConfig)) chartConfig = [
|
|
237
|
+
chartConfig
|
|
238
|
+
];
|
|
239
|
+
var hasChartType = chartConfig.some(function(c) {
|
|
240
|
+
return c.chartType && c.chartType !== 'table';
|
|
241
|
+
});
|
|
242
|
+
if (!hasChartType) continue;
|
|
243
|
+
var tableData = extractTableData(next);
|
|
244
|
+
if (!tableData) continue;
|
|
245
|
+
var chartJson = JSON.stringify({
|
|
246
|
+
config: chartConfig,
|
|
247
|
+
columns: tableData.columns,
|
|
248
|
+
dataSource: tableData.dataSource
|
|
249
|
+
});
|
|
250
|
+
children[i] = {
|
|
251
|
+
type: 'code',
|
|
252
|
+
lang: 'chart',
|
|
253
|
+
value: chartJson
|
|
254
|
+
};
|
|
255
|
+
toRemove.push(i + 1);
|
|
256
|
+
i++;
|
|
257
|
+
}
|
|
258
|
+
for(var j = toRemove.length - 1; j >= 0; j--){
|
|
259
|
+
children.splice(toRemove[j], 1);
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* rehype 插件:将文本中残留的 [^N] 模式转为 fnc 标记元素。
|
|
265
|
+
*
|
|
266
|
+
* remark-gfm 只在有对应 footnoteDefinition 时才会转换 footnoteReference,
|
|
267
|
+
* 但 AI 对话场景中 [^1] 常用作内联引用(无底部定义)。
|
|
268
|
+
* 此插件在 hast 层面补充处理这些"裸引用"。
|
|
269
|
+
*/ var rehypeFootnoteRef = function rehypeFootnoteRef() {
|
|
270
|
+
return function(tree) {
|
|
271
|
+
visit(tree, 'text', function(node, index, parent) {
|
|
272
|
+
if (!parent || index === undefined) return;
|
|
273
|
+
var value = node.value;
|
|
274
|
+
if (!FOOTNOTE_REF_PATTERN.test(value)) return;
|
|
275
|
+
FOOTNOTE_REF_PATTERN.lastIndex = 0;
|
|
276
|
+
var children = [];
|
|
277
|
+
var lastIndex = 0;
|
|
278
|
+
var match;
|
|
279
|
+
while((match = FOOTNOTE_REF_PATTERN.exec(value)) !== null){
|
|
280
|
+
if (match.index > lastIndex) {
|
|
281
|
+
children.push({
|
|
282
|
+
type: 'text',
|
|
283
|
+
value: value.slice(lastIndex, match.index)
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
children.push({
|
|
287
|
+
type: 'element',
|
|
288
|
+
tagName: 'span',
|
|
289
|
+
properties: {
|
|
290
|
+
'data-fnc': 'fnc',
|
|
291
|
+
'data-fnc-name': match[1]
|
|
292
|
+
},
|
|
293
|
+
children: [
|
|
294
|
+
{
|
|
295
|
+
type: 'text',
|
|
296
|
+
value: match[1]
|
|
297
|
+
}
|
|
298
|
+
]
|
|
299
|
+
});
|
|
300
|
+
lastIndex = match.index + match[0].length;
|
|
301
|
+
}
|
|
302
|
+
if (lastIndex < value.length) {
|
|
303
|
+
children.push({
|
|
304
|
+
type: 'text',
|
|
305
|
+
value: value.slice(lastIndex)
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
if (children.length > 0) {
|
|
309
|
+
var _parent_children;
|
|
310
|
+
(_parent_children = parent.children).splice.apply(_parent_children, [
|
|
311
|
+
index,
|
|
312
|
+
1
|
|
313
|
+
].concat(_to_consumable_array(children)));
|
|
314
|
+
return index + children.length;
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
};
|
|
318
|
+
};
|
|
319
|
+
var createHastProcessor = function createHastProcessor(extraRemarkPlugins, config) {
|
|
320
|
+
var processor = unified();
|
|
321
|
+
processor.use(remarkParse).use(remarkGfm, {
|
|
322
|
+
singleTilde: false
|
|
323
|
+
}).use(fixStrongWithSpecialChars).use(convertParagraphToImage).use(protectJinjaDollarInText).use(remarkMath, INLINE_MATH_WITH_SINGLE_DOLLAR).use(remarkFrontmatter, FRONTMATTER_LANGUAGES).use(remarkDirective).use(remarkDirectiveContainer, REMARK_DIRECTIVE_CONTAINER_OPTIONS).use(remarkChartFromComment).use(remarkRehypePlugin, {
|
|
324
|
+
allowDangerousHtml: true,
|
|
325
|
+
handlers: REMARK_REHYPE_DIRECTIVE_HANDLERS
|
|
326
|
+
}).use(rehypeRaw).use(rehypeKatex, {
|
|
327
|
+
strict: 'ignore'
|
|
328
|
+
}).use(rehypeFootnoteRef);
|
|
329
|
+
if (extraRemarkPlugins) {
|
|
330
|
+
extraRemarkPlugins.forEach(function(entry) {
|
|
331
|
+
if (Array.isArray(entry)) {
|
|
332
|
+
var _processor;
|
|
333
|
+
var _entry = _to_array(entry), plugin = _entry[0], pluginOptions = _entry.slice(1);
|
|
334
|
+
(_processor = processor).use.apply(_processor, [
|
|
335
|
+
plugin
|
|
336
|
+
].concat(_to_consumable_array(pluginOptions)));
|
|
337
|
+
} else {
|
|
338
|
+
processor.use(entry);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
if (config === null || config === void 0 ? void 0 : config.markedConfig) {
|
|
343
|
+
config.markedConfig.forEach(function(entry) {
|
|
344
|
+
if (Array.isArray(entry)) {
|
|
345
|
+
var _processor;
|
|
346
|
+
var _entry = _to_array(entry), plugin = _entry[0], pluginOptions = _entry.slice(1);
|
|
347
|
+
(_processor = processor).use.apply(_processor, [
|
|
348
|
+
plugin
|
|
349
|
+
].concat(_to_consumable_array(pluginOptions)));
|
|
350
|
+
} else {
|
|
351
|
+
processor.use(entry);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
return processor;
|
|
356
|
+
};
|
|
357
|
+
var extractLanguageFromClassName = function extractLanguageFromClassName(className) {
|
|
358
|
+
if (!className) return undefined;
|
|
359
|
+
var classes = Array.isArray(className) ? className : [
|
|
360
|
+
className
|
|
361
|
+
];
|
|
362
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
363
|
+
try {
|
|
364
|
+
for(var _iterator = classes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
365
|
+
var cls = _step.value;
|
|
366
|
+
var match = String(cls).match(/^language-(.+)$/);
|
|
367
|
+
if (match) return match[1];
|
|
368
|
+
}
|
|
369
|
+
} catch (err) {
|
|
370
|
+
_didIteratorError = true;
|
|
371
|
+
_iteratorError = err;
|
|
372
|
+
} finally{
|
|
373
|
+
try {
|
|
374
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
375
|
+
_iterator.return();
|
|
376
|
+
}
|
|
377
|
+
} finally{
|
|
378
|
+
if (_didIteratorError) {
|
|
379
|
+
throw _iteratorError;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return undefined;
|
|
384
|
+
};
|
|
385
|
+
/**
|
|
386
|
+
* 提取 React children 的文本内容
|
|
387
|
+
*/ var extractChildrenText = function extractChildrenText1(children) {
|
|
388
|
+
var _children_props;
|
|
389
|
+
if (typeof children === 'string') return children;
|
|
390
|
+
if (typeof children === 'number') return String(children);
|
|
391
|
+
if (Array.isArray(children)) return children.map(extractChildrenText).join('');
|
|
392
|
+
if (React.isValidElement(children) && ((_children_props = children.props) === null || _children_props === void 0 ? void 0 : _children_props.children)) {
|
|
393
|
+
return extractChildrenText(children.props.children);
|
|
394
|
+
}
|
|
395
|
+
return '';
|
|
396
|
+
};
|
|
397
|
+
/**
|
|
398
|
+
* <think> 标签渲染组件——使用 ToolUseBarThink 替代原生 DOM。
|
|
399
|
+
* 在 MarkdownEditor 中,<think> 被预处理为 ```think 代码块,
|
|
400
|
+
* 然后由 ThinkBlock 组件(依赖 Slate 上下文)渲染为 ToolUseBarThink。
|
|
401
|
+
* 在 MarkdownRenderer 中,<think> 通过 rehypeRaw 保留为 hast 元素,
|
|
402
|
+
* 这里直接渲染为 ToolUseBarThink,无需 Slate 上下文。
|
|
403
|
+
*/ var ThinkBlockRendererComponent = function ThinkBlockRendererComponent(props) {
|
|
404
|
+
var children = props.children;
|
|
405
|
+
var content = extractChildrenText(children);
|
|
406
|
+
var isLoading = content.endsWith('...');
|
|
407
|
+
return React.createElement(ToolUseBarThink, {
|
|
408
|
+
testId: 'think-block-renderer',
|
|
409
|
+
styles: {
|
|
410
|
+
root: {
|
|
411
|
+
boxSizing: 'border-box',
|
|
412
|
+
maxWidth: '680px',
|
|
413
|
+
marginTop: 8
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
toolName: isLoading ? '深度思考...' : '深度思考',
|
|
417
|
+
thinkContent: content,
|
|
418
|
+
status: isLoading ? 'loading' : 'success'
|
|
419
|
+
});
|
|
420
|
+
};
|
|
421
|
+
/**
|
|
422
|
+
* 构建与 MarkdownEditor Readonly 组件对齐的 hast→React 组件映射。
|
|
423
|
+
*
|
|
424
|
+
* MarkdownEditor 的 Slate 元素使用 data-be 属性和 prefixCls 类名,
|
|
425
|
+
* 这里为原生 HTML 标签添加相同的属性,使共用的 CSS 能正确命中。
|
|
426
|
+
*/ var buildEditorAlignedComponents = function buildEditorAlignedComponents(prefixCls, userComponents, streaming, linkConfig) {
|
|
427
|
+
var listCls = "".concat(prefixCls, "-list");
|
|
428
|
+
var tableCls = "".concat(prefixCls, "-content-table");
|
|
429
|
+
var contentCls = prefixCls; // e.g. ant-agentic-md-editor-content
|
|
430
|
+
var wrapAnimation = function wrapAnimation(children) {
|
|
431
|
+
return streaming ? jsx(AnimationText, {
|
|
432
|
+
children: children
|
|
433
|
+
}) : children;
|
|
434
|
+
};
|
|
435
|
+
return _object_spread({
|
|
436
|
+
// ================================================================
|
|
437
|
+
// Block 级别元素
|
|
438
|
+
// ================================================================
|
|
439
|
+
p: function p(props) {
|
|
440
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
441
|
+
"node",
|
|
442
|
+
"children"
|
|
443
|
+
]);
|
|
444
|
+
return jsx('div', _object_spread_props(_object_spread({}, rest), {
|
|
445
|
+
'data-be': 'paragraph',
|
|
446
|
+
'data-testid': 'markdown-paragraph',
|
|
447
|
+
children: wrapAnimation(children)
|
|
448
|
+
}));
|
|
449
|
+
},
|
|
450
|
+
h1: function h1(props) {
|
|
451
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
452
|
+
"node",
|
|
453
|
+
"children"
|
|
454
|
+
]);
|
|
455
|
+
return jsx('h1', _object_spread_props(_object_spread({}, rest), {
|
|
456
|
+
'data-be': 'head',
|
|
457
|
+
'data-testid': 'markdown-heading-1',
|
|
458
|
+
children: wrapAnimation(children)
|
|
459
|
+
}));
|
|
460
|
+
},
|
|
461
|
+
h2: function h2(props) {
|
|
462
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
463
|
+
"node",
|
|
464
|
+
"children"
|
|
465
|
+
]);
|
|
466
|
+
return jsx('h2', _object_spread_props(_object_spread({}, rest), {
|
|
467
|
+
'data-be': 'head',
|
|
468
|
+
'data-testid': 'markdown-heading-2',
|
|
469
|
+
children: wrapAnimation(children)
|
|
470
|
+
}));
|
|
471
|
+
},
|
|
472
|
+
h3: function h3(props) {
|
|
473
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
474
|
+
"node",
|
|
475
|
+
"children"
|
|
476
|
+
]);
|
|
477
|
+
return jsx('h3', _object_spread_props(_object_spread({}, rest), {
|
|
478
|
+
'data-be': 'head',
|
|
479
|
+
'data-testid': 'markdown-heading-3',
|
|
480
|
+
children: wrapAnimation(children)
|
|
481
|
+
}));
|
|
482
|
+
},
|
|
483
|
+
h4: function h4(props) {
|
|
484
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
485
|
+
"node",
|
|
486
|
+
"children"
|
|
487
|
+
]);
|
|
488
|
+
return jsx('h4', _object_spread_props(_object_spread({}, rest), {
|
|
489
|
+
'data-be': 'head',
|
|
490
|
+
'data-testid': 'markdown-heading-4',
|
|
491
|
+
children: wrapAnimation(children)
|
|
492
|
+
}));
|
|
493
|
+
},
|
|
494
|
+
h5: function h5(props) {
|
|
495
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
496
|
+
"node",
|
|
497
|
+
"children"
|
|
498
|
+
]);
|
|
499
|
+
return jsx('h5', _object_spread_props(_object_spread({}, rest), {
|
|
500
|
+
'data-be': 'head',
|
|
501
|
+
'data-testid': 'markdown-heading-5',
|
|
502
|
+
children: wrapAnimation(children)
|
|
503
|
+
}));
|
|
504
|
+
},
|
|
505
|
+
h6: function h6(props) {
|
|
506
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
507
|
+
"node",
|
|
508
|
+
"children"
|
|
509
|
+
]);
|
|
510
|
+
return jsx('h6', _object_spread_props(_object_spread({}, rest), {
|
|
511
|
+
'data-be': 'head',
|
|
512
|
+
'data-testid': 'markdown-heading-6',
|
|
513
|
+
children: wrapAnimation(children)
|
|
514
|
+
}));
|
|
515
|
+
},
|
|
516
|
+
blockquote: function blockquote(props) {
|
|
517
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
518
|
+
"node",
|
|
519
|
+
"children"
|
|
520
|
+
]);
|
|
521
|
+
return jsx('blockquote', _object_spread_props(_object_spread({}, rest), {
|
|
522
|
+
'data-be': 'blockquote',
|
|
523
|
+
'data-testid': 'markdown-blockquote',
|
|
524
|
+
children: children
|
|
525
|
+
}));
|
|
526
|
+
},
|
|
527
|
+
ul: function ul(props) {
|
|
528
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
529
|
+
"node",
|
|
530
|
+
"children"
|
|
531
|
+
]);
|
|
532
|
+
return jsx('div', {
|
|
533
|
+
className: "".concat(listCls, "-container"),
|
|
534
|
+
'data-be': 'list',
|
|
535
|
+
'data-testid': 'markdown-unordered-list',
|
|
536
|
+
children: jsx('ul', _object_spread_props(_object_spread({}, rest), {
|
|
537
|
+
className: "".concat(listCls, " ul"),
|
|
538
|
+
children: children
|
|
539
|
+
}))
|
|
540
|
+
});
|
|
541
|
+
},
|
|
542
|
+
ol: function ol(props) {
|
|
543
|
+
var _node = props.node, children = props.children, start = props.start, rest = _object_without_properties(props, [
|
|
544
|
+
"node",
|
|
545
|
+
"children",
|
|
546
|
+
"start"
|
|
547
|
+
]);
|
|
548
|
+
return jsx('div', {
|
|
549
|
+
className: "".concat(listCls, "-container"),
|
|
550
|
+
'data-be': 'list',
|
|
551
|
+
'data-testid': 'markdown-ordered-list',
|
|
552
|
+
children: jsx('ol', _object_spread_props(_object_spread({}, rest), {
|
|
553
|
+
className: "".concat(listCls, " ol"),
|
|
554
|
+
start: start,
|
|
555
|
+
children: children
|
|
556
|
+
}))
|
|
557
|
+
});
|
|
558
|
+
},
|
|
559
|
+
li: function li(props) {
|
|
560
|
+
var _node = props.node, children = props.children, className = props.className, rest = _object_without_properties(props, [
|
|
561
|
+
"node",
|
|
562
|
+
"children",
|
|
563
|
+
"className"
|
|
564
|
+
]);
|
|
565
|
+
var isTask = className === 'task-list-item' || Array.isArray(className) && className.includes('task-list-item');
|
|
566
|
+
if (isTask) {
|
|
567
|
+
var childArray = Array.isArray(children) ? children : [
|
|
568
|
+
children
|
|
569
|
+
];
|
|
570
|
+
var checked = false;
|
|
571
|
+
var filteredChildren = childArray.filter(function(child) {
|
|
572
|
+
var _child_props;
|
|
573
|
+
if (React.isValidElement(child) && ((_child_props = child.props) === null || _child_props === void 0 ? void 0 : _child_props.type) === 'checkbox') {
|
|
574
|
+
var _child_props1;
|
|
575
|
+
checked = !!((_child_props1 = child.props) === null || _child_props1 === void 0 ? void 0 : _child_props1.checked);
|
|
576
|
+
return false;
|
|
577
|
+
}
|
|
578
|
+
return true;
|
|
579
|
+
});
|
|
580
|
+
return jsxs('li', _object_spread_props(_object_spread({}, rest), {
|
|
581
|
+
className: "".concat(listCls, "-item ").concat(listCls, "-task"),
|
|
582
|
+
'data-be': 'list-item',
|
|
583
|
+
'data-testid': 'markdown-task-item',
|
|
584
|
+
children: [
|
|
585
|
+
jsx('span', {
|
|
586
|
+
className: "".concat(listCls, "-check-item"),
|
|
587
|
+
contentEditable: false,
|
|
588
|
+
'data-check-item': true,
|
|
589
|
+
children: jsx(Checkbox, {
|
|
590
|
+
checked: checked,
|
|
591
|
+
disabled: true
|
|
592
|
+
})
|
|
593
|
+
})
|
|
594
|
+
].concat(_to_consumable_array(filteredChildren))
|
|
595
|
+
}));
|
|
596
|
+
}
|
|
597
|
+
return jsx('li', _object_spread_props(_object_spread({}, rest), {
|
|
598
|
+
className: "".concat(listCls, "-item"),
|
|
599
|
+
'data-be': 'list-item',
|
|
600
|
+
'data-testid': 'markdown-list-item',
|
|
601
|
+
children: wrapAnimation(children)
|
|
602
|
+
}));
|
|
603
|
+
},
|
|
604
|
+
table: function table(props) {
|
|
605
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
606
|
+
"node",
|
|
607
|
+
"children"
|
|
608
|
+
]);
|
|
609
|
+
return jsx('div', {
|
|
610
|
+
className: tableCls,
|
|
611
|
+
'data-testid': 'markdown-table',
|
|
612
|
+
children: jsx('div', {
|
|
613
|
+
className: "".concat(tableCls, "-container"),
|
|
614
|
+
children: jsx('table', _object_spread_props(_object_spread({}, rest), {
|
|
615
|
+
className: "".concat(tableCls, "-readonly-table"),
|
|
616
|
+
style: {
|
|
617
|
+
tableLayout: 'auto',
|
|
618
|
+
width: '100%'
|
|
619
|
+
},
|
|
620
|
+
children: children
|
|
621
|
+
}))
|
|
622
|
+
})
|
|
623
|
+
});
|
|
624
|
+
},
|
|
625
|
+
thead: function thead(props) {
|
|
626
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
627
|
+
"node",
|
|
628
|
+
"children"
|
|
629
|
+
]);
|
|
630
|
+
return jsx('thead', _object_spread_props(_object_spread({}, rest), {
|
|
631
|
+
'data-testid': 'markdown-thead',
|
|
632
|
+
children: children
|
|
633
|
+
}));
|
|
634
|
+
},
|
|
635
|
+
tbody: function tbody(props) {
|
|
636
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
637
|
+
"node",
|
|
638
|
+
"children"
|
|
639
|
+
]);
|
|
640
|
+
return jsx('tbody', _object_spread_props(_object_spread({}, rest), {
|
|
641
|
+
'data-testid': 'markdown-tbody',
|
|
642
|
+
children: children
|
|
643
|
+
}));
|
|
644
|
+
},
|
|
645
|
+
tr: function tr(props) {
|
|
646
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
647
|
+
"node",
|
|
648
|
+
"children"
|
|
649
|
+
]);
|
|
650
|
+
return jsx('tr', _object_spread_props(_object_spread({}, rest), {
|
|
651
|
+
'data-testid': 'markdown-tr',
|
|
652
|
+
children: children
|
|
653
|
+
}));
|
|
654
|
+
},
|
|
655
|
+
th: function th(props) {
|
|
656
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
657
|
+
"node",
|
|
658
|
+
"children"
|
|
659
|
+
]);
|
|
660
|
+
return jsx('th', _object_spread_props(_object_spread({}, rest), {
|
|
661
|
+
'data-testid': 'markdown-th',
|
|
662
|
+
style: {
|
|
663
|
+
whiteSpace: 'normal',
|
|
664
|
+
maxWidth: '20%'
|
|
665
|
+
},
|
|
666
|
+
children: children
|
|
667
|
+
}));
|
|
668
|
+
},
|
|
669
|
+
td: function td(props) {
|
|
670
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
671
|
+
"node",
|
|
672
|
+
"children"
|
|
673
|
+
]);
|
|
674
|
+
return jsx('td', _object_spread_props(_object_spread({}, rest), {
|
|
675
|
+
'data-testid': 'markdown-td',
|
|
676
|
+
style: {
|
|
677
|
+
whiteSpace: 'normal',
|
|
678
|
+
maxWidth: '20%'
|
|
679
|
+
},
|
|
680
|
+
children: wrapAnimation(children)
|
|
681
|
+
}));
|
|
682
|
+
},
|
|
683
|
+
// input[type=checkbox]:task list 的 checkbox(兜底,主逻辑在 li 中)
|
|
684
|
+
input: function input(props) {
|
|
685
|
+
var _node = props.node, type = props.type, checked = props.checked, disabled = props.disabled, rest = _object_without_properties(props, [
|
|
686
|
+
"node",
|
|
687
|
+
"type",
|
|
688
|
+
"checked",
|
|
689
|
+
"disabled"
|
|
690
|
+
]);
|
|
691
|
+
if (type === 'checkbox') {
|
|
692
|
+
return jsx(Checkbox, {
|
|
693
|
+
checked: !!checked,
|
|
694
|
+
disabled: true,
|
|
695
|
+
'data-testid': 'markdown-checkbox'
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
return jsx('input', _object_spread_props(_object_spread({}, rest), {
|
|
699
|
+
type: type,
|
|
700
|
+
checked: checked,
|
|
701
|
+
disabled: disabled
|
|
702
|
+
}));
|
|
703
|
+
},
|
|
704
|
+
// ================================================================
|
|
705
|
+
// Leaf 级别(行内元素)
|
|
706
|
+
// ================================================================
|
|
707
|
+
a: function a(props) {
|
|
708
|
+
var _node = props.node, href = props.href, _origOnClick = props.onClick, rest = _object_without_properties(props, [
|
|
709
|
+
"node",
|
|
710
|
+
"href",
|
|
711
|
+
"onClick"
|
|
712
|
+
]);
|
|
713
|
+
var openInNewTab = (linkConfig === null || linkConfig === void 0 ? void 0 : linkConfig.openInNewTab) !== false;
|
|
714
|
+
return jsx('a', _object_spread_props(_object_spread({}, rest), {
|
|
715
|
+
href: href,
|
|
716
|
+
'data-be': 'text',
|
|
717
|
+
'data-url': 'url',
|
|
718
|
+
'data-testid': 'markdown-link',
|
|
719
|
+
target: openInNewTab ? '_blank' : undefined,
|
|
720
|
+
rel: openInNewTab ? 'noopener noreferrer' : undefined,
|
|
721
|
+
onClick: function onClick(e) {
|
|
722
|
+
if (linkConfig === null || linkConfig === void 0 ? void 0 : linkConfig.onClick) {
|
|
723
|
+
var res = linkConfig.onClick(href);
|
|
724
|
+
if (res === false) {
|
|
725
|
+
e.preventDefault();
|
|
726
|
+
return;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}));
|
|
731
|
+
},
|
|
732
|
+
strong: function strong(props) {
|
|
733
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
734
|
+
"node",
|
|
735
|
+
"children"
|
|
736
|
+
]);
|
|
737
|
+
return jsx('strong', _object_spread_props(_object_spread({}, rest), {
|
|
738
|
+
'data-testid': 'markdown-bold',
|
|
739
|
+
style: {
|
|
740
|
+
fontWeight: 'bold'
|
|
741
|
+
},
|
|
742
|
+
children: children
|
|
743
|
+
}));
|
|
744
|
+
},
|
|
745
|
+
em: function em(props) {
|
|
746
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
747
|
+
"node",
|
|
748
|
+
"children"
|
|
749
|
+
]);
|
|
750
|
+
return jsx('em', _object_spread_props(_object_spread({}, rest), {
|
|
751
|
+
'data-testid': 'markdown-italic',
|
|
752
|
+
style: {
|
|
753
|
+
fontStyle: 'italic'
|
|
754
|
+
},
|
|
755
|
+
children: children
|
|
756
|
+
}));
|
|
757
|
+
},
|
|
758
|
+
del: function del(props) {
|
|
759
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
760
|
+
"node",
|
|
761
|
+
"children"
|
|
762
|
+
]);
|
|
763
|
+
return jsx('del', _object_spread_props(_object_spread({}, rest), {
|
|
764
|
+
'data-testid': 'markdown-strikethrough',
|
|
765
|
+
children: children
|
|
766
|
+
}));
|
|
767
|
+
},
|
|
768
|
+
code: function code(props) {
|
|
769
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
770
|
+
"node",
|
|
771
|
+
"children"
|
|
772
|
+
]);
|
|
773
|
+
return jsx('code', _object_spread_props(_object_spread({}, rest), {
|
|
774
|
+
'data-testid': 'markdown-inline-code',
|
|
775
|
+
className: "".concat(contentCls, "-inline-code"),
|
|
776
|
+
children: children
|
|
777
|
+
}));
|
|
778
|
+
},
|
|
779
|
+
mark: function mark(props) {
|
|
780
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
781
|
+
"node",
|
|
782
|
+
"children"
|
|
783
|
+
]);
|
|
784
|
+
return jsx('mark', _object_spread_props(_object_spread({}, rest), {
|
|
785
|
+
'data-testid': 'markdown-mark',
|
|
786
|
+
style: {
|
|
787
|
+
background: '#f59e0b',
|
|
788
|
+
padding: '0.1em 0.2em',
|
|
789
|
+
borderRadius: 2
|
|
790
|
+
},
|
|
791
|
+
children: children
|
|
792
|
+
}));
|
|
793
|
+
},
|
|
794
|
+
kbd: function kbd(props) {
|
|
795
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
796
|
+
"node",
|
|
797
|
+
"children"
|
|
798
|
+
]);
|
|
799
|
+
return jsx('kbd', _object_spread_props(_object_spread({}, rest), {
|
|
800
|
+
'data-testid': 'markdown-kbd',
|
|
801
|
+
style: {
|
|
802
|
+
padding: '0.1em 0.4em',
|
|
803
|
+
fontSize: '0.85em',
|
|
804
|
+
border: '1px solid var(--color-gray-border-light, #d9d9d9)',
|
|
805
|
+
borderRadius: 3,
|
|
806
|
+
boxShadow: '0 1px 0 var(--color-gray-border-light, #d9d9d9)',
|
|
807
|
+
fontFamily: 'Consolas, Monaco, "Courier New", monospace'
|
|
808
|
+
},
|
|
809
|
+
children: children
|
|
810
|
+
}));
|
|
811
|
+
},
|
|
812
|
+
sub: function sub(props) {
|
|
813
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
814
|
+
"node",
|
|
815
|
+
"children"
|
|
816
|
+
]);
|
|
817
|
+
return jsx('sub', _object_spread_props(_object_spread({}, rest), {
|
|
818
|
+
'data-testid': 'markdown-sub',
|
|
819
|
+
children: children
|
|
820
|
+
}));
|
|
821
|
+
},
|
|
822
|
+
// ================================================================
|
|
823
|
+
// 代码块 pre > code → 路由到自定义渲染器
|
|
824
|
+
pre: function pre(props) {
|
|
825
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
826
|
+
"node",
|
|
827
|
+
"children"
|
|
828
|
+
]);
|
|
829
|
+
var codeChild = Array.isArray(children) ? children[0] : children;
|
|
830
|
+
var codeProps = (codeChild === null || codeChild === void 0 ? void 0 : codeChild.props) || {};
|
|
831
|
+
var language = extractLanguageFromClassName(codeProps.className);
|
|
832
|
+
var CodeBlockComponent = userComponents.__codeBlock || userComponents.code;
|
|
833
|
+
if (CodeBlockComponent) {
|
|
834
|
+
return jsx(CodeBlockComponent, _object_spread_props(_object_spread({}, rest), {
|
|
835
|
+
language: language,
|
|
836
|
+
children: codeProps.children,
|
|
837
|
+
node: _node
|
|
838
|
+
}));
|
|
839
|
+
}
|
|
840
|
+
return jsxs('pre', _object_spread_props(_object_spread({}, rest), {
|
|
841
|
+
children: [
|
|
842
|
+
children
|
|
843
|
+
]
|
|
844
|
+
}));
|
|
845
|
+
},
|
|
846
|
+
img: function img(props) {
|
|
847
|
+
var _node = props.node, src = props.src, alt = props.alt, width = props.width, height = props.height, _rest = _object_without_properties(props, [
|
|
848
|
+
"node",
|
|
849
|
+
"src",
|
|
850
|
+
"alt",
|
|
851
|
+
"width",
|
|
852
|
+
"height"
|
|
853
|
+
]);
|
|
854
|
+
var imgWidth = width ? Number(width) || width : 400;
|
|
855
|
+
return jsx('div', {
|
|
856
|
+
'data-be': 'image',
|
|
857
|
+
'data-testid': 'markdown-image',
|
|
858
|
+
style: {
|
|
859
|
+
position: 'relative',
|
|
860
|
+
userSelect: 'none',
|
|
861
|
+
width: '100%',
|
|
862
|
+
maxWidth: '100%',
|
|
863
|
+
boxSizing: 'border-box'
|
|
864
|
+
},
|
|
865
|
+
children: jsx('div', {
|
|
866
|
+
style: {
|
|
867
|
+
padding: 4,
|
|
868
|
+
userSelect: 'none',
|
|
869
|
+
display: 'flex',
|
|
870
|
+
flexDirection: 'column',
|
|
871
|
+
width: '100%',
|
|
872
|
+
maxWidth: '100%',
|
|
873
|
+
boxSizing: 'border-box'
|
|
874
|
+
},
|
|
875
|
+
'data-testid': 'image-container',
|
|
876
|
+
'data-be': 'image-container',
|
|
877
|
+
children: jsx(Image, {
|
|
878
|
+
src: src,
|
|
879
|
+
alt: alt || 'image',
|
|
880
|
+
width: imgWidth,
|
|
881
|
+
height: height,
|
|
882
|
+
preview: {
|
|
883
|
+
getContainer: function getContainer() {
|
|
884
|
+
return document.body;
|
|
885
|
+
}
|
|
886
|
+
},
|
|
887
|
+
referrerPolicy: 'no-referrer',
|
|
888
|
+
draggable: false,
|
|
889
|
+
style: {
|
|
890
|
+
maxWidth: '100%',
|
|
891
|
+
height: 'auto',
|
|
892
|
+
display: 'block'
|
|
893
|
+
}
|
|
894
|
+
})
|
|
895
|
+
})
|
|
896
|
+
});
|
|
897
|
+
},
|
|
898
|
+
// 视频:对齐 ReadonlyMedia 的 video 处理
|
|
899
|
+
video: function video(props) {
|
|
900
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
901
|
+
"node",
|
|
902
|
+
"children"
|
|
903
|
+
]);
|
|
904
|
+
return jsx('div', {
|
|
905
|
+
'data-be': 'media',
|
|
906
|
+
'data-testid': 'markdown-video',
|
|
907
|
+
style: {
|
|
908
|
+
position: 'relative',
|
|
909
|
+
width: '100%',
|
|
910
|
+
maxWidth: '100%',
|
|
911
|
+
margin: '0.5em 0'
|
|
912
|
+
},
|
|
913
|
+
children: jsx('video', _object_spread_props(_object_spread({}, rest), {
|
|
914
|
+
controls: true,
|
|
915
|
+
style: {
|
|
916
|
+
maxWidth: '100%',
|
|
917
|
+
borderRadius: 8
|
|
918
|
+
},
|
|
919
|
+
children: children
|
|
920
|
+
}))
|
|
921
|
+
});
|
|
922
|
+
},
|
|
923
|
+
// 音频:对齐 ReadonlyMedia 的 audio 处理
|
|
924
|
+
audio: function audio(props) {
|
|
925
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
926
|
+
"node",
|
|
927
|
+
"children"
|
|
928
|
+
]);
|
|
929
|
+
return jsx('div', {
|
|
930
|
+
'data-be': 'media',
|
|
931
|
+
'data-testid': 'markdown-audio',
|
|
932
|
+
style: {
|
|
933
|
+
position: 'relative',
|
|
934
|
+
width: '100%',
|
|
935
|
+
margin: '0.5em 0'
|
|
936
|
+
},
|
|
937
|
+
children: jsx('audio', _object_spread_props(_object_spread({}, rest), {
|
|
938
|
+
controls: true,
|
|
939
|
+
style: {
|
|
940
|
+
width: '100%'
|
|
941
|
+
},
|
|
942
|
+
children: children
|
|
943
|
+
}))
|
|
944
|
+
});
|
|
945
|
+
},
|
|
946
|
+
// iframe
|
|
947
|
+
iframe: function iframe(props) {
|
|
948
|
+
var _node = props.node, rest = _object_without_properties(props, [
|
|
949
|
+
"node"
|
|
950
|
+
]);
|
|
951
|
+
return jsx('div', {
|
|
952
|
+
'data-testid': 'markdown-iframe',
|
|
953
|
+
style: {
|
|
954
|
+
position: 'relative',
|
|
955
|
+
width: '100%',
|
|
956
|
+
margin: '0.5em 0'
|
|
957
|
+
},
|
|
958
|
+
children: jsx('iframe', _object_spread_props(_object_spread({}, rest), {
|
|
959
|
+
style: {
|
|
960
|
+
width: '100%',
|
|
961
|
+
minHeight: 300,
|
|
962
|
+
border: '1px solid var(--color-gray-border-light, #e8e8e8)',
|
|
963
|
+
borderRadius: 8
|
|
964
|
+
}
|
|
965
|
+
}))
|
|
966
|
+
});
|
|
967
|
+
},
|
|
968
|
+
hr: function hr(props) {
|
|
969
|
+
var _node = props.node, rest = _object_without_properties(props, [
|
|
970
|
+
"node"
|
|
971
|
+
]);
|
|
972
|
+
return jsx('hr', _object_spread_props(_object_spread({}, rest), {
|
|
973
|
+
'data-be': 'hr',
|
|
974
|
+
'data-testid': 'markdown-hr'
|
|
975
|
+
}));
|
|
976
|
+
},
|
|
977
|
+
// 脚注引用 sup > a(remark-gfm 有定义时生成)
|
|
978
|
+
sup: function sup(props) {
|
|
979
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
980
|
+
"node",
|
|
981
|
+
"children"
|
|
982
|
+
]);
|
|
983
|
+
return jsx('span', _object_spread_props(_object_spread({}, rest), {
|
|
984
|
+
'data-fnc': 'fnc',
|
|
985
|
+
'data-testid': 'markdown-footnote-ref',
|
|
986
|
+
className: "".concat(contentCls, "-fnc"),
|
|
987
|
+
style: {
|
|
988
|
+
fontSize: 12,
|
|
989
|
+
cursor: 'pointer'
|
|
990
|
+
},
|
|
991
|
+
children: children
|
|
992
|
+
}));
|
|
993
|
+
},
|
|
994
|
+
span: function span(props) {
|
|
995
|
+
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
996
|
+
"node",
|
|
997
|
+
"children"
|
|
998
|
+
]);
|
|
999
|
+
if (rest['data-fnc'] === 'fnc') {
|
|
1000
|
+
return jsx('span', _object_spread_props(_object_spread({}, rest), {
|
|
1001
|
+
'data-testid': 'markdown-footnote-ref',
|
|
1002
|
+
className: "".concat(contentCls, "-fnc"),
|
|
1003
|
+
style: {
|
|
1004
|
+
fontSize: 12,
|
|
1005
|
+
cursor: 'pointer'
|
|
1006
|
+
},
|
|
1007
|
+
children: children
|
|
1008
|
+
}));
|
|
1009
|
+
}
|
|
1010
|
+
return jsx('span', _object_spread_props(_object_spread({}, rest), {
|
|
1011
|
+
children: children
|
|
1012
|
+
}));
|
|
1013
|
+
},
|
|
1014
|
+
section: function section(props) {
|
|
1015
|
+
var _node = props.node, children = props.children, className = props.className, rest = _object_without_properties(props, [
|
|
1016
|
+
"node",
|
|
1017
|
+
"children",
|
|
1018
|
+
"className"
|
|
1019
|
+
]);
|
|
1020
|
+
var isFootnotes = className === 'footnotes' || typeof (rest === null || rest === void 0 ? void 0 : rest['data-footnotes']) !== 'undefined';
|
|
1021
|
+
if (isFootnotes) {
|
|
1022
|
+
return jsx('div', _object_spread_props(_object_spread({}, rest), {
|
|
1023
|
+
'data-be': 'footnoteDefinition',
|
|
1024
|
+
'data-testid': 'markdown-footnote-section',
|
|
1025
|
+
style: {
|
|
1026
|
+
fontSize: 12,
|
|
1027
|
+
borderTop: '1px solid var(--color-gray-border-light, #e8e8e8)',
|
|
1028
|
+
marginTop: 16,
|
|
1029
|
+
paddingTop: 8
|
|
1030
|
+
},
|
|
1031
|
+
children: children
|
|
1032
|
+
}));
|
|
1033
|
+
}
|
|
1034
|
+
return jsx('section', _object_spread_props(_object_spread({}, rest), {
|
|
1035
|
+
className: className,
|
|
1036
|
+
children: children
|
|
1037
|
+
}));
|
|
1038
|
+
},
|
|
1039
|
+
think: ThinkBlockRendererComponent,
|
|
1040
|
+
answer: function answer(props) {
|
|
1041
|
+
var _node = props.node, children = props.children;
|
|
1042
|
+
return jsx(Fragment, {
|
|
1043
|
+
children: children
|
|
1044
|
+
});
|
|
1045
|
+
}
|
|
1046
|
+
}, userComponents);
|
|
1047
|
+
};
|
|
1048
|
+
/**
|
|
1049
|
+
* 将单个 markdown 片段转为 React 元素(内部函数)
|
|
1050
|
+
*/ var renderMarkdownBlock = function renderMarkdownBlock(blockContent, processor, components) {
|
|
1051
|
+
if (!blockContent.trim()) return null;
|
|
1052
|
+
try {
|
|
1053
|
+
var mdast = processor.parse(blockContent);
|
|
1054
|
+
var hast = processor.runSync(mdast);
|
|
1055
|
+
return toJsxRuntime(hast, {
|
|
1056
|
+
Fragment: Fragment,
|
|
1057
|
+
jsx: jsx,
|
|
1058
|
+
jsxs: jsxs,
|
|
1059
|
+
components: components
|
|
1060
|
+
});
|
|
1061
|
+
} catch (unused) {
|
|
1062
|
+
return null;
|
|
1063
|
+
}
|
|
1064
|
+
};
|
|
1065
|
+
/**
|
|
1066
|
+
* 将 markdown 按块(双换行)拆分,尊重代码围栏边界。
|
|
1067
|
+
* 返回的每个块是一个独立的 markdown 片段,可单独解析。
|
|
1068
|
+
*/ var splitMarkdownBlocks = function splitMarkdownBlocks(content) {
|
|
1069
|
+
var lines = content.split('\n');
|
|
1070
|
+
var blocks = [];
|
|
1071
|
+
var current = [];
|
|
1072
|
+
var inFence = false;
|
|
1073
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1074
|
+
try {
|
|
1075
|
+
for(var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1076
|
+
var line = _step.value;
|
|
1077
|
+
var trimmed = line.trimStart();
|
|
1078
|
+
if (trimmed.startsWith('```') || trimmed.startsWith('~~~')) {
|
|
1079
|
+
inFence = !inFence;
|
|
1080
|
+
}
|
|
1081
|
+
if (!inFence && line === '' && current.length > 0) {
|
|
1082
|
+
var prev = current[current.length - 1];
|
|
1083
|
+
if (prev === '') {
|
|
1084
|
+
blocks.push(current.join('\n'));
|
|
1085
|
+
current = [];
|
|
1086
|
+
continue;
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
current.push(line);
|
|
1090
|
+
}
|
|
1091
|
+
} catch (err) {
|
|
1092
|
+
_didIteratorError = true;
|
|
1093
|
+
_iteratorError = err;
|
|
1094
|
+
} finally{
|
|
1095
|
+
try {
|
|
1096
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1097
|
+
_iterator.return();
|
|
1098
|
+
}
|
|
1099
|
+
} finally{
|
|
1100
|
+
if (_didIteratorError) {
|
|
1101
|
+
throw _iteratorError;
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
if (current.length > 0) {
|
|
1106
|
+
blocks.push(current.join('\n'));
|
|
1107
|
+
}
|
|
1108
|
+
return blocks;
|
|
1109
|
+
};
|
|
1110
|
+
var _BLOCK_CACHE_KEY = Symbol('blockCache');
|
|
1111
|
+
/**
|
|
1112
|
+
* 将 markdown 字符串转换为 React 元素树的 hook。
|
|
1113
|
+
*
|
|
1114
|
+
* 性能优化:分块缓存
|
|
1115
|
+
* - markdown 按双换行拆分为独立块
|
|
1116
|
+
* - 已完成的块(非最后一个)通过内容哈希缓存 React 输出
|
|
1117
|
+
* - 每次更新只重新解析变化的块(通常仅最后一个)
|
|
1118
|
+
* - 稳定块的 React 元素直接复用,跳过 parse → hast → jsx 全链路
|
|
1119
|
+
*/ /**
|
|
1120
|
+
* 流式场景下,最后一个块每个字符都变化,但大部分变化只是尾部追加。
|
|
1121
|
+
* 对最后一个块做节流:只在新增了换行、块级标记、或超过一定字符数时才重新解析。
|
|
1122
|
+
*/ var LAST_BLOCK_THROTTLE_CHARS = 20;
|
|
1123
|
+
var BLOCK_BOUNDARY_TRIGGERS = /[\n`|#>*\-!$[\]]/;
|
|
1124
|
+
var shouldReparseLastBlock = function shouldReparseLastBlock(prevSource, newSource, streaming) {
|
|
1125
|
+
if (!streaming) return true;
|
|
1126
|
+
if (!prevSource) return true;
|
|
1127
|
+
if (newSource.length < prevSource.length) return true;
|
|
1128
|
+
if (!newSource.startsWith(prevSource)) return true;
|
|
1129
|
+
var added = newSource.slice(prevSource.length);
|
|
1130
|
+
if (added.length >= LAST_BLOCK_THROTTLE_CHARS) return true;
|
|
1131
|
+
if (BLOCK_BOUNDARY_TRIGGERS.test(added)) return true;
|
|
1132
|
+
return false;
|
|
1133
|
+
};
|
|
1134
|
+
export var useMarkdownToReact = function useMarkdownToReact(content, options) {
|
|
1135
|
+
var processorRef = useRef(null);
|
|
1136
|
+
var blockCacheRef = useRef(new Map());
|
|
1137
|
+
var lastBlockRef = useRef(null);
|
|
1138
|
+
var processor = useMemo(function() {
|
|
1139
|
+
var p = createHastProcessor(options === null || options === void 0 ? void 0 : options.remarkPlugins, options === null || options === void 0 ? void 0 : options.htmlConfig);
|
|
1140
|
+
processorRef.current = p;
|
|
1141
|
+
return p;
|
|
1142
|
+
}, [
|
|
1143
|
+
options === null || options === void 0 ? void 0 : options.remarkPlugins,
|
|
1144
|
+
options === null || options === void 0 ? void 0 : options.htmlConfig
|
|
1145
|
+
]);
|
|
1146
|
+
var prefixCls = (options === null || options === void 0 ? void 0 : options.prefixCls) || 'ant-agentic-md-editor';
|
|
1147
|
+
var components = useMemo(function() {
|
|
1148
|
+
var userComponents = (options === null || options === void 0 ? void 0 : options.components) || {};
|
|
1149
|
+
return buildEditorAlignedComponents(prefixCls, userComponents, options === null || options === void 0 ? void 0 : options.streaming, options === null || options === void 0 ? void 0 : options.linkConfig);
|
|
1150
|
+
}, [
|
|
1151
|
+
prefixCls,
|
|
1152
|
+
options === null || options === void 0 ? void 0 : options.components,
|
|
1153
|
+
options === null || options === void 0 ? void 0 : options.streaming,
|
|
1154
|
+
options === null || options === void 0 ? void 0 : options.linkConfig
|
|
1155
|
+
]);
|
|
1156
|
+
return useMemo(function() {
|
|
1157
|
+
if (!content) return null;
|
|
1158
|
+
try {
|
|
1159
|
+
var preprocessed = content.replace(new RegExp(JINJA_DOLLAR_PLACEHOLDER, 'g'), '$');
|
|
1160
|
+
var blocks = splitMarkdownBlocks(preprocessed);
|
|
1161
|
+
if (blocks.length === 0) return null;
|
|
1162
|
+
var cache = blockCacheRef.current;
|
|
1163
|
+
var newCache = new Map();
|
|
1164
|
+
var elements = [];
|
|
1165
|
+
for(var i = 0; i < blocks.length; i++){
|
|
1166
|
+
var block = blocks[i];
|
|
1167
|
+
var isLast = i === blocks.length - 1;
|
|
1168
|
+
// 用 index + 内容前 64 字符作 key,保持稳定性:
|
|
1169
|
+
// 相同位置 + 相同内容开头 → 相同 key → React 不 unmount
|
|
1170
|
+
var stableKey = "b".concat(i, "-").concat(block.slice(0, 64));
|
|
1171
|
+
if (!isLast) {
|
|
1172
|
+
var cached = cache.get(block);
|
|
1173
|
+
if (cached && cached.source === block) {
|
|
1174
|
+
newCache.set(block, cached);
|
|
1175
|
+
elements.push(jsx(Fragment, {
|
|
1176
|
+
children: cached.element
|
|
1177
|
+
}, stableKey));
|
|
1178
|
+
continue;
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
// 最后一个块:节流——仅在有意义的变化时重新解析
|
|
1182
|
+
if (isLast && lastBlockRef.current) {
|
|
1183
|
+
if (!shouldReparseLastBlock(lastBlockRef.current.source, block, options === null || options === void 0 ? void 0 : options.streaming)) {
|
|
1184
|
+
newCache.set(block, {
|
|
1185
|
+
source: lastBlockRef.current.source,
|
|
1186
|
+
element: lastBlockRef.current.element
|
|
1187
|
+
});
|
|
1188
|
+
elements.push(jsx(Fragment, {
|
|
1189
|
+
children: lastBlockRef.current.element
|
|
1190
|
+
}, stableKey));
|
|
1191
|
+
continue;
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
var element = renderMarkdownBlock(block, processor, components);
|
|
1195
|
+
var entry = {
|
|
1196
|
+
source: block,
|
|
1197
|
+
element: element
|
|
1198
|
+
};
|
|
1199
|
+
newCache.set(block, entry);
|
|
1200
|
+
if (isLast) lastBlockRef.current = entry;
|
|
1201
|
+
elements.push(jsx(Fragment, {
|
|
1202
|
+
children: element
|
|
1203
|
+
}, stableKey));
|
|
1204
|
+
}
|
|
1205
|
+
blockCacheRef.current = newCache;
|
|
1206
|
+
return jsxs(Fragment, {
|
|
1207
|
+
children: elements
|
|
1208
|
+
});
|
|
1209
|
+
} catch (error) {
|
|
1210
|
+
console.error('Failed to render markdown:', error);
|
|
1211
|
+
return null;
|
|
1212
|
+
}
|
|
1213
|
+
}, [
|
|
1214
|
+
content,
|
|
1215
|
+
processor,
|
|
1216
|
+
components,
|
|
1217
|
+
options === null || options === void 0 ? void 0 : options.streaming
|
|
1218
|
+
]);
|
|
1219
|
+
};
|
|
1220
|
+
/**
|
|
1221
|
+
* 同步将 markdown 转为 React 元素(非 hook 版本,用于测试或一次性转换)
|
|
1222
|
+
*/ export var markdownToReactSync = function markdownToReactSync(content, components, remarkPlugins, htmlConfig) {
|
|
1223
|
+
if (!content) return null;
|
|
1224
|
+
try {
|
|
1225
|
+
var processor = createHastProcessor(remarkPlugins, htmlConfig);
|
|
1226
|
+
var preprocessed = content.replace(new RegExp(JINJA_DOLLAR_PLACEHOLDER, 'g'), '$');
|
|
1227
|
+
var mdast = processor.parse(preprocessed);
|
|
1228
|
+
var hast = processor.runSync(mdast);
|
|
1229
|
+
var userComps = components || {};
|
|
1230
|
+
var allComponents = buildEditorAlignedComponents('ant-agentic-md-editor', userComps, false);
|
|
1231
|
+
return toJsxRuntime(hast, {
|
|
1232
|
+
Fragment: Fragment,
|
|
1233
|
+
jsx: jsx,
|
|
1234
|
+
jsxs: jsxs,
|
|
1235
|
+
components: allComponents
|
|
1236
|
+
});
|
|
1237
|
+
} catch (error) {
|
|
1238
|
+
console.error('Failed to render markdown:', error);
|
|
1239
|
+
return null;
|
|
1240
|
+
}
|
|
1241
|
+
};
|