@ant-design/agentic-ui 2.21.0 → 2.22.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.
- package/dist/MarkdownEditor/editor/elements/TagPopup/index.js +4 -4
- package/dist/MarkdownEditor/editor/elements/TagPopup/style.js +14 -12
- package/dist/MarkdownEditor/editor/parser/parse/applyContextPropsAndConfig.d.ts +8 -0
- package/dist/MarkdownEditor/editor/parser/parse/applyContextPropsAndConfig.js +58 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseBlockElements.d.ts +67 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseBlockElements.js +289 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseElements.d.ts +27 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseElements.js +83 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseEmptyLines.d.ts +9 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseEmptyLines.js +60 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseFootnote.d.ts +10 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseFootnote.js +12 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseHtml.d.ts +63 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseHtml.js +759 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseMath.d.ts +24 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseMath.js +58 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseMedia.d.ts +27 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseMedia.js +127 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseTable.js +36 -3
- package/dist/MarkdownEditor/editor/parser/parse/parseText.d.ts +26 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseText.js +304 -0
- package/dist/MarkdownEditor/editor/parser/parserMarkdownToSlateNode.d.ts +3 -40
- package/dist/MarkdownEditor/editor/parser/parserMarkdownToSlateNode.js +128 -1855
- package/dist/MarkdownEditor/editor/parser/parserSlateNodeToMarkdown.js +131 -18
- package/dist/MarkdownEditor/editor/parser/remarkParse.js +24 -17
- package/dist/MarkdownEditor/editor/plugins/elements.js +1 -1
- package/dist/Plugins/code/components/CodeToolbar.js +3 -16
- package/package.json +1 -1
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
* 此文件包含大量相互依赖的函数,为了保持代码的可读性和逻辑分组,
|
|
3
|
-
* 我们允许函数在定义前使用(函数提升)
|
|
4
|
-
*/ /* eslint-disable @typescript-eslint/no-use-before-define */ /* eslint-disable @typescript-eslint/no-unused-expressions */ function _array_like_to_array(arr, len) {
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
5
2
|
if (len == null || len > arr.length) len = arr.length;
|
|
6
3
|
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
7
4
|
return arr2;
|
|
8
5
|
}
|
|
9
|
-
function _array_with_holes(arr) {
|
|
10
|
-
if (Array.isArray(arr)) return arr;
|
|
11
|
-
}
|
|
12
6
|
function _array_without_holes(arr) {
|
|
13
7
|
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
14
8
|
}
|
|
@@ -47,33 +41,6 @@ function _define_property(obj, key, value) {
|
|
|
47
41
|
function _iterable_to_array(iter) {
|
|
48
42
|
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
49
43
|
}
|
|
50
|
-
function _iterable_to_array_limit(arr, i) {
|
|
51
|
-
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
52
|
-
if (_i == null) return;
|
|
53
|
-
var _arr = [];
|
|
54
|
-
var _n = true;
|
|
55
|
-
var _d = false;
|
|
56
|
-
var _s, _e;
|
|
57
|
-
try {
|
|
58
|
-
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
59
|
-
_arr.push(_s.value);
|
|
60
|
-
if (i && _arr.length === i) break;
|
|
61
|
-
}
|
|
62
|
-
} catch (err) {
|
|
63
|
-
_d = true;
|
|
64
|
-
_e = err;
|
|
65
|
-
} finally{
|
|
66
|
-
try {
|
|
67
|
-
if (!_n && _i["return"] != null) _i["return"]();
|
|
68
|
-
} finally{
|
|
69
|
-
if (_d) throw _e;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return _arr;
|
|
73
|
-
}
|
|
74
|
-
function _non_iterable_rest() {
|
|
75
|
-
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
76
|
-
}
|
|
77
44
|
function _non_iterable_spread() {
|
|
78
45
|
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
79
46
|
}
|
|
@@ -92,33 +59,6 @@ function _object_spread(target) {
|
|
|
92
59
|
}
|
|
93
60
|
return target;
|
|
94
61
|
}
|
|
95
|
-
function ownKeys(object, enumerableOnly) {
|
|
96
|
-
var keys = Object.keys(object);
|
|
97
|
-
if (Object.getOwnPropertySymbols) {
|
|
98
|
-
var symbols = Object.getOwnPropertySymbols(object);
|
|
99
|
-
if (enumerableOnly) {
|
|
100
|
-
symbols = symbols.filter(function(sym) {
|
|
101
|
-
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
keys.push.apply(keys, symbols);
|
|
105
|
-
}
|
|
106
|
-
return keys;
|
|
107
|
-
}
|
|
108
|
-
function _object_spread_props(target, source) {
|
|
109
|
-
source = source != null ? source : {};
|
|
110
|
-
if (Object.getOwnPropertyDescriptors) {
|
|
111
|
-
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
112
|
-
} else {
|
|
113
|
-
ownKeys(Object(source)).forEach(function(key) {
|
|
114
|
-
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
return target;
|
|
118
|
-
}
|
|
119
|
-
function _sliced_to_array(arr, i) {
|
|
120
|
-
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
121
|
-
}
|
|
122
62
|
function _to_consumable_array(arr) {
|
|
123
63
|
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
124
64
|
}
|
|
@@ -130,1492 +70,17 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
130
70
|
if (n === "Map" || n === "Set") return Array.from(n);
|
|
131
71
|
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
132
72
|
}
|
|
133
|
-
import
|
|
134
|
-
import {
|
|
135
|
-
import { EditorUtils } from "../utils";
|
|
136
|
-
import partialJsonParse from "./json-parse";
|
|
73
|
+
import { applyContextPropsAndConfig } from "./parse/applyContextPropsAndConfig";
|
|
74
|
+
import { handleBlockquote, handleFootnoteDefinition, handleHeading, handleList, handleListItem, handleParagraph, handleTextAndInlineElements } from "./parse/parseBlockElements";
|
|
137
75
|
import { handleCode, handleYaml } from "./parse/parseCode";
|
|
76
|
+
import { handleDefinition, handleInlineCode, handleThematicBreak } from "./parse/parseElements";
|
|
77
|
+
import { addEmptyLinesIfNeeded } from "./parse/parseEmptyLines";
|
|
78
|
+
import { handleFootnoteReference } from "./parse/parseFootnote";
|
|
79
|
+
import { handleHtml, preprocessNonStandardHtmlTags, preprocessThinkTags } from "./parse/parseHtml";
|
|
80
|
+
import { handleInlineMath, handleMath } from "./parse/parseMath";
|
|
81
|
+
import { handleImage } from "./parse/parseMedia";
|
|
138
82
|
import { parseTableOrChart, preprocessMarkdownTableNewlines } from "./parse/parseTable";
|
|
139
83
|
import mdastParser from "./remarkParse";
|
|
140
|
-
// 常量定义
|
|
141
|
-
var EMPTY_LINE_DISTANCE_THRESHOLD = 4; // 两个元素之间的行距阈值
|
|
142
|
-
var EMPTY_LINE_CALCULATION_OFFSET = 2; // 计算空行数量时的偏移量
|
|
143
|
-
var EMPTY_LINE_DIVISOR = 2; // 计算空行数量的除数
|
|
144
|
-
var INLINE_MATH_SUFFIX_PATTERN = '(?:%|[kKmMbB]|千|万|亿|兆|万亿|百万|亿万)?';
|
|
145
|
-
var INLINE_MATH_CURRENCY_PATTERN = new RegExp("^[+-]?\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?".concat(INLINE_MATH_SUFFIX_PATTERN, "$"));
|
|
146
|
-
var INLINE_MATH_SIMPLE_NUMBER_PATTERN = new RegExp("^[+-]?\\d+(?:\\.\\d+)?".concat(INLINE_MATH_SUFFIX_PATTERN, "$"));
|
|
147
|
-
var shouldTreatInlineMathAsText = function(rawValue) {
|
|
148
|
-
var trimmedValue = rawValue.trim();
|
|
149
|
-
if (!trimmedValue) {
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
|
-
if (/[=^_\\{}]/.test(trimmedValue)) {
|
|
153
|
-
return false;
|
|
154
|
-
}
|
|
155
|
-
return INLINE_MATH_CURRENCY_PATTERN.test(trimmedValue) || INLINE_MATH_SIMPLE_NUMBER_PATTERN.test(trimmedValue);
|
|
156
|
-
};
|
|
157
|
-
/**
|
|
158
|
-
* 检测和解析 think 标签
|
|
159
|
-
* @param str - 要检测的字符串
|
|
160
|
-
* @returns think 标签的内容,如果不是 think 标签则返回 null
|
|
161
|
-
*/ var findThinkElement = function(str) {
|
|
162
|
-
try {
|
|
163
|
-
// 匹配 <think>内容</think> 格式
|
|
164
|
-
var thinkMatch = str.match(/^\s*<think>([\s\S]*?)<\/think>\s*$/);
|
|
165
|
-
if (thinkMatch) {
|
|
166
|
-
return {
|
|
167
|
-
content: thinkMatch[1].trim()
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
return null;
|
|
171
|
-
} catch (e) {
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
};
|
|
175
|
-
/**
|
|
176
|
-
* 检测和解析 answer 标签
|
|
177
|
-
* @param str - 要检测的字符串
|
|
178
|
-
* @returns answer 标签的内容,如果不是 answer 标签则返回 null
|
|
179
|
-
*/ var findAnswerElement = function(str) {
|
|
180
|
-
try {
|
|
181
|
-
// 匹配 <answer>内容</answer> 格式
|
|
182
|
-
var answerMatch = str.match(/^\s*<answer>([\s\S]*?)<\/answer>\s*$/);
|
|
183
|
-
if (answerMatch) {
|
|
184
|
-
return {
|
|
185
|
-
content: answerMatch[1].trim()
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
return null;
|
|
189
|
-
} catch (e) {
|
|
190
|
-
return null;
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
/**
|
|
194
|
-
* 从 HTML 字符串中提取媒体元素属性
|
|
195
|
-
*/ var extractMediaAttributes = function(str) {
|
|
196
|
-
var _str_match, _str_match1, _str_match2, _str_match3, _str_match4;
|
|
197
|
-
return {
|
|
198
|
-
height: (_str_match = str.match(/height="(\d+)"/)) === null || _str_match === void 0 ? void 0 : _str_match[1],
|
|
199
|
-
width: (_str_match1 = str.match(/width="(\d+)"/)) === null || _str_match1 === void 0 ? void 0 : _str_match1[1],
|
|
200
|
-
align: (_str_match2 = str.match(/data-align="(\w+)"/)) === null || _str_match2 === void 0 ? void 0 : _str_match2[1],
|
|
201
|
-
alt: (_str_match3 = str.match(/alt="([^"\n]+)"/)) === null || _str_match3 === void 0 ? void 0 : _str_match3[1],
|
|
202
|
-
controls: str.match(/controls/),
|
|
203
|
-
autoplay: str.match(/autoplay/),
|
|
204
|
-
loop: str.match(/loop/),
|
|
205
|
-
muted: str.match(/muted/),
|
|
206
|
-
poster: (_str_match4 = str.match(/poster="([^"\n]+)"/)) === null || _str_match4 === void 0 ? void 0 : _str_match4[1]
|
|
207
|
-
};
|
|
208
|
-
};
|
|
209
|
-
/**
|
|
210
|
-
* 构建媒体元素对象
|
|
211
|
-
*/ var buildMediaElement = function(url, tagName, attrs) {
|
|
212
|
-
return {
|
|
213
|
-
url: url,
|
|
214
|
-
height: attrs.height ? +attrs.height : undefined,
|
|
215
|
-
width: attrs.width ? +attrs.width : undefined,
|
|
216
|
-
align: attrs.align,
|
|
217
|
-
alt: attrs.alt,
|
|
218
|
-
tagName: tagName,
|
|
219
|
-
controls: !!attrs.controls,
|
|
220
|
-
autoplay: !!attrs.autoplay,
|
|
221
|
-
loop: !!attrs.loop,
|
|
222
|
-
muted: !!attrs.muted,
|
|
223
|
-
poster: attrs.poster
|
|
224
|
-
};
|
|
225
|
-
};
|
|
226
|
-
/**
|
|
227
|
-
* 从字符串中提取视频源 URL
|
|
228
|
-
*/ var extractVideoSource = function(str, tagName) {
|
|
229
|
-
// 首先尝试从标签本身获取 src 属性
|
|
230
|
-
var url = str.match(/src="([^"\n]+)"/);
|
|
231
|
-
// 如果是 video 标签且没有找到 src,尝试从 source 标签中获取
|
|
232
|
-
if (tagName === 'video' && !url) {
|
|
233
|
-
var sourceMatch = str.match(/<source[^>]*src="([^"\n]+)"[^>]*>/);
|
|
234
|
-
if (sourceMatch) {
|
|
235
|
-
url = sourceMatch;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return url === null || url === void 0 ? void 0 : url[1];
|
|
239
|
-
};
|
|
240
|
-
/**
|
|
241
|
-
* 查找并解析媒体元素(img/video/iframe)
|
|
242
|
-
*/ var findImageElement = function(str) {
|
|
243
|
-
try {
|
|
244
|
-
// 首先尝试匹配包含 source 标签的 video 格式
|
|
245
|
-
var videoWithSourceMatch = str.match(/^\s*<video[^>\n]*>[\s\S]*?<source[^>]*src="([^"\n]+)"[^>]*>[\s\S]*?<\/video>\s*$/);
|
|
246
|
-
if (videoWithSourceMatch) {
|
|
247
|
-
var attrs = extractMediaAttributes(str);
|
|
248
|
-
return buildMediaElement(videoWithSourceMatch[1], 'video', attrs);
|
|
249
|
-
}
|
|
250
|
-
// 尝试匹配各种媒体标签格式
|
|
251
|
-
var patterns = [
|
|
252
|
-
/^\s*<(img|video|iframe)[^>\n]*>.*?<\/(?:img|video|iframe)>\s*$/,
|
|
253
|
-
/^\s*<(img|video|iframe)[^>\n]*\/?>(.*<\/(?:img|video|iframe)>)?\s*$/,
|
|
254
|
-
/^\s*<(img|video|iframe)[^>\n]*\/>\s*$/,
|
|
255
|
-
/^\s*<(img|video|iframe)[^>\n]*>\s*$/
|
|
256
|
-
];
|
|
257
|
-
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
258
|
-
try {
|
|
259
|
-
for(var _iterator = patterns[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
260
|
-
var pattern = _step.value;
|
|
261
|
-
var match = str.match(pattern);
|
|
262
|
-
if (match) {
|
|
263
|
-
var _match__match;
|
|
264
|
-
var tagName = (_match__match = match[0].match(/<(img|video|iframe)/)) === null || _match__match === void 0 ? void 0 : _match__match[1];
|
|
265
|
-
var url = extractVideoSource(match[0], tagName);
|
|
266
|
-
var attrs1 = extractMediaAttributes(match[0]);
|
|
267
|
-
return buildMediaElement(url, tagName, attrs1);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
} catch (err) {
|
|
271
|
-
_didIteratorError = true;
|
|
272
|
-
_iteratorError = err;
|
|
273
|
-
} finally{
|
|
274
|
-
try {
|
|
275
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
276
|
-
_iterator.return();
|
|
277
|
-
}
|
|
278
|
-
} finally{
|
|
279
|
-
if (_didIteratorError) {
|
|
280
|
-
throw _iteratorError;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
return null;
|
|
285
|
-
} catch (e) {
|
|
286
|
-
console.error('Failed to parse media element:', e);
|
|
287
|
-
return null;
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
/**
|
|
291
|
-
* 根据媒体元素信息创建编辑器节点
|
|
292
|
-
*/ var createMediaNodeFromElement = function(mediaElement) {
|
|
293
|
-
if (!mediaElement) return null;
|
|
294
|
-
// 根据标签类型确定媒体类型
|
|
295
|
-
var mediaTypeMap = {
|
|
296
|
-
video: 'video',
|
|
297
|
-
iframe: 'iframe',
|
|
298
|
-
img: 'image'
|
|
299
|
-
};
|
|
300
|
-
var mediaType = mediaTypeMap[mediaElement.tagName] || 'image';
|
|
301
|
-
return EditorUtils.createMediaNode(decodeURIComponentUrl(mediaElement.url || ''), mediaType, {
|
|
302
|
-
align: mediaElement.align,
|
|
303
|
-
alt: mediaElement.alt,
|
|
304
|
-
height: mediaElement.height,
|
|
305
|
-
width: mediaElement.width,
|
|
306
|
-
controls: mediaElement.controls,
|
|
307
|
-
autoplay: mediaElement.autoplay,
|
|
308
|
-
loop: mediaElement.loop,
|
|
309
|
-
muted: mediaElement.muted,
|
|
310
|
-
poster: mediaElement.poster
|
|
311
|
-
});
|
|
312
|
-
};
|
|
313
|
-
var findAttachment = function(str) {
|
|
314
|
-
try {
|
|
315
|
-
var match = str.match(/^\s*<a[^>\n]*download[^>\n]*\/?>(.*<\/a>:?)?\s*$/);
|
|
316
|
-
if (match) {
|
|
317
|
-
var url = match[0].match(/href="([^"\n]+)"/);
|
|
318
|
-
var size = match[0].match(/data-size="(\d+)"/);
|
|
319
|
-
if (url) {
|
|
320
|
-
return {
|
|
321
|
-
url: url[1],
|
|
322
|
-
size: Number((size === null || size === void 0 ? void 0 : size[1]) || 0)
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
return null;
|
|
327
|
-
} catch (e) {
|
|
328
|
-
return null;
|
|
329
|
-
}
|
|
330
|
-
};
|
|
331
|
-
/**
|
|
332
|
-
* 设置节点的 finished 属性
|
|
333
|
-
*/ var setFinishedProp = function(leaf, finished) {
|
|
334
|
-
if (finished !== false) {
|
|
335
|
-
return leaf;
|
|
336
|
-
}
|
|
337
|
-
return _object_spread_props(_object_spread({}, leaf), {
|
|
338
|
-
otherProps: _object_spread_props(_object_spread({}, leaf.otherProps), {
|
|
339
|
-
finished: finished
|
|
340
|
-
})
|
|
341
|
-
});
|
|
342
|
-
};
|
|
343
|
-
/**
|
|
344
|
-
* 检查 leaf 是否有格式属性需要保留
|
|
345
|
-
*/ var hasFormattingProps = function(leaf) {
|
|
346
|
-
var _leaf_otherProps;
|
|
347
|
-
return !!(leaf.bold || leaf.italic || leaf.strikethrough || leaf.url || leaf.code || ((_leaf_otherProps = leaf.otherProps) === null || _leaf_otherProps === void 0 ? void 0 : _leaf_otherProps.finished) === false);
|
|
348
|
-
};
|
|
349
|
-
var parseText = function(els) {
|
|
350
|
-
var leaf = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
|
|
351
|
-
data: {}
|
|
352
|
-
};
|
|
353
|
-
var leafs = [];
|
|
354
|
-
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
355
|
-
try {
|
|
356
|
-
for(var _iterator = els[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
357
|
-
var n = _step.value;
|
|
358
|
-
if (n.type === 'strong') {
|
|
359
|
-
var strongLeaf = setFinishedProp(_object_spread_props(_object_spread({}, leaf), {
|
|
360
|
-
bold: true
|
|
361
|
-
}), n.finished);
|
|
362
|
-
var strongResult = parseText(n.children, strongLeaf);
|
|
363
|
-
leafs = leafs.concat(strongResult);
|
|
364
|
-
// 如果处理完嵌套节点后没有生成任何节点,且 leaf 有格式属性,生成空文本节点以保留格式
|
|
365
|
-
if (strongResult.length === 0 && hasFormattingProps(strongLeaf)) {
|
|
366
|
-
leafs.push(_object_spread_props(_object_spread({}, strongLeaf), {
|
|
367
|
-
text: ''
|
|
368
|
-
}));
|
|
369
|
-
}
|
|
370
|
-
continue;
|
|
371
|
-
}
|
|
372
|
-
if (n.type === 'emphasis') {
|
|
373
|
-
var emphasisLeaf = setFinishedProp(_object_spread_props(_object_spread({}, leaf), {
|
|
374
|
-
italic: true
|
|
375
|
-
}), n.finished);
|
|
376
|
-
var emphasisResult = parseText(n.children, emphasisLeaf);
|
|
377
|
-
leafs = leafs.concat(emphasisResult);
|
|
378
|
-
// 如果处理完嵌套节点后没有生成任何节点,且 leaf 有格式属性,生成空文本节点以保留格式
|
|
379
|
-
if (emphasisResult.length === 0 && hasFormattingProps(emphasisLeaf)) {
|
|
380
|
-
leafs.push(_object_spread_props(_object_spread({}, emphasisLeaf), {
|
|
381
|
-
text: ''
|
|
382
|
-
}));
|
|
383
|
-
}
|
|
384
|
-
continue;
|
|
385
|
-
}
|
|
386
|
-
if (n.type === 'delete') {
|
|
387
|
-
var deleteLeaf = _object_spread_props(_object_spread({}, leaf), {
|
|
388
|
-
strikethrough: true
|
|
389
|
-
});
|
|
390
|
-
var deleteResult = parseText(n.children, deleteLeaf);
|
|
391
|
-
leafs = leafs.concat(deleteResult);
|
|
392
|
-
// 如果处理完嵌套节点后没有生成任何节点,且 leaf 有格式属性,生成空文本节点以保留格式
|
|
393
|
-
if (deleteResult.length === 0 && hasFormattingProps(deleteLeaf)) {
|
|
394
|
-
leafs.push(_object_spread_props(_object_spread({}, deleteLeaf), {
|
|
395
|
-
text: ''
|
|
396
|
-
}));
|
|
397
|
-
}
|
|
398
|
-
continue;
|
|
399
|
-
}
|
|
400
|
-
if (n.type === 'link') {
|
|
401
|
-
var linkLeaf = _object_spread_props(_object_spread({}, leaf), {
|
|
402
|
-
url: n === null || n === void 0 ? void 0 : n.url
|
|
403
|
-
});
|
|
404
|
-
var linkResult = parseText(n.children, linkLeaf);
|
|
405
|
-
leafs = leafs.concat(linkResult);
|
|
406
|
-
// 如果处理完嵌套节点后没有生成任何节点,且 leaf 有格式属性,生成空文本节点以保留格式
|
|
407
|
-
if (linkResult.length === 0 && hasFormattingProps(linkLeaf)) {
|
|
408
|
-
leafs.push(_object_spread_props(_object_spread({}, linkLeaf), {
|
|
409
|
-
text: ''
|
|
410
|
-
}));
|
|
411
|
-
}
|
|
412
|
-
continue;
|
|
413
|
-
}
|
|
414
|
-
if (n.type === 'inlineCode') {
|
|
415
|
-
leafs.push(_object_spread_props(_object_spread({}, leaf), {
|
|
416
|
-
text: n.value,
|
|
417
|
-
code: true
|
|
418
|
-
}));
|
|
419
|
-
continue;
|
|
420
|
-
}
|
|
421
|
-
if (n.type === 'inlineMath') {
|
|
422
|
-
var inlineMathValue = typeof n.value === 'string' ? n.value : '';
|
|
423
|
-
if (shouldTreatInlineMathAsText(inlineMathValue)) {
|
|
424
|
-
leafs.push(_object_spread_props(_object_spread({}, leaf), {
|
|
425
|
-
text: "$".concat(inlineMathValue, "$")
|
|
426
|
-
}));
|
|
427
|
-
} else {
|
|
428
|
-
leafs.push(_object_spread_props(_object_spread({}, leaf), {
|
|
429
|
-
type: 'inline-katex',
|
|
430
|
-
children: [
|
|
431
|
-
{
|
|
432
|
-
text: inlineMathValue
|
|
433
|
-
}
|
|
434
|
-
]
|
|
435
|
-
}));
|
|
436
|
-
}
|
|
437
|
-
continue;
|
|
438
|
-
}
|
|
439
|
-
// @ts-ignore
|
|
440
|
-
leafs.push(_object_spread_props(_object_spread({}, leaf), {
|
|
441
|
-
text: n.value || ''
|
|
442
|
-
}));
|
|
443
|
-
}
|
|
444
|
-
} catch (err) {
|
|
445
|
-
_didIteratorError = true;
|
|
446
|
-
_iteratorError = err;
|
|
447
|
-
} finally{
|
|
448
|
-
try {
|
|
449
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
450
|
-
_iterator.return();
|
|
451
|
-
}
|
|
452
|
-
} finally{
|
|
453
|
-
if (_didIteratorError) {
|
|
454
|
-
throw _iteratorError;
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
return leafs;
|
|
459
|
-
};
|
|
460
|
-
/**
|
|
461
|
-
* 处理标题节点
|
|
462
|
-
* @param currentElement - 当前处理的标题元素,包含depth和children属性
|
|
463
|
-
* @returns 返回格式化的标题节点对象
|
|
464
|
-
*/ var handleHeading = function(currentElement, plugins, parserConfig) {
|
|
465
|
-
var _currentElement_children;
|
|
466
|
-
return {
|
|
467
|
-
type: 'head',
|
|
468
|
-
level: currentElement.depth,
|
|
469
|
-
children: ((_currentElement_children = currentElement.children) === null || _currentElement_children === void 0 ? void 0 : _currentElement_children.length) ? parseNodes(currentElement.children, plugins, false, currentElement, parserConfig) : [
|
|
470
|
-
{
|
|
471
|
-
text: ''
|
|
472
|
-
}
|
|
473
|
-
]
|
|
474
|
-
};
|
|
475
|
-
};
|
|
476
|
-
export var decodeURIComponentUrl = function(url) {
|
|
477
|
-
try {
|
|
478
|
-
return decodeURIComponent(url);
|
|
479
|
-
} catch (e) {
|
|
480
|
-
console.error('Failed to decode URI component:', e);
|
|
481
|
-
return url;
|
|
482
|
-
}
|
|
483
|
-
};
|
|
484
|
-
/**
|
|
485
|
-
* 解析 HTML 注释中的上下文属性
|
|
486
|
-
*/ var parseCommentContextProps = function(value, processedValue) {
|
|
487
|
-
var _processedValue_trim, _processedValue_trim1;
|
|
488
|
-
var isComment = value && (processedValue === null || processedValue === void 0 ? void 0 : (_processedValue_trim = processedValue.trim()) === null || _processedValue_trim === void 0 ? void 0 : _processedValue_trim.endsWith('-->')) && ((_processedValue_trim1 = processedValue.trim()) === null || _processedValue_trim1 === void 0 ? void 0 : _processedValue_trim1.startsWith('<!--'));
|
|
489
|
-
if (!isComment) {
|
|
490
|
-
return {};
|
|
491
|
-
}
|
|
492
|
-
try {
|
|
493
|
-
return json5.parse(value);
|
|
494
|
-
} catch (e) {
|
|
495
|
-
try {
|
|
496
|
-
return partialJsonParse(value);
|
|
497
|
-
} catch (parseError) {
|
|
498
|
-
console.warn('Failed to parse HTML comment as JSON or partial JSON:', {
|
|
499
|
-
value: value,
|
|
500
|
-
error: parseError
|
|
501
|
-
});
|
|
502
|
-
}
|
|
503
|
-
console.warn('HTML comment parse fallback attempted:', e);
|
|
504
|
-
}
|
|
505
|
-
return {};
|
|
506
|
-
};
|
|
507
|
-
/**
|
|
508
|
-
* 处理块级 HTML 元素
|
|
509
|
-
*/ var handleBlockHtml = function(currentElement, processedValue, isUnclosedComment) {
|
|
510
|
-
var thinkElement = findThinkElement(currentElement.value);
|
|
511
|
-
if (thinkElement) {
|
|
512
|
-
return {
|
|
513
|
-
type: 'code',
|
|
514
|
-
language: 'think',
|
|
515
|
-
value: thinkElement.content,
|
|
516
|
-
children: [
|
|
517
|
-
{
|
|
518
|
-
text: thinkElement.content
|
|
519
|
-
}
|
|
520
|
-
]
|
|
521
|
-
};
|
|
522
|
-
}
|
|
523
|
-
var answerElement = findAnswerElement(currentElement.value);
|
|
524
|
-
if (answerElement) {
|
|
525
|
-
return {
|
|
526
|
-
text: answerElement.content
|
|
527
|
-
};
|
|
528
|
-
}
|
|
529
|
-
var mediaElement = findImageElement(currentElement.value);
|
|
530
|
-
if (mediaElement) {
|
|
531
|
-
return createMediaNodeFromElement(mediaElement);
|
|
532
|
-
}
|
|
533
|
-
if (currentElement.value === '<br/>') {
|
|
534
|
-
return {
|
|
535
|
-
type: 'paragraph',
|
|
536
|
-
children: [
|
|
537
|
-
{
|
|
538
|
-
text: ''
|
|
539
|
-
}
|
|
540
|
-
]
|
|
541
|
-
};
|
|
542
|
-
}
|
|
543
|
-
if (currentElement.value.match(/^<\/(img|video|iframe)>/)) {
|
|
544
|
-
return null;
|
|
545
|
-
}
|
|
546
|
-
var commentValue = isUnclosedComment ? processedValue : currentElement.value;
|
|
547
|
-
var isComment = commentValue.trim().startsWith('<!--') && commentValue.trim().endsWith('-->');
|
|
548
|
-
if (isComment || isStandardHtmlElement(commentValue)) {
|
|
549
|
-
return commentValue.match(/<\/?(table|div|ul|li|ol|p|strong)[^\n>]*?>/) ? htmlToFragmentList(commentValue, '') : {
|
|
550
|
-
type: 'code',
|
|
551
|
-
language: 'html',
|
|
552
|
-
render: true,
|
|
553
|
-
value: commentValue,
|
|
554
|
-
children: [
|
|
555
|
-
{
|
|
556
|
-
text: commentValue
|
|
557
|
-
}
|
|
558
|
-
]
|
|
559
|
-
};
|
|
560
|
-
}
|
|
561
|
-
return {
|
|
562
|
-
text: currentElement.value
|
|
563
|
-
};
|
|
564
|
-
};
|
|
565
|
-
/**
|
|
566
|
-
* 应用元素配置属性(纯函数版本)
|
|
567
|
-
*/ var applyElementConfig = function(el, contextProps, processedValue, isUnclosedComment, currentElement) {
|
|
568
|
-
var _valueToCheck_trim;
|
|
569
|
-
if (!el || Array.isArray(el)) {
|
|
570
|
-
return el;
|
|
571
|
-
}
|
|
572
|
-
var isPlainText = 'text' in el && Object.keys(el).length === 1;
|
|
573
|
-
if (isPlainText) {
|
|
574
|
-
return el;
|
|
575
|
-
}
|
|
576
|
-
var valueToCheck = isUnclosedComment ? processedValue : currentElement === null || currentElement === void 0 ? void 0 : currentElement.value;
|
|
577
|
-
var otherProps = _object_spread({}, contextProps);
|
|
578
|
-
// 只有当 finished === false 时才设置 finished 属性,否则删除
|
|
579
|
-
if (isUnclosedComment) {
|
|
580
|
-
otherProps.finished = false;
|
|
581
|
-
}
|
|
582
|
-
return _object_spread_props(_object_spread({}, el), {
|
|
583
|
-
isConfig: valueToCheck === null || valueToCheck === void 0 ? void 0 : (_valueToCheck_trim = valueToCheck.trim()) === null || _valueToCheck_trim === void 0 ? void 0 : _valueToCheck_trim.startsWith('<!--'),
|
|
584
|
-
otherProps: Object.keys(otherProps).length > 0 ? otherProps : undefined
|
|
585
|
-
});
|
|
586
|
-
};
|
|
587
|
-
/**
|
|
588
|
-
* 处理HTML节点
|
|
589
|
-
* @param currentElement - 当前处理的HTML元素
|
|
590
|
-
* @param parent - 父级元素,用于判断上下文
|
|
591
|
-
* @param htmlTag - HTML标签栈,用于跟踪嵌套的HTML标签
|
|
592
|
-
* @returns 返回包含解析后元素和上下文属性的对象
|
|
593
|
-
*/ var handleHtml = function(currentElement, parent, htmlTag) {
|
|
594
|
-
var _currentElement_value;
|
|
595
|
-
var trimmedValue = (currentElement === null || currentElement === void 0 ? void 0 : (_currentElement_value = currentElement.value) === null || _currentElement_value === void 0 ? void 0 : _currentElement_value.trim()) || '';
|
|
596
|
-
var isUnclosedComment = trimmedValue.startsWith('<!--') && !trimmedValue.endsWith('-->');
|
|
597
|
-
var processedValue = isUnclosedComment ? trimmedValue + '-->' : (currentElement === null || currentElement === void 0 ? void 0 : currentElement.value) || '';
|
|
598
|
-
var value = (processedValue === null || processedValue === void 0 ? void 0 : processedValue.replace('<!--', '').replace('-->', '').trim()) || '{}';
|
|
599
|
-
var contextProps = parseCommentContextProps(value, processedValue);
|
|
600
|
-
var isBlockLevel = !parent || [
|
|
601
|
-
'listItem',
|
|
602
|
-
'blockquote'
|
|
603
|
-
].includes(parent.type);
|
|
604
|
-
var el;
|
|
605
|
-
var updatedHtmlTag = htmlTag;
|
|
606
|
-
if (isBlockLevel) {
|
|
607
|
-
el = handleBlockHtml(currentElement, processedValue, isUnclosedComment);
|
|
608
|
-
} else {
|
|
609
|
-
var inlineResult = processInlineHtml(currentElement, htmlTag);
|
|
610
|
-
el = inlineResult.el;
|
|
611
|
-
updatedHtmlTag = inlineResult.htmlTag;
|
|
612
|
-
}
|
|
613
|
-
var configuredEl = applyElementConfig(el, contextProps, processedValue, isUnclosedComment, currentElement);
|
|
614
|
-
return {
|
|
615
|
-
el: configuredEl,
|
|
616
|
-
contextProps: contextProps,
|
|
617
|
-
htmlTag: updatedHtmlTag
|
|
618
|
-
};
|
|
619
|
-
};
|
|
620
|
-
/**
|
|
621
|
-
* 处理内联HTML元素(纯函数版本)
|
|
622
|
-
* @param currentElement - 当前处理的HTML元素
|
|
623
|
-
* @param htmlTag - HTML标签栈
|
|
624
|
-
* @returns 返回处理后的元素对象和新的标签栈,如果是标签则返回null
|
|
625
|
-
*/ var processInlineHtml = function(currentElement, htmlTag) {
|
|
626
|
-
var value = currentElement.value;
|
|
627
|
-
if (value.match(/<br\/?>/)) {
|
|
628
|
-
return {
|
|
629
|
-
el: {
|
|
630
|
-
type: 'break',
|
|
631
|
-
children: [
|
|
632
|
-
{
|
|
633
|
-
text: '\n'
|
|
634
|
-
}
|
|
635
|
-
]
|
|
636
|
-
},
|
|
637
|
-
htmlTag: htmlTag
|
|
638
|
-
};
|
|
639
|
-
}
|
|
640
|
-
var answerElement = findAnswerElement(value);
|
|
641
|
-
if (answerElement) {
|
|
642
|
-
return {
|
|
643
|
-
el: {
|
|
644
|
-
text: answerElement.content
|
|
645
|
-
},
|
|
646
|
-
htmlTag: htmlTag
|
|
647
|
-
};
|
|
648
|
-
}
|
|
649
|
-
if (!isStandardHtmlElement(value)) {
|
|
650
|
-
return {
|
|
651
|
-
el: {
|
|
652
|
-
text: value
|
|
653
|
-
},
|
|
654
|
-
htmlTag: htmlTag
|
|
655
|
-
};
|
|
656
|
-
}
|
|
657
|
-
var htmlMatch = value.match(/<\/?(b|i|del|font|code|span|sup|sub|strong|a)[^\n>]*?>/);
|
|
658
|
-
if (htmlMatch) {
|
|
659
|
-
var _htmlMatch = _sliced_to_array(htmlMatch, 2), str = _htmlMatch[0], tag = _htmlMatch[1];
|
|
660
|
-
var isClosingTag = str.startsWith('</');
|
|
661
|
-
var isMatchingTag = isClosingTag && htmlTag.length && htmlTag[htmlTag.length - 1].tag === tag;
|
|
662
|
-
var newHtmlTag = htmlTag;
|
|
663
|
-
if (isMatchingTag) {
|
|
664
|
-
newHtmlTag = htmlTag.slice(0, -1);
|
|
665
|
-
}
|
|
666
|
-
if (!isClosingTag) {
|
|
667
|
-
newHtmlTag = processHtmlTag(str, tag, newHtmlTag);
|
|
668
|
-
}
|
|
669
|
-
return {
|
|
670
|
-
el: null,
|
|
671
|
-
htmlTag: newHtmlTag
|
|
672
|
-
};
|
|
673
|
-
}
|
|
674
|
-
var mediaElement = findImageElement(value);
|
|
675
|
-
return {
|
|
676
|
-
el: mediaElement ? createMediaNodeFromElement(mediaElement) : {
|
|
677
|
-
text: value
|
|
678
|
-
},
|
|
679
|
-
htmlTag: htmlTag
|
|
680
|
-
};
|
|
681
|
-
};
|
|
682
|
-
/**
|
|
683
|
-
* 处理 span 标签的样式属性(纯函数版本)
|
|
684
|
-
*/ var processSpanTag = function(str, tag, htmlTag) {
|
|
685
|
-
try {
|
|
686
|
-
var styles = str.match(/style="([^"\n]+)"/);
|
|
687
|
-
if (!styles) {
|
|
688
|
-
return htmlTag;
|
|
689
|
-
}
|
|
690
|
-
var stylesMap = new Map(styles[1].split(';').map(function(item) {
|
|
691
|
-
return item.split(':').map(function(item) {
|
|
692
|
-
return item.trim();
|
|
693
|
-
});
|
|
694
|
-
}));
|
|
695
|
-
var color = stylesMap.get('color');
|
|
696
|
-
if (color) {
|
|
697
|
-
return _to_consumable_array(htmlTag).concat([
|
|
698
|
-
{
|
|
699
|
-
tag: tag,
|
|
700
|
-
color: color
|
|
701
|
-
}
|
|
702
|
-
]);
|
|
703
|
-
}
|
|
704
|
-
} catch (e) {
|
|
705
|
-
console.warn('Failed to parse span style attribute:', {
|
|
706
|
-
str: str,
|
|
707
|
-
error: e
|
|
708
|
-
});
|
|
709
|
-
}
|
|
710
|
-
return htmlTag;
|
|
711
|
-
};
|
|
712
|
-
/**
|
|
713
|
-
* 处理 a 标签的链接属性(纯函数版本)
|
|
714
|
-
*/ var processATag = function(str, tag, htmlTag) {
|
|
715
|
-
var url = str.match(/href="([\w:./_\-#\\]+)"/);
|
|
716
|
-
if (url) {
|
|
717
|
-
return _to_consumable_array(htmlTag).concat([
|
|
718
|
-
{
|
|
719
|
-
tag: tag,
|
|
720
|
-
url: url[1]
|
|
721
|
-
}
|
|
722
|
-
]);
|
|
723
|
-
}
|
|
724
|
-
return htmlTag;
|
|
725
|
-
};
|
|
726
|
-
/**
|
|
727
|
-
* 处理 font 标签的颜色属性(纯函数版本)
|
|
728
|
-
*/ var processFontTag = function(str, tag, htmlTag) {
|
|
729
|
-
var colorMatch = str.match(/color="([^"\n]+)"/) || str.match(/color=([^"\n]+)/);
|
|
730
|
-
if (colorMatch) {
|
|
731
|
-
return _to_consumable_array(htmlTag).concat([
|
|
732
|
-
{
|
|
733
|
-
tag: tag,
|
|
734
|
-
color: colorMatch[1].replaceAll('>', '')
|
|
735
|
-
}
|
|
736
|
-
]);
|
|
737
|
-
}
|
|
738
|
-
return htmlTag;
|
|
739
|
-
};
|
|
740
|
-
/**
|
|
741
|
-
* HTML 标签处理器映射表
|
|
742
|
-
*/ var htmlTagProcessors = {
|
|
743
|
-
span: processSpanTag,
|
|
744
|
-
a: processATag,
|
|
745
|
-
font: processFontTag
|
|
746
|
-
};
|
|
747
|
-
/**
|
|
748
|
-
* 处理HTML标签并添加到标签栈中(纯函数版本)
|
|
749
|
-
* @param str - HTML标签字符串
|
|
750
|
-
* @param tag - 标签名称
|
|
751
|
-
* @param htmlTag - HTML标签栈
|
|
752
|
-
* @returns 返回新的标签栈数组
|
|
753
|
-
*/ var processHtmlTag = function(str, tag, htmlTag) {
|
|
754
|
-
var processor = htmlTagProcessors[tag];
|
|
755
|
-
if (processor) {
|
|
756
|
-
return processor(str, tag, htmlTag);
|
|
757
|
-
}
|
|
758
|
-
return _to_consumable_array(htmlTag).concat([
|
|
759
|
-
{
|
|
760
|
-
tag: tag
|
|
761
|
-
}
|
|
762
|
-
]);
|
|
763
|
-
};
|
|
764
|
-
/**
|
|
765
|
-
* 处理图片节点
|
|
766
|
-
* @param currentElement - 当前处理的图片元素,包含url和alt属性
|
|
767
|
-
* @returns 返回格式化的图片节点对象
|
|
768
|
-
*/ var handleImage = function(currentElement) {
|
|
769
|
-
return EditorUtils.createMediaNode(decodeURIComponent(currentElement === null || currentElement === void 0 ? void 0 : currentElement.url), 'image', {
|
|
770
|
-
alt: currentElement.alt,
|
|
771
|
-
finished: currentElement.finished
|
|
772
|
-
});
|
|
773
|
-
};
|
|
774
|
-
/**
|
|
775
|
-
* 处理内联数学公式
|
|
776
|
-
* @param currentElement - 当前处理的内联数学公式元素
|
|
777
|
-
* @returns 返回格式化的内联KaTeX节点对象
|
|
778
|
-
*/ var handleInlineMath = function(currentElement) {
|
|
779
|
-
var inlineMathValue = typeof (currentElement === null || currentElement === void 0 ? void 0 : currentElement.value) === 'string' ? currentElement.value : '';
|
|
780
|
-
if (shouldTreatInlineMathAsText(inlineMathValue)) {
|
|
781
|
-
return {
|
|
782
|
-
type: 'paragraph',
|
|
783
|
-
children: [
|
|
784
|
-
{
|
|
785
|
-
text: "$".concat(inlineMathValue, "$")
|
|
786
|
-
}
|
|
787
|
-
]
|
|
788
|
-
};
|
|
789
|
-
}
|
|
790
|
-
return {
|
|
791
|
-
type: 'inline-katex',
|
|
792
|
-
children: [
|
|
793
|
-
{
|
|
794
|
-
text: inlineMathValue
|
|
795
|
-
}
|
|
796
|
-
]
|
|
797
|
-
};
|
|
798
|
-
};
|
|
799
|
-
/**
|
|
800
|
-
* 处理数学公式块
|
|
801
|
-
* @param currentElement - 当前处理的数学公式块元素
|
|
802
|
-
* @returns 返回格式化的KaTeX块节点对象
|
|
803
|
-
*/ var handleMath = function(currentElement) {
|
|
804
|
-
return {
|
|
805
|
-
type: 'katex',
|
|
806
|
-
language: 'latex',
|
|
807
|
-
katex: true,
|
|
808
|
-
value: currentElement.value,
|
|
809
|
-
children: [
|
|
810
|
-
{
|
|
811
|
-
text: ''
|
|
812
|
-
}
|
|
813
|
-
]
|
|
814
|
-
};
|
|
815
|
-
};
|
|
816
|
-
/**
|
|
817
|
-
* 处理列表节点
|
|
818
|
-
* @param currentElement - 当前处理的列表元素,包含ordered、start等属性
|
|
819
|
-
* @returns 返回格式化的列表节点对象
|
|
820
|
-
*/ var handleList = function(currentElement, plugins, parserConfig) {
|
|
821
|
-
var _el_children;
|
|
822
|
-
var el = {
|
|
823
|
-
type: 'list',
|
|
824
|
-
order: currentElement.ordered,
|
|
825
|
-
start: currentElement.start,
|
|
826
|
-
finished: currentElement.finished,
|
|
827
|
-
children: parseNodes(currentElement.children, plugins, false, currentElement, parserConfig)
|
|
828
|
-
};
|
|
829
|
-
el.task = (_el_children = el.children) === null || _el_children === void 0 ? void 0 : _el_children.some(function(s) {
|
|
830
|
-
return typeof s.checked === 'boolean';
|
|
831
|
-
});
|
|
832
|
-
return el;
|
|
833
|
-
};
|
|
834
|
-
/**
|
|
835
|
-
* 处理脚注引用
|
|
836
|
-
* @param currentElement - 当前处理的脚注引用元素
|
|
837
|
-
* @returns 返回格式化的脚注引用节点对象
|
|
838
|
-
*/ var handleFootnoteReference = function(currentElement) {
|
|
839
|
-
var _currentElement_identifier;
|
|
840
|
-
return {
|
|
841
|
-
text: "".concat((_currentElement_identifier = currentElement.identifier) === null || _currentElement_identifier === void 0 ? void 0 : _currentElement_identifier.toUpperCase()),
|
|
842
|
-
identifier: currentElement.identifier,
|
|
843
|
-
type: 'footnoteReference'
|
|
844
|
-
};
|
|
845
|
-
};
|
|
846
|
-
/**
|
|
847
|
-
* 处理脚注定义
|
|
848
|
-
* @param currentElement - 当前处理的脚注定义元素
|
|
849
|
-
* @returns 返回格式化的脚注定义节点对象
|
|
850
|
-
*/ var handleFootnoteDefinition = function(currentElement, plugins, parserConfig) {
|
|
851
|
-
var _parseNodes, _linkNode_children;
|
|
852
|
-
var linkNode = (_parseNodes = parseNodes(currentElement.children, plugins, false, currentElement, parserConfig)) === null || _parseNodes === void 0 ? void 0 : _parseNodes.at(0);
|
|
853
|
-
var cellNode = linkNode === null || linkNode === void 0 ? void 0 : (_linkNode_children = linkNode.children) === null || _linkNode_children === void 0 ? void 0 : _linkNode_children.at(0);
|
|
854
|
-
return {
|
|
855
|
-
value: cellNode === null || cellNode === void 0 ? void 0 : cellNode.text,
|
|
856
|
-
url: cellNode === null || cellNode === void 0 ? void 0 : cellNode.url,
|
|
857
|
-
type: 'footnoteDefinition',
|
|
858
|
-
identifier: currentElement.identifier,
|
|
859
|
-
children: [
|
|
860
|
-
cellNode
|
|
861
|
-
]
|
|
862
|
-
};
|
|
863
|
-
};
|
|
864
|
-
/**
|
|
865
|
-
* 处理列表项节点(纯函数版本)
|
|
866
|
-
* @param currentElement - 当前处理的列表项元素
|
|
867
|
-
* @returns 返回格式化的列表项节点对象,包含复选框状态和提及信息
|
|
868
|
-
*/ var handleListItem = function(currentElement, plugins, parserConfig) {
|
|
869
|
-
var _currentElement_children, _currentElement_children__children_, _currentElement_children__children, _currentElement_children_, _currentElement_children1, _currentElement_children__children1, _currentElement_children_1, _currentElement_children2, _processedChildren_, _processedChildren__children_, _processedChildren__children, _processedChildren_1;
|
|
870
|
-
var children = ((_currentElement_children = currentElement.children) === null || _currentElement_children === void 0 ? void 0 : _currentElement_children.length) ? parseNodes(currentElement.children, plugins, false, currentElement, parserConfig) : [
|
|
871
|
-
{
|
|
872
|
-
type: 'paragraph',
|
|
873
|
-
children: [
|
|
874
|
-
{
|
|
875
|
-
text: ''
|
|
876
|
-
}
|
|
877
|
-
]
|
|
878
|
-
}
|
|
879
|
-
];
|
|
880
|
-
var mentions = undefined;
|
|
881
|
-
var processedChildren = _to_consumable_array(children);
|
|
882
|
-
if (((_currentElement_children1 = currentElement.children) === null || _currentElement_children1 === void 0 ? void 0 : (_currentElement_children_ = _currentElement_children1[0]) === null || _currentElement_children_ === void 0 ? void 0 : (_currentElement_children__children = _currentElement_children_.children) === null || _currentElement_children__children === void 0 ? void 0 : (_currentElement_children__children_ = _currentElement_children__children[0]) === null || _currentElement_children__children_ === void 0 ? void 0 : _currentElement_children__children_.type) === 'link' && ((_currentElement_children2 = currentElement.children) === null || _currentElement_children2 === void 0 ? void 0 : (_currentElement_children_1 = _currentElement_children2[0]) === null || _currentElement_children_1 === void 0 ? void 0 : (_currentElement_children__children1 = _currentElement_children_1.children) === null || _currentElement_children__children1 === void 0 ? void 0 : _currentElement_children__children1.length) > 1) {
|
|
883
|
-
var _processedChildren__children1, _processedChildren_2;
|
|
884
|
-
var item = processedChildren === null || processedChildren === void 0 ? void 0 : (_processedChildren_2 = processedChildren[0]) === null || _processedChildren_2 === void 0 ? void 0 : (_processedChildren__children1 = _processedChildren_2.children) === null || _processedChildren__children1 === void 0 ? void 0 : _processedChildren__children1[0];
|
|
885
|
-
var label = item === null || item === void 0 ? void 0 : item.text;
|
|
886
|
-
if (label) {
|
|
887
|
-
var _item_url;
|
|
888
|
-
mentions = [
|
|
889
|
-
{
|
|
890
|
-
avatar: item === null || item === void 0 ? void 0 : item.url,
|
|
891
|
-
name: label,
|
|
892
|
-
id: new URLSearchParams('?' + (item === null || item === void 0 ? void 0 : (_item_url = item.url) === null || _item_url === void 0 ? void 0 : _item_url.split('?')[1])).get('id') || undefined
|
|
893
|
-
}
|
|
894
|
-
];
|
|
895
|
-
var firstChild = processedChildren[0];
|
|
896
|
-
if (firstChild && firstChild.children) {
|
|
897
|
-
processedChildren = [
|
|
898
|
-
_object_spread_props(_object_spread({}, firstChild), {
|
|
899
|
-
children: firstChild.children.filter(function(_, idx) {
|
|
900
|
-
return idx !== 0;
|
|
901
|
-
})
|
|
902
|
-
})
|
|
903
|
-
].concat(_to_consumable_array(processedChildren.slice(1)));
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
if (((_processedChildren_ = processedChildren[0]) === null || _processedChildren_ === void 0 ? void 0 : _processedChildren_.type) === 'paragraph' && ((_processedChildren_1 = processedChildren[0]) === null || _processedChildren_1 === void 0 ? void 0 : (_processedChildren__children = _processedChildren_1.children) === null || _processedChildren__children === void 0 ? void 0 : (_processedChildren__children_ = _processedChildren__children[0]) === null || _processedChildren__children_ === void 0 ? void 0 : _processedChildren__children_.text)) {
|
|
908
|
-
var text = processedChildren[0].children[0].text;
|
|
909
|
-
var m = text.match(/^\[([x\s])]/);
|
|
910
|
-
if (m) {
|
|
911
|
-
var updatedFirstChild = _object_spread_props(_object_spread({}, processedChildren[0]), {
|
|
912
|
-
children: [
|
|
913
|
-
_object_spread_props(_object_spread({}, processedChildren[0].children[0]), {
|
|
914
|
-
text: text.replace(/^\[([x\s])]/, '')
|
|
915
|
-
})
|
|
916
|
-
].concat(_to_consumable_array(processedChildren[0].children.slice(1)))
|
|
917
|
-
});
|
|
918
|
-
return {
|
|
919
|
-
type: 'list-item',
|
|
920
|
-
checked: m ? m[1] === 'x' : undefined,
|
|
921
|
-
children: [
|
|
922
|
-
updatedFirstChild
|
|
923
|
-
].concat(_to_consumable_array(processedChildren.slice(1))),
|
|
924
|
-
mentions: mentions
|
|
925
|
-
};
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
return {
|
|
929
|
-
type: 'list-item',
|
|
930
|
-
checked: currentElement.checked,
|
|
931
|
-
children: processedChildren,
|
|
932
|
-
mentions: mentions
|
|
933
|
-
};
|
|
934
|
-
};
|
|
935
|
-
/**
|
|
936
|
-
* 处理附件链接
|
|
937
|
-
*/ var handleAttachmentLink = function(currentElement) {
|
|
938
|
-
var text = currentElement.children.map(function(n) {
|
|
939
|
-
return n.value || '';
|
|
940
|
-
}).join('');
|
|
941
|
-
var attach = findAttachment(text);
|
|
942
|
-
if (!attach) return null;
|
|
943
|
-
var name = text.match(/>(.*)<\/a>/);
|
|
944
|
-
return {
|
|
945
|
-
type: 'attach',
|
|
946
|
-
url: decodeURIComponentUrl(attach === null || attach === void 0 ? void 0 : attach.url),
|
|
947
|
-
size: attach.size,
|
|
948
|
-
children: [
|
|
949
|
-
{
|
|
950
|
-
type: 'card-before',
|
|
951
|
-
children: [
|
|
952
|
-
{
|
|
953
|
-
text: ''
|
|
954
|
-
}
|
|
955
|
-
]
|
|
956
|
-
},
|
|
957
|
-
{
|
|
958
|
-
type: 'card-after',
|
|
959
|
-
children: [
|
|
960
|
-
{
|
|
961
|
-
text: ''
|
|
962
|
-
}
|
|
963
|
-
]
|
|
964
|
-
}
|
|
965
|
-
],
|
|
966
|
-
name: name ? name[1] : attach === null || attach === void 0 ? void 0 : attach.url
|
|
967
|
-
};
|
|
968
|
-
};
|
|
969
|
-
/**
|
|
970
|
-
* 处理链接卡片
|
|
971
|
-
*/ var handleLinkCard = function(currentElement, config) {
|
|
972
|
-
var _currentElement_children;
|
|
973
|
-
var link = currentElement === null || currentElement === void 0 ? void 0 : (_currentElement_children = currentElement.children) === null || _currentElement_children === void 0 ? void 0 : _currentElement_children.at(0);
|
|
974
|
-
return _object_spread_props(_object_spread({}, config), {
|
|
975
|
-
type: 'link-card',
|
|
976
|
-
url: decodeURIComponentUrl(link === null || link === void 0 ? void 0 : link.url),
|
|
977
|
-
children: [
|
|
978
|
-
{
|
|
979
|
-
type: 'card-before',
|
|
980
|
-
children: [
|
|
981
|
-
{
|
|
982
|
-
text: ''
|
|
983
|
-
}
|
|
984
|
-
]
|
|
985
|
-
},
|
|
986
|
-
{
|
|
987
|
-
type: 'card-after',
|
|
988
|
-
children: [
|
|
989
|
-
{
|
|
990
|
-
text: ''
|
|
991
|
-
}
|
|
992
|
-
]
|
|
993
|
-
}
|
|
994
|
-
],
|
|
995
|
-
name: link.title
|
|
996
|
-
});
|
|
997
|
-
};
|
|
998
|
-
/**
|
|
999
|
-
* 处理段落中的图片子元素(纯函数版本)
|
|
1000
|
-
*/ var processImageChild = function(currentChild, textNodes, elements, currentElement, plugins, parserConfig) {
|
|
1001
|
-
var newElements = _to_consumable_array(elements);
|
|
1002
|
-
var newTextNodes = _to_consumable_array(textNodes);
|
|
1003
|
-
if (textNodes.length) {
|
|
1004
|
-
newElements.push({
|
|
1005
|
-
type: 'paragraph',
|
|
1006
|
-
children: parseNodes(textNodes, plugins, false, currentElement, parserConfig)
|
|
1007
|
-
});
|
|
1008
|
-
newTextNodes = [];
|
|
1009
|
-
}
|
|
1010
|
-
newElements.push(EditorUtils.createMediaNode(decodeURIComponentUrl(currentChild === null || currentChild === void 0 ? void 0 : currentChild.url), 'image', {
|
|
1011
|
-
alt: currentChild.alt,
|
|
1012
|
-
finished: currentChild.finished
|
|
1013
|
-
}));
|
|
1014
|
-
return {
|
|
1015
|
-
elements: newElements,
|
|
1016
|
-
textNodes: newTextNodes
|
|
1017
|
-
};
|
|
1018
|
-
};
|
|
1019
|
-
/**
|
|
1020
|
-
* 处理段落中的 HTML 子元素(纯函数版本)
|
|
1021
|
-
*/ var processHtmlChild = function(currentChild, textNodes, elements) {
|
|
1022
|
-
if (currentChild.value.match(/^<\/(img|video|iframe)>/)) {
|
|
1023
|
-
return {
|
|
1024
|
-
elements: elements,
|
|
1025
|
-
textNodes: textNodes
|
|
1026
|
-
};
|
|
1027
|
-
}
|
|
1028
|
-
var mediaElement = findImageElement(currentChild.value);
|
|
1029
|
-
if (mediaElement) {
|
|
1030
|
-
var node = createMediaNodeFromElement(mediaElement);
|
|
1031
|
-
if (node) {
|
|
1032
|
-
return {
|
|
1033
|
-
elements: _to_consumable_array(elements).concat([
|
|
1034
|
-
node
|
|
1035
|
-
]),
|
|
1036
|
-
textNodes: textNodes
|
|
1037
|
-
};
|
|
1038
|
-
}
|
|
1039
|
-
}
|
|
1040
|
-
return {
|
|
1041
|
-
elements: elements,
|
|
1042
|
-
textNodes: _to_consumable_array(textNodes).concat([
|
|
1043
|
-
{
|
|
1044
|
-
type: 'html',
|
|
1045
|
-
value: currentChild.value
|
|
1046
|
-
}
|
|
1047
|
-
])
|
|
1048
|
-
};
|
|
1049
|
-
};
|
|
1050
|
-
/**
|
|
1051
|
-
* 处理段落中的子元素
|
|
1052
|
-
*/ var processParagraphChildren = function(currentElement, plugins, parserConfig) {
|
|
1053
|
-
var elements = [];
|
|
1054
|
-
var textNodes = [];
|
|
1055
|
-
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1056
|
-
try {
|
|
1057
|
-
for(var _iterator = (currentElement.children || [])[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1058
|
-
var currentChild = _step.value;
|
|
1059
|
-
if (currentChild.type === 'image') {
|
|
1060
|
-
var result = processImageChild(currentChild, textNodes, elements, currentElement, plugins, parserConfig);
|
|
1061
|
-
elements = result.elements;
|
|
1062
|
-
textNodes = result.textNodes;
|
|
1063
|
-
} else if (currentChild.type === 'html') {
|
|
1064
|
-
var result1 = processHtmlChild(currentChild, textNodes, elements);
|
|
1065
|
-
elements = result1.elements;
|
|
1066
|
-
textNodes = result1.textNodes;
|
|
1067
|
-
} else {
|
|
1068
|
-
textNodes = _to_consumable_array(textNodes).concat([
|
|
1069
|
-
currentChild
|
|
1070
|
-
]);
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1073
|
-
} catch (err) {
|
|
1074
|
-
_didIteratorError = true;
|
|
1075
|
-
_iteratorError = err;
|
|
1076
|
-
} finally{
|
|
1077
|
-
try {
|
|
1078
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1079
|
-
_iterator.return();
|
|
1080
|
-
}
|
|
1081
|
-
} finally{
|
|
1082
|
-
if (_didIteratorError) {
|
|
1083
|
-
throw _iteratorError;
|
|
1084
|
-
}
|
|
1085
|
-
}
|
|
1086
|
-
}
|
|
1087
|
-
if (textNodes.length) {
|
|
1088
|
-
elements.push({
|
|
1089
|
-
type: 'paragraph',
|
|
1090
|
-
children: parseNodes(textNodes, plugins, false, currentElement, undefined)
|
|
1091
|
-
});
|
|
1092
|
-
}
|
|
1093
|
-
return elements;
|
|
1094
|
-
};
|
|
1095
|
-
/**
|
|
1096
|
-
* 处理段落节点
|
|
1097
|
-
* @param currentElement - 当前处理的段落元素
|
|
1098
|
-
* @param config - 配置对象,包含样式和行为设置
|
|
1099
|
-
* @param plugins - 插件数组
|
|
1100
|
-
* @returns 返回格式化的段落节点对象或元素数组
|
|
1101
|
-
*/ var handleParagraph = function(currentElement, config, plugins, parserConfig) {
|
|
1102
|
-
var _currentElement_children, _currentElement_children_at, _currentElement_children1;
|
|
1103
|
-
// 检查是否是附件链接
|
|
1104
|
-
if (((_currentElement_children = currentElement.children) === null || _currentElement_children === void 0 ? void 0 : _currentElement_children[0].type) === 'html' && currentElement.children[0].value.startsWith('<a')) {
|
|
1105
|
-
var attachNode = handleAttachmentLink(currentElement);
|
|
1106
|
-
if (attachNode) return attachNode;
|
|
1107
|
-
}
|
|
1108
|
-
// 检查是否是链接卡片
|
|
1109
|
-
if ((currentElement === null || currentElement === void 0 ? void 0 : (_currentElement_children1 = currentElement.children) === null || _currentElement_children1 === void 0 ? void 0 : (_currentElement_children_at = _currentElement_children1.at(0)) === null || _currentElement_children_at === void 0 ? void 0 : _currentElement_children_at.type) === 'link' && config.type === 'card') {
|
|
1110
|
-
return handleLinkCard(currentElement, config);
|
|
1111
|
-
}
|
|
1112
|
-
// 处理混合内容段落
|
|
1113
|
-
return processParagraphChildren(currentElement, plugins, parserConfig);
|
|
1114
|
-
};
|
|
1115
|
-
/**
|
|
1116
|
-
* 处理内联代码节点
|
|
1117
|
-
* @param currentElement - 当前处理的内联代码元素
|
|
1118
|
-
* @returns 返回格式化的内联代码节点对象,支持占位符和初始值
|
|
1119
|
-
*/ var handleInlineCode = function(currentElement) {
|
|
1120
|
-
var _currentElement_value, _currentElement_value1;
|
|
1121
|
-
var hasPlaceHolder = (_currentElement_value = currentElement.value) === null || _currentElement_value === void 0 ? void 0 : _currentElement_value.match(/\$\{(.*?)\}/);
|
|
1122
|
-
var values = hasPlaceHolder ? hasPlaceHolder[1].split(';').map(function(item) {
|
|
1123
|
-
var values = item === null || item === void 0 ? void 0 : item.split(':');
|
|
1124
|
-
return _define_property({}, (values === null || values === void 0 ? void 0 : values.at(0)) || '', values === null || values === void 0 ? void 0 : values.at(1));
|
|
1125
|
-
}).reduce(function(acc, item) {
|
|
1126
|
-
return _object_spread({}, acc, item);
|
|
1127
|
-
}, {}) : undefined;
|
|
1128
|
-
return {
|
|
1129
|
-
text: values ? (values === null || values === void 0 ? void 0 : values.initialValue) || ' ' : currentElement.value,
|
|
1130
|
-
tag: (_currentElement_value1 = currentElement.value) === null || _currentElement_value1 === void 0 ? void 0 : _currentElement_value1.startsWith('${'),
|
|
1131
|
-
placeholder: (values === null || values === void 0 ? void 0 : values.placeholder) || undefined,
|
|
1132
|
-
initialValue: (values === null || values === void 0 ? void 0 : values.initialValue) || undefined,
|
|
1133
|
-
code: true
|
|
1134
|
-
};
|
|
1135
|
-
};
|
|
1136
|
-
/**
|
|
1137
|
-
* 处理分割线节点
|
|
1138
|
-
* @returns 返回格式化的分割线节点对象
|
|
1139
|
-
*/ var handleThematicBreak = function() {
|
|
1140
|
-
return {
|
|
1141
|
-
type: 'hr',
|
|
1142
|
-
children: [
|
|
1143
|
-
{
|
|
1144
|
-
text: ''
|
|
1145
|
-
}
|
|
1146
|
-
]
|
|
1147
|
-
};
|
|
1148
|
-
};
|
|
1149
|
-
/**
|
|
1150
|
-
* 处理引用块节点
|
|
1151
|
-
* @param currentElement - 当前处理的引用块元素
|
|
1152
|
-
* @returns 返回格式化的引用块节点对象
|
|
1153
|
-
*/ var handleBlockquote = function(currentElement, plugins, parserConfig) {
|
|
1154
|
-
var _currentElement_children;
|
|
1155
|
-
return {
|
|
1156
|
-
type: 'blockquote',
|
|
1157
|
-
children: ((_currentElement_children = currentElement.children) === null || _currentElement_children === void 0 ? void 0 : _currentElement_children.length) ? parseNodes(currentElement.children, plugins, false, currentElement, parserConfig) : [
|
|
1158
|
-
{
|
|
1159
|
-
type: 'paragraph',
|
|
1160
|
-
children: [
|
|
1161
|
-
{
|
|
1162
|
-
text: ''
|
|
1163
|
-
}
|
|
1164
|
-
]
|
|
1165
|
-
}
|
|
1166
|
-
]
|
|
1167
|
-
};
|
|
1168
|
-
};
|
|
1169
|
-
/**
|
|
1170
|
-
* 处理定义节点
|
|
1171
|
-
* @param currentElement - 当前处理的定义元素,包含标签和URL
|
|
1172
|
-
* @returns 返回格式化的定义段落节点对象
|
|
1173
|
-
*/ var handleDefinition = function(currentElement) {
|
|
1174
|
-
return {
|
|
1175
|
-
type: 'paragraph',
|
|
1176
|
-
children: [
|
|
1177
|
-
{
|
|
1178
|
-
text: "[".concat(currentElement.label, "]: ") + (currentElement.url ? "".concat(currentElement.url) : '')
|
|
1179
|
-
}
|
|
1180
|
-
]
|
|
1181
|
-
};
|
|
1182
|
-
};
|
|
1183
|
-
/**
|
|
1184
|
-
* 应用HTML标签样式到元素(纯函数版本)
|
|
1185
|
-
* @param el - 目标元素对象
|
|
1186
|
-
* @param htmlTag - HTML标签数组,包含样式信息
|
|
1187
|
-
* @returns 返回应用了样式的新元素对象
|
|
1188
|
-
*/ var applyHtmlTagsToElement = function(el, htmlTag) {
|
|
1189
|
-
if (!htmlTag.length) {
|
|
1190
|
-
return el;
|
|
1191
|
-
}
|
|
1192
|
-
var result = _object_spread({}, el);
|
|
1193
|
-
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1194
|
-
try {
|
|
1195
|
-
for(var _iterator = htmlTag[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1196
|
-
var t = _step.value;
|
|
1197
|
-
if (t.tag === 'font') {
|
|
1198
|
-
result.color = t.color;
|
|
1199
|
-
}
|
|
1200
|
-
if (t.tag === 'sup') result.identifier = el.text;
|
|
1201
|
-
if (t.tag === 'sub') result.identifier = el.text;
|
|
1202
|
-
if (t.tag === 'code') result.code = true;
|
|
1203
|
-
if (t.tag === 'i') result.italic = true;
|
|
1204
|
-
if (t.tag === 'b' || t.tag === 'strong') result.bold = true;
|
|
1205
|
-
if (t.tag === 'del') result.strikethrough = true;
|
|
1206
|
-
if ((t.tag === 'span' || t.tag === 'font') && t.color) {
|
|
1207
|
-
result.highColor = t.color;
|
|
1208
|
-
}
|
|
1209
|
-
if (t.tag === 'a' && (t === null || t === void 0 ? void 0 : t.url)) {
|
|
1210
|
-
result.url = t === null || t === void 0 ? void 0 : t.url;
|
|
1211
|
-
}
|
|
1212
|
-
}
|
|
1213
|
-
} catch (err) {
|
|
1214
|
-
_didIteratorError = true;
|
|
1215
|
-
_iteratorError = err;
|
|
1216
|
-
} finally{
|
|
1217
|
-
try {
|
|
1218
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1219
|
-
_iterator.return();
|
|
1220
|
-
}
|
|
1221
|
-
} finally{
|
|
1222
|
-
if (_didIteratorError) {
|
|
1223
|
-
throw _iteratorError;
|
|
1224
|
-
}
|
|
1225
|
-
}
|
|
1226
|
-
}
|
|
1227
|
-
return result;
|
|
1228
|
-
};
|
|
1229
|
-
/**
|
|
1230
|
-
* 处理文本和内联元素节点(纯函数版本)
|
|
1231
|
-
* @param currentElement - 当前处理的元素
|
|
1232
|
-
* @param htmlTag - HTML标签数组
|
|
1233
|
-
* @param applyInlineFormattingFn - 应用内联格式的函数
|
|
1234
|
-
* @param parseNodesFn - 解析节点的函数
|
|
1235
|
-
* @returns 处理后的元素对象
|
|
1236
|
-
*/ var handleTextAndInlineElementsPure = function(currentElement, htmlTag, applyInlineFormattingFn, parseNodesFn) {
|
|
1237
|
-
var elementType = currentElement.type;
|
|
1238
|
-
// 处理文本节点
|
|
1239
|
-
if (elementType === 'text') {
|
|
1240
|
-
var el = {
|
|
1241
|
-
text: currentElement.value
|
|
1242
|
-
};
|
|
1243
|
-
return htmlTag.length > 0 && currentElement.value ? applyHtmlTagsToElement(el, htmlTag) : el;
|
|
1244
|
-
}
|
|
1245
|
-
// 处理换行
|
|
1246
|
-
if (elementType === 'break') {
|
|
1247
|
-
return {
|
|
1248
|
-
text: '\n'
|
|
1249
|
-
};
|
|
1250
|
-
}
|
|
1251
|
-
// 处理内联元素(strong, link, emphasis, delete, inlineCode)
|
|
1252
|
-
var inlineElementTypes = [
|
|
1253
|
-
'strong',
|
|
1254
|
-
'link',
|
|
1255
|
-
'emphasis',
|
|
1256
|
-
'delete',
|
|
1257
|
-
'inlineCode'
|
|
1258
|
-
];
|
|
1259
|
-
if (inlineElementTypes.includes(elementType)) {
|
|
1260
|
-
var _currentElement_children, _parseNodesFn, _currentElement_children1;
|
|
1261
|
-
var finished = currentElement.finished;
|
|
1262
|
-
var leaf = _object_spread({}, finished === false && {
|
|
1263
|
-
otherProps: {
|
|
1264
|
-
finished: finished
|
|
1265
|
-
}
|
|
1266
|
-
});
|
|
1267
|
-
var formattedLeaf = applyInlineFormattingFn(leaf, currentElement);
|
|
1268
|
-
var leafWithHtmlTags = applyHtmlTagsToElement(formattedLeaf, htmlTag);
|
|
1269
|
-
var hasHtmlChildren = currentElement === null || currentElement === void 0 ? void 0 : (_currentElement_children = currentElement.children) === null || _currentElement_children === void 0 ? void 0 : _currentElement_children.some(function(n) {
|
|
1270
|
-
return n.type === 'html';
|
|
1271
|
-
});
|
|
1272
|
-
return hasHtmlChildren ? _object_spread_props(_object_spread({}, (_parseNodesFn = parseNodesFn(currentElement === null || currentElement === void 0 ? void 0 : currentElement.children, false, currentElement)) === null || _parseNodesFn === void 0 ? void 0 : _parseNodesFn.at(0)), {
|
|
1273
|
-
url: leafWithHtmlTags.url
|
|
1274
|
-
}) : parseText(((_currentElement_children1 = currentElement.children) === null || _currentElement_children1 === void 0 ? void 0 : _currentElement_children1.length) ? currentElement.children : [
|
|
1275
|
-
{
|
|
1276
|
-
value: (leafWithHtmlTags === null || leafWithHtmlTags === void 0 ? void 0 : leafWithHtmlTags.url) || ''
|
|
1277
|
-
}
|
|
1278
|
-
], leafWithHtmlTags);
|
|
1279
|
-
}
|
|
1280
|
-
// 默认返回空文本
|
|
1281
|
-
return {
|
|
1282
|
-
text: ''
|
|
1283
|
-
};
|
|
1284
|
-
};
|
|
1285
|
-
/**
|
|
1286
|
-
* 应用上下文属性和配置到元素(纯函数版本)
|
|
1287
|
-
* @param el - 目标元素或元素数组
|
|
1288
|
-
* @param contextProps - 上下文属性对象
|
|
1289
|
-
* @param config - 配置对象
|
|
1290
|
-
* @returns 返回应用了属性和配置的新元素
|
|
1291
|
-
*/ var applyContextPropsAndConfig = function(el, contextProps, config) {
|
|
1292
|
-
var hasContextProps = Object.keys(contextProps || {}).length > 0;
|
|
1293
|
-
var hasConfig = Object.keys(config || {}).length > 0;
|
|
1294
|
-
if (Array.isArray(el)) {
|
|
1295
|
-
return el.map(function(item) {
|
|
1296
|
-
var result = _object_spread({}, item);
|
|
1297
|
-
if (hasContextProps) {
|
|
1298
|
-
result.contextProps = contextProps;
|
|
1299
|
-
}
|
|
1300
|
-
if (hasConfig && !item.otherProps) {
|
|
1301
|
-
result.otherProps = config;
|
|
1302
|
-
}
|
|
1303
|
-
return result;
|
|
1304
|
-
});
|
|
1305
|
-
}
|
|
1306
|
-
var result = _object_spread({}, el);
|
|
1307
|
-
if (hasContextProps) {
|
|
1308
|
-
result.contextProps = contextProps;
|
|
1309
|
-
}
|
|
1310
|
-
if (hasConfig && !el.otherProps) {
|
|
1311
|
-
result.otherProps = config;
|
|
1312
|
-
}
|
|
1313
|
-
return result;
|
|
1314
|
-
};
|
|
1315
|
-
/**
|
|
1316
|
-
* 根据行间距添加空行元素(纯函数版本)
|
|
1317
|
-
* @param els - 目标元素数组
|
|
1318
|
-
* @param preNode - 前一个节点
|
|
1319
|
-
* @param currentElement - 当前处理的元素
|
|
1320
|
-
* @param top - 是否为顶级解析
|
|
1321
|
-
* @returns 返回添加了空行元素的新数组
|
|
1322
|
-
*/ var addEmptyLinesIfNeeded = function(els, preNode, currentElement, top) {
|
|
1323
|
-
var _currentElement_position, _preNode_position;
|
|
1324
|
-
if (!preNode || !top) {
|
|
1325
|
-
return els;
|
|
1326
|
-
}
|
|
1327
|
-
var distance = (((_currentElement_position = currentElement.position) === null || _currentElement_position === void 0 ? void 0 : _currentElement_position.start.line) || 0) - (((_preNode_position = preNode.position) === null || _preNode_position === void 0 ? void 0 : _preNode_position.end.line) || 0);
|
|
1328
|
-
if (distance < EMPTY_LINE_DISTANCE_THRESHOLD) {
|
|
1329
|
-
return els;
|
|
1330
|
-
}
|
|
1331
|
-
var lines = Math.floor((distance - EMPTY_LINE_CALCULATION_OFFSET) / EMPTY_LINE_DIVISOR);
|
|
1332
|
-
var emptyLines = Array.from({
|
|
1333
|
-
length: lines
|
|
1334
|
-
}, function() {
|
|
1335
|
-
return {
|
|
1336
|
-
type: 'paragraph',
|
|
1337
|
-
children: [
|
|
1338
|
-
{
|
|
1339
|
-
text: ''
|
|
1340
|
-
}
|
|
1341
|
-
]
|
|
1342
|
-
};
|
|
1343
|
-
});
|
|
1344
|
-
return _to_consumable_array(els).concat(_to_consumable_array(emptyLines));
|
|
1345
|
-
};
|
|
1346
|
-
/**
|
|
1347
|
-
* 元素处理器映射表
|
|
1348
|
-
* 注意:这些处理器需要通过 handleSingleElement 传递 parserConfig
|
|
1349
|
-
*/ var elementHandlers = {
|
|
1350
|
-
heading: {
|
|
1351
|
-
handler: function(el, plugins) {
|
|
1352
|
-
return handleHeading(el, plugins);
|
|
1353
|
-
}
|
|
1354
|
-
},
|
|
1355
|
-
html: {
|
|
1356
|
-
handler: function() {
|
|
1357
|
-
return null;
|
|
1358
|
-
},
|
|
1359
|
-
needsHtmlResult: true
|
|
1360
|
-
},
|
|
1361
|
-
image: {
|
|
1362
|
-
handler: function(el) {
|
|
1363
|
-
return handleImage(el);
|
|
1364
|
-
}
|
|
1365
|
-
},
|
|
1366
|
-
inlineMath: {
|
|
1367
|
-
handler: function(el) {
|
|
1368
|
-
return handleInlineMath(el);
|
|
1369
|
-
}
|
|
1370
|
-
},
|
|
1371
|
-
math: {
|
|
1372
|
-
handler: function(el) {
|
|
1373
|
-
return handleMath(el);
|
|
1374
|
-
}
|
|
1375
|
-
},
|
|
1376
|
-
list: {
|
|
1377
|
-
handler: function(el, plugins) {
|
|
1378
|
-
return handleList(el, plugins);
|
|
1379
|
-
}
|
|
1380
|
-
},
|
|
1381
|
-
footnoteReference: {
|
|
1382
|
-
handler: function(el) {
|
|
1383
|
-
return handleFootnoteReference(el);
|
|
1384
|
-
}
|
|
1385
|
-
},
|
|
1386
|
-
footnoteDefinition: {
|
|
1387
|
-
handler: function(el, plugins) {
|
|
1388
|
-
return handleFootnoteDefinition(el, plugins);
|
|
1389
|
-
}
|
|
1390
|
-
},
|
|
1391
|
-
listItem: {
|
|
1392
|
-
handler: function(el, plugins) {
|
|
1393
|
-
return handleListItem(el, plugins);
|
|
1394
|
-
}
|
|
1395
|
-
},
|
|
1396
|
-
paragraph: {
|
|
1397
|
-
handler: function(el, plugins, config) {
|
|
1398
|
-
return handleParagraph(el, config, plugins);
|
|
1399
|
-
}
|
|
1400
|
-
},
|
|
1401
|
-
inlineCode: {
|
|
1402
|
-
handler: function(el) {
|
|
1403
|
-
return handleInlineCode(el);
|
|
1404
|
-
}
|
|
1405
|
-
},
|
|
1406
|
-
thematicBreak: {
|
|
1407
|
-
handler: function() {
|
|
1408
|
-
return handleThematicBreak();
|
|
1409
|
-
}
|
|
1410
|
-
},
|
|
1411
|
-
code: {
|
|
1412
|
-
handler: function(el) {
|
|
1413
|
-
return handleCode(el);
|
|
1414
|
-
}
|
|
1415
|
-
},
|
|
1416
|
-
yaml: {
|
|
1417
|
-
handler: function(el) {
|
|
1418
|
-
return handleYaml(el);
|
|
1419
|
-
}
|
|
1420
|
-
},
|
|
1421
|
-
blockquote: {
|
|
1422
|
-
handler: function(el, plugins) {
|
|
1423
|
-
return handleBlockquote(el, plugins);
|
|
1424
|
-
}
|
|
1425
|
-
},
|
|
1426
|
-
table: {
|
|
1427
|
-
handler: function(el, plugins, config, parent, htmlTag, preElement) {
|
|
1428
|
-
return parseTableOrChart(el, preElement, plugins, parseNodes, undefined);
|
|
1429
|
-
}
|
|
1430
|
-
},
|
|
1431
|
-
definition: {
|
|
1432
|
-
handler: function(el) {
|
|
1433
|
-
return handleDefinition(el);
|
|
1434
|
-
}
|
|
1435
|
-
}
|
|
1436
|
-
};
|
|
1437
|
-
/**
|
|
1438
|
-
* 解析 Markdown AST 节点为 Slate 节点(独立函数版本,用于向后兼容)
|
|
1439
|
-
* 内部使用 MarkdownToSlateParser 类来处理
|
|
1440
|
-
*
|
|
1441
|
-
* @deprecated 建议直接使用 MarkdownToSlateParser 类
|
|
1442
|
-
*/ var parseNodes = function(nodes, plugins) {
|
|
1443
|
-
var top = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false, parent = arguments.length > 3 ? arguments[3] : void 0, parserConfig = arguments.length > 4 ? arguments[4] : void 0;
|
|
1444
|
-
// 创建一个临时 parser 实例来处理
|
|
1445
|
-
// 注意:这不是最优的方式,但为了向后兼容保留
|
|
1446
|
-
// 使用类型断言访问私有方法
|
|
1447
|
-
var parser = new MarkdownToSlateParser(parserConfig || {}, plugins || []);
|
|
1448
|
-
return parser.parseNodes(nodes, top, parent);
|
|
1449
|
-
};
|
|
1450
|
-
/**
|
|
1451
|
-
* 标准 HTML 元素列表
|
|
1452
|
-
* 这些标签会被正常解析为 HTML,其他标签会被当作普通文本处理
|
|
1453
|
-
*/ var STANDARD_HTML_ELEMENTS = new Set([
|
|
1454
|
-
// 文档结构
|
|
1455
|
-
'html',
|
|
1456
|
-
'head',
|
|
1457
|
-
'body',
|
|
1458
|
-
'title',
|
|
1459
|
-
'meta',
|
|
1460
|
-
'link',
|
|
1461
|
-
'style',
|
|
1462
|
-
'script',
|
|
1463
|
-
// 内容分区
|
|
1464
|
-
'header',
|
|
1465
|
-
'nav',
|
|
1466
|
-
'main',
|
|
1467
|
-
'section',
|
|
1468
|
-
'article',
|
|
1469
|
-
'aside',
|
|
1470
|
-
'footer',
|
|
1471
|
-
'h1',
|
|
1472
|
-
'h2',
|
|
1473
|
-
'h3',
|
|
1474
|
-
'h4',
|
|
1475
|
-
'h5',
|
|
1476
|
-
'h6',
|
|
1477
|
-
// 文本内容
|
|
1478
|
-
'div',
|
|
1479
|
-
'p',
|
|
1480
|
-
'hr',
|
|
1481
|
-
'pre',
|
|
1482
|
-
'blockquote',
|
|
1483
|
-
// 列表
|
|
1484
|
-
'ul',
|
|
1485
|
-
'ol',
|
|
1486
|
-
'li',
|
|
1487
|
-
'dl',
|
|
1488
|
-
'dt',
|
|
1489
|
-
'dd',
|
|
1490
|
-
// 表格
|
|
1491
|
-
'table',
|
|
1492
|
-
'thead',
|
|
1493
|
-
'tbody',
|
|
1494
|
-
'tfoot',
|
|
1495
|
-
'tr',
|
|
1496
|
-
'th',
|
|
1497
|
-
'td',
|
|
1498
|
-
'caption',
|
|
1499
|
-
'colgroup',
|
|
1500
|
-
'col',
|
|
1501
|
-
// 表单
|
|
1502
|
-
'form',
|
|
1503
|
-
'input',
|
|
1504
|
-
'textarea',
|
|
1505
|
-
'button',
|
|
1506
|
-
'select',
|
|
1507
|
-
'option',
|
|
1508
|
-
'label',
|
|
1509
|
-
'fieldset',
|
|
1510
|
-
'legend',
|
|
1511
|
-
// 内联文本语义
|
|
1512
|
-
'a',
|
|
1513
|
-
'em',
|
|
1514
|
-
'strong',
|
|
1515
|
-
'small',
|
|
1516
|
-
'mark',
|
|
1517
|
-
'del',
|
|
1518
|
-
'ins',
|
|
1519
|
-
'sub',
|
|
1520
|
-
'sup',
|
|
1521
|
-
'i',
|
|
1522
|
-
'b',
|
|
1523
|
-
'u',
|
|
1524
|
-
's',
|
|
1525
|
-
'code',
|
|
1526
|
-
'kbd',
|
|
1527
|
-
'samp',
|
|
1528
|
-
'var',
|
|
1529
|
-
'span',
|
|
1530
|
-
'br',
|
|
1531
|
-
'wbr',
|
|
1532
|
-
// 图片和多媒体
|
|
1533
|
-
'img',
|
|
1534
|
-
'video',
|
|
1535
|
-
'audio',
|
|
1536
|
-
'source',
|
|
1537
|
-
'track',
|
|
1538
|
-
'iframe',
|
|
1539
|
-
'embed',
|
|
1540
|
-
'object',
|
|
1541
|
-
'param',
|
|
1542
|
-
'picture',
|
|
1543
|
-
// 其他
|
|
1544
|
-
'canvas',
|
|
1545
|
-
'svg',
|
|
1546
|
-
'math',
|
|
1547
|
-
'details',
|
|
1548
|
-
'summary',
|
|
1549
|
-
'dialog',
|
|
1550
|
-
'menu',
|
|
1551
|
-
'menuitem',
|
|
1552
|
-
// 字体
|
|
1553
|
-
'font'
|
|
1554
|
-
]);
|
|
1555
|
-
/**
|
|
1556
|
-
* 检查 HTML 标签是否为标准元素
|
|
1557
|
-
* @param htmlString - HTML 字符串
|
|
1558
|
-
* @returns 是否为标准 HTML 元素
|
|
1559
|
-
*/ function isStandardHtmlElement(htmlString) {
|
|
1560
|
-
// 提取标签名(支持开始标签和结束标签)
|
|
1561
|
-
var tagMatch = htmlString.match(/<\/?(\w+)/);
|
|
1562
|
-
if (!tagMatch) return false;
|
|
1563
|
-
var tagName = tagMatch[1].toLowerCase();
|
|
1564
|
-
return STANDARD_HTML_ELEMENTS.has(tagName);
|
|
1565
|
-
}
|
|
1566
|
-
/**
|
|
1567
|
-
* 预处理特殊标签(think/answer),将其转换为代码块格式
|
|
1568
|
-
* @param markdown - 原始 Markdown 字符串
|
|
1569
|
-
* @param tagName - 标签名称(think 或 answer)
|
|
1570
|
-
* @returns 处理后的 Markdown 字符串
|
|
1571
|
-
*/ function preprocessSpecialTags(markdown, tagName) {
|
|
1572
|
-
var tagRegex = new RegExp("<".concat(tagName, ">([\\s\\S]*?)<\\/").concat(tagName, ">"), 'g');
|
|
1573
|
-
return markdown === null || markdown === void 0 ? void 0 : markdown.replace(tagRegex, function(match, content) {
|
|
1574
|
-
var trimmedContent = content.trim();
|
|
1575
|
-
// 如果内容中包含代码块标记(三个反引号),需要进行转义
|
|
1576
|
-
// 策略:使用特殊标记替换代码块,保持原始格式
|
|
1577
|
-
var processedContent = trimmedContent === null || trimmedContent === void 0 ? void 0 : trimmedContent.replace(/```(\w*)\n?([\s\S]*?)```/g, function(_, lang, code) {
|
|
1578
|
-
// 使用特殊标记包裹,保留语言和代码内容
|
|
1579
|
-
// 格式:【CODE_BLOCK:lang】code【/CODE_BLOCK】
|
|
1580
|
-
var marker = '\u200B'; // 零宽空格,用于标记
|
|
1581
|
-
return "".concat(marker, "【CODE_BLOCK:").concat(lang || '', "】\n").concat(code, "\n【/CODE_BLOCK】").concat(marker);
|
|
1582
|
-
});
|
|
1583
|
-
// 构建对应类型的代码块
|
|
1584
|
-
return "```".concat(tagName, "\n").concat(processedContent, "\n```");
|
|
1585
|
-
});
|
|
1586
|
-
}
|
|
1587
|
-
/**
|
|
1588
|
-
* 预处理 <think> 标签,将其转换为 ```think 代码块格式
|
|
1589
|
-
* @param markdown - 原始 Markdown 字符串
|
|
1590
|
-
* @returns 处理后的 Markdown 字符串
|
|
1591
|
-
*/ function preprocessThinkTags(markdown) {
|
|
1592
|
-
return preprocessSpecialTags(markdown, 'think');
|
|
1593
|
-
}
|
|
1594
|
-
/**
|
|
1595
|
-
* 预处理所有非标准 HTML 标签,提取其内容(删除标签本身)
|
|
1596
|
-
* @param markdown - 原始 Markdown 字符串
|
|
1597
|
-
* @returns 处理后的 Markdown 字符串
|
|
1598
|
-
*/ function preprocessNonStandardHtmlTags(markdown) {
|
|
1599
|
-
var result = markdown;
|
|
1600
|
-
var hasNonStandardTags = true;
|
|
1601
|
-
// 循环处理,直到没有非标准标签(处理嵌套情况)
|
|
1602
|
-
while(hasNonStandardTags){
|
|
1603
|
-
var before = result;
|
|
1604
|
-
// 匹配所有 HTML 标签对:<tagname>content</tagname>
|
|
1605
|
-
result = result.replace(/<(\w+)>([\s\S]*?)<\/\1>/g, function(match, tagName, content) {
|
|
1606
|
-
// 检查是否为标准 HTML 元素
|
|
1607
|
-
if (STANDARD_HTML_ELEMENTS.has(tagName.toLowerCase())) {
|
|
1608
|
-
// 标准元素保持不变
|
|
1609
|
-
return match;
|
|
1610
|
-
}
|
|
1611
|
-
// 非标准元素只保留内容(不 trim,保持原始格式)
|
|
1612
|
-
return content;
|
|
1613
|
-
});
|
|
1614
|
-
// 如果没有变化,说明处理完成
|
|
1615
|
-
hasNonStandardTags = before !== result;
|
|
1616
|
-
}
|
|
1617
|
-
return result;
|
|
1618
|
-
}
|
|
1619
84
|
/**
|
|
1620
85
|
* Markdown 到 Slate 节点解析器类
|
|
1621
86
|
*
|
|
@@ -1715,18 +180,6 @@ export var decodeURIComponentUrl = function(url) {
|
|
|
1715
180
|
}
|
|
1716
181
|
// 如果插件没有处理,使用默认处理逻辑
|
|
1717
182
|
if (!pluginHandled) {
|
|
1718
|
-
var isLastNode = i === nodes.length - 1;
|
|
1719
|
-
// 如果是 code 节点,检查是否是最后一个节点,设置 finished 属性
|
|
1720
|
-
if (currentElement.type === 'code') {
|
|
1721
|
-
// 如果 code 不是最后一个节点,finish 设置为 true
|
|
1722
|
-
if (!isLastNode) {
|
|
1723
|
-
if (!currentElement.otherProps) {
|
|
1724
|
-
currentElement.otherProps = {};
|
|
1725
|
-
}
|
|
1726
|
-
delete currentElement.otherProps.finished;
|
|
1727
|
-
}
|
|
1728
|
-
// 如果是最后一个节点,保持原逻辑(在 handleCode 中处理)
|
|
1729
|
-
}
|
|
1730
183
|
// 使用统一的处理函数,通过 this 访问配置和插件
|
|
1731
184
|
var result = _this.handleSingleElement(currentElement, config, parent, htmlTag, preElement);
|
|
1732
185
|
el = result.el;
|
|
@@ -1741,9 +194,14 @@ export var decodeURIComponentUrl = function(url) {
|
|
|
1741
194
|
els = addEmptyLinesIfNeeded(els, preNode, currentElement, top);
|
|
1742
195
|
if (el) {
|
|
1743
196
|
el = applyContextPropsAndConfig(el, contextProps, config);
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
197
|
+
// 使用 if-else 而不是条件表达式,避免类型错误
|
|
198
|
+
if (Array.isArray(el)) {
|
|
199
|
+
els = _to_consumable_array(els).concat(_to_consumable_array(el));
|
|
200
|
+
} else {
|
|
201
|
+
els = _to_consumable_array(els).concat([
|
|
202
|
+
el
|
|
203
|
+
]);
|
|
204
|
+
}
|
|
1747
205
|
}
|
|
1748
206
|
preNode = currentElement;
|
|
1749
207
|
preElement = el;
|
|
@@ -1769,325 +227,140 @@ export var decodeURIComponentUrl = function(url) {
|
|
|
1769
227
|
}
|
|
1770
228
|
},
|
|
1771
229
|
{
|
|
1772
|
-
key: "
|
|
230
|
+
key: "getElementHandlers",
|
|
1773
231
|
value: /**
|
|
1774
232
|
* 处理单个元素(类方法版本)
|
|
1775
|
-
*/
|
|
233
|
+
*/ /**
|
|
234
|
+
* 获取统一的元素处理器映射表
|
|
235
|
+
*/ function getElementHandlers() {
|
|
1776
236
|
var _this = this;
|
|
1777
|
-
var
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
return
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
el: this.handleTextAndInlineElements(currentElement, htmlTag)
|
|
1790
|
-
};
|
|
1791
|
-
}
|
|
1792
|
-
var classMethodHandlers = {
|
|
1793
|
-
heading: function(el) {
|
|
1794
|
-
return _this.handleHeading(el);
|
|
237
|
+
var parseNodesFn = function(nodes, top, parent) {
|
|
238
|
+
return _this.parseNodes(nodes, top, parent);
|
|
239
|
+
};
|
|
240
|
+
var parseNodesForTable = function(nodes, _plugins, top, parent) {
|
|
241
|
+
return _this.parseNodes(nodes, top || false, parent);
|
|
242
|
+
};
|
|
243
|
+
return {
|
|
244
|
+
html: {
|
|
245
|
+
handler: function() {
|
|
246
|
+
return null;
|
|
247
|
+
},
|
|
248
|
+
needsHtmlResult: true
|
|
1795
249
|
},
|
|
1796
|
-
|
|
1797
|
-
|
|
250
|
+
image: {
|
|
251
|
+
handler: function(el) {
|
|
252
|
+
return handleImage(el);
|
|
253
|
+
}
|
|
1798
254
|
},
|
|
1799
|
-
|
|
1800
|
-
|
|
255
|
+
inlineMath: {
|
|
256
|
+
handler: function(el) {
|
|
257
|
+
return handleInlineMath(el);
|
|
258
|
+
}
|
|
1801
259
|
},
|
|
1802
|
-
|
|
1803
|
-
|
|
260
|
+
math: {
|
|
261
|
+
handler: function(el) {
|
|
262
|
+
return handleMath(el);
|
|
263
|
+
}
|
|
1804
264
|
},
|
|
1805
|
-
|
|
1806
|
-
|
|
265
|
+
footnoteReference: {
|
|
266
|
+
handler: function(el) {
|
|
267
|
+
return handleFootnoteReference(el);
|
|
268
|
+
}
|
|
1807
269
|
},
|
|
1808
|
-
|
|
1809
|
-
|
|
270
|
+
inlineCode: {
|
|
271
|
+
handler: function(el) {
|
|
272
|
+
return handleInlineCode(el);
|
|
273
|
+
}
|
|
1810
274
|
},
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
return
|
|
1814
|
-
}, _this.config);
|
|
1815
|
-
}
|
|
1816
|
-
};
|
|
1817
|
-
var classMethodHandler = classMethodHandlers[elementType];
|
|
1818
|
-
if (classMethodHandler) {
|
|
1819
|
-
return {
|
|
1820
|
-
el: classMethodHandler(currentElement)
|
|
1821
|
-
};
|
|
1822
|
-
}
|
|
1823
|
-
var handlerResult = handlerInfo.handler(currentElement, this.plugins, config, parent, htmlTag, preElement);
|
|
1824
|
-
return {
|
|
1825
|
-
el: handlerResult
|
|
1826
|
-
};
|
|
1827
|
-
}
|
|
1828
|
-
},
|
|
1829
|
-
{
|
|
1830
|
-
key: "handleHeading",
|
|
1831
|
-
value: /**
|
|
1832
|
-
* 处理标题节点(类方法版本)
|
|
1833
|
-
*/ function handleHeading(currentElement) {
|
|
1834
|
-
var _currentElement_children;
|
|
1835
|
-
return {
|
|
1836
|
-
type: 'head',
|
|
1837
|
-
level: currentElement.depth,
|
|
1838
|
-
children: ((_currentElement_children = currentElement.children) === null || _currentElement_children === void 0 ? void 0 : _currentElement_children.length) ? this.parseNodes(currentElement.children, false, currentElement) : [
|
|
1839
|
-
{
|
|
1840
|
-
text: ''
|
|
275
|
+
thematicBreak: {
|
|
276
|
+
handler: function() {
|
|
277
|
+
return handleThematicBreak();
|
|
1841
278
|
}
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
{
|
|
1847
|
-
key: "handleList",
|
|
1848
|
-
value: /**
|
|
1849
|
-
* 处理列表节点(类方法版本)
|
|
1850
|
-
*/ function handleList(currentElement) {
|
|
1851
|
-
var _el_children;
|
|
1852
|
-
var el = {
|
|
1853
|
-
type: 'list',
|
|
1854
|
-
order: currentElement.ordered,
|
|
1855
|
-
start: currentElement.start,
|
|
1856
|
-
finished: currentElement.finished,
|
|
1857
|
-
children: this.parseNodes(currentElement.children, false, currentElement)
|
|
1858
|
-
};
|
|
1859
|
-
el.task = (_el_children = el.children) === null || _el_children === void 0 ? void 0 : _el_children.some(function(s) {
|
|
1860
|
-
return typeof s.checked === 'boolean';
|
|
1861
|
-
});
|
|
1862
|
-
return el;
|
|
1863
|
-
}
|
|
1864
|
-
},
|
|
1865
|
-
{
|
|
1866
|
-
key: "handleFootnoteDefinition",
|
|
1867
|
-
value: /**
|
|
1868
|
-
* 处理脚注定义节点(类方法版本)
|
|
1869
|
-
*/ function handleFootnoteDefinition(currentElement) {
|
|
1870
|
-
var _this_parseNodes, _linkNode_children;
|
|
1871
|
-
var linkNode = (_this_parseNodes = this.parseNodes(currentElement.children, false, currentElement)) === null || _this_parseNodes === void 0 ? void 0 : _this_parseNodes.at(0);
|
|
1872
|
-
var cellNode = linkNode === null || linkNode === void 0 ? void 0 : (_linkNode_children = linkNode.children) === null || _linkNode_children === void 0 ? void 0 : _linkNode_children.at(0);
|
|
1873
|
-
return {
|
|
1874
|
-
value: cellNode === null || cellNode === void 0 ? void 0 : cellNode.text,
|
|
1875
|
-
url: cellNode === null || cellNode === void 0 ? void 0 : cellNode.url,
|
|
1876
|
-
type: 'footnoteDefinition',
|
|
1877
|
-
identifier: currentElement.identifier,
|
|
1878
|
-
children: [
|
|
1879
|
-
cellNode
|
|
1880
|
-
]
|
|
1881
|
-
};
|
|
1882
|
-
}
|
|
1883
|
-
},
|
|
1884
|
-
{
|
|
1885
|
-
key: "handleListItem",
|
|
1886
|
-
value: /**
|
|
1887
|
-
* 处理列表项节点(类方法版本)
|
|
1888
|
-
*/ function handleListItem(currentElement) {
|
|
1889
|
-
var _currentElement_children, _currentElement_children__children_, _currentElement_children__children, _currentElement_children_, _currentElement_children1, _currentElement_children__children1, _currentElement_children_1, _currentElement_children2;
|
|
1890
|
-
var children = ((_currentElement_children = currentElement.children) === null || _currentElement_children === void 0 ? void 0 : _currentElement_children.length) ? this.parseNodes(currentElement.children, false, currentElement) : [
|
|
1891
|
-
{
|
|
1892
|
-
type: 'paragraph',
|
|
1893
|
-
children: [
|
|
1894
|
-
{
|
|
1895
|
-
text: ''
|
|
1896
|
-
}
|
|
1897
|
-
]
|
|
1898
|
-
}
|
|
1899
|
-
];
|
|
1900
|
-
var mentions = undefined;
|
|
1901
|
-
if (((_currentElement_children1 = currentElement.children) === null || _currentElement_children1 === void 0 ? void 0 : (_currentElement_children_ = _currentElement_children1[0]) === null || _currentElement_children_ === void 0 ? void 0 : (_currentElement_children__children = _currentElement_children_.children) === null || _currentElement_children__children === void 0 ? void 0 : (_currentElement_children__children_ = _currentElement_children__children[0]) === null || _currentElement_children__children_ === void 0 ? void 0 : _currentElement_children__children_.type) === 'link' && ((_currentElement_children2 = currentElement.children) === null || _currentElement_children2 === void 0 ? void 0 : (_currentElement_children_1 = _currentElement_children2[0]) === null || _currentElement_children_1 === void 0 ? void 0 : (_currentElement_children__children1 = _currentElement_children_1.children) === null || _currentElement_children__children1 === void 0 ? void 0 : _currentElement_children__children1.length) > 1) {
|
|
1902
|
-
var _children__children, _children_;
|
|
1903
|
-
var item = children === null || children === void 0 ? void 0 : (_children_ = children[0]) === null || _children_ === void 0 ? void 0 : (_children__children = _children_.children) === null || _children__children === void 0 ? void 0 : _children__children[0];
|
|
1904
|
-
var label = item === null || item === void 0 ? void 0 : item.text;
|
|
1905
|
-
if (label) {
|
|
1906
|
-
var _item_url, _children__children1, _children_1;
|
|
1907
|
-
mentions = [
|
|
1908
|
-
{
|
|
1909
|
-
avatar: item === null || item === void 0 ? void 0 : item.url,
|
|
1910
|
-
name: label,
|
|
1911
|
-
id: new URLSearchParams('?' + (item === null || item === void 0 ? void 0 : (_item_url = item.url) === null || _item_url === void 0 ? void 0 : _item_url.split('?')[1])).get('id') || undefined
|
|
1912
|
-
}
|
|
1913
|
-
];
|
|
1914
|
-
children === null || children === void 0 ? true : (_children_1 = children[0]) === null || _children_1 === void 0 ? true : (_children__children1 = _children_1.children) === null || _children__children1 === void 0 ? true : delete _children__children1[0];
|
|
1915
|
-
}
|
|
1916
|
-
}
|
|
1917
|
-
return {
|
|
1918
|
-
type: 'list-item',
|
|
1919
|
-
checked: currentElement.checked,
|
|
1920
|
-
children: children,
|
|
1921
|
-
mentions: mentions
|
|
1922
|
-
};
|
|
1923
|
-
}
|
|
1924
|
-
},
|
|
1925
|
-
{
|
|
1926
|
-
key: "processParagraphChildren",
|
|
1927
|
-
value: /**
|
|
1928
|
-
* 处理段落子节点(类方法版本)
|
|
1929
|
-
*/ function processParagraphChildren(currentElement) {
|
|
1930
|
-
var elements = [];
|
|
1931
|
-
var textNodes = [];
|
|
1932
|
-
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1933
|
-
try {
|
|
1934
|
-
for(var _iterator = (currentElement.children || [])[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1935
|
-
var currentChild = _step.value;
|
|
1936
|
-
if (currentChild.type === 'image') {
|
|
1937
|
-
// 将累积的文本节点生成段落
|
|
1938
|
-
if (textNodes.length) {
|
|
1939
|
-
elements.push({
|
|
1940
|
-
type: 'paragraph',
|
|
1941
|
-
children: this.parseNodes(textNodes, false, currentElement)
|
|
1942
|
-
});
|
|
1943
|
-
textNodes = [];
|
|
1944
|
-
}
|
|
1945
|
-
// 添加图片节点
|
|
1946
|
-
elements.push(EditorUtils.createMediaNode(decodeURIComponentUrl(currentChild === null || currentChild === void 0 ? void 0 : currentChild.url), 'image', {
|
|
1947
|
-
alt: currentChild.alt,
|
|
1948
|
-
finished: currentChild.finished
|
|
1949
|
-
}));
|
|
1950
|
-
} else if (currentChild.type === 'html') {
|
|
1951
|
-
// 跳过媒体标签的结束标签
|
|
1952
|
-
if (currentChild.value.match(/^<\/(img|video|iframe)>/)) {
|
|
1953
|
-
continue;
|
|
1954
|
-
}
|
|
1955
|
-
var mediaElement = findImageElement(currentChild.value);
|
|
1956
|
-
if (mediaElement) {
|
|
1957
|
-
var node = createMediaNodeFromElement(mediaElement);
|
|
1958
|
-
if (node) {
|
|
1959
|
-
elements.push(node);
|
|
1960
|
-
}
|
|
1961
|
-
} else {
|
|
1962
|
-
textNodes.push({
|
|
1963
|
-
type: 'html',
|
|
1964
|
-
value: currentChild.value
|
|
1965
|
-
});
|
|
1966
|
-
}
|
|
1967
|
-
} else {
|
|
1968
|
-
textNodes.push(currentChild);
|
|
279
|
+
},
|
|
280
|
+
code: {
|
|
281
|
+
handler: function(el) {
|
|
282
|
+
return handleCode(el);
|
|
1969
283
|
}
|
|
1970
|
-
}
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
} finally{
|
|
1975
|
-
try {
|
|
1976
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1977
|
-
_iterator.return();
|
|
284
|
+
},
|
|
285
|
+
yaml: {
|
|
286
|
+
handler: function(el) {
|
|
287
|
+
return handleYaml(el);
|
|
1978
288
|
}
|
|
1979
|
-
}
|
|
1980
|
-
|
|
1981
|
-
|
|
289
|
+
},
|
|
290
|
+
definition: {
|
|
291
|
+
handler: function(el) {
|
|
292
|
+
return handleDefinition(el);
|
|
1982
293
|
}
|
|
1983
|
-
}
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
elements.push({
|
|
1988
|
-
type: 'paragraph',
|
|
1989
|
-
children: this.parseNodes(textNodes, false, currentElement)
|
|
1990
|
-
});
|
|
1991
|
-
}
|
|
1992
|
-
return elements;
|
|
1993
|
-
}
|
|
1994
|
-
},
|
|
1995
|
-
{
|
|
1996
|
-
key: "handleParagraph",
|
|
1997
|
-
value: /**
|
|
1998
|
-
* 处理段落节点(类方法版本)
|
|
1999
|
-
*/ function handleParagraph(currentElement, config) {
|
|
2000
|
-
var _currentElement_children, _currentElement_children_at, _currentElement_children1;
|
|
2001
|
-
// 检查是否是附件链接
|
|
2002
|
-
if (((_currentElement_children = currentElement.children) === null || _currentElement_children === void 0 ? void 0 : _currentElement_children[0].type) === 'html' && currentElement.children[0].value.startsWith('<a')) {
|
|
2003
|
-
var attachNode = handleAttachmentLink(currentElement);
|
|
2004
|
-
if (attachNode) return attachNode;
|
|
2005
|
-
}
|
|
2006
|
-
// 检查是否是链接卡片
|
|
2007
|
-
if ((currentElement === null || currentElement === void 0 ? void 0 : (_currentElement_children1 = currentElement.children) === null || _currentElement_children1 === void 0 ? void 0 : (_currentElement_children_at = _currentElement_children1.at(0)) === null || _currentElement_children_at === void 0 ? void 0 : _currentElement_children_at.type) === 'link' && config.type === 'card') {
|
|
2008
|
-
return handleLinkCard(currentElement, config);
|
|
2009
|
-
}
|
|
2010
|
-
// 处理混合内容段落
|
|
2011
|
-
return this.processParagraphChildren(currentElement);
|
|
2012
|
-
}
|
|
2013
|
-
},
|
|
2014
|
-
{
|
|
2015
|
-
key: "handleBlockquote",
|
|
2016
|
-
value: /**
|
|
2017
|
-
* 处理引用块节点(类方法版本)
|
|
2018
|
-
*/ function handleBlockquote(currentElement) {
|
|
2019
|
-
var _currentElement_children;
|
|
2020
|
-
return {
|
|
2021
|
-
type: 'blockquote',
|
|
2022
|
-
children: ((_currentElement_children = currentElement.children) === null || _currentElement_children === void 0 ? void 0 : _currentElement_children.length) ? this.parseNodes(currentElement.children, false, currentElement) : [
|
|
2023
|
-
{
|
|
2024
|
-
type: 'paragraph',
|
|
2025
|
-
children: [
|
|
2026
|
-
{
|
|
2027
|
-
text: ''
|
|
2028
|
-
}
|
|
2029
|
-
]
|
|
294
|
+
},
|
|
295
|
+
heading: {
|
|
296
|
+
handler: function(el) {
|
|
297
|
+
return handleHeading(el, parseNodesFn);
|
|
2030
298
|
}
|
|
2031
|
-
|
|
299
|
+
},
|
|
300
|
+
list: {
|
|
301
|
+
handler: function(el) {
|
|
302
|
+
return handleList(el, parseNodesFn);
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
listItem: {
|
|
306
|
+
handler: function(el) {
|
|
307
|
+
return handleListItem(el, parseNodesFn);
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
blockquote: {
|
|
311
|
+
handler: function(el) {
|
|
312
|
+
return handleBlockquote(el, parseNodesFn);
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
footnoteDefinition: {
|
|
316
|
+
handler: function(el) {
|
|
317
|
+
return handleFootnoteDefinition(el, parseNodesFn);
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
paragraph: {
|
|
321
|
+
handler: function(el, _plugins, config) {
|
|
322
|
+
return handleParagraph(el, config, parseNodesFn);
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
table: {
|
|
326
|
+
handler: function(el, _plugins, _config, parent, _htmlTag, preElement) {
|
|
327
|
+
return parseTableOrChart(el, preElement || parent, _this.plugins, parseNodesForTable, _this.config);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
2032
330
|
};
|
|
2033
331
|
}
|
|
2034
332
|
},
|
|
2035
333
|
{
|
|
2036
|
-
key: "
|
|
2037
|
-
value:
|
|
2038
|
-
* 处理文本和内联元素节点(类方法版本)
|
|
2039
|
-
*/ function handleTextAndInlineElements(currentElement, htmlTag) {
|
|
334
|
+
key: "handleSingleElement",
|
|
335
|
+
value: function handleSingleElement(currentElement, config, parent, htmlTag, preElement) {
|
|
2040
336
|
var _this = this;
|
|
2041
|
-
return handleTextAndInlineElementsPure(currentElement, htmlTag, function(leaf, element) {
|
|
2042
|
-
return _this.applyInlineFormatting(leaf, element);
|
|
2043
|
-
}, function(children, top, parent) {
|
|
2044
|
-
return _this.parseNodes(children, top, parent);
|
|
2045
|
-
});
|
|
2046
|
-
}
|
|
2047
|
-
},
|
|
2048
|
-
{
|
|
2049
|
-
key: "applyInlineFormatting",
|
|
2050
|
-
value: /**
|
|
2051
|
-
* 应用内联格式到叶子节点(类方法版本)
|
|
2052
|
-
*/ function applyInlineFormatting(leaf, currentElement) {
|
|
2053
|
-
var result = _object_spread({}, leaf);
|
|
2054
337
|
var elementType = currentElement.type;
|
|
2055
|
-
var
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
}
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
result.strikethrough = true;
|
|
2068
|
-
return result;
|
|
2069
|
-
}
|
|
2070
|
-
if (elementType === 'link') {
|
|
2071
|
-
try {
|
|
2072
|
-
var _this_config;
|
|
2073
|
-
result.url = currentElement === null || currentElement === void 0 ? void 0 : currentElement.url;
|
|
2074
|
-
var shouldOpenInNewTab = ((_this_config = this.config) === null || _this_config === void 0 ? void 0 : _this_config.openLinksInNewTab) || finished === false;
|
|
2075
|
-
if (shouldOpenInNewTab) {
|
|
2076
|
-
if (!result.otherProps) {
|
|
2077
|
-
result.otherProps = {};
|
|
2078
|
-
}
|
|
2079
|
-
result.otherProps.target = '_blank';
|
|
2080
|
-
result.otherProps.rel = 'noopener noreferrer';
|
|
2081
|
-
if (finished === false) {
|
|
2082
|
-
result.otherProps.finished = finished;
|
|
2083
|
-
}
|
|
2084
|
-
}
|
|
2085
|
-
} catch (e) {
|
|
2086
|
-
result.url = currentElement === null || currentElement === void 0 ? void 0 : currentElement.url;
|
|
338
|
+
var elementHandlers = this.getElementHandlers();
|
|
339
|
+
var handlerInfo = elementHandlers[elementType];
|
|
340
|
+
if (handlerInfo === null || handlerInfo === void 0 ? void 0 : handlerInfo.needsHtmlResult) {
|
|
341
|
+
var htmlResult = handleHtml(currentElement, parent, htmlTag);
|
|
342
|
+
var result = {
|
|
343
|
+
el: htmlResult.el
|
|
344
|
+
};
|
|
345
|
+
if (htmlResult.contextProps) {
|
|
346
|
+
result.contextProps = htmlResult.contextProps;
|
|
347
|
+
}
|
|
348
|
+
if (htmlResult.htmlTag) {
|
|
349
|
+
result.htmlTag = htmlResult.htmlTag;
|
|
2087
350
|
}
|
|
2088
351
|
return result;
|
|
2089
352
|
}
|
|
2090
|
-
|
|
353
|
+
if (!handlerInfo) {
|
|
354
|
+
return {
|
|
355
|
+
el: handleTextAndInlineElements(currentElement, htmlTag, function(nodes, top, parent) {
|
|
356
|
+
return _this.parseNodes(nodes, top, parent);
|
|
357
|
+
}, this.config)
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
var handlerResult = handlerInfo.handler(currentElement, this.plugins, config, parent, htmlTag, preElement, this);
|
|
361
|
+
return {
|
|
362
|
+
el: handlerResult
|
|
363
|
+
};
|
|
2091
364
|
}
|
|
2092
365
|
}
|
|
2093
366
|
]);
|