@lobehub/editor 1.35.0 → 2.0.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/es/editor-kernel/inode/helper.d.ts +1 -1
- package/es/plugins/litexml/command/index.js +81 -5
- package/es/plugins/litexml/data-source/litexml-data-source.js +7 -4
- package/es/plugins/litexml/plugin/index.js +41 -0
- package/es/plugins/litexml/service/litexml-service.d.ts +4 -1
- package/es/react/ChatInputActions/components/CollapsedActions.js +1 -1
- package/es/react/FloatActions/components/CollapsedActions.js +1 -1
- package/package.json +21 -21
|
@@ -13,5 +13,5 @@ export declare const INodeHelper: {
|
|
|
13
13
|
createTypeNode(type: string, attrs?: Record<string, unknown>): INode;
|
|
14
14
|
isParagraphNode(node: INode): node is IParagraphNode;
|
|
15
15
|
isRootNode(node: INode): node is IRootNode;
|
|
16
|
-
isTextNode(node: INode): node is import("lexical").SerializedTextNode;
|
|
16
|
+
isTextNode(node: INode): node is import("lexical/nodes/LexicalTextNode").SerializedTextNode;
|
|
17
17
|
};
|
|
@@ -11,7 +11,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
|
|
|
11
11
|
import { mergeRegister } from '@lexical/utils';
|
|
12
12
|
import { $createParagraphNode, $getNodeByKey, $insertNodes, $isElementNode, COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical';
|
|
13
13
|
import { $closest } from "../../../editor-kernel";
|
|
14
|
-
import { $createDiffNode } from "../node/DiffNode";
|
|
14
|
+
import { $createDiffNode, DiffNode } from "../node/DiffNode";
|
|
15
15
|
import { $cloneNode, $parseSerializedNodeImpl, charToId } from "../utils";
|
|
16
16
|
|
|
17
17
|
// Helpers to reduce duplication and improve readability
|
|
@@ -41,6 +41,13 @@ function handleReplaceForApplyDelay(oldNode, newNode, modifyBlockNodes, diffNode
|
|
|
41
41
|
if (!oldBlock) {
|
|
42
42
|
throw new Error('Old block node not found for diffing.');
|
|
43
43
|
}
|
|
44
|
+
var originDiffNode = $closest(oldNode, function (node) {
|
|
45
|
+
return node.getType() === DiffNode.getType();
|
|
46
|
+
});
|
|
47
|
+
if (originDiffNode) {
|
|
48
|
+
oldNode.replace(newNode, false);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
44
51
|
if (oldNode === oldBlock) {
|
|
45
52
|
var diffNode = $createDiffNode('modify');
|
|
46
53
|
diffNode.append($cloneNode(oldBlock, editor), newNode);
|
|
@@ -247,6 +254,32 @@ function handleRemove(editor, key, delay) {
|
|
|
247
254
|
|
|
248
255
|
// delay removal: show a diff
|
|
249
256
|
if (node.isInline() === false) {
|
|
257
|
+
var originDiffNode = $closest(node, function (node) {
|
|
258
|
+
return node.getType() === DiffNode.getType();
|
|
259
|
+
});
|
|
260
|
+
if (originDiffNode) {
|
|
261
|
+
switch (originDiffNode.diffType) {
|
|
262
|
+
case 'add':
|
|
263
|
+
{
|
|
264
|
+
originDiffNode.remove();
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
case 'listItemModify':
|
|
268
|
+
case 'modify':
|
|
269
|
+
{
|
|
270
|
+
var children = originDiffNode.getChildren();
|
|
271
|
+
originDiffNode.replace(children[0], false).selectEnd();
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
case 'remove':
|
|
275
|
+
case 'unchanged':
|
|
276
|
+
{
|
|
277
|
+
// do nothing special
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
250
283
|
var diffNode = $createDiffNode('remove');
|
|
251
284
|
diffNode.append($cloneNode(node, editor));
|
|
252
285
|
node.replace(diffNode, false);
|
|
@@ -257,6 +290,13 @@ function handleRemove(editor, key, delay) {
|
|
|
257
290
|
if (!oldBlock) {
|
|
258
291
|
throw new Error('Old block node not found for removal.');
|
|
259
292
|
}
|
|
293
|
+
var _originDiffNode = $closest(node, function (node) {
|
|
294
|
+
return node.getType() === DiffNode.getType();
|
|
295
|
+
});
|
|
296
|
+
if (_originDiffNode) {
|
|
297
|
+
node.remove();
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
260
300
|
// wrap changes inside a modify diff
|
|
261
301
|
wrapBlockModify(oldBlock, editor, function () {
|
|
262
302
|
node.remove();
|
|
@@ -299,6 +339,12 @@ function handleInsert(editor, payload, dataSource) {
|
|
|
299
339
|
// delay insertion: show diffs or wrap block modifications
|
|
300
340
|
if (isBefore) {
|
|
301
341
|
if (referenceNode.isInline() === false) {
|
|
342
|
+
var originDiffNode = $closest(referenceNode, function (node) {
|
|
343
|
+
return node.getType() === DiffNode.getType();
|
|
344
|
+
});
|
|
345
|
+
if (originDiffNode) {
|
|
346
|
+
referenceNode = originDiffNode;
|
|
347
|
+
}
|
|
302
348
|
var diffNodes = newNodes.map(function (node) {
|
|
303
349
|
var diffNode = $createDiffNode('add');
|
|
304
350
|
diffNode.append(node);
|
|
@@ -316,16 +362,34 @@ function handleInsert(editor, payload, dataSource) {
|
|
|
316
362
|
if (!refBlock) {
|
|
317
363
|
throw new Error('Reference block node not found for insertion.');
|
|
318
364
|
}
|
|
319
|
-
|
|
365
|
+
var _originDiffNode2 = $closest(referenceNode, function (node) {
|
|
366
|
+
return node.getType() === DiffNode.getType();
|
|
367
|
+
});
|
|
368
|
+
if (_originDiffNode2) {
|
|
369
|
+
// 可能是 modify / add,那么直接修改就好了
|
|
320
370
|
newNodes.forEach(function (node) {
|
|
321
371
|
if (referenceNode) {
|
|
322
372
|
referenceNode = referenceNode.insertBefore(node);
|
|
323
373
|
}
|
|
324
374
|
});
|
|
325
|
-
}
|
|
375
|
+
} else {
|
|
376
|
+
wrapBlockModify(refBlock, editor, function () {
|
|
377
|
+
newNodes.forEach(function (node) {
|
|
378
|
+
if (referenceNode) {
|
|
379
|
+
referenceNode = referenceNode.insertBefore(node);
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
}
|
|
326
384
|
}
|
|
327
385
|
} else {
|
|
328
386
|
if (referenceNode.isInline() === false) {
|
|
387
|
+
var _originDiffNode3 = $closest(referenceNode, function (node) {
|
|
388
|
+
return node.getType() === DiffNode.getType();
|
|
389
|
+
});
|
|
390
|
+
if (_originDiffNode3) {
|
|
391
|
+
referenceNode = _originDiffNode3;
|
|
392
|
+
}
|
|
329
393
|
newNodes.forEach(function (node) {
|
|
330
394
|
if (referenceNode) {
|
|
331
395
|
var diffNode = $createDiffNode('add');
|
|
@@ -340,13 +404,25 @@ function handleInsert(editor, payload, dataSource) {
|
|
|
340
404
|
if (!_refBlock) {
|
|
341
405
|
throw new Error('Reference block node not found for insertion.');
|
|
342
406
|
}
|
|
343
|
-
|
|
407
|
+
var _originDiffNode4 = $closest(referenceNode, function (node) {
|
|
408
|
+
return node.getType() === DiffNode.getType();
|
|
409
|
+
});
|
|
410
|
+
if (_originDiffNode4) {
|
|
411
|
+
// 可能是 modify / add,那么直接修改就好了
|
|
344
412
|
newNodes.forEach(function (node) {
|
|
345
413
|
if (referenceNode) {
|
|
346
414
|
referenceNode = referenceNode.insertAfter(node);
|
|
347
415
|
}
|
|
348
416
|
});
|
|
349
|
-
}
|
|
417
|
+
} else {
|
|
418
|
+
wrapBlockModify(_refBlock, editor, function () {
|
|
419
|
+
newNodes.forEach(function (node) {
|
|
420
|
+
if (referenceNode) {
|
|
421
|
+
referenceNode = referenceNode.insertAfter(node);
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
}
|
|
350
426
|
}
|
|
351
427
|
}
|
|
352
428
|
} catch (error) {
|
|
@@ -368,16 +368,19 @@ var LitexmlDataSource = /*#__PURE__*/function (_DataSource) {
|
|
|
368
368
|
try {
|
|
369
369
|
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
370
370
|
var writer = _step2.value;
|
|
371
|
-
var handled = writer(node, this.ctx, indent);
|
|
371
|
+
var handled = writer(node, this.ctx, indent, this.nodesToXML.bind(this));
|
|
372
372
|
if (handled) {
|
|
373
|
+
if ('lines' in handled) {
|
|
374
|
+
lines.push.apply(lines, _toConsumableArray(handled.lines));
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
373
377
|
var attrs = this.buildXMLAttributes(_objectSpread({
|
|
374
378
|
id: idToChar(node.getKey())
|
|
375
379
|
}, handled.attributes));
|
|
376
380
|
var openTag = "".concat(indentStr, "<").concat(handled.tagName).concat(attrs, ">");
|
|
377
381
|
var closeTag = "</".concat(handled.tagName, ">");
|
|
378
382
|
if (handled.textContent) {
|
|
379
|
-
|
|
380
|
-
lines.push("".concat(openTag).concat(childLines.join('')).concat(closeTag));
|
|
383
|
+
lines.push("".concat(openTag).concat(handled.textContent).concat(closeTag));
|
|
381
384
|
} else if ($isElementNode(node)) {
|
|
382
385
|
var children = node.getChildren();
|
|
383
386
|
children.forEach(function (child) {
|
|
@@ -399,7 +402,7 @@ var LitexmlDataSource = /*#__PURE__*/function (_DataSource) {
|
|
|
399
402
|
if ($isElementNode(node)) {
|
|
400
403
|
var _children = node.getChildren();
|
|
401
404
|
_children.forEach(function (child) {
|
|
402
|
-
_this6.nodesToXML(child, childLines, indent
|
|
405
|
+
_this6.nodesToXML(child, childLines, indent);
|
|
403
406
|
});
|
|
404
407
|
}
|
|
405
408
|
lines.push.apply(lines, childLines);
|
|
@@ -36,6 +36,7 @@ export var LitexmlPlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
|
|
|
36
36
|
_classCallCheck(this, LitexmlPlugin);
|
|
37
37
|
_this = _super.call(this);
|
|
38
38
|
_defineProperty(_assertThisInitialized(_this), "datasource", void 0);
|
|
39
|
+
_defineProperty(_assertThisInitialized(_this), "service", void 0);
|
|
39
40
|
_this.kernel = kernel;
|
|
40
41
|
_this.config = config;
|
|
41
42
|
kernel.registerThemes({
|
|
@@ -44,6 +45,7 @@ export var LitexmlPlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
|
|
|
44
45
|
|
|
45
46
|
// Create and register the Litexml service
|
|
46
47
|
var litexmlService = new LitexmlService();
|
|
48
|
+
_this.service = litexmlService;
|
|
47
49
|
kernel.registerService(ILitexmlService, litexmlService);
|
|
48
50
|
_this.datasource = new LitexmlDataSource('litexml', function (serviceId) {
|
|
49
51
|
return kernel.requireService(serviceId);
|
|
@@ -72,6 +74,45 @@ export var LitexmlPlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
|
|
|
72
74
|
// Plugin initialization logic can be added here if needed
|
|
73
75
|
this.register(registerLiteXMLCommand(editor, this.datasource));
|
|
74
76
|
this.register(registerLiteXMLDiffCommand(editor));
|
|
77
|
+
this.regiserLiteXml();
|
|
78
|
+
}
|
|
79
|
+
}, {
|
|
80
|
+
key: "regiserLiteXml",
|
|
81
|
+
value: function regiserLiteXml() {
|
|
82
|
+
this.service.registerXMLWriter(DiffNode.getType(), function (node, ctx, indent, nodeToXML) {
|
|
83
|
+
var diffNode = node;
|
|
84
|
+
var lines = [];
|
|
85
|
+
switch (diffNode.diffType) {
|
|
86
|
+
case 'modify':
|
|
87
|
+
{
|
|
88
|
+
nodeToXML(diffNode.getChildAtIndex(1), lines, indent);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case 'add':
|
|
92
|
+
{
|
|
93
|
+
nodeToXML(diffNode.getChildAtIndex(0), lines, indent);
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
case 'remove':
|
|
97
|
+
{
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case 'listItemModify':
|
|
101
|
+
{
|
|
102
|
+
diffNode.getChildAtIndex(1).getChildren().forEach(function (child) {
|
|
103
|
+
nodeToXML(child, lines, indent);
|
|
104
|
+
});
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
default:
|
|
108
|
+
{
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
lines: lines
|
|
114
|
+
};
|
|
115
|
+
});
|
|
75
116
|
}
|
|
76
117
|
}]);
|
|
77
118
|
return LitexmlPlugin;
|
|
@@ -6,7 +6,7 @@ export type XMLReaderFunc = (xmlElement: Element, children: any[]) => any | any[
|
|
|
6
6
|
/**
|
|
7
7
|
* XML Writer function type - converts Lexical node to XML string
|
|
8
8
|
*/
|
|
9
|
-
export type XMLWriterFunc = (node: LexicalNode, ctx: IWriterContext, indent: number) => IXmlNode | false;
|
|
9
|
+
export type XMLWriterFunc = (node: LexicalNode, ctx: IWriterContext, indent: number, nodeToXML: (node: any, lines: string[], indent?: number) => void) => IXmlNode | HandleChildrenResult | false;
|
|
10
10
|
/**
|
|
11
11
|
* Record of XML readers indexed by tag name
|
|
12
12
|
*/
|
|
@@ -27,6 +27,9 @@ export interface IXmlNode {
|
|
|
27
27
|
tagName: string;
|
|
28
28
|
textContent?: string;
|
|
29
29
|
}
|
|
30
|
+
export interface HandleChildrenResult {
|
|
31
|
+
lines: string[];
|
|
32
|
+
}
|
|
30
33
|
export interface IWriterContext {
|
|
31
34
|
createXmlNode(tagName: string, attributes?: {
|
|
32
35
|
[key: string]: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/editor",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "A powerful and extensible rich text editor built on Meta's Lexical framework, providing a modern editing experience with React integration.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lobehub",
|
|
@@ -29,29 +29,29 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@floating-ui/dom": "^1.7.4",
|
|
31
31
|
"@floating-ui/react": "^0.27.16",
|
|
32
|
-
"@lexical/code": "^0.
|
|
33
|
-
"@lexical/code-shiki": "^0.
|
|
34
|
-
"@lexical/dragon": "^0.
|
|
35
|
-
"@lexical/history": "^0.
|
|
36
|
-
"@lexical/link": "^0.
|
|
37
|
-
"@lexical/list": "^0.
|
|
38
|
-
"@lexical/rich-text": "^0.
|
|
39
|
-
"@lexical/selection": "^0.
|
|
40
|
-
"@lexical/table": "^0.
|
|
41
|
-
"@lexical/utils": "^0.
|
|
42
|
-
"@shikijs/core": "^3.
|
|
43
|
-
"@shikijs/engine-javascript": "^3.
|
|
32
|
+
"@lexical/code": "^0.39.0",
|
|
33
|
+
"@lexical/code-shiki": "^0.39.0",
|
|
34
|
+
"@lexical/dragon": "^0.39.0",
|
|
35
|
+
"@lexical/history": "^0.39.0",
|
|
36
|
+
"@lexical/link": "^0.39.0",
|
|
37
|
+
"@lexical/list": "^0.39.0",
|
|
38
|
+
"@lexical/rich-text": "^0.39.0",
|
|
39
|
+
"@lexical/selection": "^0.39.0",
|
|
40
|
+
"@lexical/table": "^0.39.0",
|
|
41
|
+
"@lexical/utils": "^0.39.0",
|
|
42
|
+
"@shikijs/core": "^3.20.0",
|
|
43
|
+
"@shikijs/engine-javascript": "^3.20.0",
|
|
44
44
|
"@xmldom/xmldom": "^0.8.11",
|
|
45
45
|
"ahooks": "^3.9.6",
|
|
46
46
|
"antd-style": "^3.7.1",
|
|
47
47
|
"debug": "^4.4.3",
|
|
48
48
|
"eventemitter3": "^5.0.1",
|
|
49
|
-
"framer-motion": "^12.23.
|
|
49
|
+
"framer-motion": "^12.23.26",
|
|
50
50
|
"fuse.js": "^7.1.0",
|
|
51
|
-
"katex": "^0.16.
|
|
52
|
-
"lexical": "^0.
|
|
53
|
-
"lodash-es": "^4.17.
|
|
54
|
-
"lucide-react": "^0.
|
|
51
|
+
"katex": "^0.16.27",
|
|
52
|
+
"lexical": "^0.39.0",
|
|
53
|
+
"lodash-es": "^4.17.22",
|
|
54
|
+
"lucide-react": "^0.562.0",
|
|
55
55
|
"polished": "^4.3.1",
|
|
56
56
|
"re-resizable": "^6.11.2",
|
|
57
57
|
"react-error-boundary": "^6.0.0",
|
|
@@ -59,13 +59,13 @@
|
|
|
59
59
|
"react-merge-refs": "^3.0.2",
|
|
60
60
|
"remark-cjk-friendly": "^1.2.3",
|
|
61
61
|
"remark-supersub": "^1.0.0",
|
|
62
|
-
"shiki": "^3.
|
|
62
|
+
"shiki": "^3.20.0",
|
|
63
63
|
"ts-key-enum": "^3.0.13",
|
|
64
64
|
"use-merge-value": "^1.2.0"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
|
-
"@lobehub/ui": "^
|
|
68
|
-
"antd": "^
|
|
67
|
+
"@lobehub/ui": "^3.0.0",
|
|
68
|
+
"antd": "^6.1.1",
|
|
69
69
|
"react": "^19.0.0",
|
|
70
70
|
"react-dom": "^19.0.0"
|
|
71
71
|
}
|