@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.
- package/es/editor-kernel/data-source.d.ts +4 -1
- package/es/editor-kernel/data-source.js +1 -1
- package/es/editor-kernel/inode/helper.d.ts +4 -1
- package/es/editor-kernel/inode/helper.js +16 -2
- package/es/editor-kernel/inode/i-element-node.d.ts +2 -5
- package/es/editor-kernel/inode/i-node.d.ts +2 -6
- package/es/editor-kernel/inode/root-node.d.ts +2 -4
- package/es/editor-kernel/kernel.d.ts +1 -0
- package/es/editor-kernel/kernel.js +14 -0
- package/es/editor-kernel/types.d.ts +0 -0
- package/es/editor-kernel/types.js +0 -0
- package/es/plugins/codeblock/plugin/index.js +27 -0
- package/es/plugins/common/data-source/json-data-source.d.ts +2 -1
- package/es/plugins/common/data-source/json-data-source.js +122 -1
- package/es/plugins/common/data-source/text-data-source.d.ts +2 -1
- package/es/plugins/common/data-source/text-data-source.js +8 -2
- package/es/plugins/markdown/data-source/markdown-data-source.d.ts +2 -1
- package/es/plugins/markdown/data-source/markdown-data-source.js +184 -17
- package/es/types/kernel.d.ts +5 -0
- package/package.json +1 -1
|
@@ -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
|
}
|
|
@@ -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
|
|
15
|
+
appendChild: function appendChild(parent) {
|
|
16
|
+
var _parent$children;
|
|
15
17
|
if (!parent.children) {
|
|
16
18
|
parent.children = [];
|
|
17
19
|
}
|
|
18
|
-
|
|
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
|
};
|
|
@@ -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
|
-
|
|
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
|
-
|
|
38
|
-
var
|
|
39
|
-
var
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
});
|
package/es/types/kernel.d.ts
CHANGED
|
@@ -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