@rtdui/editor
Version:
React rich text editor based on tiptap
95 lines (91 loc) • 2.72 kB
JavaScript
'use client';
;
var core = require('@tiptap/core');
var katex = require('katex');
var prosemirrorState = require('prosemirror-state');
var prosemirrorView = require('prosemirror-view');
function getDecorations({
editor,
doc,
name,
katexOptions,
selection
}) {
const decorations = [];
const texts = [];
core.findChildren(doc, (node) => node.type.name === "paragraph").forEach(
(block) => {
const pos = block.pos + 1;
texts.push({
pos,
text: block.node.textContent
});
}
);
texts.forEach((txt) => {
if (txt.text) {
const inlineMatchs = txt.text.matchAll(/\$([^$]+)\$/g);
for (const match of inlineMatchs) {
if (!match[1]) {
continue;
}
match[1] = match[1].replace(/\s\\\s/g, " \\\\ ");
const mathStart = txt.pos + (match.index ?? 0);
const mathEnd = txt.pos + (match.index ?? 0) + match[0].length;
if (selection.$anchor.pos < mathStart || selection.$anchor.pos > mathEnd || !editor.isEditable) {
const mathRender = document.createElement("span");
mathRender.classList.add("tiptap-math-render");
katex.render(match[1], mathRender, { output: "html" });
const decoration = prosemirrorView.Decoration.widget(mathStart, mathRender);
decorations.push(decoration);
const decoration2 = prosemirrorView.Decoration.inline(mathStart, mathEnd, {
class: "titap-math-source hidden"
});
decorations.push(decoration2);
} else if (editor.isEditable) {
const decoration3 = prosemirrorView.Decoration.inline(mathStart, mathEnd, {
class: "titap-math-source"
});
decorations.push(decoration3);
}
}
}
});
return prosemirrorView.DecorationSet.create(doc, decorations);
}
function KatexInlinePlugin({
editor,
name,
katexOptions
}) {
const katexInlinePlugin = new prosemirrorState.Plugin({
key: new prosemirrorState.PluginKey("mathKatex"),
state: {
init: (_, { doc, selection }) => getDecorations({
editor,
doc,
name,
katexOptions,
selection
}),
apply: (transaction, decorationSet, oldState, newState) => {
const { selection } = newState;
return getDecorations({
editor,
doc: transaction.doc,
name,
katexOptions,
selection
});
}
},
props: {
decorations(state) {
return katexInlinePlugin.getState(state);
}
}
});
return katexInlinePlugin;
}
exports.KatexInlinePlugin = KatexInlinePlugin;
//# sourceMappingURL=math-katex-inline-plugin.cjs.map