@lobehub/editor 1.2.2 → 1.3.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.
@@ -1,8 +1,11 @@
1
1
  import { LexicalEditor } from 'lexical';
2
+ export interface IWriteOptions {
3
+ selection?: boolean;
4
+ }
2
5
  export default class DataSource {
3
6
  protected dataType: string;
4
7
  constructor(dataType: string);
5
8
  get type(): string;
6
9
  read(editor: LexicalEditor, data: any): void;
7
- write(editor: LexicalEditor): any;
10
+ write(editor: LexicalEditor, options?: IWriteOptions): any;
8
11
  }
@@ -21,7 +21,7 @@ var DataSource = /*#__PURE__*/function () {
21
21
  value: function read(editor, data) {}
22
22
  }, {
23
23
  key: "write",
24
- value: function write(editor) {
24
+ value: function write(editor, options) {
25
25
  return null;
26
26
  }
27
27
  }]);
@@ -4,8 +4,11 @@ import { IParagraphNode } from './paragraph-node';
4
4
  import { IRootNode } from './root-node';
5
5
  import { ITextNode } from './text-node';
6
6
  export declare const INodeHelper: {
7
- appendChild(parent: IElementNode, child: INode): void;
7
+ appendChild(parent: IElementNode, ...child: INode[]): void;
8
8
  createParagraph(attrs?: Record<string, unknown>): IParagraphNode;
9
9
  createRootNode(attrs?: Record<string, unknown>): IRootNode;
10
10
  createTextNode(text: string, attrs?: Record<string, unknown>): ITextNode;
11
+ isParagraphNode(node: INode): node is IParagraphNode;
12
+ isRootNode(node: INode): node is IRootNode;
13
+ isTextNode(node: INode): node is ITextNode;
11
14
  };
@@ -8,14 +8,19 @@ var BaseContent = {
8
8
  direction: 'ltr',
9
9
  format: '',
10
10
  indent: 0,
11
+ type: '',
11
12
  version: 1
12
13
  };
13
14
  export var INodeHelper = {
14
- appendChild: function appendChild(parent, child) {
15
+ appendChild: function appendChild(parent) {
16
+ var _parent$children;
15
17
  if (!parent.children) {
16
18
  parent.children = [];
17
19
  }
18
- parent.children.push(child);
20
+ for (var _len = arguments.length, child = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
21
+ child[_key - 1] = arguments[_key];
22
+ }
23
+ (_parent$children = parent.children).push.apply(_parent$children, child);
19
24
  },
20
25
  createParagraph: function createParagraph() {
21
26
  var attrs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -44,5 +49,14 @@ export var INodeHelper = {
44
49
  text: text,
45
50
  type: 'text'
46
51
  });
52
+ },
53
+ isParagraphNode: function isParagraphNode(node) {
54
+ return node.type === 'paragraph';
55
+ },
56
+ isRootNode: function isRootNode(node) {
57
+ return node.type === 'root';
58
+ },
59
+ isTextNode: function isTextNode(node) {
60
+ return node.type === 'text';
47
61
  }
48
62
  };
@@ -1,5 +1,2 @@
1
- import { INode } from './i-node';
2
- export interface IElementNode extends INode {
3
- children: INode[];
4
- type: string;
5
- }
1
+ import { SerializedElementNode } from 'lexical';
2
+ export type IElementNode = SerializedElementNode;
@@ -1,6 +1,2 @@
1
- export interface INode {
2
- direction: 'ltr' | 'rtl';
3
- format: string;
4
- indent: number;
5
- version: number;
6
- }
1
+ import type { SerializedLexicalNode } from 'lexical';
2
+ export type INode = SerializedLexicalNode;
@@ -1,7 +1,5 @@
1
- import { IElementNode } from './i-element-node';
1
+ import { SerializedRootNode } from 'lexical';
2
2
  /**
3
3
  * Root node
4
4
  */
5
- export interface IRootNode extends IElementNode {
6
- type: 'root';
7
- }
5
+ export type IRootNode = SerializedRootNode;
@@ -34,6 +34,7 @@ export declare class Kernel extends EventEmitter implements IEditorKernel {
34
34
  focus(): void;
35
35
  blur(): void;
36
36
  getDocument(type: string): DataSource | undefined;
37
+ getSelectionDocument(type: string): unknown | null;
37
38
  registerDecorator(name: string, decorator: (_node: DecoratorNode<any>, _editor: LexicalEditor) => any): this;
38
39
  getDecorator(name: string): ((_node: DecoratorNode<any>, _editor: LexicalEditor) => any) | undefined;
39
40
  /**
@@ -203,6 +203,20 @@ export var Kernel = /*#__PURE__*/function (_EventEmitter) {
203
203
  }
204
204
  return datasource.write(this.editor);
205
205
  }
