@formulaxjs/ckeditor5 0.2.0 → 0.2.2
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 +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.global.js +34 -32
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +4 -5
package/dist/index.cjs
CHANGED
|
@@ -69,7 +69,7 @@ function openFormulaXModal(input) {
|
|
|
69
69
|
root.remove();
|
|
70
70
|
return Promise.reject(new Error("[FormulaX] CKEditor 5 modal host not found."));
|
|
71
71
|
}
|
|
72
|
-
const mounted = (0, import_editor.
|
|
72
|
+
const mounted = (0, import_editor.mountFormulaXEditor)(host, {
|
|
73
73
|
initialLatex: input.initialLatex,
|
|
74
74
|
height: input.options.editor.height,
|
|
75
75
|
autofocus: input.options.editor.autofocus,
|
|
@@ -421,7 +421,7 @@ function renderFormulaSvgMarkup(latex, options) {
|
|
|
421
421
|
host.style.pointerEvents = "none";
|
|
422
422
|
host.setAttribute("aria-hidden", "true");
|
|
423
423
|
document.body.appendChild(host);
|
|
424
|
-
const mounted = (0, import_editor2.
|
|
424
|
+
const mounted = (0, import_editor2.mountFormulaXEditor)(host, {
|
|
425
425
|
initialLatex: latex,
|
|
426
426
|
height: options.editor.height,
|
|
427
427
|
autofocus: false,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/plugin.ts","../src/modal.ts"],"sourcesContent":["export {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n} from '@formulaxjs/editor';\n\nexport {\n DEFAULT_BUTTON_NAME,\n DEFAULT_MODEL_NAME,\n FormulaX,\n FormulaXCommand,\n resolveOptions,\n} from './plugin';\n\nexport type {\n FormulaXCKEditor5Options,\n FormulaXPayload,\n RequiredFormulaXCKEditor5Options,\n} from './types';\n\nexport { openFormulaXModal } from './modal';\n\nexport { FormulaX as default } from './plugin';\n","import {\n ButtonView,\n Command,\n Plugin,\n Widget,\n toWidget,\n viewToModelPositionOutsideModelElement,\n} from 'ckeditor5';\nimport {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n createFormulaMarkup,\n ensureFormulaXModalStyles,\n mountFormulaXKityEditor,\n} from '@formulaxjs/editor';\nimport { openFormulaXModal } from './modal';\nimport type {\n FormulaXCKEditor5Options,\n FormulaXPayload,\n RequiredFormulaXCKEditor5Options,\n} from './types';\n\nconst DEFAULT_BUTTON_NAME = 'formulaX';\nconst DEFAULT_MODEL_NAME = 'formulaX';\n\nexport { DEFAULT_BUTTON_NAME, DEFAULT_MODEL_NAME };\n\nexport function resolveOptions(options: FormulaXCKEditor5Options = {}): RequiredFormulaXCKEditor5Options {\n return {\n name: options.name ?? DEFAULT_MODEL_NAME,\n buttonName: options.buttonName ?? DEFAULT_BUTTON_NAME,\n toolbarText: options.toolbarText ?? 'FormulaX',\n tooltip: options.tooltip ?? 'Insert or edit formula',\n cursorStyle: options.cursorStyle ?? 'pointer',\n formulaClassName: options.formulaClassName ?? DEFAULT_FORMULA_CLASS,\n formulaAttributeName: options.formulaAttributeName ?? DEFAULT_FORMULA_ATTRIBUTE,\n modal: {\n title: options.modal?.title ?? 'FormulaX Editor',\n insertText: options.modal?.insertText ?? 'Insert',\n updateText: options.modal?.updateText ?? 'Update',\n cancelText: options.modal?.cancelText ?? 'Cancel',\n closeOnBackdrop: options.modal?.closeOnBackdrop ?? true,\n },\n editor: {\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 },\n };\n}\n\nexport class FormulaXCommand extends Command {\n private readonly options: RequiredFormulaXCKEditor5Options;\n\n constructor(editor: unknown, options: RequiredFormulaXCKEditor5Options) {\n super(editor as any);\n this.options = options;\n }\n\n override refresh(): void {\n this.isEnabled = true;\n }\n\n override execute(): void {\n const editor = this.editor as any;\n const selectedFormula = getSelectedFormulaModelElement(editor, this.options.name);\n const initialLatex = String(selectedFormula?.getAttribute('latex') ?? '');\n\n void openFormulaXModal({\n initialLatex,\n isUpdate: Boolean(selectedFormula),\n options: this.options,\n }).then((payload) => {\n if (!payload) return;\n applyFormulaPayload(editor, selectedFormula, payload, this.options.name);\n editor.editing.view.focus();\n });\n }\n}\n\nexport class FormulaX extends Plugin {\n static get pluginName(): string {\n return 'FormulaX';\n }\n\n static get requires(): readonly [typeof Widget] {\n return [Widget];\n }\n\n init(): void {\n const editor = this.editor as any;\n const options = resolveOptions(editor.config.get('formulaX') as FormulaXCKEditor5Options | undefined);\n\n if (hasRegisteredFormulaModelName(editor, options.name)) {\n console.error(\n `[FormulaX] CKEditor5 model name \"${options.name}\" is already registered. ` +\n 'Pass a unique \"name\" option to avoid schema collisions.',\n );\n return;\n }\n\n ensureFormulaXModalStyles(document);\n defineFormulaSchema(editor, options.name);\n defineFormulaConverters(editor, options);\n editor.editing.mapper.on(\n 'viewToModelPosition',\n viewToModelPositionOutsideModelElement(editor.model, isFormulaWidgetView),\n );\n\n const command = new FormulaXCommand(editor, options);\n editor.commands.add(options.buttonName, command);\n\n editor.ui.componentFactory.add(options.buttonName, (locale: unknown) => {\n const button = new ButtonView(locale as any);\n\n button.set({\n label: options.toolbarText,\n tooltip: options.tooltip,\n withText: true,\n });\n\n button.bind('isEnabled').to(command, 'isEnabled');\n this.listenTo(button, 'execute', () => editor.execute(options.buttonName));\n\n return button;\n });\n }\n}\n\nexport default FormulaX;\n\nfunction applyFormulaPayload(\n editor: any,\n selectedFormula: any,\n payload: FormulaXPayload,\n modelName: string,\n): void {\n editor.model.change((writer: any) => {\n if (selectedFormula) {\n if (!payload.latex.trim()) {\n writer.remove(selectedFormula);\n return;\n }\n\n writer.setAttribute('latex', payload.latex, selectedFormula);\n return;\n }\n\n if (!payload.latex.trim()) return;\n\n const formula = writer.createElement(modelName, {\n latex: payload.latex,\n });\n\n editor.model.insertObject(formula, null, null, { setSelection: 'after' });\n });\n}\n\nfunction hasRegisteredFormulaModelName(editor: any, modelName: string): boolean {\n const schema = editor?.model?.schema;\n\n if (!schema) {\n return false;\n }\n\n if (typeof schema.isRegistered === 'function') {\n return Boolean(schema.isRegistered(modelName));\n }\n\n if (typeof schema.getDefinition === 'function') {\n return Boolean(schema.getDefinition(modelName));\n }\n\n if (schema._sourceDefinitions?.has) {\n return Boolean(schema._sourceDefinitions.has(modelName));\n }\n\n return Boolean(schema._definitions?.[modelName]);\n}\n\nfunction defineFormulaSchema(editor: any, modelName: string): void {\n editor.model.schema.register(modelName, {\n allowWhere: '$text',\n isInline: true,\n isObject: true,\n allowAttributes: ['latex'],\n });\n}\n\nfunction defineFormulaConverters(editor: any, options: RequiredFormulaXCKEditor5Options): void {\n editor.conversion.for('upcast').elementToElement({\n view: {\n name: 'span',\n attributes: {\n [FORMULA_FLAG_ATTRIBUTE]: true,\n },\n },\n model: (viewElement: any, { writer }: any) => writer.createElement(options.name, {\n latex: readFormulaLatexFromView(viewElement, options),\n }),\n });\n\n editor.conversion.for('dataDowncast').elementToElement({\n model: createFormulaConverterModelDefinition(options.name),\n view: (modelElement: any, { writer }: any) => createFormulaRawElement(writer, modelElement, options),\n });\n\n editor.conversion.for('editingDowncast').elementToElement({\n model: createFormulaConverterModelDefinition(options.name),\n view: (modelElement: any, { writer }: any) => {\n const widgetElement = createFormulaWidgetElement(writer, modelElement, options, editor);\n return toWidget(widgetElement, writer, { label: 'FormulaX formula' });\n },\n });\n}\n\nfunction createFormulaConverterModelDefinition(modelName: string): {\n name: string;\n attributes: string[];\n} {\n return {\n name: modelName,\n attributes: ['latex'],\n };\n}\n\nfunction createFormulaRawElement(\n writer: any,\n modelElement: any,\n options: RequiredFormulaXCKEditor5Options,\n): any {\n const latex = String(modelElement.getAttribute('latex') ?? '');\n\n const element = writer.createContainerElement(\n 'span',\n createFormulaViewAttributes(latex, options),\n );\n\n writer.insert(\n writer.createPositionAt(element, 0),\n writer.createText(latex || '\\\\square'),\n );\n\n return element;\n}\n\nfunction createFormulaWidgetElement(\n writer: any,\n modelElement: any,\n options: RequiredFormulaXCKEditor5Options,\n editor: any,\n): any {\n const latex = String(modelElement.getAttribute('latex') ?? '');\n const widgetElement = writer.createContainerElement(\n 'span',\n createFormulaViewAttributes(latex, options),\n );\n const contentElement = writer.createRawElement(\n 'span',\n {\n class: `${options.formulaClassName}__content`,\n 'aria-hidden': 'true',\n },\n (domElement: HTMLElement) => {\n domElement.innerHTML = createFormulaFallbackMarkup(latex, options);\n void renderFormulaIntoElement(domElement, latex, options);\n bindFormulaWidgetDomEvents(domElement, editor, modelElement, options.buttonName);\n },\n );\n\n writer.insert(writer.createPositionAt(widgetElement, 0), contentElement);\n\n return widgetElement;\n}\n\nfunction createFormulaViewAttributes(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Record<string, string> {\n return {\n class: options.formulaClassName,\n [FORMULA_FLAG_ATTRIBUTE]: 'true',\n [options.formulaAttributeName]: latex,\n 'data-latex': latex,\n contenteditable: 'false',\n role: 'button',\n style: `cursor: ${options.cursorStyle}`,\n tabindex: '0',\n };\n}\n\nfunction bindFormulaWidgetDomEvents(\n domElement: HTMLElement,\n editor: any,\n modelElement: any,\n commandName: string,\n): void {\n domElement.onclick = (event) => {\n event.preventDefault();\n selectFormulaModelElement(editor, modelElement);\n };\n\n domElement.ondblclick = (event) => {\n event.preventDefault();\n event.stopPropagation();\n selectFormulaModelElement(editor, modelElement);\n editor.execute(commandName);\n };\n}\n\nfunction selectFormulaModelElement(editor: any, modelElement: any): void {\n if (!modelElement?.is?.('element', 'formulaX')) {\n return;\n }\n\n editor.editing.view.focus();\n editor.model.change((writer: any) => {\n writer.setSelection(modelElement, 'on');\n });\n}\n\nfunction createFormulaFallbackMarkup(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): string {\n const markup = createFormulaMarkup(latex, {\n attributeName: options.formulaAttributeName,\n className: options.formulaClassName,\n });\n return extractInnerHtml(markup);\n}\n\nfunction extractInnerHtml(markup: string): string {\n const wrapper = document.createElement('span');\n wrapper.innerHTML = markup;\n return wrapper.firstElementChild?.innerHTML ?? '';\n}\n\nfunction getSelectedFormulaModelElement(editor: any, modelName: string): any | null {\n const selectedElement = editor.model.document.selection.getSelectedElement();\n return selectedElement?.is?.('element', modelName) ? selectedElement : null;\n}\n\nfunction isFormulaWidgetView(node: any): boolean {\n return Boolean(node?.is?.('element') && node.hasAttribute?.(FORMULA_FLAG_ATTRIBUTE));\n}\n\nfunction readFormulaLatexFromView(viewElement: any, options: RequiredFormulaXCKEditor5Options): string {\n return String(\n viewElement.getAttribute(options.formulaAttributeName)\n ?? viewElement.getAttribute('data-latex')\n ?? '',\n );\n}\n\nconst formulaRenderCache = new Map<string, Promise<string>>();\n\nasync function renderFormulaIntoElement(\n domElement: HTMLElement,\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Promise<void> {\n const trimmedLatex = latex.trim();\n const renderToken = `${trimmedLatex}::${Date.now()}::${Math.random().toString(36).slice(2, 8)}`;\n domElement.dataset.renderToken = renderToken;\n\n if (!trimmedLatex) {\n return;\n }\n\n try {\n const markup = await renderFormulaSvgMarkup(trimmedLatex, options);\n if (domElement.dataset.renderToken !== renderToken) {\n return;\n }\n\n domElement.innerHTML = markup;\n } catch (error) {\n if (domElement.dataset.renderToken !== renderToken) {\n return;\n }\n\n console.error('[FormulaX] Failed to render CKEditor5 formula widget:', error);\n }\n}\n\nfunction renderFormulaSvgMarkup(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Promise<string> {\n const cached = formulaRenderCache.get(latex);\n if (cached) {\n return cached;\n }\n\n const pending = (async () => {\n const host = document.createElement('div');\n host.style.position = 'fixed';\n host.style.left = '-100000px';\n host.style.top = '0';\n host.style.width = '1px';\n host.style.height = '1px';\n host.style.opacity = '0';\n host.style.pointerEvents = 'none';\n host.setAttribute('aria-hidden', 'true');\n document.body.appendChild(host);\n\n const mounted = mountFormulaXKityEditor(host, {\n initialLatex: latex,\n height: options.editor.height,\n autofocus: false,\n assets: options.editor.assets,\n render: {\n fontsize: options.editor.render.fontsize,\n },\n });\n\n try {\n return await mounted.getRenderHtml();\n } finally {\n mounted.destroy();\n host.remove();\n }\n })();\n\n formulaRenderCache.set(latex, pending);\n pending.catch(() => {\n if (formulaRenderCache.get(latex) === pending) {\n formulaRenderCache.delete(latex);\n }\n });\n return pending;\n}\n","import {\n ensureFormulaXModalStyles,\n escapeAttribute,\n escapeHtml,\n mountFormulaXKityEditor,\n} from '@formulaxjs/editor';\nimport type { FormulaXPayload, RequiredFormulaXCKEditor5Options } from './types';\n\nexport interface OpenFormulaXModalInput {\n initialLatex: string;\n isUpdate: boolean;\n options: RequiredFormulaXCKEditor5Options;\n}\n\nexport function openFormulaXModal(input: OpenFormulaXModalInput): Promise<FormulaXPayload | null> {\n ensureFormulaXModalStyles(document);\n\n const root = document.createElement('div');\n root.className = 'fx-formula-modal-root';\n root.setAttribute('data-formulax-modal', 'true');\n\n const submitText = input.isUpdate ? input.options.modal.updateText : input.options.modal.insertText;\n\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(input.options.modal.title)}\">\n <header class=\"fx-formula-modal__header\">\n <h2 class=\"fx-formula-modal__title\">${escapeHtml(input.options.modal.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(input.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 return Promise.reject(new Error('[FormulaX] CKEditor 5 modal host not found.'));\n }\n\n const mounted = mountFormulaXKityEditor(host, {\n initialLatex: input.initialLatex,\n height: input.options.editor.height,\n autofocus: input.options.editor.autofocus,\n assets: input.options.editor.assets,\n render: {\n fontsize: input.options.editor.render.fontsize,\n },\n });\n let closed = false;\n\n return new Promise((resolve) => {\n const close = (payload: FormulaXPayload | null): void => {\n if (closed) return;\n closed = true;\n\n mounted.destroy();\n root.removeEventListener('click', onClick);\n document.removeEventListener('keydown', onKeydown, true);\n root.remove();\n document.body.classList.remove('fx-formula-modal-open');\n resolve(payload);\n };\n\n const submit = async (): Promise<void> => {\n try {\n const latex = await mounted.getLatex();\n close({ latex });\n } catch (error) {\n host.innerHTML = `\n <div class=\"fx-formula-editor-error\">\n Failed to read FormulaX editor content.\n <pre>${escapeHtml(error instanceof Error ? error.message : String(error))}</pre>\n </div>\n `;\n }\n };\n\n function onClick(event: MouseEvent): void {\n const action = (event.target as HTMLElement).closest<HTMLElement>('[data-action]')?.dataset.action;\n if (!action) return;\n\n if (action === 'submit') {\n void submit();\n return;\n }\n\n if (action === 'cancel' || action === 'close') {\n close(null);\n return;\n }\n\n if (action === 'backdrop' && input.options.modal.closeOnBackdrop) {\n close(null);\n }\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n close(null);\n }\n }\n\n root.addEventListener('click', onClick);\n document.addEventListener('keydown', onKeydown, true);\n\n queueMicrotask(() => {\n mounted.root.focus();\n });\n });\n}\n"],"mappings":"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","names":["import_editor","import_editor"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/plugin.ts","../src/modal.ts"],"sourcesContent":["export {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n} from '@formulaxjs/editor';\n\nexport {\n DEFAULT_BUTTON_NAME,\n DEFAULT_MODEL_NAME,\n FormulaX,\n FormulaXCommand,\n resolveOptions,\n} from './plugin';\n\nexport type {\n FormulaXCKEditor5Options,\n FormulaXPayload,\n RequiredFormulaXCKEditor5Options,\n} from './types';\n\nexport { openFormulaXModal } from './modal';\n\nexport { FormulaX as default } from './plugin';\n","import {\n ButtonView,\n Command,\n Plugin,\n Widget,\n toWidget,\n viewToModelPositionOutsideModelElement,\n} from 'ckeditor5';\nimport {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n createFormulaMarkup,\n ensureFormulaXModalStyles,\n mountFormulaXEditor,\n} from '@formulaxjs/editor';\nimport { openFormulaXModal } from './modal';\nimport type {\n FormulaXCKEditor5Options,\n FormulaXPayload,\n RequiredFormulaXCKEditor5Options,\n} from './types';\n\nconst DEFAULT_BUTTON_NAME = 'formulaX';\nconst DEFAULT_MODEL_NAME = 'formulaX';\n\nexport { DEFAULT_BUTTON_NAME, DEFAULT_MODEL_NAME };\n\nexport function resolveOptions(options: FormulaXCKEditor5Options = {}): RequiredFormulaXCKEditor5Options {\n return {\n name: options.name ?? DEFAULT_MODEL_NAME,\n buttonName: options.buttonName ?? DEFAULT_BUTTON_NAME,\n toolbarText: options.toolbarText ?? 'FormulaX',\n tooltip: options.tooltip ?? 'Insert or edit formula',\n cursorStyle: options.cursorStyle ?? 'pointer',\n formulaClassName: options.formulaClassName ?? DEFAULT_FORMULA_CLASS,\n formulaAttributeName: options.formulaAttributeName ?? DEFAULT_FORMULA_ATTRIBUTE,\n modal: {\n title: options.modal?.title ?? 'FormulaX Editor',\n insertText: options.modal?.insertText ?? 'Insert',\n updateText: options.modal?.updateText ?? 'Update',\n cancelText: options.modal?.cancelText ?? 'Cancel',\n closeOnBackdrop: options.modal?.closeOnBackdrop ?? true,\n },\n editor: {\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 },\n };\n}\n\nexport class FormulaXCommand extends Command {\n private readonly options: RequiredFormulaXCKEditor5Options;\n\n constructor(editor: unknown, options: RequiredFormulaXCKEditor5Options) {\n super(editor as any);\n this.options = options;\n }\n\n override refresh(): void {\n this.isEnabled = true;\n }\n\n override execute(): void {\n const editor = this.editor as any;\n const selectedFormula = getSelectedFormulaModelElement(editor, this.options.name);\n const initialLatex = String(selectedFormula?.getAttribute('latex') ?? '');\n\n void openFormulaXModal({\n initialLatex,\n isUpdate: Boolean(selectedFormula),\n options: this.options,\n }).then((payload) => {\n if (!payload) return;\n applyFormulaPayload(editor, selectedFormula, payload, this.options.name);\n editor.editing.view.focus();\n });\n }\n}\n\nexport class FormulaX extends Plugin {\n static get pluginName(): string {\n return 'FormulaX';\n }\n\n static get requires(): readonly [typeof Widget] {\n return [Widget];\n }\n\n init(): void {\n const editor = this.editor as any;\n const options = resolveOptions(editor.config.get('formulaX') as FormulaXCKEditor5Options | undefined);\n\n if (hasRegisteredFormulaModelName(editor, options.name)) {\n console.error(\n `[FormulaX] CKEditor5 model name \"${options.name}\" is already registered. ` +\n 'Pass a unique \"name\" option to avoid schema collisions.',\n );\n return;\n }\n\n ensureFormulaXModalStyles(document);\n defineFormulaSchema(editor, options.name);\n defineFormulaConverters(editor, options);\n editor.editing.mapper.on(\n 'viewToModelPosition',\n viewToModelPositionOutsideModelElement(editor.model, isFormulaWidgetView),\n );\n\n const command = new FormulaXCommand(editor, options);\n editor.commands.add(options.buttonName, command);\n\n editor.ui.componentFactory.add(options.buttonName, (locale: unknown) => {\n const button = new ButtonView(locale as any);\n\n button.set({\n label: options.toolbarText,\n tooltip: options.tooltip,\n withText: true,\n });\n\n button.bind('isEnabled').to(command, 'isEnabled');\n this.listenTo(button, 'execute', () => editor.execute(options.buttonName));\n\n return button;\n });\n }\n}\n\nexport default FormulaX;\n\nfunction applyFormulaPayload(\n editor: any,\n selectedFormula: any,\n payload: FormulaXPayload,\n modelName: string,\n): void {\n editor.model.change((writer: any) => {\n if (selectedFormula) {\n if (!payload.latex.trim()) {\n writer.remove(selectedFormula);\n return;\n }\n\n writer.setAttribute('latex', payload.latex, selectedFormula);\n return;\n }\n\n if (!payload.latex.trim()) return;\n\n const formula = writer.createElement(modelName, {\n latex: payload.latex,\n });\n\n editor.model.insertObject(formula, null, null, { setSelection: 'after' });\n });\n}\n\nfunction hasRegisteredFormulaModelName(editor: any, modelName: string): boolean {\n const schema = editor?.model?.schema;\n\n if (!schema) {\n return false;\n }\n\n if (typeof schema.isRegistered === 'function') {\n return Boolean(schema.isRegistered(modelName));\n }\n\n if (typeof schema.getDefinition === 'function') {\n return Boolean(schema.getDefinition(modelName));\n }\n\n if (schema._sourceDefinitions?.has) {\n return Boolean(schema._sourceDefinitions.has(modelName));\n }\n\n return Boolean(schema._definitions?.[modelName]);\n}\n\nfunction defineFormulaSchema(editor: any, modelName: string): void {\n editor.model.schema.register(modelName, {\n allowWhere: '$text',\n isInline: true,\n isObject: true,\n allowAttributes: ['latex'],\n });\n}\n\nfunction defineFormulaConverters(editor: any, options: RequiredFormulaXCKEditor5Options): void {\n editor.conversion.for('upcast').elementToElement({\n view: {\n name: 'span',\n attributes: {\n [FORMULA_FLAG_ATTRIBUTE]: true,\n },\n },\n model: (viewElement: any, { writer }: any) => writer.createElement(options.name, {\n latex: readFormulaLatexFromView(viewElement, options),\n }),\n });\n\n editor.conversion.for('dataDowncast').elementToElement({\n model: createFormulaConverterModelDefinition(options.name),\n view: (modelElement: any, { writer }: any) => createFormulaRawElement(writer, modelElement, options),\n });\n\n editor.conversion.for('editingDowncast').elementToElement({\n model: createFormulaConverterModelDefinition(options.name),\n view: (modelElement: any, { writer }: any) => {\n const widgetElement = createFormulaWidgetElement(writer, modelElement, options, editor);\n return toWidget(widgetElement, writer, { label: 'FormulaX formula' });\n },\n });\n}\n\nfunction createFormulaConverterModelDefinition(modelName: string): {\n name: string;\n attributes: string[];\n} {\n return {\n name: modelName,\n attributes: ['latex'],\n };\n}\n\nfunction createFormulaRawElement(\n writer: any,\n modelElement: any,\n options: RequiredFormulaXCKEditor5Options,\n): any {\n const latex = String(modelElement.getAttribute('latex') ?? '');\n\n const element = writer.createContainerElement(\n 'span',\n createFormulaViewAttributes(latex, options),\n );\n\n writer.insert(\n writer.createPositionAt(element, 0),\n writer.createText(latex || '\\\\square'),\n );\n\n return element;\n}\n\nfunction createFormulaWidgetElement(\n writer: any,\n modelElement: any,\n options: RequiredFormulaXCKEditor5Options,\n editor: any,\n): any {\n const latex = String(modelElement.getAttribute('latex') ?? '');\n const widgetElement = writer.createContainerElement(\n 'span',\n createFormulaViewAttributes(latex, options),\n );\n const contentElement = writer.createRawElement(\n 'span',\n {\n class: `${options.formulaClassName}__content`,\n 'aria-hidden': 'true',\n },\n (domElement: HTMLElement) => {\n domElement.innerHTML = createFormulaFallbackMarkup(latex, options);\n void renderFormulaIntoElement(domElement, latex, options);\n bindFormulaWidgetDomEvents(domElement, editor, modelElement, options.buttonName);\n },\n );\n\n writer.insert(writer.createPositionAt(widgetElement, 0), contentElement);\n\n return widgetElement;\n}\n\nfunction createFormulaViewAttributes(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Record<string, string> {\n return {\n class: options.formulaClassName,\n [FORMULA_FLAG_ATTRIBUTE]: 'true',\n [options.formulaAttributeName]: latex,\n 'data-latex': latex,\n contenteditable: 'false',\n role: 'button',\n style: `cursor: ${options.cursorStyle}`,\n tabindex: '0',\n };\n}\n\nfunction bindFormulaWidgetDomEvents(\n domElement: HTMLElement,\n editor: any,\n modelElement: any,\n commandName: string,\n): void {\n domElement.onclick = (event) => {\n event.preventDefault();\n selectFormulaModelElement(editor, modelElement);\n };\n\n domElement.ondblclick = (event) => {\n event.preventDefault();\n event.stopPropagation();\n selectFormulaModelElement(editor, modelElement);\n editor.execute(commandName);\n };\n}\n\nfunction selectFormulaModelElement(editor: any, modelElement: any): void {\n if (!modelElement?.is?.('element', 'formulaX')) {\n return;\n }\n\n editor.editing.view.focus();\n editor.model.change((writer: any) => {\n writer.setSelection(modelElement, 'on');\n });\n}\n\nfunction createFormulaFallbackMarkup(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): string {\n const markup = createFormulaMarkup(latex, {\n attributeName: options.formulaAttributeName,\n className: options.formulaClassName,\n });\n return extractInnerHtml(markup);\n}\n\nfunction extractInnerHtml(markup: string): string {\n const wrapper = document.createElement('span');\n wrapper.innerHTML = markup;\n return wrapper.firstElementChild?.innerHTML ?? '';\n}\n\nfunction getSelectedFormulaModelElement(editor: any, modelName: string): any | null {\n const selectedElement = editor.model.document.selection.getSelectedElement();\n return selectedElement?.is?.('element', modelName) ? selectedElement : null;\n}\n\nfunction isFormulaWidgetView(node: any): boolean {\n return Boolean(node?.is?.('element') && node.hasAttribute?.(FORMULA_FLAG_ATTRIBUTE));\n}\n\nfunction readFormulaLatexFromView(viewElement: any, options: RequiredFormulaXCKEditor5Options): string {\n return String(\n viewElement.getAttribute(options.formulaAttributeName)\n ?? viewElement.getAttribute('data-latex')\n ?? '',\n );\n}\n\nconst formulaRenderCache = new Map<string, Promise<string>>();\n\nasync function renderFormulaIntoElement(\n domElement: HTMLElement,\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Promise<void> {\n const trimmedLatex = latex.trim();\n const renderToken = `${trimmedLatex}::${Date.now()}::${Math.random().toString(36).slice(2, 8)}`;\n domElement.dataset.renderToken = renderToken;\n\n if (!trimmedLatex) {\n return;\n }\n\n try {\n const markup = await renderFormulaSvgMarkup(trimmedLatex, options);\n if (domElement.dataset.renderToken !== renderToken) {\n return;\n }\n\n domElement.innerHTML = markup;\n } catch (error) {\n if (domElement.dataset.renderToken !== renderToken) {\n return;\n }\n\n console.error('[FormulaX] Failed to render CKEditor5 formula widget:', error);\n }\n}\n\nfunction renderFormulaSvgMarkup(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Promise<string> {\n const cached = formulaRenderCache.get(latex);\n if (cached) {\n return cached;\n }\n\n const pending = (async () => {\n const host = document.createElement('div');\n host.style.position = 'fixed';\n host.style.left = '-100000px';\n host.style.top = '0';\n host.style.width = '1px';\n host.style.height = '1px';\n host.style.opacity = '0';\n host.style.pointerEvents = 'none';\n host.setAttribute('aria-hidden', 'true');\n document.body.appendChild(host);\n\n const mounted = mountFormulaXEditor(host, {\n initialLatex: latex,\n height: options.editor.height,\n autofocus: false,\n assets: options.editor.assets,\n render: {\n fontsize: options.editor.render.fontsize,\n },\n });\n\n try {\n return await mounted.getRenderHtml();\n } finally {\n mounted.destroy();\n host.remove();\n }\n })();\n\n formulaRenderCache.set(latex, pending);\n pending.catch(() => {\n if (formulaRenderCache.get(latex) === pending) {\n formulaRenderCache.delete(latex);\n }\n });\n return pending;\n}\n","import {\n ensureFormulaXModalStyles,\n escapeAttribute,\n escapeHtml,\n mountFormulaXEditor,\n} from '@formulaxjs/editor';\nimport type { FormulaXPayload, RequiredFormulaXCKEditor5Options } from './types';\n\nexport interface OpenFormulaXModalInput {\n initialLatex: string;\n isUpdate: boolean;\n options: RequiredFormulaXCKEditor5Options;\n}\n\nexport function openFormulaXModal(input: OpenFormulaXModalInput): Promise<FormulaXPayload | null> {\n ensureFormulaXModalStyles(document);\n\n const root = document.createElement('div');\n root.className = 'fx-formula-modal-root';\n root.setAttribute('data-formulax-modal', 'true');\n\n const submitText = input.isUpdate ? input.options.modal.updateText : input.options.modal.insertText;\n\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(input.options.modal.title)}\">\n <header class=\"fx-formula-modal__header\">\n <h2 class=\"fx-formula-modal__title\">${escapeHtml(input.options.modal.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(input.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 return Promise.reject(new Error('[FormulaX] CKEditor 5 modal host not found.'));\n }\n\n const mounted = mountFormulaXEditor(host, {\n initialLatex: input.initialLatex,\n height: input.options.editor.height,\n autofocus: input.options.editor.autofocus,\n assets: input.options.editor.assets,\n render: {\n fontsize: input.options.editor.render.fontsize,\n },\n });\n let closed = false;\n\n return new Promise((resolve) => {\n const close = (payload: FormulaXPayload | null): void => {\n if (closed) return;\n closed = true;\n\n mounted.destroy();\n root.removeEventListener('click', onClick);\n document.removeEventListener('keydown', onKeydown, true);\n root.remove();\n document.body.classList.remove('fx-formula-modal-open');\n resolve(payload);\n };\n\n const submit = async (): Promise<void> => {\n try {\n const latex = await mounted.getLatex();\n close({ latex });\n } catch (error) {\n host.innerHTML = `\n <div class=\"fx-formula-editor-error\">\n Failed to read FormulaX editor content.\n <pre>${escapeHtml(error instanceof Error ? error.message : String(error))}</pre>\n </div>\n `;\n }\n };\n\n function onClick(event: MouseEvent): void {\n const action = (event.target as HTMLElement).closest<HTMLElement>('[data-action]')?.dataset.action;\n if (!action) return;\n\n if (action === 'submit') {\n void submit();\n return;\n }\n\n if (action === 'cancel' || action === 'close') {\n close(null);\n return;\n }\n\n if (action === 'backdrop' && input.options.modal.closeOnBackdrop) {\n close(null);\n }\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n close(null);\n }\n }\n\n root.addEventListener('click', onClick);\n document.addEventListener('keydown', onKeydown, true);\n\n queueMicrotask(() => {\n mounted.root.focus();\n });\n });\n}\n"],"mappings":"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","names":["import_editor","import_editor"]}
|
package/dist/index.global.js
CHANGED
|
@@ -4919,28 +4919,30 @@ var FormulaX = (() => {
|
|
|
4919
4919
|
|
|
4920
4920
|
// ../kity-runtime/src/vendor/legacy-ui-utils.ts
|
|
4921
4921
|
function createLegacyUiUtils() {
|
|
4922
|
-
return
|
|
4923
|
-
ele: createElement,
|
|
4924
|
-
getRectBox,
|
|
4925
|
-
on(target, type, fn) {
|
|
4926
|
-
addEvent(target, type, fn);
|
|
4927
|
-
return this;
|
|
4928
|
-
},
|
|
4929
|
-
delegate(target, selector, type, fn) {
|
|
4930
|
-
delegateEvent(target, selector, type, fn);
|
|
4931
|
-
return this;
|
|
4932
|
-
},
|
|
4933
|
-
publish(topic, ...args) {
|
|
4934
|
-
publish(topic, ...args);
|
|
4935
|
-
},
|
|
4936
|
-
subscribe,
|
|
4937
|
-
getClassList
|
|
4938
|
-
};
|
|
4922
|
+
return legacyUiUtils;
|
|
4939
4923
|
}
|
|
4924
|
+
var legacyUiUtils;
|
|
4940
4925
|
var init_legacy_ui_utils = __esm({
|
|
4941
4926
|
"../kity-runtime/src/vendor/legacy-ui-utils.ts"() {
|
|
4942
4927
|
"use strict";
|
|
4943
4928
|
init_dom_utils();
|
|
4929
|
+
legacyUiUtils = {
|
|
4930
|
+
ele: createElement,
|
|
4931
|
+
getRectBox,
|
|
4932
|
+
on(target, type, fn) {
|
|
4933
|
+
addEvent(target, type, fn);
|
|
4934
|
+
return this;
|
|
4935
|
+
},
|
|
4936
|
+
delegate(target, selector, type, fn) {
|
|
4937
|
+
delegateEvent(target, selector, type, fn);
|
|
4938
|
+
return this;
|
|
4939
|
+
},
|
|
4940
|
+
publish(topic, ...args) {
|
|
4941
|
+
publish(topic, ...args);
|
|
4942
|
+
},
|
|
4943
|
+
subscribe,
|
|
4944
|
+
getClassList
|
|
4945
|
+
};
|
|
4944
4946
|
}
|
|
4945
4947
|
});
|
|
4946
4948
|
|
|
@@ -20263,31 +20265,31 @@ var FormulaX = (() => {
|
|
|
20263
20265
|
};
|
|
20264
20266
|
var parseLatex = (input) => new LatexParser(input).parse();
|
|
20265
20267
|
|
|
20266
|
-
// ../kity-
|
|
20268
|
+
// ../kity-runtime/public/assets/images/toolbar/btn.png
|
|
20267
20269
|
var btn_default = "./btn-5DANP6JY.png";
|
|
20268
20270
|
|
|
20269
|
-
// ../kity-
|
|
20271
|
+
// ../kity-runtime/public/assets/images/toolbar/other.png
|
|
20270
20272
|
var other_default = "./other-OMWJFGL5.png";
|
|
20271
20273
|
|
|
20272
|
-
// ../kity-
|
|
20274
|
+
// ../kity-runtime/public/assets/styles/editor.css?url
|
|
20273
20275
|
var editor_default = "./editor-JT5KLVXX.css?url";
|
|
20274
20276
|
|
|
20275
|
-
// ../kity-
|
|
20277
|
+
// ../kity-runtime/public/resource/KF_AMS_BB.woff
|
|
20276
20278
|
var KF_AMS_BB_default = "./KF_AMS_BB-5QF7FUSO.woff";
|
|
20277
20279
|
|
|
20278
|
-
// ../kity-
|
|
20280
|
+
// ../kity-runtime/public/resource/KF_AMS_CAL.woff
|
|
20279
20281
|
var KF_AMS_CAL_default = "./KF_AMS_CAL-NXRNLAZN.woff";
|
|
20280
20282
|
|
|
20281
|
-
// ../kity-
|
|
20283
|
+
// ../kity-runtime/public/resource/KF_AMS_FRAK.woff
|
|
20282
20284
|
var KF_AMS_FRAK_default = "./KF_AMS_FRAK-CO33WWN4.woff";
|
|
20283
20285
|
|
|
20284
|
-
// ../kity-
|
|
20286
|
+
// ../kity-runtime/public/resource/KF_AMS_MAIN.woff
|
|
20285
20287
|
var KF_AMS_MAIN_default = "./KF_AMS_MAIN-25QJVAWY.woff";
|
|
20286
20288
|
|
|
20287
|
-
// ../kity-
|
|
20289
|
+
// ../kity-runtime/public/resource/KF_AMS_ROMAN.woff
|
|
20288
20290
|
var KF_AMS_ROMAN_default = "./KF_AMS_ROMAN-243BR7HH.woff";
|
|
20289
20291
|
|
|
20290
|
-
// ../kity-
|
|
20292
|
+
// ../kity-runtime/src/asset-manifest.ts
|
|
20291
20293
|
var kityFontAssets = {
|
|
20292
20294
|
KF_AMS_BB: KF_AMS_BB_default,
|
|
20293
20295
|
KF_AMS_CAL: KF_AMS_CAL_default,
|
|
@@ -23805,7 +23807,7 @@ var FormulaX = (() => {
|
|
|
23805
23807
|
kity: runtimeWindow.kity,
|
|
23806
23808
|
otherPosition: legacyOtherPosition,
|
|
23807
23809
|
uiDef: legacyUiDef,
|
|
23808
|
-
uiUtils:
|
|
23810
|
+
uiUtils: legacyUiUtils
|
|
23809
23811
|
};
|
|
23810
23812
|
}
|
|
23811
23813
|
async function ensureKityRuntime() {
|
|
@@ -24244,7 +24246,7 @@ var FormulaX = (() => {
|
|
|
24244
24246
|
style.textContent = formulaXModalStyles;
|
|
24245
24247
|
doc2.head.appendChild(style);
|
|
24246
24248
|
}
|
|
24247
|
-
function
|
|
24249
|
+
function mountFormulaXEditor(root2, options = {}) {
|
|
24248
24250
|
let destroyed = false;
|
|
24249
24251
|
let latestLatex = options.initialLatex ?? "";
|
|
24250
24252
|
let handle = null;
|
|
@@ -45647,7 +45649,7 @@ Original error: ${originalError.name}: ${originalError.message}` : "";
|
|
|
45647
45649
|
}
|
|
45648
45650
|
return clonedNodes;
|
|
45649
45651
|
}
|
|
45650
|
-
function
|
|
45652
|
+
function insertText() {
|
|
45651
45653
|
return (evt, data, conversionApi) => {
|
|
45652
45654
|
if (!conversionApi.consumable.consume(data.item, evt.name)) {
|
|
45653
45655
|
return;
|
|
@@ -55982,7 +55984,7 @@ Original error: ${originalError.name}: ${originalError.message}` : "";
|
|
|
55982
55984
|
schema: model.schema
|
|
55983
55985
|
});
|
|
55984
55986
|
mapper.bindElements(node.root, viewRoot);
|
|
55985
|
-
downcastDispatcher.on("insert:$text",
|
|
55987
|
+
downcastDispatcher.on("insert:$text", insertText());
|
|
55986
55988
|
downcastDispatcher.on("insert", insertAttributesAndChildren(), {
|
|
55987
55989
|
priority: "lowest"
|
|
55988
55990
|
});
|
|
@@ -61939,7 +61941,7 @@ Original error: ${originalError.name}: ${originalError.message}` : "";
|
|
|
61939
61941
|
root2.remove();
|
|
61940
61942
|
return Promise.reject(new Error("[FormulaX] CKEditor 5 modal host not found."));
|
|
61941
61943
|
}
|
|
61942
|
-
const mounted =
|
|
61944
|
+
const mounted = mountFormulaXEditor(host, {
|
|
61943
61945
|
initialLatex: input.initialLatex,
|
|
61944
61946
|
height: input.options.editor.height,
|
|
61945
61947
|
autofocus: input.options.editor.autofocus,
|
|
@@ -62291,7 +62293,7 @@ Original error: ${originalError.name}: ${originalError.message}` : "";
|
|
|
62291
62293
|
host.style.pointerEvents = "none";
|
|
62292
62294
|
host.setAttribute("aria-hidden", "true");
|
|
62293
62295
|
document.body.appendChild(host);
|
|
62294
|
-
const mounted =
|
|
62296
|
+
const mounted = mountFormulaXEditor(host, {
|
|
62295
62297
|
initialLatex: latex,
|
|
62296
62298
|
height: options.editor.height,
|
|
62297
62299
|
autofocus: false,
|