UNPKG

@mdxeditor/editor

Version:

React component for rich text markdown editing

64 lines (63 loc) 2.4 kB
import { $createHeadingNode, HeadingNode } from "@lexical/rich-text"; import { Cell } from "@mdxeditor/gurx"; import { KEY_DOWN_COMMAND, $createParagraphNode, COMMAND_PRIORITY_LOW } from "lexical"; import { realmPlugin } from "../../RealmWithPlugins.js"; import { controlOrMeta } from "../../utils/detectMac.js"; import { createRootEditorSubscription$, convertSelectionToNode$, addExportVisitor$, addLexicalNode$, addImportVisitor$, addActivePlugin$ } from "../core/index.js"; import { LexicalHeadingVisitor } from "./LexicalHeadingVisitor.js"; import { MdastHeadingVisitor } from "./MdastHeadingVisitor.js"; const FORMATTING_KEYS = ["Digit0", "Digit1", "Digit2", "Digit3", "Digit4", "Digit5", "Digit6"]; const ALL_HEADING_LEVELS = [1, 2, 3, 4, 5, 6]; const CODE_TO_HEADING_LEVEL_MAP = { Digit1: 1, Digit2: 2, Digit3: 3, Digit4: 4, Digit5: 5, Digit6: 6 }; const allowedHeadingLevels$ = Cell(ALL_HEADING_LEVELS, (r) => { r.pub(createRootEditorSubscription$, (theRootEditor) => { return theRootEditor.registerCommand( KEY_DOWN_COMMAND, (event) => { const { code, ctrlKey, metaKey, altKey } = event; if (FORMATTING_KEYS.includes(code) && controlOrMeta(metaKey, ctrlKey) && altKey) { event.preventDefault(); theRootEditor.update(() => { if (code === "Digit0") { r.pub(convertSelectionToNode$, () => $createParagraphNode()); } else { const allowedHeadingLevels = r.getValue(allowedHeadingLevels$); const requestedHeadingLevel = CODE_TO_HEADING_LEVEL_MAP[code]; if (allowedHeadingLevels.includes(requestedHeadingLevel)) { r.pub(convertSelectionToNode$, () => $createHeadingNode(`h${requestedHeadingLevel}`)); } } }); return true; } return false; }, COMMAND_PRIORITY_LOW ); }); }); const headingsPlugin = realmPlugin({ init(realm) { realm.pubIn({ [addActivePlugin$]: "headings", [addImportVisitor$]: MdastHeadingVisitor, [addLexicalNode$]: HeadingNode, [addExportVisitor$]: LexicalHeadingVisitor }); }, update(realm, params) { realm.pub(allowedHeadingLevels$, (params == null ? void 0 : params.allowedHeadingLevels) ?? ALL_HEADING_LEVELS); } }); export { ALL_HEADING_LEVELS, allowedHeadingLevels$, headingsPlugin };