@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.
@@ -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
- wrapBlockModify(refBlock, editor, function () {
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
- wrapBlockModify(_refBlock, editor, function () {
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
- childLines.push(handled.textContent);
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 + 1);
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;
@@ -25,7 +25,7 @@ var CollapsedActions = /*#__PURE__*/memo(function (_ref) {
25
25
  children: children
26
26
  }),
27
27
  styles: {
28
- body: {
28
+ content: {
29
29
  padding: 4
30
30
  }
31
31
  },
@@ -25,7 +25,7 @@ var CollapsedActions = /*#__PURE__*/memo(function (_ref) {
25
25
  children: children
26
26
  }),
27
27
  styles: {
28
- body: {
28
+ content: {
29
29
  padding: 4
30
30
  }
31
31
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/editor",
3
- "version": "1.35.0",
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.38.2",
33
- "@lexical/code-shiki": "^0.38.2",
34
- "@lexical/dragon": "^0.38.2",
35
- "@lexical/history": "^0.38.2",
36
- "@lexical/link": "^0.38.2",
37
- "@lexical/list": "^0.38.2",
38
- "@lexical/rich-text": "^0.38.2",
39
- "@lexical/selection": "^0.38.2",
40
- "@lexical/table": "^0.38.2",
41
- "@lexical/utils": "^0.38.2",
42
- "@shikijs/core": "^3.19.0",
43
- "@shikijs/engine-javascript": "^3.19.0",
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.25",
49
+ "framer-motion": "^12.23.26",
50
50
  "fuse.js": "^7.1.0",
51
- "katex": "^0.16.25",
52
- "lexical": "^0.38.2",
53
- "lodash-es": "^4.17.21",
54
- "lucide-react": "^0.553.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.19.0",
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": "^2.0.0",
68
- "antd": "^5.25.0",
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
  }