@lobehub/editor 1.7.0 → 1.7.1
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/plugins/code/command/index.js +7 -7
- package/es/plugins/code/node/code.d.ts +2 -1
- package/es/plugins/code/node/code.js +23 -4
- package/es/plugins/code/plugin/index.js +13 -1
- package/es/plugins/code/plugin/registry.js +14 -7
- package/es/plugins/common/index.d.ts +1 -1
- package/es/plugins/common/index.js +1 -1
- package/es/plugins/common/node/cursor.js +8 -0
- package/es/plugins/common/plugin/index.js +0 -4
- package/es/plugins/markdown/service/shortcut.d.ts +5 -3
- package/es/plugins/markdown/service/shortcut.js +41 -33
- package/package.json +1 -1
|
@@ -4,7 +4,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
|
|
|
4
4
|
import { $isCodeHighlightNode } from '@lexical/code';
|
|
5
5
|
import { $getSelection, $insertNodes, $isRangeSelection, COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical';
|
|
6
6
|
import { $createCursorNode } from "../../common";
|
|
7
|
-
import { $createCodeNode, $isCodeInlineNode } from "../node/code";
|
|
7
|
+
import { $createCodeNode, $isCodeInlineNode, getCodeInlineNode } from "../node/code";
|
|
8
8
|
export var INSERT_CODEINLINE_COMMAND = createCommand('INSERT_CODEINLINE_COMMAND');
|
|
9
9
|
export function registerCodeInlineCommand(editor) {
|
|
10
10
|
return editor.registerCommand(INSERT_CODEINLINE_COMMAND, function () {
|
|
@@ -18,24 +18,24 @@ export function registerCodeInlineCommand(editor) {
|
|
|
18
18
|
if ($isCodeHighlightNode(focusNode) || $isCodeHighlightNode(anchorNode)) {
|
|
19
19
|
return false;
|
|
20
20
|
}
|
|
21
|
-
|
|
21
|
+
var code = getCodeInlineNode(focusNode);
|
|
22
|
+
if (code !== getCodeInlineNode(anchorNode)) {
|
|
22
23
|
return false;
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
var _iterator = _createForOfIteratorHelper(parentNode.getChildren().slice(0)),
|
|
25
|
+
if ($isCodeInlineNode(code)) {
|
|
26
|
+
var _iterator = _createForOfIteratorHelper(code.getChildren().slice(0)),
|
|
27
27
|
_step;
|
|
28
28
|
try {
|
|
29
29
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
30
30
|
var node = _step.value;
|
|
31
|
-
|
|
31
|
+
code.insertBefore(node);
|
|
32
32
|
}
|
|
33
33
|
} catch (err) {
|
|
34
34
|
_iterator.e(err);
|
|
35
35
|
} finally {
|
|
36
36
|
_iterator.f();
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
code.remove();
|
|
39
39
|
return true;
|
|
40
40
|
}
|
|
41
41
|
var codeNode = $createCodeNode(selection.getTextContent());
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EditorConfig, LexicalEditor, SerializedElementNode } from 'lexical';
|
|
1
|
+
import { EditorConfig, LexicalEditor, LexicalNode, SerializedElementNode } from 'lexical';
|
|
2
2
|
import { CardLikeElementNode } from "../../common";
|
|
3
3
|
export type SerializedCodeNode = SerializedElementNode;
|
|
4
4
|
export declare class CodeNode extends CardLikeElementNode {
|
|
@@ -17,4 +17,5 @@ export declare class CodeNode extends CardLikeElementNode {
|
|
|
17
17
|
}
|
|
18
18
|
export declare function $createCodeNode(textContent?: string): CodeNode;
|
|
19
19
|
export declare function $isCodeInlineNode(node: unknown): node is CodeNode;
|
|
20
|
+
export declare function getCodeInlineNode(node: LexicalNode): LexicalNode | null;
|
|
20
21
|
export declare function $isSelectionInCodeInline(editor: LexicalEditor): boolean;
|
|
@@ -16,7 +16,7 @@ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.g
|
|
|
16
16
|
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
17
17
|
import { addClassNamesToElement } from '@lexical/utils';
|
|
18
18
|
import { $applyNodeReplacement, $createTextNode, $getSelection, $isNodeSelection, $isRangeSelection } from 'lexical';
|
|
19
|
-
import { $createCursorNode, CardLikeElementNode } from "../../common";
|
|
19
|
+
import { $createCursorNode, $isCursorNode, CardLikeElementNode } from "../../common";
|
|
20
20
|
export var CodeNode = /*#__PURE__*/function (_CardLikeElementNode) {
|
|
21
21
|
_inherits(CodeNode, _CardLikeElementNode);
|
|
22
22
|
var _super = _createSuper(CodeNode);
|
|
@@ -120,6 +120,25 @@ export function $createCodeNode(textContent) {
|
|
|
120
120
|
export function $isCodeInlineNode(node) {
|
|
121
121
|
return node instanceof CodeNode;
|
|
122
122
|
}
|
|
123
|
+
export function getCodeInlineNode(node) {
|
|
124
|
+
if ($isCursorNode(node)) {
|
|
125
|
+
var parent = node.getParent();
|
|
126
|
+
if ($isCodeInlineNode(parent)) {
|
|
127
|
+
return parent;
|
|
128
|
+
}
|
|
129
|
+
if ($isCodeInlineNode(node.getNextSibling())) {
|
|
130
|
+
return node.getNextSibling();
|
|
131
|
+
}
|
|
132
|
+
if ($isCodeInlineNode(node.getPreviousSibling())) {
|
|
133
|
+
return node.getPreviousSibling();
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
if ($isCodeInlineNode(node.getParent())) {
|
|
138
|
+
return node.getParent();
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
123
142
|
export function $isSelectionInCodeInline(editor) {
|
|
124
143
|
return editor.read(function () {
|
|
125
144
|
var selection = $getSelection();
|
|
@@ -129,11 +148,11 @@ export function $isSelectionInCodeInline(editor) {
|
|
|
129
148
|
if ($isRangeSelection(selection)) {
|
|
130
149
|
var focusNode = selection.focus.getNode();
|
|
131
150
|
var anchorNode = selection.anchor.getNode();
|
|
132
|
-
|
|
151
|
+
var code = getCodeInlineNode(focusNode);
|
|
152
|
+
if (code !== getCodeInlineNode(anchorNode)) {
|
|
133
153
|
return false;
|
|
134
154
|
}
|
|
135
|
-
|
|
136
|
-
if ($isCodeInlineNode(parentNode)) {
|
|
155
|
+
if ($isCodeInlineNode(code)) {
|
|
137
156
|
return true;
|
|
138
157
|
}
|
|
139
158
|
return false;
|
|
@@ -13,10 +13,12 @@ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.g
|
|
|
13
13
|
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; }
|
|
14
14
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
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
|
+
import { $setSelection } from 'lexical';
|
|
16
17
|
import { KernelPlugin } from "../../../editor-kernel/plugin";
|
|
18
|
+
import { $createCursorNode } from "../../common";
|
|
17
19
|
import { IMarkdownShortCutService } from "../../markdown/service/shortcut";
|
|
18
20
|
import { registerCodeInlineCommand } from "../command";
|
|
19
|
-
import { CodeNode } from "../node/code";
|
|
21
|
+
import { $createCodeNode, CodeNode } from "../node/code";
|
|
20
22
|
import { registerCodeInline } from "./registry";
|
|
21
23
|
export var CodePlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
|
|
22
24
|
_inherits(CodePlugin, _KernelPlugin);
|
|
@@ -49,6 +51,16 @@ export var CodePlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
|
|
|
49
51
|
ctx.appendLine("`".concat(node.getTextContent(), "`"));
|
|
50
52
|
return true;
|
|
51
53
|
});
|
|
54
|
+
markdownService.registerMarkdownShortCuts([{
|
|
55
|
+
process: function process(selection) {
|
|
56
|
+
var text = selection.getTextContent();
|
|
57
|
+
selection.removeText();
|
|
58
|
+
selection.insertNodes([$createCodeNode(text), $createCursorNode()]);
|
|
59
|
+
$setSelection(selection);
|
|
60
|
+
},
|
|
61
|
+
tag: '`',
|
|
62
|
+
type: 'text-format'
|
|
63
|
+
}]);
|
|
52
64
|
}
|
|
53
65
|
}]);
|
|
54
66
|
return CodePlugin;
|
|
@@ -3,6 +3,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
|
|
|
3
3
|
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; }
|
|
4
4
|
import { mergeRegister } from '@lexical/utils';
|
|
5
5
|
import { $getNodeByKey } from 'lexical';
|
|
6
|
+
import { $createCursorNode } from "../../common";
|
|
6
7
|
import { HotkeyEnum } from "../../../types/hotkey";
|
|
7
8
|
import { INSERT_CODEINLINE_COMMAND } from "../command";
|
|
8
9
|
import { CodeNode } from "../node/code";
|
|
@@ -14,6 +15,7 @@ export function registerCodeInline(editor, kernel, options) {
|
|
|
14
15
|
var mutatedNodes = _ref2.mutatedNodes;
|
|
15
16
|
var codeChanged = mutatedNodes === null || mutatedNodes === void 0 ? void 0 : mutatedNodes.get(CodeNode);
|
|
16
17
|
var keys = (codeChanged === null || codeChanged === void 0 ? void 0 : codeChanged.keys()) || [];
|
|
18
|
+
var needAddBefore = new Set();
|
|
17
19
|
editor.read(function () {
|
|
18
20
|
var _iterator = _createForOfIteratorHelper(keys),
|
|
19
21
|
_step;
|
|
@@ -25,13 +27,8 @@ export function registerCodeInline(editor, kernel, options) {
|
|
|
25
27
|
return;
|
|
26
28
|
}
|
|
27
29
|
var parent = node.getParent();
|
|
28
|
-
if ((parent === null || parent === void 0 ? void 0 : parent.
|
|
29
|
-
|
|
30
|
-
if (!(codeElement !== null && codeElement !== void 0 && codeElement.nextSibling)) {
|
|
31
|
-
parent
|
|
32
|
-
// @ts-expect-error not error
|
|
33
|
-
.getDOMSlot(editor.getElementByKey(parent.getKey())).setManagedLineBreak('decorator');
|
|
34
|
-
}
|
|
30
|
+
if ((parent === null || parent === void 0 ? void 0 : parent.getFirstChild()) === node) {
|
|
31
|
+
needAddBefore.add(node);
|
|
35
32
|
}
|
|
36
33
|
}
|
|
37
34
|
} catch (err) {
|
|
@@ -40,6 +37,16 @@ export function registerCodeInline(editor, kernel, options) {
|
|
|
40
37
|
_iterator.f();
|
|
41
38
|
}
|
|
42
39
|
});
|
|
40
|
+
if (needAddBefore.size > 0) {
|
|
41
|
+
editor.update(function () {
|
|
42
|
+
needAddBefore.forEach(function (node) {
|
|
43
|
+
var prev = node.getPreviousSibling();
|
|
44
|
+
if (!prev) {
|
|
45
|
+
node.insertBefore($createCursorNode());
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
43
50
|
}), kernel.registerHotkey(HotkeyEnum.CodeInline, function () {
|
|
44
51
|
return editor.dispatchCommand(INSERT_CODEINLINE_COMMAND, undefined);
|
|
45
52
|
}, {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { INSERT_HEADING_COMMAND, INSERT_QUOTE_COMMAND } from './command';
|
|
2
|
-
export { $createCursorNode, $isCardLikeElementNode, CardLikeElementNode } from './node/cursor';
|
|
2
|
+
export { $createCursorNode, $isCardLikeElementNode, $isCursorNode, CardLikeElementNode, } from './node/cursor';
|
|
3
3
|
export * from './plugin';
|
|
4
4
|
export * from './react';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { INSERT_HEADING_COMMAND, INSERT_QUOTE_COMMAND } from "./command";
|
|
2
|
-
export { $createCursorNode, $isCardLikeElementNode, CardLikeElementNode } from "./node/cursor";
|
|
2
|
+
export { $createCursorNode, $isCardLikeElementNode, $isCursorNode, CardLikeElementNode } from "./node/cursor";
|
|
3
3
|
export * from "./plugin";
|
|
4
4
|
export * from "./react";
|
|
@@ -130,6 +130,14 @@ export function registerCursorNode(editor) {
|
|
|
130
130
|
mutation = _step3$value[1];
|
|
131
131
|
if (mutation === 'updated') {
|
|
132
132
|
var cursorNode = $getNodeByKey(key);
|
|
133
|
+
if ((cursorNode === null || cursorNode === void 0 ? void 0 : cursorNode.getIndexWithinParent()) === 0) {
|
|
134
|
+
var nextElement = cursorNode.getNextSibling();
|
|
135
|
+
if (!$isCardLikeElementNode(nextElement) && !$isDecoratorNode(nextElement) && !$isCardLikeElementNode(cursorNode === null || cursorNode === void 0 ? void 0 : cursorNode.getParent())) {
|
|
136
|
+
needRemove.add(cursorNode);
|
|
137
|
+
} else {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
133
141
|
var element = cursorNode === null || cursorNode === void 0 ? void 0 : cursorNode.getPreviousSibling();
|
|
134
142
|
if (!$isCardLikeElementNode(element) && !$isDecoratorNode(element) && !$isCardLikeElementNode(cursorNode === null || cursorNode === void 0 ? void 0 : cursorNode.getParent())) {
|
|
135
143
|
needRemove.add(cursorNode);
|
|
@@ -117,10 +117,6 @@ export var CommonPlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
|
|
|
117
117
|
intraword: false,
|
|
118
118
|
tag: '__',
|
|
119
119
|
type: 'text-format'
|
|
120
|
-
}, {
|
|
121
|
-
format: ['code'],
|
|
122
|
-
tag: '`',
|
|
123
|
-
type: 'text-format'
|
|
124
120
|
}, {
|
|
125
121
|
format: ['strikethrough'],
|
|
126
122
|
tag: '~~',
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { ElementNode, LexicalNode, TextFormatType, TextNode } from 'lexical';
|
|
1
|
+
import { ElementNode, LexicalNode, RangeSelection, TextFormatType, TextNode } from 'lexical';
|
|
2
2
|
import { IServiceID } from "../../../types/kernel";
|
|
3
3
|
export type TextFormatTransformer = Readonly<{
|
|
4
|
-
format
|
|
4
|
+
format?: ReadonlyArray<TextFormatType>;
|
|
5
5
|
intraword?: boolean;
|
|
6
|
+
process?: (selection: RangeSelection) => void;
|
|
6
7
|
tag: string;
|
|
7
8
|
type: 'text-format';
|
|
8
9
|
}>;
|
|
@@ -129,8 +130,9 @@ export declare class MarkdownShortCutService implements IMarkdownShortCutService
|
|
|
129
130
|
type: "text-match";
|
|
130
131
|
}>[]>>;
|
|
131
132
|
get textFormatTransformersByTrigger(): Readonly<Record<string, readonly Readonly<{
|
|
132
|
-
format
|
|
133
|
+
format?: readonly TextFormatType[] | undefined;
|
|
133
134
|
intraword?: boolean | undefined;
|
|
135
|
+
process?: ((selection: RangeSelection) => void) | undefined;
|
|
134
136
|
tag: string;
|
|
135
137
|
type: "text-format";
|
|
136
138
|
}>[]>>;
|
|
@@ -234,50 +234,58 @@ function $runTextFormatTransformers(anchorNode, anchorOffset, textFormatTransfor
|
|
|
234
234
|
closeNode.setTextContent(closeNodeText);
|
|
235
235
|
var openNodeText = openNode === closeNode ? closeNodeText : prevOpenNodeText;
|
|
236
236
|
openNode.setTextContent(openNodeText.slice(0, openTagStartIndex) + openNodeText.slice(openTagStartIndex + tagLength));
|
|
237
|
-
var
|
|
237
|
+
var _selection = $getSelection();
|
|
238
238
|
var nextSelection = $createRangeSelection();
|
|
239
239
|
$setSelection(nextSelection);
|
|
240
240
|
// Adjust offset based on deleted chars
|
|
241
241
|
var newOffset = closeTagEndIndex - tagLength * (openNode === closeNode ? 2 : 1) + 1;
|
|
242
242
|
nextSelection.anchor.set(openNode.__key, openTagStartIndex, 'text');
|
|
243
243
|
nextSelection.focus.set(closeNode.__key, newOffset, 'text');
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
244
|
+
if (matcher.process) {
|
|
245
|
+
matcher.process(nextSelection);
|
|
246
|
+
return true;
|
|
247
|
+
} else if (matcher.format) {
|
|
248
|
+
// Apply formatting to selected text
|
|
249
|
+
var _iterator5 = _createForOfIteratorHelper(matcher.format),
|
|
250
|
+
_step5;
|
|
251
|
+
try {
|
|
252
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
253
|
+
var format = _step5.value;
|
|
254
|
+
if (!nextSelection.hasFormat(format)) {
|
|
255
|
+
nextSelection.formatText(format);
|
|
256
|
+
}
|
|
253
257
|
}
|
|
254
|
-
}
|
|
255
258
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
259
|
+
// Collapse selection up to the focus point
|
|
260
|
+
} catch (err) {
|
|
261
|
+
_iterator5.e(err);
|
|
262
|
+
} finally {
|
|
263
|
+
_iterator5.f();
|
|
264
|
+
}
|
|
265
|
+
nextSelection.anchor.set(nextSelection.focus.key, nextSelection.focus.offset, nextSelection.focus.type);
|
|
263
266
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
267
|
+
// Remove formatting from collapsed selection
|
|
268
|
+
var _iterator6 = _createForOfIteratorHelper(matcher.format),
|
|
269
|
+
_step6;
|
|
270
|
+
try {
|
|
271
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
272
|
+
var _format = _step6.value;
|
|
273
|
+
if (nextSelection.hasFormat(_format)) {
|
|
274
|
+
nextSelection.toggleFormat(_format);
|
|
275
|
+
}
|
|
272
276
|
}
|
|
277
|
+
} catch (err) {
|
|
278
|
+
_iterator6.e(err);
|
|
279
|
+
} finally {
|
|
280
|
+
_iterator6.f();
|
|
273
281
|
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
282
|
+
if ($isRangeSelection(_selection)) {
|
|
283
|
+
nextSelection.format = _selection.format;
|
|
284
|
+
}
|
|
285
|
+
} else {
|
|
286
|
+
// No format or process specified, nothing to do
|
|
287
|
+
$setSelection(_selection);
|
|
288
|
+
continue;
|
|
281
289
|
}
|
|
282
290
|
return true;
|
|
283
291
|
}
|
package/package.json
CHANGED