206
+ }, {
207
+ key: "getSelectionDocument",
208
+ value: function getSelectionDocument(type) {
209
+ var datasource = this.dataTypeMap.get(type);
210
+ if (!datasource) {
211
+ throw new Error("DataSource for type \"".concat(type, "\" is not registered."));
212
+ }
213
+ if (!this.editor) {
214
+ throw new Error("Editor is not initialized.");
215
+ }
216
+ return datasource.write(this.editor, {
217
+ selection: true
218
+ });
219
+ }
206
220
  }, {
207
221
  key: "registerDecorator",
208
222
  value: function registerDecorator(name, decorator) {
File without changes
File without changes
@@ -20,6 +20,33 @@ import { IMarkdownShortCutService } from "../../markdown";
20
20
  import { CustomShikiTokenizer, registerCodeCommand } from "../command";
21
21
  import { getCodeLanguageByInput } from "../utils/language";
22
22
  import { registerCodeHighlighting, toCodeTheme } from "./CodeHighlighterShiki";
23
+ var origin = CodeNode.importDOM;
24
+ var LANGUAGE_DATA_ATTRIBUTE = 'data-language';
25
+ var MAX_LENGTH = 8000;
26
+ function $convertPreElement(domNode) {
27
+ var language = domNode.getAttribute(LANGUAGE_DATA_ATTRIBUTE);
28
+ if (domNode.innerHTML.length > MAX_LENGTH) {
29
+ return {
30
+ node: null
31
+ };
32
+ }
33
+ return {
34
+ node: $createCodeNode(language)
35
+ };
36
+ }
37
+ CodeNode.importDOM = function () {
38
+ var node = origin();
39
+ if (node) {
40
+ node.pre = function () {
41
+ return {
42
+ conversion: $convertPreElement,
43
+ priority: 0
44
+ };
45
+ };
46
+ }
47
+ // Custom logic for handling imported DOM
48
+ return node;
49
+ };
23
50
  export var CodeblockPlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
24
51
  _inherits(CodeblockPlugin, _KernelPlugin);
25
52
  var _super = _createSuper(CodeblockPlugin);
@@ -1,6 +1,7 @@
1
1
  import { LexicalEditor } from 'lexical';
2
2
  import { DataSource } from "../../../editor-kernel";
3
+ import { IWriteOptions } from "../../../editor-kernel/data-source";
3
4
  export default class JSONDataSource extends DataSource {
4
5
  read(editor: LexicalEditor, data: any): void;
5
- write(editor: LexicalEditor): any;
6
+ write(editor: LexicalEditor, options?: IWriteOptions): any;
6
7
  }
@@ -1,4 +1,13 @@
1
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 _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
6
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
+ 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); }
8
+ 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; }
9
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
10
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
2
11
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
12
  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); } }
4
13
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
@@ -11,6 +20,9 @@ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) ===
11
20
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
12
21
  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; } }
13
22
  function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
23
+ /* eslint-disable unicorn/no-for-loop */
24
+ import { $isTableSelection } from '@lexical/table';
25
+ import { $getCharacterOffsets, $getNodeByKey, $getSelection, $isElementNode, $isRangeSelection, $isTextNode } from 'lexical';
14
26
  import { DataSource } from "../../../editor-kernel";
