@ant-design/agentic-ui 2.30.0 → 2.30.2
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 +4 -0
- package/dist/Bubble/List/index.js +8 -5
- package/dist/Bubble/MessagesContent/EXCEPTION.js +11 -2
- package/dist/Bubble/MessagesContent/MarkdownPreview.js +13 -7
- package/dist/Bubble/MessagesContent/index.js +39 -10
- package/dist/Bubble/MessagesContent/style.js +55 -22
- package/dist/Bubble/type.d.ts +4 -0
- package/dist/I18n/locales.js +2 -2
- 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/constants.d.ts +2 -1
- package/dist/MarkdownEditor/editor/parser/constants.js +86 -8
- 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/editor/store.d.ts +1 -2
- package/dist/MarkdownEditor/editor/tools/ToolBar/components/ToolBarItem.js +6 -4
- package/dist/MarkdownEditor/style.js +109 -7
- package/dist/MarkdownEditor/types.d.ts +5 -0
- 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/utils/renderHelpers.d.ts +8 -1
- package/dist/MarkdownInputField/utils/renderHelpers.js +5 -1
- package/dist/MarkdownRenderer/AnimationText.d.ts +4 -7
- package/dist/MarkdownRenderer/AnimationText.js +117 -15
- package/dist/MarkdownRenderer/MarkdownRenderer.js +15 -1
- package/dist/MarkdownRenderer/index.d.ts +2 -2
- package/dist/MarkdownRenderer/index.js +1 -1
- 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.js +13 -4
- package/dist/MarkdownRenderer/style.js +7 -6
- package/dist/MarkdownRenderer/useMarkdownToReact.js +37 -18
- package/dist/MarkdownRenderer/useStreaming.js +8 -1
- package/dist/Plugins/chart/BarChart/index.js +5 -5
- package/dist/Plugins/chart/ChartRender.js +1 -0
- package/dist/Plugins/chart/index.js +3 -1
- package/dist/Plugins/chart/utils.d.ts +14 -0
- package/dist/Plugins/chart/utils.js +49 -2
- package/dist/Schema/SchemaEditor/index.js +12 -5
- package/package.json +6 -5
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import json5 from "json5";
|
|
2
|
+
import React, { useMemo } from "react";
|
|
3
|
+
import { normalizeTaskListPropsFromJson } from "../../MarkdownEditor/editor/elements/AgenticUiBlocks/agenticUiEmbedUtils";
|
|
4
|
+
import partialParse from "../../MarkdownEditor/editor/parser/json-parse";
|
|
5
|
+
import { TaskList } from "../../TaskList";
|
|
6
|
+
var extractTextContent = function extractTextContent1(children) {
|
|
7
|
+
var _children_props;
|
|
8
|
+
if (typeof children === 'string') return children;
|
|
9
|
+
if (typeof children === 'number') return String(children);
|
|
10
|
+
if (Array.isArray(children)) return children.map(extractTextContent).join('');
|
|
11
|
+
if (/*#__PURE__*/ React.isValidElement(children) && ((_children_props = children.props) === null || _children_props === void 0 ? void 0 : _children_props.children)) {
|
|
12
|
+
return extractTextContent(children.props.children);
|
|
13
|
+
}
|
|
14
|
+
return '';
|
|
15
|
+
};
|
|
16
|
+
var parseJsonBody = function parseJsonBody(code) {
|
|
17
|
+
try {
|
|
18
|
+
return json5.parse(code || '{}');
|
|
19
|
+
} catch (unused) {
|
|
20
|
+
try {
|
|
21
|
+
return partialParse(code || '{}');
|
|
22
|
+
} catch (unused) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* ```agentic-ui-task``` 代码块 → TaskList(与 MarkdownEditor parseCode 对齐)
|
|
29
|
+
*/ export var AgenticUiTaskBlockRenderer = function AgenticUiTaskBlockRenderer(props) {
|
|
30
|
+
var code = useMemo(function() {
|
|
31
|
+
return extractTextContent(props.children);
|
|
32
|
+
}, [
|
|
33
|
+
props.children
|
|
34
|
+
]);
|
|
35
|
+
var parsed = useMemo(function() {
|
|
36
|
+
return parseJsonBody(code);
|
|
37
|
+
}, [
|
|
38
|
+
code
|
|
39
|
+
]);
|
|
40
|
+
var listProps = useMemo(function() {
|
|
41
|
+
return normalizeTaskListPropsFromJson(parsed);
|
|
42
|
+
}, [
|
|
43
|
+
parsed
|
|
44
|
+
]);
|
|
45
|
+
if (parsed === null) {
|
|
46
|
+
return /*#__PURE__*/ React.createElement("pre", {
|
|
47
|
+
"data-testid": "agentic-ui-task-fallback",
|
|
48
|
+
style: {
|
|
49
|
+
background: 'rgb(242, 241, 241)',
|
|
50
|
+
padding: '1em',
|
|
51
|
+
borderRadius: '0.5em',
|
|
52
|
+
margin: '0.75em 0',
|
|
53
|
+
fontSize: '0.8em',
|
|
54
|
+
whiteSpace: 'pre-wrap',
|
|
55
|
+
wordBreak: 'break-all'
|
|
56
|
+
}
|
|
57
|
+
}, /*#__PURE__*/ React.createElement("code", null, code));
|
|
58
|
+
}
|
|
59
|
+
return /*#__PURE__*/ React.createElement("div", {
|
|
60
|
+
"data-testid": "agentic-ui-task-block",
|
|
61
|
+
style: {
|
|
62
|
+
margin: '0.75em 0'
|
|
63
|
+
}
|
|
64
|
+
}, /*#__PURE__*/ React.createElement(TaskList, listProps));
|
|
65
|
+
};
|
|
66
|
+
AgenticUiTaskBlockRenderer.displayName = 'AgenticUiTaskBlockRenderer';
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
function _object_spread(target) {
|
|
15
|
+
for(var i = 1; i < arguments.length; i++){
|
|
16
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
17
|
+
var ownKeys = Object.keys(source);
|
|
18
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
19
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
20
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
ownKeys.forEach(function(key) {
|
|
24
|
+
_define_property(target, key, source[key]);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return target;
|
|
28
|
+
}
|
|
29
|
+
function _object_without_properties(source, excluded) {
|
|
30
|
+
if (source == null) return {};
|
|
31
|
+
var target = {}, sourceKeys, key, i;
|
|
32
|
+
if (typeof Reflect !== "undefined" && Reflect.ownKeys) {
|
|
33
|
+
sourceKeys = Reflect.ownKeys(source);
|
|
34
|
+
for(i = 0; i < sourceKeys.length; i++){
|
|
35
|
+
key = sourceKeys[i];
|
|
36
|
+
if (excluded.indexOf(key) >= 0) continue;
|
|
37
|
+
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
38
|
+
target[key] = source[key];
|
|
39
|
+
}
|
|
40
|
+
return target;
|
|
41
|
+
}
|
|
42
|
+
target = _object_without_properties_loose(source, excluded);
|
|
43
|
+
if (Object.getOwnPropertySymbols) {
|
|
44
|
+
sourceKeys = Object.getOwnPropertySymbols(source);
|
|
45
|
+
for(i = 0; i < sourceKeys.length; i++){
|
|
46
|
+
key = sourceKeys[i];
|
|
47
|
+
if (excluded.indexOf(key) >= 0) continue;
|
|
48
|
+
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
49
|
+
target[key] = source[key];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return target;
|
|
53
|
+
}
|
|
54
|
+
function _object_without_properties_loose(source, excluded) {
|
|
55
|
+
if (source == null) return {};
|
|
56
|
+
var target = {}, sourceKeys = Object.getOwnPropertyNames(source), key, i;
|
|
57
|
+
for(i = 0; i < sourceKeys.length; i++){
|
|
58
|
+
key = sourceKeys[i];
|
|
59
|
+
if (excluded.indexOf(key) >= 0) continue;
|
|
60
|
+
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
61
|
+
target[key] = source[key];
|
|
62
|
+
}
|
|
63
|
+
return target;
|
|
64
|
+
}
|
|
65
|
+
import json5 from "json5";
|
|
66
|
+
import React, { useMemo } from "react";
|
|
67
|
+
import { normalizeToolUseBarPropsFromJson } from "../../MarkdownEditor/editor/elements/AgenticUiBlocks/agenticUiEmbedUtils";
|
|
68
|
+
import partialParse from "../../MarkdownEditor/editor/parser/json-parse";
|
|
69
|
+
import { ToolUseBar } from "../../ToolUseBar";
|
|
70
|
+
var extractTextContent = function extractTextContent1(children) {
|
|
71
|
+
var _children_props;
|
|
72
|
+
if (typeof children === 'string') return children;
|
|
73
|
+
if (typeof children === 'number') return String(children);
|
|
74
|
+
if (Array.isArray(children)) return children.map(extractTextContent).join('');
|
|
75
|
+
if (/*#__PURE__*/ React.isValidElement(children) && ((_children_props = children.props) === null || _children_props === void 0 ? void 0 : _children_props.children)) {
|
|
76
|
+
return extractTextContent(children.props.children);
|
|
77
|
+
}
|
|
78
|
+
return '';
|
|
79
|
+
};
|
|
80
|
+
var parseJsonBody = function parseJsonBody(code) {
|
|
81
|
+
try {
|
|
82
|
+
return json5.parse(code || '{}');
|
|
83
|
+
} catch (unused) {
|
|
84
|
+
try {
|
|
85
|
+
return partialParse(code || '{}');
|
|
86
|
+
} catch (unused) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* ```agentic-ui-toolusebar``` 代码块 → ToolUseBar
|
|
93
|
+
*/ export var AgenticUiToolUseBarBlockRenderer = function AgenticUiToolUseBarBlockRenderer(props) {
|
|
94
|
+
var code = useMemo(function() {
|
|
95
|
+
return extractTextContent(props.children);
|
|
96
|
+
}, [
|
|
97
|
+
props.children
|
|
98
|
+
]);
|
|
99
|
+
var parsed = useMemo(function() {
|
|
100
|
+
return parseJsonBody(code);
|
|
101
|
+
}, [
|
|
102
|
+
code
|
|
103
|
+
]);
|
|
104
|
+
var _useMemo = useMemo(function() {
|
|
105
|
+
return normalizeToolUseBarPropsFromJson(parsed);
|
|
106
|
+
}, [
|
|
107
|
+
parsed
|
|
108
|
+
]), tools = _useMemo.tools, restBar = _object_without_properties(_useMemo, [
|
|
109
|
+
"tools"
|
|
110
|
+
]);
|
|
111
|
+
if (parsed === null) {
|
|
112
|
+
return /*#__PURE__*/ React.createElement("pre", {
|
|
113
|
+
"data-testid": "agentic-ui-toolusebar-fallback",
|
|
114
|
+
style: {
|
|
115
|
+
background: 'rgb(242, 241, 241)',
|
|
116
|
+
padding: '1em',
|
|
117
|
+
borderRadius: '0.5em',
|
|
118
|
+
margin: '0.75em 0',
|
|
119
|
+
fontSize: '0.8em',
|
|
120
|
+
whiteSpace: 'pre-wrap',
|
|
121
|
+
wordBreak: 'break-all'
|
|
122
|
+
}
|
|
123
|
+
}, /*#__PURE__*/ React.createElement("code", null, code));
|
|
124
|
+
}
|
|
125
|
+
return /*#__PURE__*/ React.createElement("div", {
|
|
126
|
+
"data-testid": "agentic-ui-toolusebar-block",
|
|
127
|
+
style: {
|
|
128
|
+
margin: '0.75em 0'
|
|
129
|
+
}
|
|
130
|
+
}, /*#__PURE__*/ React.createElement(ToolUseBar, _object_spread({
|
|
131
|
+
tools: tools
|
|
132
|
+
}, restBar)));
|
|
133
|
+
};
|
|
134
|
+
AgenticUiToolUseBarBlockRenderer.displayName = 'AgenticUiToolUseBarBlockRenderer';
|
|
@@ -142,6 +142,7 @@ import React, { useEffect, useMemo, useRef, useState } from "react";
|
|
|
142
142
|
import { ErrorBoundary } from "react-error-boundary";
|
|
143
143
|
import { Loading } from "../../Components/Loading";
|
|
144
144
|
import { ChartRender } from "../../Plugins/chart/ChartRender";
|
|
145
|
+
import { parseChineseCurrencyToNumber } from "../../Plugins/chart/utils";
|
|
145
146
|
var extractTextContent = function extractTextContent1(children) {
|
|
146
147
|
var _children_props;
|
|
147
148
|
if (typeof children === 'string') return children;
|
|
@@ -366,13 +367,21 @@ var extractTextContent = function extractTextContent1(children) {
|
|
|
366
367
|
var row = _object_spread_props(_object_spread({}, rowData), {
|
|
367
368
|
column_list: Object.keys(rowData)
|
|
368
369
|
});
|
|
370
|
+
var coerceChartAxisCell = function coerceChartAxisCell(raw) {
|
|
371
|
+
if (typeof raw === 'number' && Number.isFinite(raw)) return raw;
|
|
372
|
+
var n = Number(raw);
|
|
373
|
+
if (Number.isFinite(n)) return n;
|
|
374
|
+
if (typeof raw === 'string') {
|
|
375
|
+
var cn = parseChineseCurrencyToNumber(raw);
|
|
376
|
+
if (cn !== null) return cn;
|
|
377
|
+
}
|
|
378
|
+
return raw;
|
|
379
|
+
};
|
|
369
380
|
if (x && row[x] !== undefined) {
|
|
370
|
-
|
|
371
|
-
if (!isNaN(num)) row[x] = num;
|
|
381
|
+
row[x] = coerceChartAxisCell(row[x]);
|
|
372
382
|
}
|
|
373
383
|
if (y && row[y] !== undefined) {
|
|
374
|
-
|
|
375
|
-
if (!isNaN(num1)) row[y] = num1;
|
|
384
|
+
row[y] = coerceChartAxisCell(row[y]);
|
|
376
385
|
}
|
|
377
386
|
return row;
|
|
378
387
|
});
|
|
@@ -29,17 +29,18 @@ export var useRendererVarStyle = function useRendererVarStyle(prefixCls) {
|
|
|
29
29
|
'--padding-2x': '8px',
|
|
30
30
|
'--padding-4x': '16px',
|
|
31
31
|
'--padding-5x': '20px'
|
|
32
|
-
}), //
|
|
33
|
-
|
|
32
|
+
}), // 流式文字淡入动画(opacity + translateY,GPU 硬件加速,清爽流派)
|
|
33
|
+
// 仅使用 opacity 和 transform,避免 blur 带来的重绘开销
|
|
34
|
+
_define_property(_obj, '@keyframes markdownRendererSlideFadeIn', {
|
|
34
35
|
from: {
|
|
35
36
|
opacity: 0,
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
transform: 'translateY(2px)',
|
|
38
|
+
filter: 'blur(1px)'
|
|
38
39
|
},
|
|
39
40
|
to: {
|
|
40
41
|
opacity: 1,
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
transform: 'translateY(0)',
|
|
43
|
+
filter: 'blur(0px)'
|
|
43
44
|
}
|
|
44
45
|
}), _obj;
|
|
45
46
|
});
|
|
@@ -124,7 +124,6 @@ import { Checkbox, Image } from "antd";
|
|
|
124
124
|
import { toJsxRuntime } from "hast-util-to-jsx-runtime";
|
|
125
125
|
import React, { useMemo, useRef } from "react";
|
|
126
126
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
127
|
-
import AnimationText from "./AnimationText";
|
|
128
127
|
import rehypeKatex from "rehype-katex";
|
|
129
128
|
import rehypeRaw from "rehype-raw";
|
|
130
129
|
import remarkDirective from "remark-directive";
|
|
@@ -139,7 +138,9 @@ import { JINJA_DOLLAR_PLACEHOLDER } from "../MarkdownEditor/editor/parser/consta
|
|
|
139
138
|
import { remarkDirectiveContainer } from "../MarkdownEditor/editor/parser/remarkDirectiveContainer";
|
|
140
139
|
import { convertParagraphToImage, fixStrongWithSpecialChars, protectJinjaDollarInText } from "../MarkdownEditor/editor/parser/remarkParse";
|
|
141
140
|
import { REMARK_REHYPE_DIRECTIVE_HANDLERS } from "../MarkdownEditor/editor/utils/markdownToHtml";
|
|
141
|
+
import { parseChineseCurrencyToNumber } from "../Plugins/chart/utils";
|
|
142
142
|
import { ToolUseBarThink } from "../ToolUseBarThink";
|
|
143
|
+
import AnimationText from "./AnimationText";
|
|
143
144
|
var INLINE_MATH_WITH_SINGLE_DOLLAR = {
|
|
144
145
|
singleDollarTextMath: true
|
|
145
146
|
};
|
|
@@ -177,8 +178,17 @@ var extractCellText = function extractCellText1(cell) {
|
|
|
177
178
|
row.children.forEach(function(cell, j) {
|
|
178
179
|
if (j < columns.length) {
|
|
179
180
|
var val = extractCellText(cell);
|
|
180
|
-
|
|
181
|
-
|
|
181
|
+
if (val === '') {
|
|
182
|
+
record[columns[j].dataIndex] = val;
|
|
183
|
+
} else {
|
|
184
|
+
var num = Number(val);
|
|
185
|
+
if (Number.isFinite(num)) {
|
|
186
|
+
record[columns[j].dataIndex] = num;
|
|
187
|
+
} else {
|
|
188
|
+
var cn = parseChineseCurrencyToNumber(val);
|
|
189
|
+
record[columns[j].dataIndex] = cn !== null ? cn : val;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
182
192
|
}
|
|
183
193
|
});
|
|
184
194
|
dataSource.push(record);
|
|
@@ -356,14 +366,13 @@ var createHastProcessor = function createHastProcessor(extraRemarkPlugins, confi
|
|
|
356
366
|
};
|
|
357
367
|
var extractLanguageFromClassName = function extractLanguageFromClassName(className) {
|
|
358
368
|
if (!className) return undefined;
|
|
359
|
-
var
|
|
360
|
-
|
|
361
|
-
];
|
|
369
|
+
var flat = typeof className === 'string' ? className : className.map(String).join(' ');
|
|
370
|
+
var classes = flat.split(/\s+/).filter(Boolean);
|
|
362
371
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
363
372
|
try {
|
|
364
373
|
for(var _iterator = classes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
365
374
|
var cls = _step.value;
|
|
366
|
-
var match =
|
|
375
|
+
var match = cls.match(/^language-(.+)$/);
|
|
367
376
|
if (match) return match[1];
|
|
368
377
|
}
|
|
369
378
|
} catch (err) {
|
|
@@ -766,13 +775,15 @@ var extractLanguageFromClassName = function extractLanguageFromClassName(classNa
|
|
|
766
775
|
}));
|
|
767
776
|
},
|
|
768
777
|
code: function code(props) {
|
|
769
|
-
var _node = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
778
|
+
var _node = props.node, children = props.children, className = props.className, rest = _object_without_properties(props, [
|
|
770
779
|
"node",
|
|
771
|
-
"children"
|
|
780
|
+
"children",
|
|
781
|
+
"className"
|
|
772
782
|
]);
|
|
783
|
+
var fenceLang = extractLanguageFromClassName(className);
|
|
773
784
|
return jsx('code', _object_spread_props(_object_spread({}, rest), {
|
|
774
|
-
'data-testid': 'markdown-inline-code',
|
|
775
|
-
className: "".concat(contentCls, "-inline-code"),
|
|
785
|
+
'data-testid': fenceLang ? 'markdown-fenced-code' : 'markdown-inline-code',
|
|
786
|
+
className: fenceLang ? className : "".concat(contentCls, "-inline-code"),
|
|
776
787
|
children: children
|
|
777
788
|
}));
|
|
778
789
|
},
|
|
@@ -822,19 +833,24 @@ var extractLanguageFromClassName = function extractLanguageFromClassName(classNa
|
|
|
822
833
|
// ================================================================
|
|
823
834
|
// 代码块 pre > code → 路由到自定义渲染器
|
|
824
835
|
pre: function pre(props) {
|
|
825
|
-
var
|
|
836
|
+
var _hastPreNode_children_, _hastPreNode_children, _hastPreNode_children__properties;
|
|
837
|
+
var hastPreNode = props.node, children = props.children, rest = _object_without_properties(props, [
|
|
826
838
|
"node",
|
|
827
839
|
"children"
|
|
828
840
|
]);
|
|
829
841
|
var codeChild = Array.isArray(children) ? children[0] : children;
|
|
830
842
|
var codeProps = (codeChild === null || codeChild === void 0 ? void 0 : codeChild.props) || {};
|
|
843
|
+
var codeHastClass = (hastPreNode === null || hastPreNode === void 0 ? void 0 : (_hastPreNode_children = hastPreNode.children) === null || _hastPreNode_children === void 0 ? void 0 : (_hastPreNode_children_ = _hastPreNode_children[0]) === null || _hastPreNode_children_ === void 0 ? void 0 : _hastPreNode_children_.type) === 'element' && hastPreNode.children[0].tagName === 'code' ? (_hastPreNode_children__properties = hastPreNode.children[0].properties) === null || _hastPreNode_children__properties === void 0 ? void 0 : _hastPreNode_children__properties.className : undefined;
|
|
831
844
|
var language = extractLanguageFromClassName(codeProps.className);
|
|
845
|
+
if (!language) {
|
|
846
|
+
language = extractLanguageFromClassName(codeHastClass);
|
|
847
|
+
}
|
|
832
848
|
var CodeBlockComponent = userComponents.__codeBlock || userComponents.code;
|
|
833
849
|
if (CodeBlockComponent) {
|
|
834
850
|
return jsx(CodeBlockComponent, _object_spread_props(_object_spread({}, rest), {
|
|
835
851
|
language: language,
|
|
836
852
|
children: codeProps.children,
|
|
837
|
-
node:
|
|
853
|
+
node: hastPreNode
|
|
838
854
|
}));
|
|
839
855
|
}
|
|
840
856
|
return jsxs('pre', _object_spread_props(_object_spread({}, rest), {
|
|
@@ -1056,7 +1072,8 @@ var extractLanguageFromClassName = function extractLanguageFromClassName(classNa
|
|
|
1056
1072
|
Fragment: Fragment,
|
|
1057
1073
|
jsx: jsx,
|
|
1058
1074
|
jsxs: jsxs,
|
|
1059
|
-
components: components
|
|
1075
|
+
components: components,
|
|
1076
|
+
passNode: true
|
|
1060
1077
|
});
|
|
1061
1078
|
} catch (unused) {
|
|
1062
1079
|
return null;
|
|
@@ -1120,8 +1137,9 @@ var _BLOCK_CACHE_KEY = Symbol('blockCache');
|
|
|
1120
1137
|
* 流式场景下,最后一个块每个字符都变化,但大部分变化只是尾部追加。
|
|
1121
1138
|
* 对最后一个块做节流:只在新增了换行、块级标记、或超过一定字符数时才重新解析。
|
|
1122
1139
|
*/ var LAST_BLOCK_THROTTLE_CHARS = 20;
|
|
1123
|
-
var BLOCK_BOUNDARY_TRIGGERS = /[\n
|
|
1124
|
-
var shouldReparseLastBlock = function shouldReparseLastBlock(prevSource, newSource) {
|
|
1140
|
+
var BLOCK_BOUNDARY_TRIGGERS = /[\n`|#>*\-!$[\]]/;
|
|
1141
|
+
var shouldReparseLastBlock = function shouldReparseLastBlock(prevSource, newSource, streaming) {
|
|
1142
|
+
if (!streaming) return true;
|
|
1125
1143
|
if (!prevSource) return true;
|
|
1126
1144
|
if (newSource.length < prevSource.length) return true;
|
|
1127
1145
|
if (!newSource.startsWith(prevSource)) return true;
|
|
@@ -1179,7 +1197,7 @@ export var useMarkdownToReact = function useMarkdownToReact(content, options) {
|
|
|
1179
1197
|
}
|
|
1180
1198
|
// 最后一个块:节流——仅在有意义的变化时重新解析
|
|
1181
1199
|
if (isLast && lastBlockRef.current) {
|
|
1182
|
-
if (!shouldReparseLastBlock(lastBlockRef.current.source, block)) {
|
|
1200
|
+
if (!shouldReparseLastBlock(lastBlockRef.current.source, block, options === null || options === void 0 ? void 0 : options.streaming)) {
|
|
1183
1201
|
newCache.set(block, {
|
|
1184
1202
|
source: lastBlockRef.current.source,
|
|
1185
1203
|
element: lastBlockRef.current.element
|
|
@@ -1231,7 +1249,8 @@ export var useMarkdownToReact = function useMarkdownToReact(content, options) {
|
|
|
1231
1249
|
Fragment: Fragment,
|
|
1232
1250
|
jsx: jsx,
|
|
1233
1251
|
jsxs: jsxs,
|
|
1234
|
-
components: allComponents
|
|
1252
|
+
components: allComponents,
|
|
1253
|
+
passNode: true
|
|
1235
1254
|
});
|
|
1236
1255
|
} catch (error) {
|
|
1237
1256
|
console.error('Failed to render markdown:', error);
|
|
@@ -100,6 +100,7 @@ var STREAM_INCOMPLETE_REGEX = {
|
|
|
100
100
|
/^`[^`\r\n]{0,300}$/
|
|
101
101
|
]
|
|
102
102
|
};
|
|
103
|
+
var STREAMING_LOADING_PLACEHOLDER = '...';
|
|
103
104
|
/**
|
|
104
105
|
* 判断表格是否仍不完整。
|
|
105
106
|
* 等待 header + separator + 至少一行数据(3 行)后提交。
|
|
@@ -239,6 +240,11 @@ var getInitialCache = function getInitialCache() {
|
|
|
239
240
|
completeMarkdown: ''
|
|
240
241
|
};
|
|
241
242
|
};
|
|
243
|
+
var getStreamingOutput = function getStreamingOutput(cache) {
|
|
244
|
+
if (cache.completeMarkdown) return cache.completeMarkdown;
|
|
245
|
+
if (cache.pending) return STREAMING_LOADING_PLACEHOLDER;
|
|
246
|
+
return '';
|
|
247
|
+
};
|
|
242
248
|
var isInCodeBlock = function isInCodeBlock(text) {
|
|
243
249
|
var isFinalChunk = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
|
|
244
250
|
var lines = text.split('\n');
|
|
@@ -371,11 +377,12 @@ var isInCodeBlock = function isInCodeBlock(text) {
|
|
|
371
377
|
}
|
|
372
378
|
}
|
|
373
379
|
}
|
|
374
|
-
setOutput(cache
|
|
380
|
+
setOutput(getStreamingOutput(cache));
|
|
375
381
|
}, []);
|
|
376
382
|
useEffect(function() {
|
|
377
383
|
if (typeof input !== 'string') {
|
|
378
384
|
setOutput('');
|
|
385
|
+
cacheRef.current = getInitialCache();
|
|
379
386
|
return;
|
|
380
387
|
}
|
|
381
388
|
if (enabled) {
|
|
@@ -120,7 +120,7 @@ import React, { useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
|
120
120
|
import { Bar } from "react-chartjs-2";
|
|
121
121
|
import { ChartContainer, ChartFilter, ChartStatistic, ChartToolBar, downloadChart } from "../components";
|
|
122
122
|
import { defaultColorList } from "../const";
|
|
123
|
-
import { extractAndSortXValues, findDataPointByXValue, hexToRgba, resolveCssVariable } from "../utils";
|
|
123
|
+
import { extractAndSortXValues, findDataPointByXValue, hexToRgba, resolveCssVariable, toNumber } from "../utils";
|
|
124
124
|
import { useStyle } from "./style";
|
|
125
125
|
/**
|
|
126
126
|
* @fileoverview 柱状图组件文件
|
|
@@ -279,7 +279,7 @@ var BarChart = function BarChart(param) {
|
|
|
279
279
|
// 是否是正负柱图(同一批次同时存在正值与负值)
|
|
280
280
|
var hasPositive = useMemo(function() {
|
|
281
281
|
return filteredData.some(function(item) {
|
|
282
|
-
var v = typeof item.y === 'number' ? item.y :
|
|
282
|
+
var v = typeof item.y === 'number' ? item.y : toNumber(item.y, Number.NaN);
|
|
283
283
|
return Number.isFinite(v) && v > 0;
|
|
284
284
|
});
|
|
285
285
|
}, [
|
|
@@ -287,7 +287,7 @@ var BarChart = function BarChart(param) {
|
|
|
287
287
|
]);
|
|
288
288
|
var hasNegative = useMemo(function() {
|
|
289
289
|
return filteredData.some(function(item) {
|
|
290
|
-
var v = typeof item.y === 'number' ? item.y :
|
|
290
|
+
var v = typeof item.y === 'number' ? item.y : toNumber(item.y, Number.NaN);
|
|
291
291
|
return Number.isFinite(v) && v < 0;
|
|
292
292
|
});
|
|
293
293
|
}, [
|
|
@@ -316,7 +316,7 @@ var BarChart = function BarChart(param) {
|
|
|
316
316
|
var typeData = xValues.map(function(x) {
|
|
317
317
|
var dataPoint = findDataPointByXValue(filteredData, x, type);
|
|
318
318
|
var v = dataPoint === null || dataPoint === void 0 ? void 0 : dataPoint.y;
|
|
319
|
-
var n = typeof v === 'number' ? v :
|
|
319
|
+
var n = typeof v === 'number' ? v : toNumber(v, Number.NaN);
|
|
320
320
|
return Number.isFinite(n) ? n : null;
|
|
321
321
|
});
|
|
322
322
|
return _object_spread_props(_object_spread({
|
|
@@ -537,7 +537,7 @@ var BarChart = function BarChart(param) {
|
|
|
537
537
|
var maxWidth = 0;
|
|
538
538
|
// 遍历所有数据点,计算标签文本的最大宽度
|
|
539
539
|
filteredData.forEach(function(item) {
|
|
540
|
-
var value = typeof item.y === 'number' ? item.y :
|
|
540
|
+
var value = typeof item.y === 'number' ? item.y : toNumber(item.y, Number.NaN);
|
|
541
541
|
if (Number.isFinite(value)) {
|
|
542
542
|
var labelText = '';
|
|
543
543
|
if (dataLabelFormatter) {
|
|
@@ -1195,6 +1195,7 @@ import { debounce, getDataHash, isConfigEqual, isNotEmpty, toNumber } from "./ut
|
|
|
1195
1195
|
config === null || config === void 0 ? void 0 : config.y,
|
|
1196
1196
|
config === null || config === void 0 ? void 0 : config.height,
|
|
1197
1197
|
config === null || config === void 0 ? void 0 : config.index,
|
|
1198
|
+
renderKey,
|
|
1198
1199
|
toolBar,
|
|
1199
1200
|
convertDonutData,
|
|
1200
1201
|
convertFlatData,
|
|
@@ -448,7 +448,7 @@ export { ChartFilter, ChartToolBar, downloadChart } from "./components";
|
|
|
448
448
|
left: 0,
|
|
449
449
|
right: 0,
|
|
450
450
|
bottom: 0,
|
|
451
|
-
zIndex:
|
|
451
|
+
zIndex: 0,
|
|
452
452
|
width: '100%',
|
|
453
453
|
opacity: 0,
|
|
454
454
|
height: '100%',
|
|
@@ -457,6 +457,8 @@ export { ChartFilter, ChartToolBar, downloadChart } from "./components";
|
|
|
457
457
|
}
|
|
458
458
|
}, children), /*#__PURE__*/ React.createElement("div", {
|
|
459
459
|
style: {
|
|
460
|
+
position: 'relative',
|
|
461
|
+
zIndex: 1,
|
|
460
462
|
display: 'flex',
|
|
461
463
|
flexWrap: 'wrap',
|
|
462
464
|
flexDirection: minWidth < 400 ? 'column' : 'row',
|
|
@@ -85,6 +85,19 @@ export interface ChartDataItem {
|
|
|
85
85
|
/** 筛选标签,用于数据筛选和过滤 */
|
|
86
86
|
filterLabel?: string;
|
|
87
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* 将含「亿元 / 万元 / 元」的人民币口语字符串转为数值(以「元」为数值单位)。
|
|
90
|
+
*
|
|
91
|
+
* - `533亿元` → `533 * 1e8`
|
|
92
|
+
* - `549万元` → `549 * 1e4`
|
|
93
|
+
* - `128.5元` → `128.5`
|
|
94
|
+
*
|
|
95
|
+
* 不含上述单位且无法识别为纯数字时返回 `null`,避免误解析如 `8%`。
|
|
96
|
+
*
|
|
97
|
+
* @param value - 原始单元格或字段值
|
|
98
|
+
* @returns 解析后的有限数字,无法解析则为 `null`
|
|
99
|
+
*/
|
|
100
|
+
export declare const parseChineseCurrencyToNumber: (value: unknown) => number | null;
|
|
88
101
|
/**
|
|
89
102
|
* 归一化 X 轴值
|
|
90
103
|
*
|
|
@@ -209,6 +222,7 @@ export declare const findDataPointByXValue: (data: ChartDataItem[], xValue: numb
|
|
|
209
222
|
*
|
|
210
223
|
* 安全地将任意值转换为数字类型,转换失败时返回默认值。
|
|
211
224
|
* 如果输入已经是有效的数字,直接返回;否则尝试转换。
|
|
225
|
+
* 字符串支持「亿元 / 万元 / 元」等人民币口语格式(见 `parseChineseCurrencyToNumber`)。
|
|
212
226
|
*
|
|
213
227
|
* @param {any} val - 要转换的值
|
|
214
228
|
* @param {number} fallback - 转换失败时的默认值
|
|
@@ -114,6 +114,45 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
114
114
|
};
|
|
115
115
|
return fn;
|
|
116
116
|
}
|
|
117
|
+
/** 1 亿(人民币口语单位)对应的「元」数量 */ var CHINESE_YI_TO_YUAN = 1e8;
|
|
118
|
+
/** 1 万对应的「元」数量 */ var CHINESE_WAN_TO_YUAN = 1e4;
|
|
119
|
+
/**
|
|
120
|
+
* 将含「亿元 / 万元 / 元」的人民币口语字符串转为数值(以「元」为数值单位)。
|
|
121
|
+
*
|
|
122
|
+
* - `533亿元` → `533 * 1e8`
|
|
123
|
+
* - `549万元` → `549 * 1e4`
|
|
124
|
+
* - `128.5元` → `128.5`
|
|
125
|
+
*
|
|
126
|
+
* 不含上述单位且无法识别为纯数字时返回 `null`,避免误解析如 `8%`。
|
|
127
|
+
*
|
|
128
|
+
* @param value - 原始单元格或字段值
|
|
129
|
+
* @returns 解析后的有限数字,无法解析则为 `null`
|
|
130
|
+
*/ export var parseChineseCurrencyToNumber = function parseChineseCurrencyToNumber(value) {
|
|
131
|
+
if (value === null || value === undefined) return null;
|
|
132
|
+
if (typeof value === 'number') {
|
|
133
|
+
return Number.isFinite(value) ? value : null;
|
|
134
|
+
}
|
|
135
|
+
if (typeof value !== 'string') return null;
|
|
136
|
+
var s = value.trim();
|
|
137
|
+
if (!s) return null;
|
|
138
|
+
s = s.replace(/,/g, '').replace(/,/g, '').replace(/[¥¥\s]/g, '');
|
|
139
|
+
var yi = s.match(/(-?\d+(?:\.\d+)?)\s*亿/);
|
|
140
|
+
if (yi) {
|
|
141
|
+
var n = parseFloat(yi[1]);
|
|
142
|
+
return Number.isFinite(n) ? n * CHINESE_YI_TO_YUAN : null;
|
|
143
|
+
}
|
|
144
|
+
var wan = s.match(/(-?\d+(?:\.\d+)?)\s*万/);
|
|
145
|
+
if (wan) {
|
|
146
|
+
var n1 = parseFloat(wan[1]);
|
|
147
|
+
return Number.isFinite(n1) ? n1 * CHINESE_WAN_TO_YUAN : null;
|
|
148
|
+
}
|
|
149
|
+
var yuan = s.match(/(-?\d+(?:\.\d+)?)\s*元/);
|
|
150
|
+
if (yuan) {
|
|
151
|
+
var n2 = parseFloat(yuan[1]);
|
|
152
|
+
return Number.isFinite(n2) ? n2 : null;
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
};
|
|
117
156
|
/**
|
|
118
157
|
* 归一化 X 轴值
|
|
119
158
|
*
|
|
@@ -138,7 +177,9 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
138
177
|
var s = String(value).trim();
|
|
139
178
|
if (s === '') return value;
|
|
140
179
|
var n = Number(s);
|
|
141
|
-
|
|
180
|
+
if (Number.isFinite(n)) return n;
|
|
181
|
+
var cn = parseChineseCurrencyToNumber(s);
|
|
182
|
+
return cn !== null ? cn : value;
|
|
142
183
|
};
|
|
143
184
|
/**
|
|
144
185
|
* 比较两个 X 轴值的大小
|
|
@@ -283,6 +324,7 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
283
324
|
*
|
|
284
325
|
* 安全地将任意值转换为数字类型,转换失败时返回默认值。
|
|
285
326
|
* 如果输入已经是有效的数字,直接返回;否则尝试转换。
|
|
327
|
+
* 字符串支持「亿元 / 万元 / 元」等人民币口语格式(见 `parseChineseCurrencyToNumber`)。
|
|
286
328
|
*
|
|
287
329
|
* @param {any} val - 要转换的值
|
|
288
330
|
* @param {number} fallback - 转换失败时的默认值
|
|
@@ -300,7 +342,12 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
300
342
|
*/ export var toNumber = function toNumber(val, fallback) {
|
|
301
343
|
if (typeof val === 'number' && !Number.isNaN(val)) return val;
|
|
302
344
|
var n = Number(val);
|
|
303
|
-
|
|
345
|
+
if (Number.isFinite(n)) return n;
|
|
346
|
+
if (typeof val === 'string') {
|
|
347
|
+
var cn = parseChineseCurrencyToNumber(val);
|
|
348
|
+
if (cn !== null && Number.isFinite(cn)) return cn;
|
|
349
|
+
}
|
|
350
|
+
return fallback;
|
|
304
351
|
};
|
|
305
352
|
/**
|
|
306
353
|
* 检查值是否不为空
|