@mdxeditor/editor
Version:
React component for rich text markdown editing
101 lines (100 loc) • 3.15 kB
JavaScript
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
};