@lobehub/editor 1.32.0 → 1.33.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.
Files changed (34) hide show
  1. package/es/editor-kernel/kernel.d.ts +4 -4
  2. package/es/editor-kernel/kernel.js +6 -2
  3. package/es/editor-kernel/react/PortalContainer.d.ts +11 -0
  4. package/es/editor-kernel/react/PortalContainer.js +32 -0
  5. package/es/editor-kernel/react/index.d.ts +1 -0
  6. package/es/editor-kernel/react/index.js +1 -0
  7. package/es/editor-kernel/react/useDecorators.js +3 -2
  8. package/es/editor-kernel/utils.d.ts +7 -1
  9. package/es/editor-kernel/utils.js +34 -0
  10. package/es/plugins/file/node/FileNode.js +12 -2
  11. package/es/plugins/hr/node/HorizontalRuleNode.js +12 -2
  12. package/es/plugins/link/node/LinkNode.js +2 -0
  13. package/es/plugins/link-highlight/node/link-highlight.js +1 -0
  14. package/es/plugins/litexml/command/diffCommand.d.ts +10 -0
  15. package/es/plugins/litexml/command/diffCommand.js +47 -0
  16. package/es/plugins/litexml/command/index.d.ts +19 -0
  17. package/es/plugins/litexml/command/index.js +286 -45
  18. package/es/plugins/litexml/index.d.ts +1 -1
  19. package/es/plugins/litexml/index.js +1 -1
  20. package/es/plugins/litexml/node/DiffNode.d.ts +26 -0
  21. package/es/plugins/litexml/node/DiffNode.js +164 -0
  22. package/es/plugins/litexml/plugin/index.d.ts +4 -0
  23. package/es/plugins/litexml/plugin/index.js +20 -3
  24. package/es/plugins/litexml/react/DiffNodeToolbar.d.ts +10 -0
  25. package/es/plugins/litexml/react/DiffNodeToolbar.js +47 -0
  26. package/es/plugins/litexml/react/index.js +14 -1
  27. package/es/plugins/litexml/react/style.d.ts +1 -0
  28. package/es/plugins/litexml/react/style.js +8 -0
  29. package/es/plugins/litexml/utils/index.d.ts +1 -0
  30. package/es/plugins/litexml/utils/index.js +34 -0
  31. package/es/plugins/math/node/index.js +24 -4
  32. package/es/plugins/mention/node/MentionNode.js +12 -2
  33. package/es/types/kernel.d.ts +8 -3
  34. package/package.json +1 -1
@@ -1,25 +1,194 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
8
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
9
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
10
+ /* eslint-disable @typescript-eslint/no-use-before-define */
1
11
  import { mergeRegister } from '@lexical/utils';
