@rtdui/editor
Version:
React rich text editor based on tiptap
82 lines (78 loc) • 2.28 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 = [];
core.findChildren(doc, (node) => node.type.name === name).forEach((block) => {
const from = block.pos + 1;
const to = from + block.node.textContent.length;
const mathText = block.node.textContent;
if (selection.$anchor.pos < from || selection.$anchor.pos > to || !editor.isEditable) {
const mathRender = document.createElement("div");
mathRender.classList.add("tiptap-math-render");
katex.render(mathText, mathRender, {
displayMode: true,
output: "html"
});
const decoration = prosemirrorView.Decoration.widget(from, mathRender);
decorations.push(decoration);
const decoration2 = prosemirrorView.Decoration.inline(from, to, {
nodeName: "pre",
class: "titap-math-source hidden"
});
decorations.push(decoration2);
} else if (editor.isEditable) {
const decoration2 = prosemirrorView.Decoration.inline(from, to, {
nodeName: "pre",
class: "titap-math-source"
});
decorations.push(decoration2);
}
});
return prosemirrorView.DecorationSet.create(doc, decorations);
}
function KatexBlockPlugin({
editor,
name,
katexOptions
}) {
const katexBlockPlugin = new prosemirrorState.Plugin({
key: new prosemirrorState.PluginKey("mathKatexBlock"),
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 katexBlockPlugin.getState(state);
}
}
});
return katexBlockPlugin;
}
exports.KatexBlockPlugin = KatexBlockPlugin;
//# sourceMappingURL=math-katex-block-plugin.cjs.map