15
27
  var JSONDataSource = /*#__PURE__*/function (_DataSource) {
16
28
  _inherits(JSONDataSource, _DataSource);
@@ -26,7 +38,116 @@ var JSONDataSource = /*#__PURE__*/function (_DataSource) {
26
38
  }
27
39
  }, {
28
40
  key: "write",
29
- value: function write(editor) {
41
+ value: function write(editor, options) {
42
+ if (options !== null && options !== void 0 && options.selection) {
43
+ return editor.read(function () {
44
+ var selection = $getSelection();
45
+ if (!selection) {
46
+ return null;
47
+ }
48
+ if ($isRangeSelection(selection)) {
49
+ var selectedNodes = selection.getNodes();
50
+ var selectedNodesLength = selectedNodes.length;
51
+ var lastIndex = selectedNodesLength - 1;
52
+ var anchor = selection.anchor;
53
+ var focus = selection.focus;
54
+ var isBefore = anchor.isBefore(focus);
55
+ var firstNode = selectedNodes[0];
56
+ var lastNode = selectedNodes[lastIndex];
57
+ var _$getCharacterOffsets = $getCharacterOffsets(selection),
58
+ _$getCharacterOffsets2 = _slicedToArray(_$getCharacterOffsets, 2),
59
+ anchorOffset = _$getCharacterOffsets2[0],
60
+ focusOffset = _$getCharacterOffsets2[1];
61
+ var lastElement = [];
62
+ var rootNodes = [];
63
+ for (var i = 0; i < selectedNodes.length; i++) {
64
+ var node = selectedNodes[i];
65
+ if ($isElementNode(node)) {
66
+ var sNode = _objectSpread(_objectSpread({}, node.exportJSON()), {}, {
67
+ $key: node.getKey()
68
+ });
69
+ for (var _i = 0; _i < rootNodes.length; _i++) {
70
+ var child = rootNodes[_i];
71
+ var childNode = $getNodeByKey(child.$key);
72
+ if (node.isParentOf(childNode)) {
73
+ sNode.children.push(child);
74
+ rootNodes.splice(_i, 1);
75
+ _i--;
76
+ }
77
+ }
78
+ var hasPush = false;
79
+ for (var _i2 = lastElement.length - 1; _i2 >= 0; _i2--) {
80
+ var _$getNodeByKey;
81
+ if ((_$getNodeByKey = $getNodeByKey(lastElement[_i2].$key)) !== null && _$getNodeByKey !== void 0 && _$getNodeByKey.isParentOf(node)) {
82
+ lastElement[_i2].children.push(sNode);
83
+ hasPush = true;
84
+ break;
85
+ } else {
86
+ lastElement.pop();
87
+ }
88
+ }
89
+ if (!hasPush) {
90
+ rootNodes.push(sNode);
91
+ }
92
+ lastElement.push(sNode);
93
+ } else if ($isTextNode(node)) {
94
+ var _sNode = _objectSpread(_objectSpread({}, node.exportJSON()), {}, {
95
+ $key: node.getKey()
96
+ });
97
+ if (node === firstNode) {
98
+ if (node === lastNode) {
99
+ if (anchor.type !== 'element' || focus.type !== 'element' || focus.offset === anchor.offset) {
100
+ _sNode.text = anchorOffset < focusOffset ? _sNode.text.slice(anchorOffset, focusOffset) : _sNode.text.slice(focusOffset, anchorOffset);
101
+ }
102
+ } else {
103
+ _sNode.text = isBefore ? _sNode.text.slice(anchorOffset) : _sNode.text.slice(focusOffset);
104
+ }
105
+ } else if (node === lastNode) {
106
+ _sNode.text = isBefore ? _sNode.text.slice(0, focusOffset) : _sNode.text.slice(0, anchorOffset);
107
+ }
108
+ var _hasPush = false;
109
+ for (var _i3 = lastElement.length - 1; _i3 >= 0; _i3--) {
110
+ var _$getNodeByKey2;
111
+ if ((_$getNodeByKey2 = $getNodeByKey(lastElement[_i3].$key)) !== null && _$getNodeByKey2 !== void 0 && _$getNodeByKey2.isParentOf(node)) {
112
+ lastElement[_i3].children.push(_sNode);
113
+ _hasPush = true;
114
+ break;
115
+ } else {
116
+ lastElement.pop();
117
+ }
118
+ }
119
+ if (!_hasPush) {
120
+ rootNodes.push(_sNode);
121
+ }
122
+ } else {
123
+ var _sNode2 = _objectSpread(_objectSpread({}, node.exportJSON()), {}, {
124
+ $key: node.getKey()
125
+ });
126
+ var _hasPush2 = false;
127
+ for (var _i4 = lastElement.length - 1; _i4 >= 0; _i4--) {
128
+ var _$getNodeByKey3;
129
+ if ((_$getNodeByKey3 = $getNodeByKey(lastElement[_i4].$key)) !== null && _$getNodeByKey3 !== void 0 && _$getNodeByKey3.isParentOf(node)) {
130
+ lastElement[_i4].children.push(_sNode2);
131
+ _hasPush2 = true;
132
+ break;
133
+ } else {
134
+ lastElement.pop();
135
+ }
136
+ }
137
+ if (!_hasPush2) {
138
+ rootNodes.push(_sNode2);
139
+ }
140
+ }
141
+ }
142
+ return rootNodes;
143
+ } else if ($isTableSelection(selection)) {
144
+ // todo
145
+ }
146
+ return selection.getNodes().map(function (node) {
147
+ return node.exportJSON();
148
+ });
149
+ });
150
+ }
30
151
  return editor.getEditorState().toJSON();
31
152
  }
32
153
  }]);
