@lobehub/editor
Version:
A powerful and extensible rich text editor built on Meta's Lexical framework, providing a modern editing experience with React integration.
45 lines • 1.84 kB
JavaScript
import { $getSelection, CAN_UNDO_COMMAND, COMMAND_PRIORITY_HIGH, HISTORIC_TAG, createCommand } from 'lexical';
import { createDebugLogger } from "../../../utils/debug";
import { parseMarkdownToLexical } from "../data-source/markdown/parse";
import { $generateNodesFromSerializedNodes, $insertGeneratedNodes } from "../utils";
var logger = createDebugLogger('plugin', 'markdown');
export var INSERT_MARKDOWN_COMMAND = createCommand('INSERT_MARKDOWN_COMMAND');
function undoToEntry(editor, historyState, entry) {
var undoStack = historyState.undoStack;
var current = historyState.current;
if (current) {
undoStack.push(current);
editor.dispatchCommand(CAN_UNDO_COMMAND, false);
}
historyState.current = entry || null;
if (entry) {
editor.setEditorState(entry.editorState, {
tag: HISTORIC_TAG
});
}
return editor.getEditorState();
}
export function registerMarkdownCommand(editor, service, history) {
return editor.registerCommand(INSERT_MARKDOWN_COMMAND, function (payload) {
var markdown = payload.markdown;
logger.debug('INSERT_MARKDOWN_COMMAND payload:', payload);
undoToEntry(editor, history, payload.historyState);
queueMicrotask(function () {
editor.update(function () {
try {
// Use the markdown data source to parse the content
var root = parseMarkdownToLexical(markdown, service.markdownReaders);
var selection = $getSelection();
var nodes = $generateNodesFromSerializedNodes(root.children);
logger.debug('INSERT_MARKDOWN_COMMAND nodes:', nodes);
$insertGeneratedNodes(editor, nodes, selection);
return true;
} catch (error) {
logger.error('Failed to handle markdown paste:', error);
}
});
});
return false;
}, COMMAND_PRIORITY_HIGH // Priority
);
}