UNPKG

@mdxeditor/editor

Version:

React component for rich text markdown editing

101 lines (100 loc) 3.15 kB
import { realmPlugin } from "../../RealmWithPlugins.js"; import { Cell, Signal, map } from "@mdxeditor/gurx"; import { insertCodeBlock$, appendCodeBlockEditorDescriptor$ } from "../codeblock/index.js"; import { CodeMirrorEditor } from "./CodeMirrorEditor.js"; const EMPTY_VALUE = "__EMPTY_VALUE__"; function normalizeCodeBlockLanguages(input) { var _a; const items = []; const keyMap = {}; if (Array.isArray(input)) { for (const lang of input) { const canonical = ((_a = lang.alias) == null ? void 0 : _a[0]) ?? lang.name.toLowerCase(); items.push({ value: canonical, label: lang.name }); keyMap[canonical] = canonical; if (lang.alias) { for (const alias of lang.alias) { keyMap[alias] = canonical; } } if (lang.extensions) { for (const ext of lang.extensions) { keyMap[ext] = canonical; } } keyMap[lang.name.toLowerCase()] = canonical; } } else { const firstKeyByLabel = {}; for (const [key, label] of Object.entries(input)) { if (!(label in firstKeyByLabel)) { firstKeyByLabel[label] = key; items.push({ value: key || EMPTY_VALUE, label }); } keyMap[key] = firstKeyByLabel[label] || EMPTY_VALUE; } } return { items, keyMap }; } const codeBlockLanguages$ = Cell( normalizeCodeBlockLanguages({ js: "JavaScript", ts: "TypeScript", tsx: "TypeScript (React)", jsx: "JavaScript (React)", css: "CSS" }) ); const insertCodeMirror$ = Signal((r) => { r.link( r.pipe( insertCodeMirror$, map(({ language, code }) => { return { code, language, meta: "" }; }) ), insertCodeBlock$ ); }); const codeMirrorExtensions$ = Cell([]); const codeMirrorAutoLoadLanguageSupport$ = Cell(true); const codeMirrorPlugin = realmPlugin({ update(r, params) { r.pubIn({ [codeBlockLanguages$]: normalizeCodeBlockLanguages((params == null ? void 0 : params.codeBlockLanguages) ?? {}), [codeMirrorExtensions$]: (params == null ? void 0 : params.codeMirrorExtensions) ?? [], [codeMirrorAutoLoadLanguageSupport$]: (params == null ? void 0 : params.autoLoadLanguageSupport) ?? true }); }, init(r, params) { const normalized = normalizeCodeBlockLanguages((params == null ? void 0 : params.codeBlockLanguages) ?? {}); r.pubIn({ [codeBlockLanguages$]: normalized, [codeMirrorExtensions$]: (params == null ? void 0 : params.codeMirrorExtensions) ?? [], [appendCodeBlockEditorDescriptor$]: buildCodeBlockDescriptor(normalized), [codeMirrorAutoLoadLanguageSupport$]: (params == null ? void 0 : params.autoLoadLanguageSupport) ?? true }); } }); function buildCodeBlockDescriptor(normalized) { return { match(language, meta) { return Object.hasOwn(normalized.keyMap, language ?? "") && !meta; }, priority: 1, Editor: CodeMirrorEditor }; } export { EMPTY_VALUE, codeBlockLanguages$, codeMirrorAutoLoadLanguageSupport$, codeMirrorExtensions$, codeMirrorPlugin, insertCodeMirror$, normalizeCodeBlockLanguages };