2
- import { $getNodeByKey, $insertNodes, $isElementNode, COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical';
12
+ import { $getNodeByKey, $insertNodes, COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical';
3
13
  import { $closest } from "../../../editor-kernel";
4
- import { $parseSerializedNodeImpl } from "../utils";
14
+ import { $createDiffNode } from "../node/DiffNode";
15
+ import { $cloneNode, $parseSerializedNodeImpl, charToId } from "../utils";
16
+
17
+ // Helpers to reduce duplication and improve readability
18
+ function toArrayXml(litexml) {
19
+ return Array.isArray(litexml) ? litexml : [litexml];
20
+ }
21
+ function tryParseChild(child, editor) {
22
+ try {
23
+ var oldNode = $getNodeByKey(child.id);
24
+ var newNode = $parseSerializedNodeImpl(child, editor);
25
+ return {
26
+ newNode: newNode,
27
+ oldNode: oldNode
28
+ };
29
+ } catch (error) {
30
+ console.error('Error parsing child node:', error);
31
+ return {
32
+ newNode: null,
33
+ oldNode: null
34
+ };
35
+ }
36
+ }
37
+ function handleReplaceForApplyDelay(oldNode, newNode, modifyBlockNodes, diffNodeMap, editor) {
38
+ var oldBlock = $closest(oldNode, function (node) {
39
+ return node.isInline() === false;
40
+ });
41
+ if (!oldBlock) {
42
+ throw new Error('Old block node not found for diffing.');
43
+ }
44
+ if (oldNode === oldBlock) {
45
+ var diffNode = $createDiffNode('modify');
46
+ diffNode.append($cloneNode(oldBlock, editor), newNode);
47
+ oldNode.replace(diffNode, false);
48
+ } else {
49
+ if (!modifyBlockNodes.has(oldBlock.getKey())) {
50
+ modifyBlockNodes.add(oldBlock.getKey());
51
+ var _diffNode = $createDiffNode('modify');
52
+ _diffNode.append($cloneNode(oldBlock, editor));
53
+ diffNodeMap.set(oldBlock.getKey(), _diffNode);
54
+ }
55
+ oldNode.replace(newNode, false);
56
+ }
57
+ }
58
+ function finalizeModifyBlocks(modifyBlockNodes, diffNodeMap, editor) {
59
+ var _iterator = _createForOfIteratorHelper(modifyBlockNodes),
60
+ _step;
61
+ try {
62
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
63
+ var blockNodeKey = _step.value;
64
+ var blockNode = $getNodeByKey(blockNodeKey);
65
+ var diffNode = diffNodeMap.get(blockNodeKey);
66
+ if (diffNode && blockNode) {
67
+ diffNode.append($cloneNode(blockNode, editor));
68
+ blockNode.replace(diffNode, false);
69
+ }
70
+ }
71
+ } catch (err) {
72
+ _iterator.e(err);
73
+ } finally {
74
+ _iterator.f();
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Wrap a block-level change with a `modify` diff: clone the old block, run the
80
+ * provided changeFn (which should mutate nodes inside the block), then clone
81
+ * the new block and replace it with the diff node. Useful for inline->block
82
+ * transitions where we want to show a modify diff.
83
+ */
84
+ function wrapBlockModify(oldBlock, editor, changeFn) {
85
+ var diffNode = $createDiffNode('modify');
86
+ diffNode.append($cloneNode(oldBlock, editor));
87
+ changeFn();
88
+ var newBlock = $getNodeByKey(oldBlock.getKey());
89
+ if (!newBlock) {
90
+ throw new Error('New block node not found for modify wrapper.');
91
+ }
92
+ diffNode.append($cloneNode(newBlock, editor));
93
+ newBlock.replace(diffNode, false);
94
+ }
95
+ export var LITEXML_MODIFY_COMMAND = createCommand('LITEXML_MODIFY_COMMAND');
5
96
  export var LITEXML_APPLY_COMMAND = createCommand('LITEXML_APPLY_COMMAND');
6
97
  export var LITEXML_REMOVE_COMMAND = createCommand('LITEXML_REMOVE_COMMAND');
7
98
  export var LITEXML_INSERT_COMMAND = createCommand('LITEXML_INSERT_COMMAND');
8
99
  export function registerLiteXMLCommand(editor, dataSource) {
9
- return mergeRegister(editor.registerCommand(LITEXML_APPLY_COMMAND, function (payload) {
10
- var litexml = payload.litexml;
11
- var arrayXml = Array.isArray(litexml) ? litexml : [litexml];
100
+ return mergeRegister(editor.registerCommand(LITEXML_MODIFY_COMMAND, function (payload) {
101
+ payload.forEach(function (item) {
102
+ var action = item.action;
103
+ switch (action) {
104
+ case 'modify':
105
+ {
106
+ var litexml = item.litexml;
107
+ var arrayXml = toArrayXml(litexml);
108
+ // handle modfy action
109
+ handleModify(editor, dataSource, arrayXml, true);
110
+ break;
111
+ }
112
+ case 'remove':
113
+ {
114
+ var id = item.id;
115
+ var key = charToId(id);
116
+ // handle remove action
117
+ handleRemove(editor, key, true);
118
+ break;
119
+ }
120
+ case 'insert':
121
+ {
122
+ handleInsert(editor, _objectSpread(_objectSpread({}, item), {}, {
123
+ delay: true
124
+ }), dataSource);
125
+ break;
126
+ }
127
+ default:
128
+ {
129
+ console.warn("Unknown action type: ".concat(action));
130
+ }
131
+ }
132
+ });
133
+ return false;
134
+ }, COMMAND_PRIORITY_EDITOR), editor.registerCommand(LITEXML_APPLY_COMMAND, function (payload) {
135
+ var litexml = payload.litexml,
136
+ delay = payload.delay;
137
+ var arrayXml = toArrayXml(litexml);
138
+ handleModify(editor, dataSource, arrayXml, delay);
139
+ return false;
140
+ }, COMMAND_PRIORITY_EDITOR // Priority
141
+ ), editor.registerCommand(LITEXML_REMOVE_COMMAND, function (payload) {
142
+ var id = payload.id,
143
+ delay = payload.delay;
144
+ var key = charToId(id);
145
+ handleRemove(editor, key, delay);
146
+ return false;
147
+ }, COMMAND_PRIORITY_EDITOR // Priority
148
+ ), editor.registerCommand(LITEXML_INSERT_COMMAND, function (payload) {
149
+ handleInsert(editor, payload, dataSource);
150
+ return false;
151
+ }, COMMAND_PRIORITY_EDITOR // Priority
152
+ ));
153
+ }
154
+ function handleModify(editor, dataSource, arrayXml, delay) {
155
+ if (delay) {
12
156
  editor.update(function () {
157
+ var modifyBlockNodes = new Set();
158
+ var diffNodeMap = new Map();
13
159
  arrayXml.forEach(function (xml) {
14
160
  var inode = dataSource.readLiteXMLToInode(xml);
15
- var prevNode = null;
16
161
  inode.root.children.forEach(function (child) {
17
162
  try {
18
- var oldNode = $getNodeByKey(child.id);
19
- var newNode = $parseSerializedNodeImpl(child, editor);
20
- if (oldNode) {
21
- prevNode = oldNode.replace(newNode, $isElementNode(newNode));
163
+ var _tryParseChild = tryParseChild(child, editor),
164
+ oldNode = _tryParseChild.oldNode,
165
+ newNode = _tryParseChild.newNode;
166
+ if (oldNode && newNode) {
167
+ handleReplaceForApplyDelay(oldNode, newNode, modifyBlockNodes, diffNodeMap, editor);
22
168
  } else {
169
+ console.warn("Node with key ".concat(child.id, " not found for diffing."));
170
+ }
171
+ } catch (error) {
172
+ console.error('Error replacing node:', error);
173
+ }
174
+ });
175
+ });
176
+ // replace modified block nodes with diff nodes
177
+ finalizeModifyBlocks(modifyBlockNodes, diffNodeMap, editor);
178
+ });
179
+ } else {
180
+ editor.update(function () {
181
+ arrayXml.forEach(function (xml) {
182
+ var inode = dataSource.readLiteXMLToInode(xml);
183
+ var prevNode = null;
184
+ inode.root.children.forEach(function (child) {
185
+ try {
186
+ var _tryParseChild2 = tryParseChild(child, editor),
187
+ oldNode = _tryParseChild2.oldNode,
188
+ newNode = _tryParseChild2.newNode;
189
+ if (oldNode && newNode) {
190
+ prevNode = oldNode.replace(newNode, false);
191
+ } else if (newNode) {
23
192
  if (prevNode) {
24
193
  if (!newNode.isInline()) {
25
194
  var prevBlock = $closest(prevNode, function (node) {
@@ -36,7 +205,6 @@ export function registerLiteXMLCommand(editor, dataSource) {
36
205
  }
37
206
  } else {
38
207
  $insertNodes([newNode]);
39
- prevNode = newNode;
40
208
  }
41
209
  }
42
210
  } catch (error) {
@@ -45,36 +213,56 @@ export function registerLiteXMLCommand(editor, dataSource) {
45
213
  });
46
214
  });
47
215
  });
48
- return false;
49
- }, COMMAND_PRIORITY_EDITOR // Priority
50
- ), editor.registerCommand(LITEXML_REMOVE_COMMAND, function (payload) {
51
- var id = payload.id;
52
- editor.update(function () {
53
- var node = $getNodeByKey(id);
54
- if (node) {
216
+ }
217
+ }
218
+ function handleRemove(editor, key, delay) {
219
+ editor.update(function () {
220
+ var node = $getNodeByKey(key);
221
+ if (!node) return;
222
+ if (!delay) {
223
+ node.remove();
224
+ return;
225
+ }
226
+
227
+ // delay removal: show a diff
228
+ if (node.isInline() === false) {
229
+ var diffNode = $createDiffNode('remove');
230
+ diffNode.append($cloneNode(node, editor));
231
+ node.replace(diffNode, false);
232
+ } else {
233
+ var oldBlock = $closest(node, function (node) {
234
+ return node.isInline() === false;
235
+ });
236
+ if (!oldBlock) {
237
+ throw new Error('Old block node not found for removal.');
238
+ }
239
+ // wrap changes inside a modify diff
240
+ wrapBlockModify(oldBlock, editor, function () {
55
241
  node.remove();
242
+ });
243
+ }
244
+ });
245
+ }
246
+ function handleInsert(editor, payload, dataSource) {
247
+ var litexml = payload.litexml,
248
+ delay = payload.delay;
249
+ var isBefore = ('beforeId' in payload);
250
+ var inode = dataSource.readLiteXMLToInode(litexml);
251
+ editor.update(function () {
252
+ try {
253
+ var referenceNode = null;
254
+ if (isBefore) {
255
+ referenceNode = $getNodeByKey(charToId(payload.beforeId));
256
+ } else {
257
+ referenceNode = $getNodeByKey(charToId(payload.afterId));
56
258
  }
57
- });
58
- return false;
59
- }, COMMAND_PRIORITY_EDITOR // Priority
60
- ), editor.registerCommand(LITEXML_INSERT_COMMAND, function (payload) {
61
- var litexml = payload.litexml;
62
- var isBefore = ('beforeId' in payload);
63
- var inode = dataSource.readLiteXMLToInode(litexml);
64
- editor.update(function () {
65
- try {
66
- var referenceNode = null;
67
- if (isBefore) {
68
- referenceNode = $getNodeByKey(payload.beforeId);
69
- } else {
70
- referenceNode = $getNodeByKey(payload.afterId);
71
- }
72
- if (!referenceNode) {
73
- throw new Error('Reference node not found for insertion.');
74
- }
75
- var newNodes = inode.root.children.map(function (child) {
76
- return $parseSerializedNodeImpl(child, editor);
77
- });
259
+ if (!referenceNode) {
260
+ throw new Error('Reference node not found for insertion.');
261
+ }
262
+ var newNodes = inode.root.children.map(function (child) {
263
+ return $parseSerializedNodeImpl(child, editor);
264
+ });
265
+ if (!delay) {
78
266
  if (isBefore) {
79
267
  referenceNode = referenceNode.insertBefore(newNodes);
80
268
  } else {
@@ -84,11 +272,64 @@ export function registerLiteXMLCommand(editor, dataSource) {
84
272
  }
85
273
  });
86
274
  }
87
- } catch (error) {
88
- console.error('Error inserting node:', error);
275
+ return;
89
276
  }
90
- });
91
- return false;
92
- }, COMMAND_PRIORITY_EDITOR // Priority
93
- ));
277
+
278
+ // delay insertion: show diffs or wrap block modifications
279
+ if (isBefore) {
280
+ if (referenceNode.isInline() === false) {
281
+ var diffNodes = newNodes.map(function (node) {
282
+ var diffNode = $createDiffNode('add');
283
+ diffNode.append(node);
284
+ return diffNode;
285
+ });
286
+ diffNodes.forEach(function (diffNode) {
287
+ if (referenceNode) {
288
+ referenceNode = referenceNode.insertBefore(diffNode);
289
+ }
290
+ });
291
+ } else {
292
+ var refBlock = $closest(referenceNode, function (node) {
293
+ return node.isInline() === false;
294
+ });
295
+ if (!refBlock) {
296
+ throw new Error('Reference block node not found for insertion.');
297
+ }
298
+ wrapBlockModify(refBlock, editor, function () {
299
+ newNodes.forEach(function (node) {
300
+ if (referenceNode) {
301
+ referenceNode = referenceNode.insertBefore(node);
302
+ }
303
+ });
304
+ });
305
+ }
306
+ } else {
307
+ if (referenceNode.isInline() === false) {
308
+ newNodes.forEach(function (node) {
309
+ if (referenceNode) {
310
+ var diffNode = $createDiffNode('add');
311
+ diffNode.append(node);
312
+ referenceNode = referenceNode.insertAfter(diffNode);
313
+ }
314
+ });
315
+ } else {
316
+ var _refBlock = $closest(referenceNode, function (node) {
317
+ return node.isInline() === false;
318
+ });
319
+ if (!_refBlock) {
320
+ throw new Error('Reference block node not found for insertion.');
321
+ }
322
+ wrapBlockModify(_refBlock, editor, function () {
323
+ newNodes.forEach(function (node) {
324
+ if (referenceNode) {
325
+ referenceNode = referenceNode.insertAfter(node);
326
+ }
327
+ });
328
+ });
329
+ }
330
+ }
331
+ } catch (error) {
332
+ console.error('Error inserting node:', error);
333
+ }
334
+ });
94
335
  }
@@ -1,4 +1,4 @@
1
- export { LITEXML_APPLY_COMMAND, LITEXML_INSERT_COMMAND, LITEXML_REMOVE_COMMAND } from './command';
1
+ export { LITEXML_APPLY_COMMAND, LITEXML_INSERT_COMMAND, LITEXML_MODIFY_COMMAND, LITEXML_REMOVE_COMMAND, } from './command';
2
2
  export { default as LitexmlDataSource } from './data-source/litexml-data-source';
3
3
  export type { LitexmlPluginOptions } from './plugin';
4
4
  export { LitexmlPlugin } from './plugin';
@@ -1,4 +1,4 @@
1
- export { LITEXML_APPLY_COMMAND, LITEXML_INSERT_COMMAND, LITEXML_REMOVE_COMMAND } from "./command";
1
+ export { LITEXML_APPLY_COMMAND, LITEXML_INSERT_COMMAND, LITEXML_MODIFY_COMMAND, LITEXML_REMOVE_COMMAND } from "./command";
2
2
  export { default as LitexmlDataSource } from "./data-source/litexml-data-source";
3
3
  export { LitexmlPlugin } from "./plugin";
4
4
  export { ReactLiteXmlPlugin } from "./react";
@@ -0,0 +1,26 @@
1
+ import { DOMExportOutput, EditorConfig, ElementDOMSlot, LexicalEditor, LexicalUpdateJSON, SerializedElementNode, Spread } from 'lexical';
2
+ import { CardLikeElementNode } from "../../common/node/cursor";
3
+ export type SerializedDiffNode = Spread<{
4
+ diffType: 'add' | 'remove' | 'modify' | 'unchanged';
5
+ }, SerializedElementNode>;
6
+ /** DiffNode - contains two block children: original and modified */
7
+ export declare class DiffNode extends CardLikeElementNode {
8
+ static getType(): string;
9
+ static clone(node: DiffNode): DiffNode;
10
+ static importJSON(serializedNode: SerializedDiffNode): DiffNode;
11
+ static importDOM(): null;
12
+ private __diffType;
13
+ constructor(type: 'add' | 'remove' | 'modify' | 'unchanged', key?: string);
14
+ get diffType(): 'add' | 'remove' | 'modify' | 'unchanged';
15
+ setDiffType(type: 'add' | 'remove' | 'modify' | 'unchanged'): this;
16
+ updateFromJSON(serializedNode: LexicalUpdateJSON<SerializedDiffNode>): this;
17
+ exportJSON(): SerializedDiffNode;
18
+ exportDOM(editor: LexicalEditor): DOMExportOutput;
19
+ createDOM(config: EditorConfig, editor: LexicalEditor): HTMLDivElement;
20
+ updateDOM(_prevNode: unknown, _dom: HTMLElement, _config: EditorConfig): boolean;
21
+ getDOMSlot(element: HTMLElement): ElementDOMSlot<HTMLElement>;
22
+ isInline(): boolean;
23
+ isCardLike(): boolean;
24
+ }
25
+ export declare function $createDiffNode(diffType?: 'add' | 'remove' | 'modify' | 'unchanged'): DiffNode;
26
+ export declare function $isDiffNode(node: unknown): node is DiffNode;
@@ -0,0 +1,164 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
5
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
6
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
7
+ function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get.bind(); } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
8
+ function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
9
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
10
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
11
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
12
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
13
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
14
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
15
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
16
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
18
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
19
+ /* eslint-disable @typescript-eslint/no-use-before-define */
20
+ import { $applyNodeReplacement } from 'lexical';
21
+ import { getKernelFromEditor, getKernelFromEditorConfig, reconcileDecorator } from "../../../editor-kernel/utils";
22
+ import { CardLikeElementNode } from "../../common/node/cursor";
23
+ /** DiffNode - contains two block children: original and modified */
24
+ export var DiffNode = /*#__PURE__*/function (_CardLikeElementNode) {
25
+ _inherits(DiffNode, _CardLikeElementNode);
26
+ var _super = _createSuper(DiffNode);
27
+ function DiffNode(type, key) {
28
+ var _this;
29
+ _classCallCheck(this, DiffNode);
30
+ _this = _super.call(this, key);
31
+ _defineProperty(_assertThisInitialized(_this), "__diffType", 'unchanged');
32
+ _this.__diffType = type;
33
+ return _this;
34
+ }
35
+ _createClass(DiffNode, [{
36
+ key: "diffType",
37
+ get: function get() {
38
+ return this.__diffType;
39
+ }
40
+ }, {
41
+ key: "setDiffType",
42
+ value: function setDiffType(type) {
43
+ this.getWritable().__diffType = type;
44
+ return this;
45
+ }
46
+ }, {
47
+ key: "updateFromJSON",
48
+ value: function updateFromJSON(serializedNode) {
49
+ return _get(_getPrototypeOf(DiffNode.prototype), "updateFromJSON", this).call(this, serializedNode).setDiffType(serializedNode.diffType);
50
+ }
51
+ }, {
52
+ key: "exportJSON",
53
+ value: function exportJSON() {
54
+ return _objectSpread(_objectSpread({}, _get(_getPrototypeOf(DiffNode.prototype), "exportJSON", this).call(this)), {}, {
55
+ diffType: this.__diffType,
56
+ type: 'diff'
57
+ });
58
+ }
59
+ }, {
60
+ key: "exportDOM",
61
+ value: function exportDOM(editor) {
62
+ return _get(_getPrototypeOf(DiffNode.prototype), "exportDOM", this).call(this, editor);
63
+ }
64
+ }, {
65
+ key: "createDOM",
66
+ value: function createDOM(config, editor) {
67
+ var _getKernelFromEditor;
68
+ var el = document.createElement('div');
69
+ el.contentEditable = 'false';
70
+ el.dataset.lexicalKey = this.getKey();
71
+ el.dataset.diffType = this.__diffType;
72
+ el.classList.add('ne-diff');
73
+ if (config.theme.diffNode) {
74
+ el.classList.add(config.theme.diffNode);
75
+ }
76
+ var toolbar = document.createElement('div');
77
+ toolbar.className = 'toolbar';
78
+ toolbar.dataset.lexicalDecorator = 'true';
79
+ el.append(toolbar);
80
+ var content = document.createElement('div');
81
+ content.className = 'content';
82
+ el.append(content);
83
+ var decorator = ((_getKernelFromEditor = getKernelFromEditor(editor)) === null || _getKernelFromEditor === void 0 ? void 0 : _getKernelFromEditor.getDecorator('diff')) || null;
84
+ if (decorator) {
85
+ if (typeof decorator === 'function') {
86
+ reconcileDecorator(editor, this.getKey(), decorator(this, editor));
87
+ } else {
88
+ reconcileDecorator(editor, this.getKey(), {
89
+ queryDOM: decorator.queryDOM,
90
+ render: decorator.render(this, editor)
91
+ });
92
+ }
93
+ }
94
+ return el;
95
+ }
96
+ }, {
97
+ key: "updateDOM",
98
+ value: function updateDOM(_prevNode, _dom, _config) {
99
+ if (_dom.dataset.diffType !== this.__diffType) {
100
+ _dom.dataset.diffType = this.__diffType;
101
+ }
102
+ var kernel = getKernelFromEditorConfig(_config);
103
+ var editor = kernel === null || kernel === void 0 ? void 0 : kernel.getLexicalEditor();
104
+ if (editor) {
105
+ var decorator = (kernel === null || kernel === void 0 ? void 0 : kernel.getDecorator('diff')) || null;
106
+ if (decorator) {
107
+ if (typeof decorator === 'function') {
108
+ reconcileDecorator(editor, this.getKey(), decorator(this, editor));
109
+ } else {
110
+ reconcileDecorator(editor, this.getKey(), {
111
+ queryDOM: decorator.queryDOM,
112
+ render: decorator.render(this, editor)
113
+ });
114
+ }
115
+ }
116
+ }
117
+ return false;
118
+ }
119
+ }, {
120
+ key: "getDOMSlot",
121
+ value: function getDOMSlot(element) {
122
+ return _get(_getPrototypeOf(DiffNode.prototype), "getDOMSlot", this).call(this, element).withElement(element.querySelector('.content'));
123
+ }
124
+ }, {
125
+ key: "isInline",
126
+ value: function isInline() {
127
+ return false;
128
+ }
129
+ }, {
130
+ key: "isCardLike",
131
+ value: function isCardLike() {
132
+ return true;
133
+ }
134
+ }], [{
135
+ key: "getType",
136
+ value: function getType() {
137
+ return 'diff';
138
+ }
139
+ }, {
140
+ key: "clone",
141
+ value: function clone(node) {
142
+ return new DiffNode(node.__diffType, node.__key);
143
+ }
144
+ }, {
145
+ key: "importJSON",
146
+ value: function importJSON(serializedNode) {
147
+ return $createDiffNode().updateFromJSON(serializedNode);
148
+ }
149
+ }, {
150
+ key: "importDOM",
151
+ value: function importDOM() {
152
+ // TODO: Should link node should handle the import over autolink?
153
+ return null;
154
+ }
155
+ }]);
156
+ return DiffNode;
157
+ }(CardLikeElementNode);
158
+ export function $createDiffNode() {
159
+ var diffType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'unchanged';
160
+ return $applyNodeReplacement(new DiffNode(diffType));
161
+ }
162
+ export function $isDiffNode(node) {
163
+ return node instanceof DiffNode;
164
+ }
@@ -1,13 +1,17 @@
1
+ import { LexicalEditor } from 'lexical';
1
2
  import type { IEditorPluginConstructor } from "../../../types";
3
+ import { DiffNode } from '../node/DiffNode';
2
4
  /**
3
5
  * LitexmlPluginOptions - Configuration options for the Litexml plugin
4
6
  */
5
7
  export interface LitexmlPluginOptions {
8
+ decorator: (node: DiffNode, editor: LexicalEditor) => any;
6
9
  /**
7
10
  * Enable or disable the litexml data source
8
11
  * @default true
9
12
  */
10
13
  enabled?: boolean;
14
+ theme?: string;
11
15
  }
12
16
  /**
13
17
  * LitexmlPlugin - A plugin that provides XML-based data source support
@@ -15,7 +15,9 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
15
15
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
16
16
  import { KernelPlugin } from "../../../editor-kernel/plugin";
17
17
  import { registerLiteXMLCommand } from "../command";
18
+ import { registerLiteXMLDiffCommand } from "../command/diffCommand";
18
19
  import LitexmlDataSource from "../data-source/litexml-data-source";
20
+ import { DiffNode } from "../node/DiffNode";
19
21
  import { ILitexmlService, LitexmlService } from "../service/litexml-service";
20
22
 
21
23
  /**
@@ -33,17 +35,31 @@ export var LitexmlPlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
33
35
  var _this;
34
36
  _classCallCheck(this, LitexmlPlugin);
35
37
  _this = _super.call(this);
36
-
37
- // Create and register the Litexml service
38
38
  _defineProperty(_assertThisInitialized(_this), "datasource", void 0);
39
39
  _this.kernel = kernel;
40
40
  _this.config = config;
41
+ kernel.registerThemes({
42
+ diffNode: (config === null || config === void 0 ? void 0 : config.theme) || 'editor_diffNode'
43
+ });
44
+
45
+ // Create and register the Litexml service
41
46
  var litexmlService = new LitexmlService();
42
47
  kernel.registerService(ILitexmlService, litexmlService);
43
48
  _this.datasource = new LitexmlDataSource('litexml', function (serviceId) {
44
49
  return kernel.requireService(serviceId);
45
50
  }, litexmlService);
46
51
 
52
+ // register diff node type
53
+ kernel.registerNodes([DiffNode]);
54
+ kernel.registerDecorator(DiffNode.getType(), {
55
+ queryDOM: function queryDOM(el) {
56
+ return el.querySelector('.toolbar');
57
+ },
58
+ render: function render(node, editor) {
59
+ return config !== null && config !== void 0 && config.decorator ? config.decorator(node, editor) : null;
60
+ }
61
+ });
62
+
47
63
  // Register the litexml data source
48
64
  if ((config === null || config === void 0 ? void 0 : config.enabled) !== false) {
49
65
  kernel.registerDataSource(_this.datasource);
@@ -54,7 +70,8 @@ export var LitexmlPlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
54
70
  key: "onInit",
55
71
  value: function onInit(editor) {
56
72
  // Plugin initialization logic can be added here if needed
57
- registerLiteXMLCommand(editor, this.datasource);
73
+ this.register(registerLiteXMLCommand(editor, this.datasource));
74
+ this.register(registerLiteXMLDiffCommand(editor));
58
75
  }
59
76
  }]);
60
77
  return LitexmlPlugin;
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import { LexicalEditor } from 'lexical';
3
+ import { DiffNode } from '../node/DiffNode';
4
+ interface ReactDiffNodeToolbarProps {
5
+ className?: string;
6
+ editor: LexicalEditor;
7
+ node: DiffNode;
8
+ }
9
+ declare const ReactDiffNodeToolbar: import("react").NamedExoticComponent<ReactDiffNodeToolbarProps>;
10
+ export default ReactDiffNodeToolbar;