1 import {EditorUiContext} from "../ui/framework/core";
11 import {$isImageNode} from "../nodes/image";
12 import {$isMediaNode} from "../nodes/media";
13 import {getLastSelection} from "../utils/selection";
14 import {$getNearestNodeBlockParent} from "../utils/nodes";
15 import {$createCustomParagraphNode} from "../nodes/custom-paragraph";
17 function isSingleSelectedNode(nodes: LexicalNode[]): boolean {
18 if (nodes.length === 1) {
19 const node = nodes[0];
20 if ($isDecoratorNode(node) || $isImageNode(node) || $isMediaNode(node)) {
28 function deleteSingleSelectedNode(editor: LexicalEditor) {
29 const selectionNodes = getLastSelection(editor)?.getNodes() || [];
30 if (isSingleSelectedNode(selectionNodes)) {
32 selectionNodes[0].remove();
37 function insertAfterSingleSelectedNode(editor: LexicalEditor, event: KeyboardEvent|null): boolean {
38 const selectionNodes = getLastSelection(editor)?.getNodes() || [];
39 if (isSingleSelectedNode(selectionNodes)) {
40 const node = selectionNodes[0];
41 const nearestBlock = $getNearestNodeBlockParent(node) || node;
43 requestAnimationFrame(() => {
45 const newParagraph = $createCustomParagraphNode();
46 nearestBlock.insertAfter(newParagraph);
47 newParagraph.select();
50 event?.preventDefault();
58 export function registerKeyboardHandling(context: EditorUiContext): () => void {
59 const unregisterBackspace = context.editor.registerCommand(KEY_BACKSPACE_COMMAND, (): boolean => {
60 deleteSingleSelectedNode(context.editor);
62 }, COMMAND_PRIORITY_LOW);
64 const unregisterDelete = context.editor.registerCommand(KEY_DELETE_COMMAND, (): boolean => {
65 deleteSingleSelectedNode(context.editor);
67 }, COMMAND_PRIORITY_LOW);
69 const unregisterEnter = context.editor.registerCommand(KEY_ENTER_COMMAND, (event): boolean => {
70 return insertAfterSingleSelectedNode(context.editor, event);
71 }, COMMAND_PRIORITY_LOW);
74 unregisterBackspace();