@ant-design/agentic-ui 2.29.7 → 2.29.8
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/ChatLayout/components/FooterBackgroundLottie/index.js +1 -1
- package/dist/MarkdownEditor/BaseMarkdownEditor.js +1 -1
- package/dist/MarkdownEditor/editor/elements/Blockquote/ReadonlyBlockquote.d.ts +33 -0
- package/dist/MarkdownEditor/editor/elements/Blockquote/ReadonlyBlockquote.js +69 -0
- package/dist/MarkdownEditor/editor/elements/Break/ReadonlyBreak.d.ts +30 -0
- package/dist/MarkdownEditor/editor/elements/Break/ReadonlyBreak.js +88 -0
- package/dist/MarkdownEditor/editor/elements/Card/ReadonlyCard.d.ts +34 -0
- package/dist/MarkdownEditor/editor/elements/Card/ReadonlyCard.js +96 -0
- package/dist/MarkdownEditor/editor/elements/Code/ReadonlyCode.d.ts +33 -0
- package/dist/MarkdownEditor/editor/elements/Code/ReadonlyCode.js +145 -0
- package/dist/MarkdownEditor/editor/elements/FootnoteDefinition/ReadonlyFootnoteDefinition.d.ts +34 -0
- package/dist/MarkdownEditor/editor/elements/FootnoteDefinition/ReadonlyFootnoteDefinition.js +125 -0
- package/dist/MarkdownEditor/editor/elements/FootnoteReference/ReadonlyFootnoteReference.d.ts +34 -0
- package/dist/MarkdownEditor/editor/elements/FootnoteReference/ReadonlyFootnoteReference.js +101 -0
- package/dist/MarkdownEditor/editor/elements/Head/ReadonlyHead.d.ts +35 -0
- package/dist/MarkdownEditor/editor/elements/Head/ReadonlyHead.js +111 -0
- package/dist/MarkdownEditor/editor/elements/Head/index.d.ts +3 -0
- package/dist/MarkdownEditor/editor/elements/Head/index.js +3 -1
- package/dist/MarkdownEditor/editor/elements/Hr/ReadonlyHr.d.ts +30 -0
- package/dist/MarkdownEditor/editor/elements/Hr/ReadonlyHr.js +95 -0
- package/dist/MarkdownEditor/editor/elements/Image/ReadonlyEditorImage.d.ts +35 -0
- package/dist/MarkdownEditor/editor/elements/Image/ReadonlyEditorImage.js +426 -0
- package/dist/MarkdownEditor/editor/elements/Image/index.js +38 -50
- package/dist/MarkdownEditor/editor/elements/InlineKatex/ReadonlyInlineKatex.d.ts +32 -0
- package/dist/MarkdownEditor/editor/elements/InlineKatex/ReadonlyInlineKatex.js +100 -0
- package/dist/MarkdownEditor/editor/elements/Katex/ReadonlyKatex.d.ts +32 -0
- package/dist/MarkdownEditor/editor/elements/Katex/ReadonlyKatex.js +110 -0
- package/dist/MarkdownEditor/editor/elements/LinkCard/ReadonlyLinkCard.d.ts +40 -0
- package/dist/MarkdownEditor/editor/elements/LinkCard/ReadonlyLinkCard.js +215 -0
- package/dist/MarkdownEditor/editor/elements/List/List.js +27 -12
- package/dist/MarkdownEditor/editor/elements/List/ReadonlyList.d.ts +33 -0
- package/dist/MarkdownEditor/editor/elements/List/ReadonlyList.js +93 -0
- package/dist/MarkdownEditor/editor/elements/List/ReadonlyListItem.d.ts +35 -0
- package/dist/MarkdownEditor/editor/elements/List/ReadonlyListItem.js +138 -0
- package/dist/MarkdownEditor/editor/elements/Media/ReadonlyMedia.d.ts +36 -0
- package/dist/MarkdownEditor/editor/elements/Media/ReadonlyMedia.js +600 -0
- package/dist/MarkdownEditor/editor/elements/Mermaid/ReadonlyMermaid.d.ts +32 -0
- package/dist/MarkdownEditor/editor/elements/Mermaid/ReadonlyMermaid.js +101 -0
- package/dist/MarkdownEditor/editor/elements/Paragraph/ReadonlyParagraph.d.ts +35 -0
- package/dist/MarkdownEditor/editor/elements/Paragraph/ReadonlyParagraph.js +109 -0
- package/dist/MarkdownEditor/editor/elements/Paragraph/index.js +2 -1
- package/dist/MarkdownEditor/editor/elements/Schema/ReadonlySchema.d.ts +33 -0
- package/dist/MarkdownEditor/editor/elements/Schema/ReadonlySchema.js +163 -0
- package/dist/MarkdownEditor/editor/elements/index.d.ts +20 -1
- package/dist/MarkdownEditor/editor/elements/index.js +65 -29
- package/dist/MarkdownEditor/editor/parser/parse/parseBlockElements.js +18 -10
- package/dist/MarkdownEditor/editor/parser/parserSlateNodeToMarkdown.js +64 -21
- package/dist/MarkdownEditor/editor/plugins/elements.js +60 -6
- package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/backspace.js +97 -39
- package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/tab.d.ts +14 -0
- package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/tab.js +117 -90
- package/dist/MarkdownEditor/editor/plugins/index.d.ts +8 -0
- package/dist/MarkdownEditor/editor/plugins/index.js +8 -0
- package/dist/MarkdownEditor/editor/plugins/insertParsedHtmlNodes.d.ts +12 -6
- package/dist/MarkdownEditor/editor/plugins/insertParsedHtmlNodes.js +67 -42
- package/dist/MarkdownEditor/editor/plugins/utils.d.ts +31 -0
- package/dist/MarkdownEditor/editor/plugins/utils.js +75 -0
- package/dist/MarkdownEditor/editor/plugins/withCardPlugin.d.ts +15 -0
- package/dist/MarkdownEditor/editor/plugins/withCardPlugin.js +329 -0
- package/dist/MarkdownEditor/editor/plugins/withCodeTagPlugin.d.ts +11 -0
- package/dist/MarkdownEditor/editor/plugins/withCodeTagPlugin.js +299 -0
- package/dist/MarkdownEditor/editor/plugins/withInlineNodes.d.ts +12 -0
- package/dist/MarkdownEditor/editor/plugins/withInlineNodes.js +17 -0
- package/dist/MarkdownEditor/editor/plugins/withLinkAndMediaPlugin.d.ts +11 -0
- package/dist/MarkdownEditor/editor/plugins/withLinkAndMediaPlugin.js +70 -0
- package/dist/MarkdownEditor/editor/plugins/withListsPlugin.d.ts +23 -0
- package/dist/MarkdownEditor/editor/plugins/withListsPlugin.js +204 -0
- package/dist/MarkdownEditor/editor/plugins/withMarkdown.d.ts +9 -12
- package/dist/MarkdownEditor/editor/plugins/withMarkdown.js +17 -764
- package/dist/MarkdownEditor/editor/plugins/withSchemaPlugin.d.ts +11 -0
- package/dist/MarkdownEditor/editor/plugins/withSchemaPlugin.js +55 -0
- package/dist/MarkdownEditor/editor/plugins/withVoidNodes.d.ts +12 -0
- package/dist/MarkdownEditor/editor/plugins/withVoidNodes.js +17 -0
- package/dist/MarkdownEditor/editor/store.js +1 -1
- package/dist/MarkdownEditor/editor/utils/docx/module.js +41 -8
- package/dist/MarkdownEditor/editor/utils/editorCommands.d.ts +97 -0
- package/dist/MarkdownEditor/editor/utils/editorCommands.js +966 -0
- package/dist/MarkdownEditor/editor/utils/editorUtils.js +2 -2
- package/dist/MarkdownEditor/editor/utils/keyboard.js +15 -391
- package/dist/MarkdownEditor/el.d.ts +12 -5
- package/dist/MarkdownInputField/MarkdownInputField.js +10 -23
- package/dist/MarkdownInputField/style.js +9 -4
- package/package.json +8 -8
|
@@ -262,35 +262,55 @@ export var ELEMENT_TAGS = {
|
|
|
262
262
|
type: 'blockquote'
|
|
263
263
|
};
|
|
264
264
|
},
|
|
265
|
-
H1: function() {
|
|
266
|
-
|
|
265
|
+
H1: function(el) {
|
|
266
|
+
var _el_style;
|
|
267
|
+
var align = (el && typeof el.getAttribute === 'function' ? el.getAttribute('align') : null) || (el === null || el === void 0 ? void 0 : (_el_style = el.style) === null || _el_style === void 0 ? void 0 : _el_style.textAlign) || (el && typeof el.getAttribute === 'function' ? el.getAttribute('data-align') : null);
|
|
268
|
+
return _object_spread({
|
|
267
269
|
type: 'head',
|
|
268
270
|
level: 1
|
|
269
|
-
}
|
|
271
|
+
}, align ? {
|
|
272
|
+
align: align
|
|
273
|
+
} : {});
|
|
270
274
|
},
|
|
271
|
-
H2: function() {
|
|
272
|
-
|
|
275
|
+
H2: function(el) {
|
|
276
|
+
var _el_style;
|
|
277
|
+
var align = (el && typeof el.getAttribute === 'function' ? el.getAttribute('align') : null) || (el === null || el === void 0 ? void 0 : (_el_style = el.style) === null || _el_style === void 0 ? void 0 : _el_style.textAlign) || (el && typeof el.getAttribute === 'function' ? el.getAttribute('data-align') : null);
|
|
278
|
+
return _object_spread({
|
|
273
279
|
type: 'head',
|
|
274
280
|
level: 2
|
|
275
|
-
}
|
|
281
|
+
}, align ? {
|
|
282
|
+
align: align
|
|
283
|
+
} : {});
|
|
276
284
|
},
|
|
277
|
-
H3: function() {
|
|
278
|
-
|
|
285
|
+
H3: function(el) {
|
|
286
|
+
var _el_style;
|
|
287
|
+
var align = (el && typeof el.getAttribute === 'function' ? el.getAttribute('align') : null) || (el === null || el === void 0 ? void 0 : (_el_style = el.style) === null || _el_style === void 0 ? void 0 : _el_style.textAlign) || (el && typeof el.getAttribute === 'function' ? el.getAttribute('data-align') : null);
|
|
288
|
+
return _object_spread({
|
|
279
289
|
type: 'head',
|
|
280
290
|
level: 3
|
|
281
|
-
}
|
|
291
|
+
}, align ? {
|
|
292
|
+
align: align
|
|
293
|
+
} : {});
|
|
282
294
|
},
|
|
283
|
-
H4: function() {
|
|
284
|
-
|
|
295
|
+
H4: function(el) {
|
|
296
|
+
var _el_style;
|
|
297
|
+
var align = (el && typeof el.getAttribute === 'function' ? el.getAttribute('align') : null) || (el === null || el === void 0 ? void 0 : (_el_style = el.style) === null || _el_style === void 0 ? void 0 : _el_style.textAlign) || (el && typeof el.getAttribute === 'function' ? el.getAttribute('data-align') : null);
|
|
298
|
+
return _object_spread({
|
|
285
299
|
type: 'head',
|
|
286
300
|
level: 4
|
|
287
|
-
}
|
|
301
|
+
}, align ? {
|
|
302
|
+
align: align
|
|
303
|
+
} : {});
|
|
288
304
|
},
|
|
289
|
-
H5: function() {
|
|
290
|
-
|
|
305
|
+
H5: function(el) {
|
|
306
|
+
var _el_style;
|
|
307
|
+
var align = (el && typeof el.getAttribute === 'function' ? el.getAttribute('align') : null) || (el === null || el === void 0 ? void 0 : (_el_style = el.style) === null || _el_style === void 0 ? void 0 : _el_style.textAlign) || (el && typeof el.getAttribute === 'function' ? el.getAttribute('data-align') : null);
|
|
308
|
+
return _object_spread({
|
|
291
309
|
type: 'head',
|
|
292
310
|
level: 5
|
|
293
|
-
}
|
|
311
|
+
}, align ? {
|
|
312
|
+
align: align
|
|
313
|
+
} : {});
|
|
294
314
|
},
|
|
295
315
|
TABLE: function() {
|
|
296
316
|
return {
|
|
@@ -299,8 +319,8 @@ export var ELEMENT_TAGS = {
|
|
|
299
319
|
},
|
|
300
320
|
IMG: function(el) {
|
|
301
321
|
// 添加更严格的图片URL验证,避免将普通URL误识别为图片
|
|
302
|
-
var src = el.src;
|
|
303
|
-
var alt = el.alt;
|
|
322
|
+
var src = el === null || el === void 0 ? void 0 : el.src;
|
|
323
|
+
var alt = el === null || el === void 0 ? void 0 : el.alt;
|
|
304
324
|
// 检查是否为有效的图片URL
|
|
305
325
|
var isValidImageUrl = function(url) {
|
|
306
326
|
if (!url) return false;
|
|
@@ -386,10 +406,14 @@ export var ELEMENT_TAGS = {
|
|
|
386
406
|
order: true
|
|
387
407
|
};
|
|
388
408
|
},
|
|
389
|
-
P: function() {
|
|
390
|
-
|
|
409
|
+
P: function(el) {
|
|
410
|
+
var _el_style;
|
|
411
|
+
var align = (el && typeof el.getAttribute === 'function' ? el.getAttribute('align') : null) || (el === null || el === void 0 ? void 0 : (_el_style = el.style) === null || _el_style === void 0 ? void 0 : _el_style.textAlign) || (el && typeof el.getAttribute === 'function' ? el.getAttribute('data-align') : null);
|
|
412
|
+
return _object_spread({
|
|
391
413
|
type: 'paragraph'
|
|
392
|
-
}
|
|
414
|
+
}, align ? {
|
|
415
|
+
align: align
|
|
416
|
+
} : {});
|
|
393
417
|
},
|
|
394
418
|
PRE: function() {
|
|
395
419
|
return {
|
|
@@ -398,14 +422,14 @@ export var ELEMENT_TAGS = {
|
|
|
398
422
|
},
|
|
399
423
|
UL: function() {
|
|
400
424
|
return {
|
|
401
|
-
type: 'list'
|
|
425
|
+
type: 'bulleted-list'
|
|
402
426
|
};
|
|
403
427
|
}
|
|
404
428
|
};
|
|
405
429
|
export var TEXT_TAGS = {
|
|
406
430
|
A: function(el) {
|
|
407
431
|
return {
|
|
408
|
-
url: el.getAttribute('href')
|
|
432
|
+
url: el && typeof el.getAttribute === 'function' ? el.getAttribute('href') : null
|
|
409
433
|
};
|
|
410
434
|
},
|
|
411
435
|
CODE: function() {
|
|
@@ -420,7 +444,7 @@ export var TEXT_TAGS = {
|
|
|
420
444
|
},
|
|
421
445
|
SPAN: function(el) {
|
|
422
446
|
return {
|
|
423
|
-
text: el.textContent
|
|
447
|
+
text: el === null || el === void 0 ? void 0 : el.textContent
|
|
424
448
|
};
|
|
425
449
|
},
|
|
426
450
|
DEL: function() {
|
|
@@ -456,24 +480,24 @@ export var TEXT_TAGS = {
|
|
|
456
480
|
};
|
|
457
481
|
export var deserialize = function(el) {
|
|
458
482
|
var parentTag = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : '';
|
|
459
|
-
if (el.nodeName.toLowerCase() === 'script') return [];
|
|
460
|
-
if (el.nodeName.toLowerCase() === 'style') return [];
|
|
461
|
-
if (el.nodeName.toLowerCase() === 'meta') return [];
|
|
462
|
-
if (el.nodeName.toLowerCase() === 'link') return [];
|
|
463
|
-
if (el.nodeName.toLowerCase() === 'head') return [];
|
|
464
|
-
if (el.nodeName.toLowerCase() === 'colgroup') return [];
|
|
465
|
-
if (el.nodeName.toLowerCase() === 'noscript') return [];
|
|
466
|
-
if (el.nodeType === 3) {
|
|
467
|
-
return el.textContent;
|
|
468
|
-
} else if (el.nodeType !== 1) {
|
|
483
|
+
if ((el === null || el === void 0 ? void 0 : el.nodeName.toLowerCase()) === 'script') return [];
|
|
484
|
+
if ((el === null || el === void 0 ? void 0 : el.nodeName.toLowerCase()) === 'style') return [];
|
|
485
|
+
if ((el === null || el === void 0 ? void 0 : el.nodeName.toLowerCase()) === 'meta') return [];
|
|
486
|
+
if ((el === null || el === void 0 ? void 0 : el.nodeName.toLowerCase()) === 'link') return [];
|
|
487
|
+
if ((el === null || el === void 0 ? void 0 : el.nodeName.toLowerCase()) === 'head') return [];
|
|
488
|
+
if ((el === null || el === void 0 ? void 0 : el.nodeName.toLowerCase()) === 'colgroup') return [];
|
|
489
|
+
if ((el === null || el === void 0 ? void 0 : el.nodeName.toLowerCase()) === 'noscript') return [];
|
|
490
|
+
if ((el === null || el === void 0 ? void 0 : el.nodeType) === 3) {
|
|
491
|
+
return el === null || el === void 0 ? void 0 : el.textContent;
|
|
492
|
+
} else if ((el === null || el === void 0 ? void 0 : el.nodeType) !== 1) {
|
|
469
493
|
return null;
|
|
470
|
-
} else if (el.nodeName === 'BR') {
|
|
494
|
+
} else if ((el === null || el === void 0 ? void 0 : el.nodeName) === 'BR') {
|
|
471
495
|
return '\n';
|
|
472
496
|
}
|
|
473
497
|
var nodeName = el.nodeName;
|
|
474
498
|
var target = el;
|
|
475
|
-
if (nodeName === 'PRE' && el.childNodes[0] && el.childNodes[0].nodeName === 'CODE') {
|
|
476
|
-
target = el.childNodes[0];
|
|
499
|
+
if (nodeName === 'PRE' && (el === null || el === void 0 ? void 0 : el.childNodes[0]) && (el === null || el === void 0 ? void 0 : el.childNodes[0].nodeName) === 'CODE') {
|
|
500
|
+
target = el === null || el === void 0 ? void 0 : el.childNodes[0];
|
|
477
501
|
}
|
|
478
502
|
var children = Array.from(target.childNodes).map(function(n) {
|
|
479
503
|
return deserialize(n, target.nodeName.toLowerCase().toLowerCase());
|
|
@@ -481,14 +505,14 @@ export var deserialize = function(el) {
|
|
|
481
505
|
if (children.length === 0) {
|
|
482
506
|
children = [
|
|
483
507
|
{
|
|
484
|
-
text: el.textContent || ''
|
|
508
|
+
text: (el === null || el === void 0 ? void 0 : el.textContent) || ''
|
|
485
509
|
}
|
|
486
510
|
];
|
|
487
511
|
}
|
|
488
|
-
if (fragment.has(el.nodeName.toLowerCase())) {
|
|
512
|
+
if (fragment.has(el === null || el === void 0 ? void 0 : el.nodeName.toLowerCase())) {
|
|
489
513
|
return jsx('fragment', {}, children);
|
|
490
514
|
}
|
|
491
|
-
if (TEXT_TAGS[nodeName] && Array.from(el.childNodes).some(function(e) {
|
|
515
|
+
if (TEXT_TAGS[nodeName] && Array.from(el === null || el === void 0 ? void 0 : el.childNodes).some(function(e) {
|
|
492
516
|
return e.nodeType !== 3 && !TEXT_TAGS[e.nodeName];
|
|
493
517
|
})) {
|
|
494
518
|
return jsx('fragment', {}, children);
|
|
@@ -556,8 +580,9 @@ export var deserialize = function(el) {
|
|
|
556
580
|
return children;
|
|
557
581
|
};
|
|
558
582
|
var parserCodeText = function(el) {
|
|
559
|
-
|
|
560
|
-
|
|
583
|
+
if (!el) return '';
|
|
584
|
+
el.innerHTML = el === null || el === void 0 ? void 0 : el.innerHTML.replace(/<br\/?>|<\/div>(?=\S)/g, '\n');
|
|
585
|
+
return el === null || el === void 0 ? void 0 : el.innerText;
|
|
561
586
|
};
|
|
562
587
|
var getTextsNode = function(nodes) {
|
|
563
588
|
var text = [];
|
|
@@ -1143,7 +1168,7 @@ export var insertParsedHtmlNodes = function(editor, html, editorProps, rtl) {
|
|
|
1143
1168
|
true
|
|
1144
1169
|
];
|
|
1145
1170
|
}
|
|
1146
|
-
if (!((node === null || node === void 0 ? void 0 : node[0].type) === 'list-item' && fragmentList[0].type === 'list')) return [
|
|
1171
|
+
if (!((node === null || node === void 0 ? void 0 : node[0].type) === 'list-item' && (fragmentList[0].type === 'list' || fragmentList[0].type === 'bulleted-list' || fragmentList[0].type === 'numbered-list'))) return [
|
|
1147
1172
|
3,
|
|
1148
1173
|
12
|
|
1149
1174
|
];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Editor, Path } from 'slate';
|
|
2
|
+
/**
|
|
3
|
+
* 行内节点类型集合
|
|
4
|
+
*/
|
|
5
|
+
export declare const inlineNode: Set<string>;
|
|
6
|
+
/**
|
|
7
|
+
* 空节点类型集合
|
|
8
|
+
*/
|
|
9
|
+
export declare const voidNode: Set<string>;
|
|
10
|
+
/**
|
|
11
|
+
* 检查编辑器是否包含有效的范围
|
|
12
|
+
* @param editor - Slate编辑器实例
|
|
13
|
+
* @param range - 要检查的范围
|
|
14
|
+
* @returns 如果范围有效则返回true
|
|
15
|
+
*/
|
|
16
|
+
export declare function hasRange(editor: Editor, range: {
|
|
17
|
+
anchor: any;
|
|
18
|
+
focus: any;
|
|
19
|
+
}): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 清空卡片区域的文本内容 - 使用零宽字符替换
|
|
22
|
+
* @param editor - Slate编辑器实例
|
|
23
|
+
* @param path - 要清空的节点路径
|
|
24
|
+
*/
|
|
25
|
+
export declare const clearCardAreaText: (editor: Editor, path: Path) => void;
|
|
26
|
+
/**
|
|
27
|
+
* 检查卡片是否为空
|
|
28
|
+
* @param cardNode - 卡片节点
|
|
29
|
+
* @returns 如果卡片为空则返回true
|
|
30
|
+
*/
|
|
31
|
+
export declare const isCardEmpty: (cardNode: any) => boolean;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Editor, Node } from "slate";
|
|
2
|
+
import { ReactEditor } from "slate-react";
|
|
3
|
+
/**
|
|
4
|
+
* 行内节点类型集合
|
|
5
|
+
*/ export var inlineNode = new Set([
|
|
6
|
+
'break',
|
|
7
|
+
'inline-katex'
|
|
8
|
+
]);
|
|
9
|
+
/**
|
|
10
|
+
* 空节点类型集合
|
|
11
|
+
*/ export var voidNode = new Set([
|
|
12
|
+
'hr',
|
|
13
|
+
'break'
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* 检查编辑器是否包含有效的范围
|
|
17
|
+
* @param editor - Slate编辑器实例
|
|
18
|
+
* @param range - 要检查的范围
|
|
19
|
+
* @returns 如果范围有效则返回true
|
|
20
|
+
*/ export function hasRange(editor, range) {
|
|
21
|
+
var anchor = range.anchor, focus = range.focus;
|
|
22
|
+
return Editor.hasPath(editor, anchor.path) && Editor.hasPath(editor, focus.path);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 清空卡片区域的文本内容 - 使用零宽字符替换
|
|
26
|
+
* @param editor - Slate编辑器实例
|
|
27
|
+
* @param path - 要清空的节点路径
|
|
28
|
+
*/ export var clearCardAreaText = function(editor, path) {
|
|
29
|
+
try {
|
|
30
|
+
var node = Node.get(editor, path);
|
|
31
|
+
if (node) {
|
|
32
|
+
// 尝试直接DOM操作,设置为零宽字符
|
|
33
|
+
try {
|
|
34
|
+
var domNode = ReactEditor.toDOMNode(editor, node);
|
|
35
|
+
if (domNode) {
|
|
36
|
+
var zeroWidthNode = domNode === null || domNode === void 0 ? void 0 : domNode.querySelector('[data-slate-zero-width]');
|
|
37
|
+
if (zeroWidthNode) {
|
|
38
|
+
zeroWidthNode.textContent = '\uFEFF';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
} catch (domError) {
|
|
42
|
+
// DOM operation failed, falling back to Slate transforms
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
} catch (error) {
|
|
46
|
+
// 如果操作失败,忽略错误
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* 检查卡片是否为空
|
|
51
|
+
* @param cardNode - 卡片节点
|
|
52
|
+
* @returns 如果卡片为空则返回true
|
|
53
|
+
*/ export var isCardEmpty = function(cardNode) {
|
|
54
|
+
if (!cardNode || cardNode.type !== 'card' || !cardNode.children) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
// 查找实际内容节点(非card-before和card-after的节点)
|
|
58
|
+
var contentNodes = cardNode.children.filter(function(child) {
|
|
59
|
+
return child.type !== 'card-before' && child.type !== 'card-after';
|
|
60
|
+
});
|
|
61
|
+
// 如果没有内容节点,则为空
|
|
62
|
+
if (contentNodes.length === 0) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
// 检查内容节点是否为空
|
|
66
|
+
return contentNodes.every(function(node) {
|
|
67
|
+
if (!node.children || node.children.length === 0) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
// 检查是否只包含空文本
|
|
71
|
+
return node.children.every(function(child) {
|
|
72
|
+
return child.text === '' || child.text && child.text.trim() === '';
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Editor } from 'slate';
|
|
2
|
+
/**
|
|
3
|
+
* 扩展编辑器以处理卡片节点的操作和行为
|
|
4
|
+
*
|
|
5
|
+
* @param editor - 要扩展的Slate编辑器实例
|
|
6
|
+
* @returns 增强后的编辑器实例,能够处理卡片相关操作
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* 该插件重写编辑器的 `apply`、`insertText`、`insertFragment` 和 `deleteBackward` 方法,
|
|
10
|
+
* 添加对卡片节点的特殊处理逻辑,包括:
|
|
11
|
+
* - 卡片节点的删除、插入和文本操作
|
|
12
|
+
* - 卡片空检查逻辑
|
|
13
|
+
* - 卡片区域的文本和片段插入处理
|
|
14
|
+
*/
|
|
15
|
+
export declare const withCardPlugin: (editor: Editor) => import("slate").BaseEditor & import("slate-react").ReactEditor & import("slate-history").HistoryEditor;
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
2
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
+
return arr2;
|
|
5
|
+
}
|
|
6
|
+
function _array_without_holes(arr) {
|
|
7
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
8
|
+
}
|
|
9
|
+
function _iterable_to_array(iter) {
|
|
10
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
11
|
+
}
|
|
12
|
+
function _non_iterable_spread() {
|
|
13
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
14
|
+
}
|
|
15
|
+
function _to_consumable_array(arr) {
|
|
16
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
17
|
+
}
|
|
18
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
19
|
+
if (!o) return;
|
|
20
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
21
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
22
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
23
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
24
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
25
|
+
}
|
|
26
|
+
import { Editor, Node, Path, Range, Transforms } from "slate";
|
|
27
|
+
import { clearCardAreaText, hasRange, isCardEmpty } from "./utils";
|
|
28
|
+
/**
|
|
29
|
+
* 处理卡片相关节点的操作
|
|
30
|
+
*
|
|
31
|
+
* @param editor - Slate编辑器实例
|
|
32
|
+
* @param operation - 要处理的操作
|
|
33
|
+
* @param apply - 原始的apply函数
|
|
34
|
+
* @returns 如果操作被处理则返回true,否则返回false
|
|
35
|
+
*
|
|
36
|
+
* @description
|
|
37
|
+
* 处理以下卡片相关操作:
|
|
38
|
+
* - 删除卡片节点 (remove_node),包括card、card-before和card-after
|
|
39
|
+
* - 在卡片后插入文本 (insert_text)
|
|
40
|
+
* - 在卡片内插入节点 (insert_node)
|
|
41
|
+
* - 检查并删除空卡片
|
|
42
|
+
*/ var handleCardOperation = function(editor, operation, apply) {
|
|
43
|
+
if (operation.type === 'remove_node') {
|
|
44
|
+
var node = operation.node;
|
|
45
|
+
// 删除card时,直接删除整个卡片
|
|
46
|
+
if (node.type === 'card') {
|
|
47
|
+
// 直接执行原始操作,避免递归
|
|
48
|
+
apply(operation);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
// 删除card-after时,删除整个卡片
|
|
52
|
+
if (node.type === 'card-after') {
|
|
53
|
+
Transforms.removeNodes(editor, {
|
|
54
|
+
at: Path.parent(operation.path)
|
|
55
|
+
});
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
// 删除card-before时,阻止操作
|
|
59
|
+
if (node.type === 'card-before') {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
// 检查操作后的父级是否为空卡片,如果是则删除
|
|
63
|
+
if (operation.path && operation.path.length > 0) {
|
|
64
|
+
try {
|
|
65
|
+
var parentPath = Path.parent(operation.path);
|
|
66
|
+
var parentNode = Node.get(editor, parentPath);
|
|
67
|
+
if (parentNode && parentNode.type === 'card' && isCardEmpty(parentNode)) {
|
|
68
|
+
Transforms.removeNodes(editor, {
|
|
69
|
+
at: parentPath
|
|
70
|
+
});
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
// 如果无法获取父节点,忽略错误
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (operation.type === 'insert_text') {
|
|
79
|
+
try {
|
|
80
|
+
var parentNode1 = Node.get(editor, Path.parent(operation.path));
|
|
81
|
+
// card-before 不允许任何文本输入
|
|
82
|
+
if (parentNode1.type === 'card-before') {
|
|
83
|
+
return true; // 阻止输入
|
|
84
|
+
}
|
|
85
|
+
// card-after 的输入会插入到卡片后面的新段落中
|
|
86
|
+
if (parentNode1.type === 'card-after') {
|
|
87
|
+
try {
|
|
88
|
+
var grandParentPath = Path.parent(Path.parent(operation.path));
|
|
89
|
+
var grandParentNode = Node.get(editor, grandParentPath);
|
|
90
|
+
if (grandParentNode.type === 'card') {
|
|
91
|
+
// 使用 Editor.withoutNormalizing 确保操作的原子性
|
|
92
|
+
Editor.withoutNormalizing(editor, function() {
|
|
93
|
+
// 先创建新段落
|
|
94
|
+
Transforms.insertNodes(editor, {
|
|
95
|
+
type: 'paragraph',
|
|
96
|
+
children: [
|
|
97
|
+
{
|
|
98
|
+
text: operation.text
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
}, {
|
|
102
|
+
at: Path.next(grandParentPath)
|
|
103
|
+
});
|
|
104
|
+
// 然后选中新创建的段落
|
|
105
|
+
var newParagraphPath = Path.next(grandParentPath);
|
|
106
|
+
var textPath = _to_consumable_array(newParagraphPath).concat([
|
|
107
|
+
0
|
|
108
|
+
]);
|
|
109
|
+
Transforms.select(editor, {
|
|
110
|
+
anchor: {
|
|
111
|
+
path: textPath,
|
|
112
|
+
offset: operation.text.length
|
|
113
|
+
},
|
|
114
|
+
focus: {
|
|
115
|
+
path: textPath,
|
|
116
|
+
offset: operation.text.length
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
clearCardAreaText(editor, operation.path);
|
|
120
|
+
});
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
} catch (error) {
|
|
124
|
+
// 如果获取父级节点失败,继续阻止输入
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
} catch (error) {
|
|
129
|
+
// 如果无法获取父节点,允许操作继续
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (operation.type === 'insert_node') {
|
|
133
|
+
var parentNode2 = Node.get(editor, Path.parent(operation.path));
|
|
134
|
+
// card-before 不允许任何节点插入
|
|
135
|
+
if (parentNode2.type === 'card-before') {
|
|
136
|
+
return true; // 阻止插入
|
|
137
|
+
}
|
|
138
|
+
// card-after 的节点插入会放到卡片后面
|
|
139
|
+
if (parentNode2.type === 'card-after') {
|
|
140
|
+
if (Node.get(editor, Path.parent(Path.parent(operation.path))).type === 'card') {
|
|
141
|
+
var cardPath = Path.parent(Path.parent(operation.path));
|
|
142
|
+
Transforms.insertNodes(editor, operation.node, {
|
|
143
|
+
at: Path.next(cardPath)
|
|
144
|
+
});
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
Transforms.insertNodes(editor, operation.node, {
|
|
148
|
+
at: Path.parent(operation.path)
|
|
149
|
+
});
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// 对于删除文本操作,我们需要在操作执行后检查卡片是否变空
|
|
154
|
+
// 这将在 editor.apply 的最后处理
|
|
155
|
+
return false;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* 扩展编辑器以处理卡片节点的操作和行为
|
|
159
|
+
*
|
|
160
|
+
* @param editor - 要扩展的Slate编辑器实例
|
|
161
|
+
* @returns 增强后的编辑器实例,能够处理卡片相关操作
|
|
162
|
+
*
|
|
163
|
+
* @description
|
|
164
|
+
* 该插件重写编辑器的 `apply`、`insertText`、`insertFragment` 和 `deleteBackward` 方法,
|
|
165
|
+
* 添加对卡片节点的特殊处理逻辑,包括:
|
|
166
|
+
* - 卡片节点的删除、插入和文本操作
|
|
167
|
+
* - 卡片空检查逻辑
|
|
168
|
+
* - 卡片区域的文本和片段插入处理
|
|
169
|
+
*/ export var withCardPlugin = function(editor) {
|
|
170
|
+
var apply = editor.apply, insertText = editor.insertText, insertFragment = editor.insertFragment, deleteBackward = editor.deleteBackward;
|
|
171
|
+
editor.apply = function(operation) {
|
|
172
|
+
// 尝试处理卡片相关操作
|
|
173
|
+
if (handleCardOperation(editor, operation, apply)) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// 记录操作前可能涉及的卡片路径,用于操作后检查
|
|
177
|
+
var cardPathsToCheck = [];
|
|
178
|
+
if (operation.type === 'remove_text' || operation.type === 'insert_text') {
|
|
179
|
+
if (operation.path && operation.path.length > 0) {
|
|
180
|
+
try {
|
|
181
|
+
// 向上查找是否在卡片内
|
|
182
|
+
var currentPath = operation.path;
|
|
183
|
+
while(currentPath.length > 0){
|
|
184
|
+
var node = Node.get(editor, currentPath);
|
|
185
|
+
if (node && node.type === 'card') {
|
|
186
|
+
cardPathsToCheck.push(currentPath);
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
currentPath = Path.parent(currentPath);
|
|
190
|
+
}
|
|
191
|
+
} catch (error) {
|
|
192
|
+
// 如果无法获取节点,忽略错误
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// 执行原始操作
|
|
197
|
+
apply(operation);
|
|
198
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
199
|
+
try {
|
|
200
|
+
// 操作执行后,检查涉及的卡片是否变空
|
|
201
|
+
for(var _iterator = cardPathsToCheck[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
202
|
+
var cardPath = _step.value;
|
|
203
|
+
try {
|
|
204
|
+
var cardNode = Node.get(editor, cardPath);
|
|
205
|
+
if (cardNode && cardNode.type === 'card' && isCardEmpty(cardNode)) {
|
|
206
|
+
Transforms.removeNodes(editor, {
|
|
207
|
+
at: cardPath
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
} catch (error) {
|
|
211
|
+
// 如果节点已被删除或不存在,忽略错误
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
} catch (err) {
|
|
215
|
+
_didIteratorError = true;
|
|
216
|
+
_iteratorError = err;
|
|
217
|
+
} finally{
|
|
218
|
+
try {
|
|
219
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
220
|
+
_iterator.return();
|
|
221
|
+
}
|
|
222
|
+
} finally{
|
|
223
|
+
if (_didIteratorError) {
|
|
224
|
+
throw _iteratorError;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
editor.insertText = function(text) {
|
|
230
|
+
var selection = editor.selection;
|
|
231
|
+
if (selection && Range.isCollapsed(selection)) {
|
|
232
|
+
try {
|
|
233
|
+
var node = Node.get(editor, Path.parent(selection.anchor.path));
|
|
234
|
+
// card-before 不允许任何文本输入
|
|
235
|
+
if (node.type === 'card-before') {
|
|
236
|
+
return; // 阻止输入
|
|
237
|
+
}
|
|
238
|
+
// card-after 的输入会插入到卡片后面的新段落中
|
|
239
|
+
if (node.type === 'card-after') {
|
|
240
|
+
var grandParentPath = Path.parent(Path.parent(selection.anchor.path));
|
|
241
|
+
var grandParent = Node.get(editor, grandParentPath);
|
|
242
|
+
if (grandParent.type === 'card') {
|
|
243
|
+
Editor.withoutNormalizing(editor, function() {
|
|
244
|
+
Transforms.insertNodes(editor, {
|
|
245
|
+
type: 'paragraph',
|
|
246
|
+
children: [
|
|
247
|
+
{
|
|
248
|
+
text: text
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
}, {
|
|
252
|
+
at: Path.next(grandParentPath)
|
|
253
|
+
});
|
|
254
|
+
// 选中新创建的段落
|
|
255
|
+
var newParagraphPath = Path.next(grandParentPath);
|
|
256
|
+
var textPath = _to_consumable_array(newParagraphPath).concat([
|
|
257
|
+
0
|
|
258
|
+
]);
|
|
259
|
+
Transforms.select(editor, {
|
|
260
|
+
anchor: {
|
|
261
|
+
path: textPath,
|
|
262
|
+
offset: text.length
|
|
263
|
+
},
|
|
264
|
+
focus: {
|
|
265
|
+
path: textPath,
|
|
266
|
+
offset: text.length
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
var cardAfterPath = _to_consumable_array(grandParentPath).concat([
|
|
270
|
+
2,
|
|
271
|
+
0
|
|
272
|
+
]);
|
|
273
|
+
clearCardAreaText(editor, cardAfterPath);
|
|
274
|
+
});
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
} catch (error) {
|
|
279
|
+
// 如果无法获取节点,继续原有逻辑
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
insertText(text);
|
|
283
|
+
};
|
|
284
|
+
editor.insertFragment = function(fragment) {
|
|
285
|
+
var selection = editor.selection;
|
|
286
|
+
if (selection && Range.isCollapsed(selection)) {
|
|
287
|
+
try {
|
|
288
|
+
var node = Node.get(editor, Path.parent(selection.anchor.path));
|
|
289
|
+
// card-before 不允许任何片段插入
|
|
290
|
+
if (node.type === 'card-before') {
|
|
291
|
+
return; // 阻止插入
|
|
292
|
+
}
|
|
293
|
+
// card-after 的片段插入会放到卡片后面
|
|
294
|
+
if (node.type === 'card-after') {
|
|
295
|
+
var grandParentPath = Path.parent(Path.parent(selection.anchor.path));
|
|
296
|
+
var grandParent = Node.get(editor, grandParentPath);
|
|
297
|
+
if (grandParent.type === 'card') {
|
|
298
|
+
// 将片段内容插入到卡片后面
|
|
299
|
+
Transforms.insertNodes(editor, fragment, {
|
|
300
|
+
at: Path.next(grandParentPath),
|
|
301
|
+
select: true
|
|
302
|
+
});
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
} catch (error) {
|
|
307
|
+
// 如果无法获取节点,继续原有逻辑
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
insertFragment(fragment);
|
|
311
|
+
};
|
|
312
|
+
editor.deleteBackward = function(unit) {
|
|
313
|
+
var selection = editor.selection;
|
|
314
|
+
if (selection && hasRange(editor, selection) && Range.isCollapsed(selection)) {
|
|
315
|
+
var node = Node.get(editor, Path.parent(selection.anchor.path));
|
|
316
|
+
if (node.type === 'card-before') {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (node.type === 'card-after') {
|
|
320
|
+
Transforms.removeNodes(editor, {
|
|
321
|
+
at: Path.parent(selection.anchor.path)
|
|
322
|
+
});
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
deleteBackward(unit);
|
|
327
|
+
};
|
|
328
|
+
return editor;
|
|
329
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Editor } from 'slate';
|
|
2
|
+
/**
|
|
3
|
+
* 扩展编辑器以处理代码和标签节点的操作
|
|
4
|
+
*
|
|
5
|
+
* @param editor - 要扩展的Slate编辑器实例
|
|
6
|
+
* @returns 增强后的编辑器实例,能够处理代码和标签相关操作
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* 该插件重写编辑器的 `apply` 和 `deleteBackward` 方法,添加对代码和标签节点的特殊处理逻辑。
|
|
10
|
+
*/
|
|
11
|
+
export declare const withCodeTagPlugin: (editor: Editor) => import("slate").BaseEditor & import("slate-react").ReactEditor & import("slate-history").HistoryEditor;
|