@@ -1,6 +1,7 @@
1
1
  import { LexicalEditor } from 'lexical';
2
2
  import { DataSource } from "../../../editor-kernel";
3
+ import { IWriteOptions } from "../../../editor-kernel/data-source";
3
4
  export default class TextDataSource extends DataSource {
4
5
  read(editor: LexicalEditor, data: string): void;
5
- write(editor: LexicalEditor): any;
6
+ write(editor: LexicalEditor, options?: IWriteOptions): any;
6
7
  }
@@ -11,7 +11,7 @@ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) ===
11
11
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
12
12
  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; } }
13
13
  function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
14
- import { $getRoot } from 'lexical';
14
+ import { $getRoot, $getSelection } from 'lexical';
15
15
  import { DataSource } from "../../../editor-kernel";
16
16
  import { INodeHelper } from "../../../editor-kernel/inode/helper";
17
17
  var TextDataSource = /*#__PURE__*/function (_DataSource) {
@@ -43,7 +43,13 @@ var TextDataSource = /*#__PURE__*/function (_DataSource) {
43
43
  }
44
44
  }, {
45
45
  key: "write",
46
- value: function write(editor) {
46
+ value: function write(editor, options) {
47
+ if (options !== null && options !== void 0 && options.selection) {
48
+ return editor.read(function () {
49
+ var selection = $getSelection();
50
+ return selection ? selection.getTextContent() : null;
51
+ });
52
+ }
47
53
  return editor.getEditorState().read(function () {
48
54
  return $getRoot().getTextContent();
49
55
  });
@@ -1,10 +1,11 @@
1
1
  import { LexicalEditor } from 'lexical';
2
2
  import { DataSource } from "../../../editor-kernel";
3
+ import { IWriteOptions } from "../../../editor-kernel/data-source";
3
4
  import { MarkdownShortCutService } from '../service/shortcut';
4
5
  export default class MarkdownDataSource extends DataSource {
5
6
  protected dataType: string;
6
7
  protected markdownService: MarkdownShortCutService;
7
8
  constructor(dataType: string, markdownService: MarkdownShortCutService);
8
9
  read(): void;
9
- write(editor: LexicalEditor): any;
10
+ write(editor: LexicalEditor, options?: IWriteOptions): any;
10
11
  }
@@ -1,4 +1,17 @@
1
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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
3
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
5
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
6
+ 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; }
7
+ 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; }
8
+ 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; }
9
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
10
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
11
+ 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); }
12
+ 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; }
13
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
14
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
2
15
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
16
  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); } }
4
17
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
@@ -11,8 +24,11 @@ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) ===
11
24
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
12
25
  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; } }
13
26
  function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
14
- import { $getRoot, $isElementNode } from 'lexical';
27
+ /* eslint-disable unicorn/no-for-loop */
28
+ import { $isTableSelection } from '@lexical/table';
29
+ import { $getCharacterOffsets, $getNodeByKey, $getRoot, $getSelection, $isElementNode, $isRangeSelection, $isTextNode } from 'lexical';
15
30
  import { DataSource } from "../../../editor-kernel";
31
+ import { INodeHelper } from "../../../editor-kernel/inode/helper";
16
32
  import { MarkdownWriterContext } from "./markdown-writer-context";
