UNPKG

@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
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 ); }