@formulaxjs/tinymce 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,470 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ DEFAULT_FORMULA_ATTRIBUTE: () => import_editor.DEFAULT_FORMULA_ATTRIBUTE,
24
+ DEFAULT_FORMULA_CLASS: () => import_editor.DEFAULT_FORMULA_CLASS,
25
+ FORMULA_FLAG_ATTRIBUTE: () => import_editor.FORMULA_FLAG_ATTRIBUTE,
26
+ createTinyMceCompat: () => createTinyMceCompat,
27
+ createTinyMceFormulaMarkup: () => createTinyMceFormulaMarkup,
28
+ findFormulaElement: () => import_editor.findFormulaElement,
29
+ getFormulaLatexFromElement: () => import_editor.getFormulaLatexFromElement,
30
+ getTinyMceMajorVersion: () => getTinyMceMajorVersion,
31
+ isFormulaElement: () => import_editor.isFormulaElement,
32
+ openFormulaXOverlayModal: () => openFormulaXOverlayModal,
33
+ parseTinyMceFormulaMarkup: () => parseTinyMceFormulaMarkup,
34
+ registerFormulaXTinyMcePlugin: () => registerFormulaXTinyMcePlugin,
35
+ replaceFormulaElement: () => import_editor.replaceFormulaElement,
36
+ resolveOptions: () => resolveOptions,
37
+ serializeTinyMceFormulaMarkup: () => serializeTinyMceFormulaMarkup,
38
+ warnUnsupportedTinyMceVersion: () => warnUnsupportedTinyMceVersion
39
+ });
40
+ module.exports = __toCommonJS(index_exports);
41
+
42
+ // src/markup.ts
43
+ var import_core = require("@formulaxjs/core");
44
+ var import_editor = require("@formulaxjs/editor");
45
+ function createTinyMceFormulaMarkup(latex, options = {}) {
46
+ return (0, import_editor.createFormulaMarkup)(latex, {
47
+ ...options,
48
+ extraAttributes: {
49
+ ...options.extraAttributes,
50
+ "data-mce-contenteditable": "false"
51
+ }
52
+ });
53
+ }
54
+ function parseTinyMceFormulaMarkup(latex) {
55
+ return (0, import_core.parseLatex)(latex);
56
+ }
57
+ function serializeTinyMceFormulaMarkup(doc, options = {}) {
58
+ return createTinyMceFormulaMarkup((0, import_core.serializeLatex)(doc), options);
59
+ }
60
+ function createTinyMceFormulaElement(ownerDocument, latex, options = {}) {
61
+ return (0, import_editor.createFormulaElement)(ownerDocument, latex, {
62
+ ...options,
63
+ extraAttributes: {
64
+ ...options.extraAttributes,
65
+ "data-mce-contenteditable": "false"
66
+ }
67
+ });
68
+ }
69
+
70
+ // src/compat.ts
71
+ function getTinyMceMajorVersion(tinymce) {
72
+ const raw = tinymce?.majorVersion;
73
+ const major = typeof raw === "string" ? Number.parseInt(raw, 10) : Number(raw);
74
+ return Number.isFinite(major) ? major : 0;
75
+ }
76
+ function createTinyMceCompat(editor, tinymce) {
77
+ const major = getTinyMceMajorVersion(tinymce);
78
+ return {
79
+ major,
80
+ insertContent(html) {
81
+ editor.insertContent(html);
82
+ },
83
+ dispatchEvent(name, detail) {
84
+ if (typeof editor.dispatch === "function") {
85
+ editor.dispatch(name, detail);
86
+ return;
87
+ }
88
+ if (typeof editor.fire === "function") {
89
+ editor.fire(name, detail);
90
+ }
91
+ },
92
+ getSelectedFormulaElement() {
93
+ const node = editor.selection?.getNode?.();
94
+ return (0, import_editor.findFormulaElement)(node ?? null);
95
+ },
96
+ getEditorDocument() {
97
+ return editor.getDoc?.() ?? document;
98
+ },
99
+ getEditorWindow() {
100
+ return editor.getWin?.() ?? window;
101
+ },
102
+ getEditorBody() {
103
+ return editor.getBody?.() ?? null;
104
+ },
105
+ focus() {
106
+ editor.focus?.();
107
+ }
108
+ };
109
+ }
110
+ function warnUnsupportedTinyMceVersion(tinymce) {
111
+ const major = getTinyMceMajorVersion(tinymce);
112
+ if (major > 0 && (major < 5 || major >= 9)) {
113
+ console.warn(`[FormulaX] TinyMCE ${major} is not officially supported. Expected >=5 <9.`);
114
+ }
115
+ }
116
+
117
+ // src/styles.ts
118
+ var import_editor2 = require("@formulaxjs/editor");
119
+ function ensureTinyMceStyles(doc = document) {
120
+ (0, import_editor2.ensureFormulaXModalStyles)(doc);
121
+ }
122
+
123
+ // src/editor-host.ts
124
+ var import_editor3 = require("@formulaxjs/editor");
125
+ var import_renderer = require("@formulaxjs/renderer");
126
+ function mountFormulaXEditorInModal(root, input) {
127
+ const options = {
128
+ initialLatex: input.initialLatex,
129
+ height: input.options.editor.height ?? "100%",
130
+ autofocus: input.options.editor.autofocus ?? true,
131
+ assets: input.options.editor.assets,
132
+ render: {
133
+ fontsize: input.options.editor.render?.fontsize ?? 40
134
+ }
135
+ };
136
+ return (0, import_editor3.mountFormulaXKityEditor)(root, options);
137
+ }
138
+
139
+ // src/modal.ts
140
+ function openFormulaXOverlayModal(input) {
141
+ ensureTinyMceStyles(document);
142
+ const { editor, target, options } = input;
143
+ const initialLatex = target ? (0, import_editor.getFormulaLatexFromElement)(target, options.formulaAttributeName) : input.initialLatex ?? options.initialLatex ?? "";
144
+ const root = document.createElement("div");
145
+ root.className = "fx-formula-modal-root";
146
+ root.setAttribute("data-formulax-modal", "true");
147
+ const isUpdate = Boolean(target);
148
+ const submitText = isUpdate ? options.modal.updateText : options.modal.insertText;
149
+ const title = options.modal.title || (isUpdate ? "Edit Formula" : "Insert Formula");
150
+ root.innerHTML = `
151
+ <div class="fx-formula-modal-backdrop" data-action="backdrop"></div>
152
+ <div class="fx-formula-modal" role="dialog" aria-modal="true" aria-label="${(0, import_editor.escapeAttribute)(title)}">
153
+ <header class="fx-formula-modal__header">
154
+ <h2 class="fx-formula-modal__title">${(0, import_editor.escapeHtml)(title)}</h2>
155
+ <button class="fx-formula-modal__close" type="button" data-action="close" aria-label="Close">\xD7</button>
156
+ </header>
157
+ <section class="fx-formula-modal__body">
158
+ <div class="fx-formula-editor-host"></div>
159
+ </section>
160
+ <footer class="fx-formula-modal__footer">
161
+ <button class="fx-formula-modal__button" type="button" data-action="cancel">${(0, import_editor.escapeHtml)(options.modal.cancelText)}</button>
162
+ <button class="fx-formula-modal__button fx-formula-modal__button--primary" type="button" data-action="submit">${(0, import_editor.escapeHtml)(submitText)}</button>
163
+ </footer>
164
+ </div>
165
+ `;
166
+ document.body.appendChild(root);
167
+ document.body.classList.add("fx-formula-modal-open");
168
+ const host = root.querySelector(".fx-formula-editor-host");
169
+ if (!host) {
170
+ root.remove();
171
+ throw new Error("[FormulaX] Modal editor host not found.");
172
+ }
173
+ const mounted = mountFormulaXEditorInModal(host, { initialLatex, options });
174
+ let closed = false;
175
+ const close = () => {
176
+ if (closed) return;
177
+ closed = true;
178
+ mounted.destroy();
179
+ root.removeEventListener("click", onClick);
180
+ document.removeEventListener("keydown", onKeydown, true);
181
+ root.remove();
182
+ document.body.classList.remove("fx-formula-modal-open");
183
+ editor.focus?.();
184
+ };
185
+ const submit = async () => {
186
+ const latex = await mounted.getLatex();
187
+ const renderHtml = mounted.getRenderHtml ? await mounted.getRenderHtml() : void 0;
188
+ runEditorTransaction(editor, () => {
189
+ if (target) {
190
+ const next = (0, import_editor.replaceFormulaElement)(target, latex, {
191
+ attributeName: options.formulaAttributeName,
192
+ className: options.formulaClassName,
193
+ cursorStyle: options.cursorStyle,
194
+ renderHtml
195
+ });
196
+ if (next) {
197
+ moveSelectionAfterNode(editor, next);
198
+ }
199
+ } else {
200
+ insertFormulaElementIntoEditor(
201
+ editor,
202
+ latex,
203
+ options.formulaAttributeName,
204
+ options.formulaClassName,
205
+ options.cursorStyle,
206
+ renderHtml
207
+ );
208
+ }
209
+ notifyEditorChanged(editor);
210
+ });
211
+ close();
212
+ };
213
+ function onClick(event) {
214
+ const action = event.target.closest("[data-action]")?.dataset.action;
215
+ if (!action) return;
216
+ if (action === "submit") {
217
+ void submit();
218
+ return;
219
+ }
220
+ if (action === "cancel" || action === "close") {
221
+ close();
222
+ return;
223
+ }
224
+ if (action === "backdrop" && options.modal.closeOnBackdrop) {
225
+ close();
226
+ }
227
+ }
228
+ function onKeydown(event) {
229
+ if (event.key === "Escape") {
230
+ event.preventDefault();
231
+ close();
232
+ }
233
+ }
234
+ root.addEventListener("click", onClick);
235
+ document.addEventListener("keydown", onKeydown, true);
236
+ queueMicrotask(() => {
237
+ mounted.root.focus();
238
+ });
239
+ return { close };
240
+ }
241
+ function runEditorTransaction(editor, mutation) {
242
+ if (typeof editor.undoManager?.transact === "function") {
243
+ editor.undoManager.transact(mutation);
244
+ return;
245
+ }
246
+ mutation();
247
+ editor.undoManager?.add?.();
248
+ }
249
+ function insertFormulaElementIntoEditor(editor, latex, attributeName, className, cursorStyle, renderHtml) {
250
+ const editorDoc = editor.getDoc?.() ?? document;
251
+ const next = createTinyMceFormulaElement(editorDoc, latex, {
252
+ attributeName,
253
+ className,
254
+ cursorStyle,
255
+ renderHtml
256
+ });
257
+ if (next && insertNodeAtEditorSelection(editor, next)) {
258
+ return;
259
+ }
260
+ insertFormulaElementWithPlaceholder(editor, latex, attributeName, className, cursorStyle, renderHtml);
261
+ }
262
+ function insertNodeAtEditorSelection(editor, node) {
263
+ const range = getEditorRange(editor);
264
+ if (!range || !isRangeInsideEditor(editor, range)) {
265
+ return false;
266
+ }
267
+ try {
268
+ range.deleteContents();
269
+ range.insertNode(node);
270
+ moveSelectionAfterNode(editor, node);
271
+ return true;
272
+ } catch {
273
+ return false;
274
+ }
275
+ }
276
+ function getEditorRange(editor) {
277
+ try {
278
+ return editor.selection?.getRng?.() ?? null;
279
+ } catch {
280
+ return null;
281
+ }
282
+ }
283
+ function isRangeInsideEditor(editor, range) {
284
+ const editorDoc = editor.getDoc?.() ?? document;
285
+ if (range.startContainer.ownerDocument !== editorDoc || range.endContainer.ownerDocument !== editorDoc) {
286
+ return false;
287
+ }
288
+ const body = editor.getBody?.();
289
+ if (!body) {
290
+ return true;
291
+ }
292
+ return body.contains(getRangeContainerElement(range.startContainer)) && body.contains(getRangeContainerElement(range.endContainer));
293
+ }
294
+ function getRangeContainerElement(node) {
295
+ return node.nodeType === 1 ? node : node.parentNode ?? node;
296
+ }
297
+ function moveSelectionAfterNode(editor, node) {
298
+ const doc = node.ownerDocument;
299
+ const range = doc.createRange();
300
+ range.setStartAfter(node);
301
+ range.collapse(true);
302
+ try {
303
+ editor.selection?.setRng?.(range);
304
+ editor.selection?.collapse?.(false);
305
+ } catch {
306
+ }
307
+ }
308
+ function insertFormulaElementWithPlaceholder(editor, latex, attributeName, className, cursorStyle, renderHtml) {
309
+ const editorDoc = editor.getDoc?.() ?? document;
310
+ const marker = `fx-pending-${Math.random().toString(36).slice(2, 10)}`;
311
+ editor.insertContent(`<span data-formulax-pending="${(0, import_editor.escapeAttribute)(marker)}">&#xfeff;</span>`);
312
+ const placeholder = editorDoc.querySelector(`[data-formulax-pending="${marker}"]`);
313
+ if (!placeholder) {
314
+ const html = createTinyMceFormulaMarkup(latex, {
315
+ attributeName,
316
+ className,
317
+ cursorStyle,
318
+ renderHtml
319
+ });
320
+ editor.insertContent(html);
321
+ return;
322
+ }
323
+ const next = createTinyMceFormulaElement(editorDoc, latex, {
324
+ attributeName,
325
+ className,
326
+ cursorStyle,
327
+ renderHtml
328
+ });
329
+ if (!next) {
330
+ placeholder.remove();
331
+ return;
332
+ }
333
+ placeholder.replaceWith(next);
334
+ moveSelectionAfterNode(editor, next);
335
+ }
336
+ function notifyEditorChanged(editor) {
337
+ editor.nodeChanged?.();
338
+ if (typeof editor.dispatch === "function") {
339
+ editor.dispatch("change");
340
+ return;
341
+ }
342
+ editor.fire?.("change");
343
+ }
344
+
345
+ // src/plugin.ts
346
+ var FORMULAX_SVG_VALID_ELEMENTS = [
347
+ "svg[class|style|id|xmlns|xmlns:xlink|version|width|height|viewbox|font-size|focusable|role|tabindex|contenteditable|data-formulax|data-formulax-latex|data-latex|aria-hidden|preserveaspectratio]",
348
+ "defs[id|class|style]",
349
+ "style[type|media]",
350
+ "g[id|class|style|transform|fill|stroke|stroke-width|stroke-linecap|stroke-linejoin|opacity|font-family|font-size|font-style|font-weight|data-type|data-flag|data-root]",
351
+ "path[id|class|style|d|fill|stroke|stroke-width|stroke-linecap|stroke-linejoin|opacity|transform|data-type|data-mce-style]",
352
+ "use[id|class|style|x|y|width|height|href|xlink:href|transform|fill|stroke|opacity]",
353
+ "text[id|class|style|x|y|dx|dy|fill|stroke|transform|font-family|font-size|font-style|font-weight|text-anchor|text-rendering|xml:space]",
354
+ "tspan[id|class|style|x|y|dx|dy|fill|stroke|transform|font-family|font-size|font-style|font-weight|text-anchor]",
355
+ "line[id|class|style|x1|y1|x2|y2|fill|stroke|stroke-width|stroke-linecap|opacity|transform]",
356
+ "rect[id|class|style|x|y|width|height|rx|ry|fill|stroke|stroke-width|opacity|transform]",
357
+ "circle[id|class|style|cx|cy|r|fill|stroke|stroke-width|opacity|transform]",
358
+ "ellipse[id|class|style|cx|cy|rx|ry|fill|stroke|stroke-width|opacity|transform]",
359
+ "polygon[id|class|style|points|fill|stroke|stroke-width|opacity|transform]",
360
+ "polyline[id|class|style|points|fill|stroke|stroke-width|opacity|transform]"
361
+ ].join(",");
362
+ function resolveOptions(options = {}) {
363
+ return {
364
+ pluginName: options.pluginName ?? "formulax",
365
+ buttonName: options.buttonName ?? "formulax",
366
+ menuItemName: options.menuItemName ?? "formulax",
367
+ toolbarText: options.toolbarText ?? "FormulaX",
368
+ tooltip: options.tooltip ?? "Insert formula",
369
+ cursorStyle: options.cursorStyle ?? "pointer",
370
+ formulaClassName: options.formulaClassName ?? "formulax-math",
371
+ formulaAttributeName: options.formulaAttributeName ?? "data-formulax-latex",
372
+ renderMode: options.renderMode ?? "text",
373
+ initialLatex: options.initialLatex ?? "",
374
+ modal: {
375
+ title: options.modal?.title ?? "FormulaX",
376
+ insertText: options.modal?.insertText ?? "Insert",
377
+ updateText: options.modal?.updateText ?? "Update",
378
+ cancelText: options.modal?.cancelText ?? "Cancel",
379
+ width: options.modal?.width ?? "1100px",
380
+ height: options.modal?.height ?? "auto",
381
+ closeOnBackdrop: options.modal?.closeOnBackdrop ?? true
382
+ },
383
+ editor: {
384
+ mode: "kity",
385
+ height: options.editor?.height ?? "100%",
386
+ autofocus: options.editor?.autofocus ?? true,
387
+ assets: options.editor?.assets ?? {},
388
+ render: {
389
+ fontsize: options.editor?.render?.fontsize ?? 40
390
+ }
391
+ }
392
+ };
393
+ }
394
+ function registerFormulaXTinyMcePlugin(tinymce, options = {}) {
395
+ if (!tinymce?.PluginManager?.add) {
396
+ throw new Error("[FormulaX] Invalid TinyMCE instance: PluginManager.add is missing.");
397
+ }
398
+ warnUnsupportedTinyMceVersion(tinymce);
399
+ const resolved = resolveOptions(options);
400
+ tinymce.PluginManager.add(
401
+ resolved.pluginName,
402
+ function FormulaXTinyMcePlugin(editor) {
403
+ const compat = createTinyMceCompat(editor, tinymce);
404
+ editor.schema?.addValidElements?.(FORMULAX_SVG_VALID_ELEMENTS);
405
+ const open = (target) => {
406
+ const resolvedTarget = target ?? compat.getSelectedFormulaElement();
407
+ openFormulaXOverlayModal({
408
+ editor,
409
+ target: resolvedTarget,
410
+ initialLatex: resolvedTarget ? void 0 : resolved.initialLatex,
411
+ options: resolved
412
+ });
413
+ };
414
+ editor.addCommand("FormulaXOpen", () => {
415
+ open();
416
+ });
417
+ editor.ui?.registry?.addButton?.(resolved.buttonName, {
418
+ text: resolved.toolbarText,
419
+ tooltip: resolved.tooltip,
420
+ onAction: () => editor.execCommand("FormulaXOpen")
421
+ });
422
+ editor.ui?.registry?.addMenuItem?.(resolved.menuItemName, {
423
+ text: resolved.toolbarText,
424
+ onAction: () => editor.execCommand("FormulaXOpen")
425
+ });
426
+ editor.on("init", () => {
427
+ ensureTinyMceStyles(document);
428
+ const editorDoc = editor.getDoc?.();
429
+ if (editorDoc) {
430
+ ensureTinyMceStyles(editorDoc);
431
+ }
432
+ });
433
+ editor.on("dblclick", (event) => {
434
+ const formula = (0, import_editor.findFormulaElement)(event.target);
435
+ if (!formula) return;
436
+ event.preventDefault?.();
437
+ open(formula);
438
+ });
439
+ editor.on("keydown", (event) => {
440
+ const e = event;
441
+ if (e.key !== "Enter" && e.key !== " ") return;
442
+ const formula = compat.getSelectedFormulaElement();
443
+ if (!formula) return;
444
+ e.preventDefault?.();
445
+ open(formula);
446
+ });
447
+ return void 0;
448
+ }
449
+ );
450
+ }
451
+ // Annotate the CommonJS export names for ESM import in node:
452
+ 0 && (module.exports = {
453
+ DEFAULT_FORMULA_ATTRIBUTE,
454
+ DEFAULT_FORMULA_CLASS,
455
+ FORMULA_FLAG_ATTRIBUTE,
456
+ createTinyMceCompat,
457
+ createTinyMceFormulaMarkup,
458
+ findFormulaElement,
459
+ getFormulaLatexFromElement,
460
+ getTinyMceMajorVersion,
461
+ isFormulaElement,
462
+ openFormulaXOverlayModal,
463
+ parseTinyMceFormulaMarkup,
464
+ registerFormulaXTinyMcePlugin,
465
+ replaceFormulaElement,
466
+ resolveOptions,
467
+ serializeTinyMceFormulaMarkup,
468
+ warnUnsupportedTinyMceVersion
469
+ });
470
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/markup.ts","../src/compat.ts","../src/styles.ts","../src/editor-host.ts","../src/modal.ts","../src/plugin.ts"],"sourcesContent":["export {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n createTinyMceFormulaMarkup,\n parseTinyMceFormulaMarkup,\n serializeTinyMceFormulaMarkup,\n getFormulaLatexFromElement,\n findFormulaElement,\n isFormulaElement,\n replaceFormulaElement,\n} from './markup';\n\nexport {\n getTinyMceMajorVersion,\n createTinyMceCompat,\n warnUnsupportedTinyMceVersion,\n} from './compat';\n\nexport {\n registerFormulaXTinyMcePlugin,\n resolveOptions,\n} from './plugin';\n\nexport {\n openFormulaXOverlayModal,\n} from './modal';\n\nexport type {\n FormulaXTinyMceOptions,\n FormulaXModalOptions,\n FormulaXModalOpenOptions,\n RequiredFormulaXTinyMceOptions,\n TinyMceEditorLike,\n TinyMceLike,\n} from './types';\n","import { parseLatex, serializeLatex, type FormulaDoc } from '@formulaxjs/core';\nimport {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n createFormulaElement,\n createFormulaMarkup,\n escapeAttribute,\n escapeHtml,\n findFormulaElement,\n getFormulaLatexFromElement,\n isFormulaElement,\n replaceFormulaElement,\n type CreateFormulaMarkupOptions,\n} from '@formulaxjs/editor';\n\nexport type { CreateFormulaMarkupOptions };\n\nexport function createTinyMceFormulaMarkup(\n latex: string,\n options: CreateFormulaMarkupOptions = {},\n): string {\n return createFormulaMarkup(latex, {\n ...options,\n extraAttributes: {\n ...options.extraAttributes,\n 'data-mce-contenteditable': 'false',\n },\n });\n}\n\r\nexport function parseTinyMceFormulaMarkup(latex: string): FormulaDoc {\r\n return parseLatex(latex);\r\n}\r\n\r\nexport function serializeTinyMceFormulaMarkup(\r\n doc: FormulaDoc,\r\n options: CreateFormulaMarkupOptions = {},\r\n): string {\r\n return createTinyMceFormulaMarkup(serializeLatex(doc), options);\r\n}\r\n\r\nexport function createTinyMceFormulaElement(\n ownerDocument: Document,\n latex: string,\n options: CreateFormulaMarkupOptions = {},\n): HTMLElement | null {\n return createFormulaElement(ownerDocument, latex, {\n ...options,\n extraAttributes: {\n ...options.extraAttributes,\n 'data-mce-contenteditable': 'false',\n },\n });\n}\n\nexport {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n escapeAttribute,\n escapeHtml,\n findFormulaElement,\n getFormulaLatexFromElement,\n isFormulaElement,\n replaceFormulaElement,\n};\n","import type { TinyMceEditorLike, TinyMceLike } from './types';\nimport { findFormulaElement } from './markup';\n\nexport interface TinyMceCompat {\n major: number;\n insertContent: (html: string) => void;\n dispatchEvent: (name: string, detail?: Record<string, unknown>) => void;\n getSelectedFormulaElement: () => HTMLElement | null;\n getEditorDocument: () => Document;\n getEditorWindow: () => Window;\n getEditorBody: () => HTMLElement | null;\n focus: () => void;\n}\n\nexport function getTinyMceMajorVersion(tinymce?: TinyMceLike): number {\n const raw = tinymce?.majorVersion;\n const major = typeof raw === 'string' ? Number.parseInt(raw, 10) : Number(raw);\n return Number.isFinite(major) ? major : 0;\n}\n\nexport function createTinyMceCompat(\n editor: TinyMceEditorLike,\n tinymce?: TinyMceLike,\n): TinyMceCompat {\n const major = getTinyMceMajorVersion(tinymce);\n\n return {\n major,\n\n insertContent(html: string): void {\n editor.insertContent(html);\n },\n\n dispatchEvent(name: string, detail?: Record<string, unknown>): void {\n if (typeof editor.dispatch === 'function') {\n editor.dispatch(name, detail);\n return;\n }\n\n if (typeof editor.fire === 'function') {\n editor.fire(name, detail);\n }\n },\n\n getSelectedFormulaElement(): HTMLElement | null {\n const node = editor.selection?.getNode?.();\n return findFormulaElement(node ?? null);\n },\n\n getEditorDocument(): Document {\n return editor.getDoc?.() ?? document;\n },\n\n getEditorWindow(): Window {\n return editor.getWin?.() ?? window;\n },\n\n getEditorBody(): HTMLElement | null {\n return editor.getBody?.() ?? null;\n },\n\n focus(): void {\n editor.focus?.();\n },\n };\n}\n\nexport function warnUnsupportedTinyMceVersion(tinymce?: TinyMceLike): void {\n const major = getTinyMceMajorVersion(tinymce);\n if (major > 0 && (major < 5 || major >= 9)) {\n console.warn(`[FormulaX] TinyMCE ${major} is not officially supported. Expected >=5 <9.`);\n }\n}\n","import {\n ensureFormulaXModalStyles,\n formulaXModalStyles,\n} from '@formulaxjs/editor';\n\nexport const tinymceStyles = formulaXModalStyles;\n\nexport function ensureTinyMceStyles(doc: Document = document): void {\n ensureFormulaXModalStyles(doc);\n}\n","import {\n mountFormulaXKityEditor,\n type FormulaXKityEditorOptions,\n} from '@formulaxjs/editor';\nimport { serializeSvgForInsertion } from '@formulaxjs/renderer';\nimport type { MountedFormulaXEditor, RequiredFormulaXTinyMceOptions } from './types';\n\nexport interface MountFormulaXEditorOptions {\n initialLatex?: string;\n options: RequiredFormulaXTinyMceOptions;\n}\n\nexport function mountFormulaXEditorInModal(\n root: HTMLElement,\n input: MountFormulaXEditorOptions,\n): MountedFormulaXEditor {\n const options: FormulaXKityEditorOptions = {\n initialLatex: input.initialLatex,\n height: input.options.editor.height ?? '100%',\n autofocus: input.options.editor.autofocus ?? true,\n assets: input.options.editor.assets,\n render: {\n fontsize: input.options.editor.render?.fontsize ?? 40,\n },\n };\n return mountFormulaXKityEditor(root, options);\n}\n\nexport { serializeSvgForInsertion };\n","import type { FormulaXModalOpenOptions, TinyMceEditorLike } from './types';\r\nimport { ensureTinyMceStyles } from './styles';\r\nimport { mountFormulaXEditorInModal } from './editor-host';\r\nimport {\r\n createTinyMceFormulaElement,\r\n createTinyMceFormulaMarkup,\r\n escapeAttribute,\r\n escapeHtml,\r\n getFormulaLatexFromElement,\r\n replaceFormulaElement,\r\n} from './markup';\r\n\r\nexport interface OpenFormulaXModalResult {\r\n close: () => void;\r\n}\r\n\r\nexport function openFormulaXOverlayModal(input: FormulaXModalOpenOptions): OpenFormulaXModalResult {\n ensureTinyMceStyles(document);\n\r\n const { editor, target, options } = input;\r\n const initialLatex = target\r\n ? getFormulaLatexFromElement(target, options.formulaAttributeName)\r\n : input.initialLatex ?? options.initialLatex ?? '';\r\n\r\n const root = document.createElement('div');\n root.className = 'fx-formula-modal-root';\n root.setAttribute('data-formulax-modal', 'true');\n\r\n const isUpdate = Boolean(target);\r\n const submitText = isUpdate ? options.modal.updateText : options.modal.insertText;\r\n const title = options.modal.title || (isUpdate ? 'Edit Formula' : 'Insert Formula');\r\n\r\n root.innerHTML = `\n <div class=\"fx-formula-modal-backdrop\" data-action=\"backdrop\"></div>\n <div class=\"fx-formula-modal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${escapeAttribute(title)}\">\n <header class=\"fx-formula-modal__header\">\n <h2 class=\"fx-formula-modal__title\">${escapeHtml(title)}</h2>\n <button class=\"fx-formula-modal__close\" type=\"button\" data-action=\"close\" aria-label=\"Close\">×</button>\n </header>\n <section class=\"fx-formula-modal__body\">\n <div class=\"fx-formula-editor-host\"></div>\n </section>\n <footer class=\"fx-formula-modal__footer\">\n <button class=\"fx-formula-modal__button\" type=\"button\" data-action=\"cancel\">${escapeHtml(options.modal.cancelText)}</button>\n <button class=\"fx-formula-modal__button fx-formula-modal__button--primary\" type=\"button\" data-action=\"submit\">${escapeHtml(submitText)}</button>\n </footer>\n </div>\n `;\n\n document.body.appendChild(root);\n document.body.classList.add('fx-formula-modal-open');\n\n const host = root.querySelector<HTMLElement>('.fx-formula-editor-host');\n if (!host) {\n root.remove();\n throw new Error('[FormulaX] Modal editor host not found.');\n }\r\n\r\n const mounted = mountFormulaXEditorInModal(host, { initialLatex, options });\r\n let closed = false;\r\n\r\n const close = (): void => {\r\n if (closed) return;\r\n closed = true;\r\n\r\n mounted.destroy();\r\n root.removeEventListener('click', onClick);\n document.removeEventListener('keydown', onKeydown, true);\n root.remove();\n document.body.classList.remove('fx-formula-modal-open');\n editor.focus?.();\n };\n\r\n const submit = async (): Promise<void> => {\r\n const latex = await mounted.getLatex();\r\n const renderHtml = mounted.getRenderHtml ? await mounted.getRenderHtml() : undefined;\r\n\r\n runEditorTransaction(editor, () => {\r\n if (target) {\n const next = replaceFormulaElement(target, latex, {\n attributeName: options.formulaAttributeName,\n className: options.formulaClassName,\n cursorStyle: options.cursorStyle,\n renderHtml,\n });\n if (next) {\n moveSelectionAfterNode(editor, next);\n }\n } else {\n insertFormulaElementIntoEditor(\n editor,\n latex,\n options.formulaAttributeName,\n options.formulaClassName,\n options.cursorStyle,\n renderHtml,\n );\n }\n\r\n notifyEditorChanged(editor);\r\n });\r\n\r\n close();\r\n };\r\n\r\n function onClick(event: MouseEvent): void {\r\n const action = (event.target as HTMLElement).closest<HTMLElement>('[data-action]')?.dataset.action;\r\n if (!action) return;\r\n\r\n if (action === 'submit') {\r\n void submit();\r\n return;\r\n }\r\n\r\n if (action === 'cancel' || action === 'close') {\r\n close();\r\n return;\r\n }\r\n\r\n if (action === 'backdrop' && options.modal.closeOnBackdrop) {\r\n close();\r\n }\r\n }\r\n\r\n function onKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n close();\r\n }\r\n }\r\n\r\n root.addEventListener('click', onClick);\r\n document.addEventListener('keydown', onKeydown, true);\r\n\r\n queueMicrotask(() => {\r\n mounted.root.focus();\r\n });\r\n\r\n return { close };\r\n}\r\n\r\nfunction runEditorTransaction(editor: TinyMceEditorLike, mutation: () => void): void {\r\n if (typeof editor.undoManager?.transact === 'function') {\r\n editor.undoManager.transact(mutation);\r\n return;\r\n }\r\n\r\n mutation();\r\n editor.undoManager?.add?.();\r\n}\r\n\r\nfunction insertFormulaElementIntoEditor(\n editor: TinyMceEditorLike,\n latex: string,\n attributeName: string,\n className: string,\n cursorStyle: string,\n renderHtml?: string,\n): void {\n const editorDoc = editor.getDoc?.() ?? document;\n const next = createTinyMceFormulaElement(editorDoc, latex, {\n attributeName,\n className,\n cursorStyle,\n renderHtml,\n });\n\r\n if (next && insertNodeAtEditorSelection(editor, next)) {\r\n return;\r\n }\r\n\r\n insertFormulaElementWithPlaceholder(editor, latex, attributeName, className, cursorStyle, renderHtml);\n}\n\r\nfunction insertNodeAtEditorSelection(editor: TinyMceEditorLike, node: HTMLElement): boolean {\r\n const range = getEditorRange(editor);\r\n if (!range || !isRangeInsideEditor(editor, range)) {\r\n return false;\r\n }\r\n\r\n try {\r\n range.deleteContents();\r\n range.insertNode(node);\r\n moveSelectionAfterNode(editor, node);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction getEditorRange(editor: TinyMceEditorLike): Range | null {\r\n try {\r\n return editor.selection?.getRng?.() ?? null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction isRangeInsideEditor(editor: TinyMceEditorLike, range: Range): boolean {\r\n const editorDoc = editor.getDoc?.() ?? document;\r\n if (range.startContainer.ownerDocument !== editorDoc || range.endContainer.ownerDocument !== editorDoc) {\r\n return false;\r\n }\r\n\r\n const body = editor.getBody?.();\r\n if (!body) {\r\n return true;\r\n }\r\n\r\n return body.contains(getRangeContainerElement(range.startContainer))\r\n && body.contains(getRangeContainerElement(range.endContainer));\r\n}\r\n\r\nfunction getRangeContainerElement(node: Node): Node {\r\n return node.nodeType === 1 ? node : node.parentNode ?? node;\r\n}\r\n\r\nfunction moveSelectionAfterNode(editor: TinyMceEditorLike, node: HTMLElement): void {\r\n const doc = node.ownerDocument;\r\n const range = doc.createRange();\r\n range.setStartAfter(node);\r\n range.collapse(true);\r\n\r\n try {\r\n editor.selection?.setRng?.(range);\r\n editor.selection?.collapse?.(false);\r\n } catch {\r\n // Ignore selection restoration failures across TinyMCE versions.\r\n }\r\n}\r\n\r\nfunction insertFormulaElementWithPlaceholder(\n editor: TinyMceEditorLike,\n latex: string,\n attributeName: string,\n className: string,\n cursorStyle: string,\n renderHtml?: string,\n): void {\n const editorDoc = editor.getDoc?.() ?? document;\r\n const marker = `fx-pending-${Math.random().toString(36).slice(2, 10)}`;\r\n editor.insertContent(`<span data-formulax-pending=\"${escapeAttribute(marker)}\">&#xfeff;</span>`);\r\n\r\n const placeholder = editorDoc.querySelector<HTMLElement>(`[data-formulax-pending=\"${marker}\"]`);\r\n if (!placeholder) {\r\n const html = createTinyMceFormulaMarkup(latex, {\n attributeName,\n className,\n cursorStyle,\n renderHtml,\n });\n editor.insertContent(html);\r\n return;\r\n }\r\n\r\n const next = createTinyMceFormulaElement(editorDoc, latex, {\n attributeName,\n className,\n cursorStyle,\n renderHtml,\n });\n\r\n if (!next) {\r\n placeholder.remove();\r\n return;\r\n }\r\n\r\n placeholder.replaceWith(next);\r\n moveSelectionAfterNode(editor, next);\r\n}\r\n\r\nfunction notifyEditorChanged(editor: TinyMceEditorLike): void {\r\n editor.nodeChanged?.();\r\n\r\n if (typeof editor.dispatch === 'function') {\r\n editor.dispatch('change');\r\n return;\r\n }\r\n\r\n editor.fire?.('change');\r\n}\r\n","import type {\n FormulaXTinyMceOptions,\n RequiredFormulaXTinyMceOptions,\n TinyMceEditorLike,\n TinyMceLike,\n} from './types';\nimport { createTinyMceCompat, warnUnsupportedTinyMceVersion } from './compat';\nimport { findFormulaElement } from './markup';\nimport { openFormulaXOverlayModal } from './modal';\nimport { ensureTinyMceStyles } from './styles';\n\nconst FORMULAX_SVG_VALID_ELEMENTS = [\n 'svg[class|style|id|xmlns|xmlns:xlink|version|width|height|viewbox|font-size|focusable|role|tabindex|contenteditable|data-formulax|data-formulax-latex|data-latex|aria-hidden|preserveaspectratio]',\n 'defs[id|class|style]',\n 'style[type|media]',\n 'g[id|class|style|transform|fill|stroke|stroke-width|stroke-linecap|stroke-linejoin|opacity|font-family|font-size|font-style|font-weight|data-type|data-flag|data-root]',\n 'path[id|class|style|d|fill|stroke|stroke-width|stroke-linecap|stroke-linejoin|opacity|transform|data-type|data-mce-style]',\n 'use[id|class|style|x|y|width|height|href|xlink:href|transform|fill|stroke|opacity]',\n 'text[id|class|style|x|y|dx|dy|fill|stroke|transform|font-family|font-size|font-style|font-weight|text-anchor|text-rendering|xml:space]',\n 'tspan[id|class|style|x|y|dx|dy|fill|stroke|transform|font-family|font-size|font-style|font-weight|text-anchor]',\n 'line[id|class|style|x1|y1|x2|y2|fill|stroke|stroke-width|stroke-linecap|opacity|transform]',\n 'rect[id|class|style|x|y|width|height|rx|ry|fill|stroke|stroke-width|opacity|transform]',\n 'circle[id|class|style|cx|cy|r|fill|stroke|stroke-width|opacity|transform]',\n 'ellipse[id|class|style|cx|cy|rx|ry|fill|stroke|stroke-width|opacity|transform]',\n 'polygon[id|class|style|points|fill|stroke|stroke-width|opacity|transform]',\n 'polyline[id|class|style|points|fill|stroke|stroke-width|opacity|transform]',\n].join(',');\n\nexport function resolveOptions(options: FormulaXTinyMceOptions = {}): RequiredFormulaXTinyMceOptions {\n return {\r\n pluginName: options.pluginName ?? 'formulax',\r\n buttonName: options.buttonName ?? 'formulax',\r\n menuItemName: options.menuItemName ?? 'formulax',\n toolbarText: options.toolbarText ?? 'FormulaX',\n tooltip: options.tooltip ?? 'Insert formula',\n cursorStyle: options.cursorStyle ?? 'pointer',\n formulaClassName: options.formulaClassName ?? 'formulax-math',\n formulaAttributeName: options.formulaAttributeName ?? 'data-formulax-latex',\n renderMode: options.renderMode ?? 'text',\n initialLatex: options.initialLatex ?? '',\r\n modal: {\r\n title: options.modal?.title ?? 'FormulaX',\r\n insertText: options.modal?.insertText ?? 'Insert',\r\n updateText: options.modal?.updateText ?? 'Update',\r\n cancelText: options.modal?.cancelText ?? 'Cancel',\r\n width: options.modal?.width ?? '1100px',\r\n height: options.modal?.height ?? 'auto',\r\n closeOnBackdrop: options.modal?.closeOnBackdrop ?? true,\r\n },\r\n editor: {\n mode: 'kity',\n height: options.editor?.height ?? '100%',\n autofocus: options.editor?.autofocus ?? true,\n assets: options.editor?.assets ?? {},\n render: {\n fontsize: options.editor?.render?.fontsize ?? 40,\n },\n },\r\n };\r\n}\r\n\r\nexport function registerFormulaXTinyMcePlugin(\r\n tinymce: TinyMceLike,\r\n options: FormulaXTinyMceOptions = {},\r\n): void {\r\n if (!tinymce?.PluginManager?.add) {\r\n throw new Error('[FormulaX] Invalid TinyMCE instance: PluginManager.add is missing.');\r\n }\r\n\r\n warnUnsupportedTinyMceVersion(tinymce);\r\n const resolved = resolveOptions(options);\r\n\r\n tinymce.PluginManager.add(\n resolved.pluginName,\n function FormulaXTinyMcePlugin(editor: TinyMceEditorLike): undefined {\n const compat = createTinyMceCompat(editor, tinymce);\n editor.schema?.addValidElements?.(FORMULAX_SVG_VALID_ELEMENTS);\n\n const open = (target?: HTMLElement | null): void => {\n const resolvedTarget = target ?? compat.getSelectedFormulaElement();\n\n openFormulaXOverlayModal({\n editor,\n target: resolvedTarget,\r\n initialLatex: resolvedTarget ? undefined : resolved.initialLatex,\r\n options: resolved,\r\n });\r\n };\r\n\n editor.addCommand('FormulaXOpen', () => {\n open();\n });\n\r\n editor.ui?.registry?.addButton?.(resolved.buttonName, {\n text: resolved.toolbarText,\n tooltip: resolved.tooltip,\n onAction: () => editor.execCommand('FormulaXOpen'),\n });\n\r\n editor.ui?.registry?.addMenuItem?.(resolved.menuItemName, {\r\n text: resolved.toolbarText,\r\n onAction: () => editor.execCommand('FormulaXOpen'),\r\n });\r\n\n editor.on('init', () => {\n ensureTinyMceStyles(document);\n const editorDoc = editor.getDoc?.();\n if (editorDoc) {\n ensureTinyMceStyles(editorDoc);\n }\n });\n\r\n editor.on('dblclick', (event: unknown) => {\r\n const formula = findFormulaElement((event as MouseEvent).target as Node);\n if (!formula) return;\n (event as Event).preventDefault?.();\n open(formula);\n });\n\r\n editor.on('keydown', (event: unknown) => {\r\n const e = event as KeyboardEvent;\r\n if (e.key !== 'Enter' && e.key !== ' ') return;\n const formula = compat.getSelectedFormulaElement();\n if (!formula) return;\n e.preventDefault?.();\n open(formula);\n });\n\r\n return undefined;\r\n },\r\n );\r\n}\r\n"],"mappings":"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","names":["import_editor","import_editor"]}