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