17
33
  var MarkdownDataSource = /*#__PURE__*/function (_DataSource) {
18
34
  _inherits(MarkdownDataSource, _DataSource);
@@ -32,26 +48,177 @@ var MarkdownDataSource = /*#__PURE__*/function (_DataSource) {
32
48
  }
33
49
  }, {
34
50
  key: "write",
35
- value: function write(editor) {
51
+ value: function write(editor, options) {
36
52
  var _this2 = this;
37
- return editor.getEditorState().read(function () {
38
- var rootNode = $getRoot();
39
- var rootCtx = new MarkdownWriterContext();
40
- var processChild = function processChild(parentCtx, child) {
41
- var writer = _this2.markdownService.markdownWriters[child.getType()];
42
- var currentCtx = parentCtx;
43
- if ($isElementNode(child)) {
44
- currentCtx = currentCtx.newChild();
53
+ var processChild = function processChild(parentCtx, child) {
54
+ var writer = _this2.markdownService.markdownWriters[child.getType()];
55
+ var currentCtx = parentCtx;
56
+ if ($isElementNode(child)) {
57
+ currentCtx = currentCtx.newChild();
58
+ }
59
+ if (writer) {
60
+ writer(currentCtx, child);
61
+ }
62
+ if ($isElementNode(child)) {
63
+ child.getChildren().forEach(function (child) {
64
+ return processChild(currentCtx, child);
65
+ });
66
+ }
67
+ };
68
+ if (options !== null && options !== void 0 && options.selection) {
69
+ return editor.read(function () {
70
+ var selection = $getSelection();
71
+ if (!selection) {
72
+ return null;
45
73
  }
46
- if (writer) {
47
- writer(currentCtx, child);
48
- }
49
- if ($isElementNode(child)) {
50
- child.getChildren().forEach(function (child) {
51
- return processChild(currentCtx, child);
74
+ var selectedNodes = selection.getNodes();
75
+ if ($isRangeSelection(selection)) {
76
+ var selectedNodesLength = selectedNodes.length;
77
+ var lastIndex = selectedNodesLength - 1;
78
+ var anchor = selection.anchor;
79
+ var focus = selection.focus;
80
+ var isBefore = anchor.isBefore(focus);
81
+ var firstNode = selectedNodes[0];
82
+ var lastNode = selectedNodes[lastIndex];
83
+ var _$getCharacterOffsets = $getCharacterOffsets(selection),
84
+ _$getCharacterOffsets2 = _slicedToArray(_$getCharacterOffsets, 2),
85
+ anchorOffset = _$getCharacterOffsets2[0],
86
+ focusOffset = _$getCharacterOffsets2[1];
87
+ var lastElement = [];
88
+ var rootNodes = [];
89
+ for (var i = 0; i < selectedNodes.length; i++) {
90
+ var node = selectedNodes[i];
91
+ if ($isElementNode(node)) {
92
+ var sNode = _objectSpread(_objectSpread({}, node.exportJSON()), {}, {
93
+ $key: node.getKey()
94
+ });
95
+ for (var _i = 0; _i < rootNodes.length; _i++) {
96
+ var child = rootNodes[_i];
97
+ var childNode = $getNodeByKey(child.$key);
98
+ if (node.isParentOf(childNode)) {
99
+ sNode.children.push(child);
100
+ rootNodes.splice(_i, 1);
101
+ _i--;
102
+ }
103
+ }
104
+ var hasPush = false;
105
+ for (var _i2 = lastElement.length - 1; _i2 >= 0; _i2--) {
106
+ var _$getNodeByKey;
107
+ if ((_$getNodeByKey = $getNodeByKey(lastElement[_i2].$key)) !== null && _$getNodeByKey !== void 0 && _$getNodeByKey.isParentOf(node)) {
108
+ lastElement[_i2].children.push(sNode);
109
+ hasPush = true;
110
+ break;
111
+ } else {
112
+ lastElement.pop();
113
+ }
114
+ }
115
+ if (!hasPush) {
116
+ rootNodes.push(sNode);
117
+ }
118
+ lastElement.push(sNode);
119
+ } else if ($isTextNode(node)) {
120
+ var _sNode = _objectSpread(_objectSpread({}, node.exportJSON()), {}, {
121
+ $key: node.getKey()
122
+ });
123
+ if (node === firstNode) {
124
+ if (node === lastNode) {
125
+ if (anchor.type !== 'element' || focus.type !== 'element' || focus.offset === anchor.offset) {
126
+ _sNode.text = anchorOffset < focusOffset ? _sNode.text.slice(anchorOffset, focusOffset) : _sNode.text.slice(focusOffset, anchorOffset);
127
+ }
128
+ } else {
129
+ _sNode.text = isBefore ? _sNode.text.slice(anchorOffset) : _sNode.text.slice(focusOffset);
130
+ }
131
+ } else if (node === lastNode) {
132
+ _sNode.text = isBefore ? _sNode.text.slice(0, focusOffset) : _sNode.text.slice(0, anchorOffset);
133
+ }
134
+ var _hasPush = false;
135
+ for (var _i3 = lastElement.length - 1; _i3 >= 0; _i3--) {
136
+ var _$getNodeByKey2;
137
+ if ((_$getNodeByKey2 = $getNodeByKey(lastElement[_i3].$key)) !== null && _$getNodeByKey2 !== void 0 && _$getNodeByKey2.isParentOf(node)) {
138
+ lastElement[_i3].children.push(_sNode);
139
+ _hasPush = true;
140
+ break;
141
+ } else {
142
+ lastElement.pop();
143
+ }
144
+ }
145
+ if (!_hasPush) {
146
+ rootNodes.push(_sNode);
147
+ }
148
+ } else {
149
+ var _sNode2 = _objectSpread(_objectSpread({}, node.exportJSON()), {}, {
150
+ $key: node.getKey()
151
+ });
152
+ var _hasPush2 = false;
153
+ for (var _i4 = lastElement.length - 1; _i4 >= 0; _i4--) {
154
+ var _$getNodeByKey3;
155
+ if ((_$getNodeByKey3 = $getNodeByKey(lastElement[_i4].$key)) !== null && _$getNodeByKey3 !== void 0 && _$getNodeByKey3.isParentOf(node)) {
156
+ lastElement[_i4].children.push(_sNode2);
157
+ _hasPush2 = true;
158
+ break;
159
+ } else {
160
+ lastElement.pop();
161
+ }
162
+ }
163
+ if (!_hasPush2) {
164
+ rootNodes.push(_sNode2);
165
+ }
166
+ }
167
+ }
168
+ var _rootNode = INodeHelper.createRootNode();
169
+ if (rootNodes.some(function (node) {
170
+ return INodeHelper.isTextNode(node);
171
+ })) {
172
+ var p = INodeHelper.createParagraph();
173
+ INodeHelper.appendChild.apply(INodeHelper, [p].concat(rootNodes));
174
+ INodeHelper.appendChild(_rootNode, p);
175
+ } else {
176
+ INodeHelper.appendChild.apply(INodeHelper, [_rootNode].concat(rootNodes));
177
+ }
178
+ var _editorState = editor.parseEditorState({
179
+ root: _rootNode
180
+ });
181
+ var _lexicalRootNode = _editorState._nodeMap.get('root');
182
+ var _rootCtx = new MarkdownWriterContext();
183
+ return _editorState.read(function () {
184
+ _lexicalRootNode.getChildren().forEach(function (child) {
185
+ return processChild(_rootCtx, child);
186
+ });
187
+ return _rootCtx.toString();
52
188
  });
189
+ } else if ($isTableSelection(selection)) {
190
+ // todo
191
+ }
192
+ var rootNode = INodeHelper.createRootNode();
193
+ if (selectedNodes.some(function (node) {
194
+ return node.isInline();
195
+ })) {
196
+ var _p = INodeHelper.createParagraph();
197
+ INodeHelper.appendChild.apply(INodeHelper, [_p].concat(_toConsumableArray(selectedNodes.map(function (node) {
198
+ return node.exportJSON();
199
+ }))));
200
+ INodeHelper.appendChild(rootNode, _p);
201
+ } else {
202
+ INodeHelper.appendChild.apply(INodeHelper, [rootNode].concat(_toConsumableArray(selectedNodes.map(function (node) {
203
+ return node.exportJSON();
204
+ }))));
53
205
  }
54
- };
206
+ var editorState = editor.parseEditorState({
207
+ root: rootNode
208
+ });
209
+ var lexicalRootNode = editorState._nodeMap.get('root');
210
+ var rootCtx = new MarkdownWriterContext();
211
+ return editorState.read(function () {
212
+ lexicalRootNode.getChildren().forEach(function (child) {
213
+ return processChild(rootCtx, child);
214
+ });
215
+ return rootCtx.toString();
216
+ });
217
+ });
218
+ }
219
+ return editor.getEditorState().read(function () {
220
+ var rootNode = $getRoot();
221
+ var rootCtx = new MarkdownWriterContext();
55
222
  rootNode.getChildren().forEach(function (child) {
56
223
  return processChild(rootCtx, child);
57
224
  });
@@ -54,6 +54,11 @@ export interface IEditor {
54
54
  * Get document editor root node
55
55
  */
56
56
  getRootElement(): HTMLElement | null;
57
+ /**
58
+ * Get document editor selection content of specified type
59
+ * @param type
60
+ */
61
+ getSelectionDocument(type: string): unknown | null;
57
62
  /**
58
63
  * Get editor theme
59
64
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/editor",
3
- "version": "1.2.2",
3
+ "version": "1.3.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",