@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
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
2
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
+
return arr2;
|
|
5
|
+
}
|
|
6
|
+
function _array_with_holes(arr) {
|
|
7
|
+
if (Array.isArray(arr)) return arr;
|
|
8
|
+
}
|
|
9
|
+
function _define_property(obj, key, value) {
|
|
10
|
+
if (key in obj) {
|
|
11
|
+
Object.defineProperty(obj, key, {
|
|
12
|
+
value: value,
|
|
13
|
+
enumerable: true,
|
|
14
|
+
configurable: true,
|
|
15
|
+
writable: true
|
|
16
|
+
});
|
|
17
|
+
} else {
|
|
18
|
+
obj[key] = value;
|
|
19
|
+
}
|
|
20
|
+
return obj;
|
|
21
|
+
}
|
|
22
|
+
function _iterable_to_array_limit(arr, i) {
|
|
23
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
24
|
+
if (_i == null) return;
|
|
25
|
+
var _arr = [];
|
|
26
|
+
var _n = true;
|
|
27
|
+
var _d = false;
|
|
28
|
+
var _s, _e;
|
|
29
|
+
try {
|
|
30
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
31
|
+
_arr.push(_s.value);
|
|
32
|
+
if (i && _arr.length === i) break;
|
|
33
|
+
}
|
|
34
|
+
} catch (err) {
|
|
35
|
+
_d = true;
|
|
36
|
+
_e = err;
|
|
37
|
+
} finally{
|
|
38
|
+
try {
|
|
39
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
40
|
+
} finally{
|
|
41
|
+
if (_d) throw _e;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return _arr;
|
|
45
|
+
}
|
|
46
|
+
function _non_iterable_rest() {
|
|
47
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
48
|
+
}
|
|
49
|
+
function _object_spread(target) {
|
|
50
|
+
for(var i = 1; i < arguments.length; i++){
|
|
51
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
52
|
+
var ownKeys = Object.keys(source);
|
|
53
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
54
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
55
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
ownKeys.forEach(function(key) {
|
|
59
|
+
_define_property(target, key, source[key]);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return target;
|
|
63
|
+
}
|
|
64
|
+
function ownKeys(object, enumerableOnly) {
|
|
65
|
+
var keys = Object.keys(object);
|
|
66
|
+
if (Object.getOwnPropertySymbols) {
|
|
67
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
68
|
+
if (enumerableOnly) {
|
|
69
|
+
symbols = symbols.filter(function(sym) {
|
|
70
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
keys.push.apply(keys, symbols);
|
|
74
|
+
}
|
|
75
|
+
return keys;
|
|
76
|
+
}
|
|
77
|
+
function _object_spread_props(target, source) {
|
|
78
|
+
source = source != null ? source : {};
|
|
79
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
80
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
81
|
+
} else {
|
|
82
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
83
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return target;
|
|
87
|
+
}
|
|
88
|
+
function _sliced_to_array(arr, i) {
|
|
89
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
90
|
+
}
|
|
91
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
92
|
+
if (!o) return;
|
|
93
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
94
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
95
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
96
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
97
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
98
|
+
}
|
|
99
|
+
import { Editor, Node, Path, Range, Transforms } from "slate";
|
|
100
|
+
import { hasRange } from "./utils";
|
|
101
|
+
/**
|
|
102
|
+
* 处理代码和标签相关节点的操作
|
|
103
|
+
*
|
|
104
|
+
* @param editor - Slate编辑器实例
|
|
105
|
+
* @param operation - 要处理的操作
|
|
106
|
+
* @param apply - 原始的apply函数
|
|
107
|
+
* @returns 如果操作被处理则返回true,否则返回false
|
|
108
|
+
*
|
|
109
|
+
* @description
|
|
110
|
+
* 处理以下代码和标签相关操作:
|
|
111
|
+
* - 删除文本 (remove_text),处理特殊触发文本和空标签
|
|
112
|
+
* - 删除节点 (remove_node),处理代码块周围的空格
|
|
113
|
+
* - 插入文本 (insert_text),处理代码块中的空格插入
|
|
114
|
+
*/ var handleCodeTagOperation = function(editor, operation, apply) {
|
|
115
|
+
if (operation.type === 'remove_text') {
|
|
116
|
+
var currentNode = Node.get(editor, operation.path);
|
|
117
|
+
if (currentNode === null || currentNode === void 0 ? void 0 : currentNode.tag) {
|
|
118
|
+
var _currentNode_text;
|
|
119
|
+
// 处理空标签的删除
|
|
120
|
+
if (((_currentNode_text = currentNode.text) === null || _currentNode_text === void 0 ? void 0 : _currentNode_text.trim()) === '') {
|
|
121
|
+
Editor.withoutNormalizing(editor, function() {
|
|
122
|
+
Transforms.setNodes(editor, {
|
|
123
|
+
tag: false,
|
|
124
|
+
code: false,
|
|
125
|
+
text: ' ',
|
|
126
|
+
triggerText: undefined
|
|
127
|
+
}, {
|
|
128
|
+
at: operation.path
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
if (currentNode.text === operation.text) {
|
|
134
|
+
Editor.withoutNormalizing(editor, function() {
|
|
135
|
+
Transforms.removeNodes(editor, {
|
|
136
|
+
at: operation.path
|
|
137
|
+
});
|
|
138
|
+
Transforms.insertNodes(editor, _object_spread_props(_object_spread({}, currentNode), {
|
|
139
|
+
tag: true,
|
|
140
|
+
code: true,
|
|
141
|
+
text: ' '
|
|
142
|
+
}), {
|
|
143
|
+
at: operation.path,
|
|
144
|
+
select: true
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
// 光标在 tag 内部,执行原始的删除操作
|
|
150
|
+
apply(operation);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (operation.type === 'insert_text') {
|
|
155
|
+
var _editor_selection;
|
|
156
|
+
var currentNode1 = Node.get(editor, operation.path);
|
|
157
|
+
if ((currentNode1 === null || currentNode1 === void 0 ? void 0 : currentNode1.tag) && operation.text === ' ' && ((_editor_selection = editor.selection) === null || _editor_selection === void 0 ? void 0 : _editor_selection.focus.offset) === currentNode1.text.length) {
|
|
158
|
+
// 检查前一个字符是否是空格
|
|
159
|
+
var lastChar = currentNode1.text.charAt(currentNode1.text.length - 1);
|
|
160
|
+
if (lastChar === ' ') {
|
|
161
|
+
// 如果前一个输入是空格,且当前输入也是空格,则插入一个空格到 tag 节点外
|
|
162
|
+
Transforms.insertNodes(editor, [
|
|
163
|
+
{
|
|
164
|
+
text: ' '
|
|
165
|
+
}
|
|
166
|
+
]);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if ((currentNode1 === null || currentNode1 === void 0 ? void 0 : currentNode1.tag) && operation.text.trim().length > 0 && currentNode1.text.trim().length === 0) {
|
|
171
|
+
Editor.withoutNormalizing(editor, function() {
|
|
172
|
+
Transforms.removeNodes(editor, {
|
|
173
|
+
at: operation.path
|
|
174
|
+
});
|
|
175
|
+
Transforms.insertNodes(editor, _object_spread_props(_object_spread({}, currentNode1), {
|
|
176
|
+
tag: true,
|
|
177
|
+
code: true,
|
|
178
|
+
text: operation.text
|
|
179
|
+
}), {
|
|
180
|
+
at: operation.path,
|
|
181
|
+
select: true
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (operation.type === 'split_node') {
|
|
188
|
+
var node = Node.get(editor, operation.path);
|
|
189
|
+
if ((node === null || node === void 0 ? void 0 : node.tag) || (node === null || node === void 0 ? void 0 : node.code)) {
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return false;
|
|
194
|
+
};
|
|
195
|
+
/**
|
|
196
|
+
* 扩展编辑器以处理代码和标签节点的操作
|
|
197
|
+
*
|
|
198
|
+
* @param editor - 要扩展的Slate编辑器实例
|
|
199
|
+
* @returns 增强后的编辑器实例,能够处理代码和标签相关操作
|
|
200
|
+
*
|
|
201
|
+
* @description
|
|
202
|
+
* 该插件重写编辑器的 `apply` 和 `deleteBackward` 方法,添加对代码和标签节点的特殊处理逻辑。
|
|
203
|
+
*/ export var withCodeTagPlugin = function(editor) {
|
|
204
|
+
var apply = editor.apply, deleteBackward = editor.deleteBackward;
|
|
205
|
+
editor.apply = function(operation) {
|
|
206
|
+
// 尝试处理代码和标签相关操作
|
|
207
|
+
if (handleCodeTagOperation(editor, operation, apply)) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// 否则执行原始操作
|
|
211
|
+
apply(operation);
|
|
212
|
+
};
|
|
213
|
+
editor.deleteBackward = function(unit) {
|
|
214
|
+
var selection = editor.selection;
|
|
215
|
+
if (selection && hasRange(editor, selection) && Range.isCollapsed(selection)) {
|
|
216
|
+
var curNode = Node.get(editor, selection.anchor.path);
|
|
217
|
+
// 检查前一个节点是否是 tag
|
|
218
|
+
try {
|
|
219
|
+
var _ref = _sliced_to_array(Editor.previous(editor, {
|
|
220
|
+
at: selection.anchor.path
|
|
221
|
+
}) || [], 2), previousNode = _ref[0], previousPath = _ref[1];
|
|
222
|
+
var isBeforeTag = selection && selection.anchor.offset <= 1;
|
|
223
|
+
if ((previousNode === null || previousNode === void 0 ? void 0 : previousNode.tag) && previousPath && isBeforeTag) {
|
|
224
|
+
var _curNode_text, _curNode_text1;
|
|
225
|
+
// 如果当前节点不为空,且只有一个文本
|
|
226
|
+
if (((_curNode_text = curNode.text) === null || _curNode_text === void 0 ? void 0 : _curNode_text.trim()) && curNode.text.trimEnd().length === 1 && selection.anchor.offset > 0) {
|
|
227
|
+
Transforms.insertText(editor, '', {
|
|
228
|
+
at: selection.anchor.path
|
|
229
|
+
});
|
|
230
|
+
Transforms.insertNodes(editor, {
|
|
231
|
+
type: 'paragraph',
|
|
232
|
+
children: [
|
|
233
|
+
{
|
|
234
|
+
text: ' '
|
|
235
|
+
}
|
|
236
|
+
]
|
|
237
|
+
}, {
|
|
238
|
+
at: selection.anchor.path,
|
|
239
|
+
select: true
|
|
240
|
+
});
|
|
241
|
+
return;
|
|
242
|
+
} else if (((_curNode_text1 = curNode.text) === null || _curNode_text1 === void 0 ? void 0 : _curNode_text1.trim()) && selection.anchor.offset > 0) {
|
|
243
|
+
deleteBackward(unit);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
// 如果前一个节点是 tag,直接删除整个 tag
|
|
247
|
+
Editor.withoutNormalizing(editor, function() {
|
|
248
|
+
var parent = Node.get(editor, Path.parent(previousPath));
|
|
249
|
+
var index = previousPath[previousPath.length - 1];
|
|
250
|
+
if (parent.children.length === 1) {
|
|
251
|
+
// 如果是唯一的节点,转换为普通文本
|
|
252
|
+
Transforms.setNodes(editor, {
|
|
253
|
+
tag: false,
|
|
254
|
+
code: false,
|
|
255
|
+
text: ' ',
|
|
256
|
+
triggerText: undefined
|
|
257
|
+
}, {
|
|
258
|
+
at: previousPath
|
|
259
|
+
});
|
|
260
|
+
} else if (index === 0) {
|
|
261
|
+
// 如果是第一个节点,删除并合并下一个节点
|
|
262
|
+
Transforms.removeNodes(editor, {
|
|
263
|
+
at: previousPath
|
|
264
|
+
});
|
|
265
|
+
} else {
|
|
266
|
+
// 如果是中间或最后节点,先合并再删除
|
|
267
|
+
Transforms.removeNodes(editor, {
|
|
268
|
+
at: previousPath
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
} catch (error) {
|
|
275
|
+
// 如果获取前一个节点失败,继续执行原始删除操作
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
var _node_text_trim, _node_text, _selection_anchor;
|
|
279
|
+
var node = Node.get(editor, selection.anchor.path);
|
|
280
|
+
if ((node === null || node === void 0 ? void 0 : node.tag) && (node === null || node === void 0 ? void 0 : (_node_text = node.text) === null || _node_text === void 0 ? void 0 : (_node_text_trim = _node_text.trim()) === null || _node_text_trim === void 0 ? void 0 : _node_text_trim.length) < 1 && (selection === null || selection === void 0 ? void 0 : (_selection_anchor = selection.anchor) === null || _selection_anchor === void 0 ? void 0 : _selection_anchor.offset) < 1) {
|
|
281
|
+
var _node_text1;
|
|
282
|
+
var text = node === null || node === void 0 ? void 0 : (_node_text1 = node.text) === null || _node_text1 === void 0 ? void 0 : _node_text1.replace(node.triggerText || '', '');
|
|
283
|
+
Transforms.setNodes(editor, {
|
|
284
|
+
tag: false,
|
|
285
|
+
code: false
|
|
286
|
+
}, {
|
|
287
|
+
at: selection.anchor.path
|
|
288
|
+
});
|
|
289
|
+
Transforms.insertText(editor, text, {
|
|
290
|
+
at: selection.anchor.path
|
|
291
|
+
});
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
} catch (unused) {}
|
|
295
|
+
}
|
|
296
|
+
deleteBackward(unit);
|
|
297
|
+
};
|
|
298
|
+
return editor;
|
|
299
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Editor } from 'slate';
|
|
2
|
+
/**
|
|
3
|
+
* 扩展编辑器以识别行内节点类型
|
|
4
|
+
*
|
|
5
|
+
* @param editor - 要扩展的Slate编辑器实例
|
|
6
|
+
* @returns 增强后的编辑器实例,能够识别行内节点
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* 该插件扩展编辑器的 `isInline` 方法,使其能够识别特定的行内元素类型。
|
|
10
|
+
* 行内节点包括:'break'、'inline-katex'
|
|
11
|
+
*/
|
|
12
|
+
export declare const withInlineNodes: (editor: Editor) => import("slate").BaseEditor & import("slate-react").ReactEditor & import("slate-history").HistoryEditor;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { inlineNode } from "./utils";
|
|
2
|
+
/**
|
|
3
|
+
* 扩展编辑器以识别行内节点类型
|
|
4
|
+
*
|
|
5
|
+
* @param editor - 要扩展的Slate编辑器实例
|
|
6
|
+
* @returns 增强后的编辑器实例,能够识别行内节点
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* 该插件扩展编辑器的 `isInline` 方法,使其能够识别特定的行内元素类型。
|
|
10
|
+
* 行内节点包括:'break'、'inline-katex'
|
|
11
|
+
*/ export var withInlineNodes = function(editor) {
|
|
12
|
+
var isInline = editor.isInline;
|
|
13
|
+
editor.isInline = function(element) {
|
|
14
|
+
return inlineNode.has(element.type) || isInline(element);
|
|
15
|
+
};
|
|
16
|
+
return editor;
|
|
17
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Editor } from 'slate';
|
|
2
|
+
/**
|
|
3
|
+
* 扩展编辑器以处理链接卡片和媒体节点的操作
|
|
4
|
+
*
|
|
5
|
+
* @param editor - 要扩展的Slate编辑器实例
|
|
6
|
+
* @returns 增强后的编辑器实例,能够处理链接和媒体相关操作
|
|
7
|
+
*
|
|
8
|
+
* @description
|
|
9
|
+
* 该插件重写编辑器的 `apply` 方法,添加对链接卡片和媒体节点的特殊处理逻辑。
|
|
10
|
+
*/
|
|
11
|
+
export declare const withLinkAndMediaPlugin: (editor: Editor) => import("slate").BaseEditor & import("slate-react").ReactEditor & import("slate-history").HistoryEditor;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Node, Path, Transforms } from "slate";
|
|
2
|
+
/**
|
|
3
|
+
* 处理链接卡片和媒体相关节点的操作
|
|
4
|
+
*
|
|
5
|
+
* @param editor - Slate编辑器实例
|
|
6
|
+
* @param operation - 要处理的操作
|
|
7
|
+
* @returns 如果操作被处理则返回true,否则返回false
|
|
8
|
+
*
|
|
9
|
+
* @description
|
|
10
|
+
* 处理以下链接和媒体相关操作:
|
|
11
|
+
* - 拆分链接卡片或媒体节点 (split_node)
|
|
12
|
+
* - 删除链接卡片内的节点 (remove_node)
|
|
13
|
+
*/ var handleLinkAndMediaOperation = function(editor, operation) {
|
|
14
|
+
var _operation_properties, _operation_properties1;
|
|
15
|
+
if (operation.type === 'split_node' && (((_operation_properties = operation.properties) === null || _operation_properties === void 0 ? void 0 : _operation_properties.type) === 'link-card' || ((_operation_properties1 = operation.properties) === null || _operation_properties1 === void 0 ? void 0 : _operation_properties1.type) === 'media')) {
|
|
16
|
+
var node = Node.get(editor, operation.path);
|
|
17
|
+
if ([
|
|
18
|
+
'link-card',
|
|
19
|
+
'media'
|
|
20
|
+
].includes(node === null || node === void 0 ? void 0 : node.type)) {
|
|
21
|
+
Transforms.insertNodes(editor, [
|
|
22
|
+
{
|
|
23
|
+
type: 'paragraph',
|
|
24
|
+
children: [
|
|
25
|
+
{
|
|
26
|
+
text: '',
|
|
27
|
+
p: 'true'
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
], {
|
|
32
|
+
at: Path.next([
|
|
33
|
+
operation.path.at(0)
|
|
34
|
+
]),
|
|
35
|
+
select: true
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (operation.type === 'remove_node') {
|
|
41
|
+
var parentNode = Node.get(editor, Path.parent(operation.path));
|
|
42
|
+
if ('link-card' === parentNode.type) {
|
|
43
|
+
Transforms.removeNodes(editor, {
|
|
44
|
+
at: Path.parent(operation.path)
|
|
45
|
+
});
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* 扩展编辑器以处理链接卡片和媒体节点的操作
|
|
53
|
+
*
|
|
54
|
+
* @param editor - 要扩展的Slate编辑器实例
|
|
55
|
+
* @returns 增强后的编辑器实例,能够处理链接和媒体相关操作
|
|
56
|
+
*
|
|
57
|
+
* @description
|
|
58
|
+
* 该插件重写编辑器的 `apply` 方法,添加对链接卡片和媒体节点的特殊处理逻辑。
|
|
59
|
+
*/ export var withLinkAndMediaPlugin = function(editor) {
|
|
60
|
+
var apply = editor.apply;
|
|
61
|
+
editor.apply = function(operation) {
|
|
62
|
+
// 尝试处理链接和媒体相关操作
|
|
63
|
+
if (handleLinkAndMediaOperation(editor, operation)) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// 否则执行原始操作
|
|
67
|
+
apply(operation);
|
|
68
|
+
};
|
|
69
|
+
return editor;
|
|
70
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Editor } from 'slate';
|
|
2
|
+
import { BulletedListNode, NumberedListNode } from '../../el';
|
|
3
|
+
/**
|
|
4
|
+
* 判断节点是否为列表类型
|
|
5
|
+
*/
|
|
6
|
+
export declare const isListType: (node: any) => node is BulletedListNode | NumberedListNode;
|
|
7
|
+
/**
|
|
8
|
+
* 根据 order 属性返回列表类型
|
|
9
|
+
*/
|
|
10
|
+
export declare const getListType: (order?: boolean) => 'bulleted-list' | 'numbered-list';
|
|
11
|
+
/**
|
|
12
|
+
* 扩展编辑器以处理列表节点的规范化
|
|
13
|
+
*
|
|
14
|
+
* @param editor - 要扩展的Slate编辑器实例
|
|
15
|
+
* @returns 增强后的编辑器实例,能够规范化列表结构
|
|
16
|
+
*
|
|
17
|
+
* @description
|
|
18
|
+
* 该插件重写编辑器的 `normalizeNode` 方法,确保列表结构符合规范:
|
|
19
|
+
* - `bulleted-list` 和 `numbered-list` 的直接子节点必须是 `list-item`
|
|
20
|
+
* - `list-item` 的第一个子节点应该是块级元素(如 `paragraph`)
|
|
21
|
+
* - 自动修复不符合规范的结构
|
|
22
|
+
*/
|
|
23
|
+
export declare const withListsPlugin: (editor: Editor) => import("slate").BaseEditor & import("slate-react").ReactEditor & import("slate-history").HistoryEditor;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
2
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
+
return arr2;
|
|
5
|
+
}
|
|
6
|
+
function _array_with_holes(arr) {
|
|
7
|
+
if (Array.isArray(arr)) return arr;
|
|
8
|
+
}
|
|
9
|
+
function _array_without_holes(arr) {
|
|
10
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
11
|
+
}
|
|
12
|
+
function _iterable_to_array(iter) {
|
|
13
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
14
|
+
}
|
|
15
|
+
function _iterable_to_array_limit(arr, i) {
|
|
16
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
17
|
+
if (_i == null) return;
|
|
18
|
+
var _arr = [];
|
|
19
|
+
var _n = true;
|
|
20
|
+
var _d = false;
|
|
21
|
+
var _s, _e;
|
|
22
|
+
try {
|
|
23
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
24
|
+
_arr.push(_s.value);
|
|
25
|
+
if (i && _arr.length === i) break;
|
|
26
|
+
}
|
|
27
|
+
} catch (err) {
|
|
28
|
+
_d = true;
|
|
29
|
+
_e = err;
|
|
30
|
+
} finally{
|
|
31
|
+
try {
|
|
32
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
33
|
+
} finally{
|
|
34
|
+
if (_d) throw _e;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return _arr;
|
|
38
|
+
}
|
|
39
|
+
function _non_iterable_rest() {
|
|
40
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
41
|
+
}
|
|
42
|
+
function _non_iterable_spread() {
|
|
43
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
44
|
+
}
|
|
45
|
+
function _sliced_to_array(arr, i) {
|
|
46
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
47
|
+
}
|
|
48
|
+
function _to_consumable_array(arr) {
|
|
49
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
50
|
+
}
|
|
51
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
52
|
+
if (!o) return;
|
|
53
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
54
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
55
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
56
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
57
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
58
|
+
}
|
|
59
|
+
import { Editor, Element, Node, Transforms } from "slate";
|
|
60
|
+
/**
|
|
61
|
+
* 判断节点是否为列表类型
|
|
62
|
+
*/ export var isListType = function(node) {
|
|
63
|
+
return Element.isElement(node) && (node.type === 'bulleted-list' || node.type === 'numbered-list');
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* 根据 order 属性返回列表类型
|
|
67
|
+
*/ export var getListType = function(order) {
|
|
68
|
+
return order ? 'numbered-list' : 'bulleted-list';
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* 扩展编辑器以处理列表节点的规范化
|
|
72
|
+
*
|
|
73
|
+
* @param editor - 要扩展的Slate编辑器实例
|
|
74
|
+
* @returns 增强后的编辑器实例,能够规范化列表结构
|
|
75
|
+
*
|
|
76
|
+
* @description
|
|
77
|
+
* 该插件重写编辑器的 `normalizeNode` 方法,确保列表结构符合规范:
|
|
78
|
+
* - `bulleted-list` 和 `numbered-list` 的直接子节点必须是 `list-item`
|
|
79
|
+
* - `list-item` 的第一个子节点应该是块级元素(如 `paragraph`)
|
|
80
|
+
* - 自动修复不符合规范的结构
|
|
81
|
+
*/ export var withListsPlugin = function(editor) {
|
|
82
|
+
var normalizeNode = editor.normalizeNode;
|
|
83
|
+
editor.normalizeNode = function(entry) {
|
|
84
|
+
var _entry = _sliced_to_array(entry, 2), node = _entry[0], path = _entry[1];
|
|
85
|
+
// 规则 1: 列表节点的直接子节点必须是 list-item
|
|
86
|
+
if (isListType(node)) {
|
|
87
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
88
|
+
try {
|
|
89
|
+
for(var _iterator = Node.children(editor, path)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
90
|
+
var _step_value = _sliced_to_array(_step.value, 2), child = _step_value[0], childPath = _step_value[1];
|
|
91
|
+
if (Element.isElement(child) && child.type !== 'list-item') {
|
|
92
|
+
// 将非 list-item 节点转换为 list-item
|
|
93
|
+
Transforms.setNodes(editor, {
|
|
94
|
+
type: 'list-item'
|
|
95
|
+
}, {
|
|
96
|
+
at: childPath
|
|
97
|
+
});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
} catch (err) {
|
|
102
|
+
_didIteratorError = true;
|
|
103
|
+
_iteratorError = err;
|
|
104
|
+
} finally{
|
|
105
|
+
try {
|
|
106
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
107
|
+
_iterator.return();
|
|
108
|
+
}
|
|
109
|
+
} finally{
|
|
110
|
+
if (_didIteratorError) {
|
|
111
|
+
throw _iteratorError;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// 规则 2: list-item 的子节点结构规范化
|
|
117
|
+
if (Element.isElement(node) && node.type === 'list-item') {
|
|
118
|
+
// 确保 list-item 至少有一个子节点
|
|
119
|
+
if (node.children.length === 0) {
|
|
120
|
+
Transforms.insertNodes(editor, {
|
|
121
|
+
type: 'paragraph',
|
|
122
|
+
children: [
|
|
123
|
+
{
|
|
124
|
+
text: ''
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
}, {
|
|
128
|
+
at: _to_consumable_array(path).concat([
|
|
129
|
+
0
|
|
130
|
+
])
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// 确保第一个子节点是块级元素(paragraph 或其他块级元素)
|
|
135
|
+
var firstChild = node.children[0];
|
|
136
|
+
if (Element.isElement(firstChild) && !Editor.isBlock(editor, firstChild) && firstChild.type !== 'paragraph') {
|
|
137
|
+
// 如果不是块级元素,包裹为 paragraph
|
|
138
|
+
Transforms.wrapNodes(editor, {
|
|
139
|
+
type: 'paragraph',
|
|
140
|
+
children: []
|
|
141
|
+
}, {
|
|
142
|
+
at: _to_consumable_array(path).concat([
|
|
143
|
+
0
|
|
144
|
+
])
|
|
145
|
+
});
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// 确保 list-item 的子节点中,除了第一个块级元素外,其他都是列表类型
|
|
149
|
+
// 允许的结构: [paragraph, bulleted-list?, numbered-list?]
|
|
150
|
+
for(var i = 1; i < node.children.length; i++){
|
|
151
|
+
var child1 = node.children[i];
|
|
152
|
+
if (Element.isElement(child1)) {
|
|
153
|
+
if (!isListType(child1)) {
|
|
154
|
+
// 如果不是列表类型,且不是第一个块级元素,需要处理
|
|
155
|
+
// 如果它是块级元素,应该移到前面或转换为列表
|
|
156
|
+
if (Editor.isBlock(editor, child1)) {
|
|
157
|
+
// 将块级元素包裹为新的 list-item,并创建新的列表
|
|
158
|
+
var listType = getListType();
|
|
159
|
+
Transforms.wrapNodes(editor, {
|
|
160
|
+
type: 'list-item',
|
|
161
|
+
checked: undefined,
|
|
162
|
+
mentions: [],
|
|
163
|
+
id: '',
|
|
164
|
+
children: []
|
|
165
|
+
}, {
|
|
166
|
+
at: _to_consumable_array(path).concat([
|
|
167
|
+
i
|
|
168
|
+
])
|
|
169
|
+
});
|
|
170
|
+
Transforms.wrapNodes(editor, {
|
|
171
|
+
type: listType,
|
|
172
|
+
children: []
|
|
173
|
+
}, {
|
|
174
|
+
at: _to_consumable_array(path).concat([
|
|
175
|
+
i
|
|
176
|
+
])
|
|
177
|
+
});
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// 规则 3: 向后兼容 - 将旧的 'list' 类型转换为新类型
|
|
185
|
+
if (Element.isElement(node) && node.type === 'list') {
|
|
186
|
+
var listType1 = getListType(node.order);
|
|
187
|
+
Transforms.setNodes(editor, {
|
|
188
|
+
type: listType1
|
|
189
|
+
}, {
|
|
190
|
+
at: path
|
|
191
|
+
});
|
|
192
|
+
// 移除 order 属性(已由类型表示)
|
|
193
|
+
if (node.order !== undefined) {
|
|
194
|
+
Transforms.unsetNodes(editor, 'order', {
|
|
195
|
+
at: path
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
// 执行原始的规范化逻辑
|
|
201
|
+
normalizeNode(entry);
|
|
202
|
+
};
|
|
203
|
+
return editor;
|
|
204
|
+
};
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { Editor } from 'slate';
|
|
2
|
-
import { ReactEditor } from 'slate-react';
|
|
3
|
-
export declare const inlineNode: Set<string>;
|
|
4
2
|
/**
|
|
5
3
|
* 为Slate编辑器添加Markdown支持的插件函数
|
|
6
4
|
*
|
|
@@ -8,15 +6,14 @@ export declare const inlineNode: Set<string>;
|
|
|
8
6
|
* @returns 增强后的编辑器实例,具有Markdown处理能力
|
|
9
7
|
*
|
|
10
8
|
* @description
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
* -
|
|
14
|
-
* -
|
|
15
|
-
* -
|
|
9
|
+
* 该插件通过组合多个子插件,为编辑器提供完整的Markdown支持:
|
|
10
|
+
* - 行内节点识别(withInlineNodes)
|
|
11
|
+
* - 空节点识别(withVoidNodes)
|
|
12
|
+
* - 卡片功能(withCardPlugin)
|
|
13
|
+
* - 链接和媒体功能(withLinkAndMediaPlugin)
|
|
14
|
+
* - Schema功能(withSchemaPlugin)
|
|
15
|
+
* - 代码标签功能(withCodeTagPlugin)
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
* 1. 按顺序尝试所有专用处理函数(表格、卡片、链接、Schema等)
|
|
19
|
-
* 2. 如果任一处理函数返回true,则操作被消费
|
|
20
|
-
* 3. 否则,调用原始的apply方法处理操作
|
|
17
|
+
* 插件按顺序应用,每个插件都会增强编辑器的特定功能。
|
|
21
18
|
*/
|
|
22
|
-
export declare const withMarkdown: (editor: Editor) => import("slate").BaseEditor & ReactEditor & import("slate-history").HistoryEditor;
|
|
19
|
+
export declare const withMarkdown: (editor: Editor) => import("slate").BaseEditor & import("slate-react").ReactEditor & import("slate-history").HistoryEditor;
|