@formulaxjs/ckeditor5 0.3.1 → 0.4.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.
Files changed (46) hide show
  1. package/README.md +24 -21
  2. package/README.zh-CN.md +24 -21
  3. package/dist/base.css +47 -0
  4. package/dist/canvg-runtime-UR3JNX5Q.js +2759 -0
  5. package/dist/canvg-runtime-UR3JNX5Q.js.map +1 -0
  6. package/dist/chunk-4NHESKRD.js +3407 -0
  7. package/dist/chunk-4NHESKRD.js.map +1 -0
  8. package/dist/images/scrollbar/custom/bar-bg.png +0 -0
  9. package/dist/images/scrollbar/custom/bar.png +0 -0
  10. package/dist/images/scrollbar/custom/bg.png +0 -0
  11. package/dist/images/scrollbar/custom/bottom.png +0 -0
  12. package/dist/images/scrollbar/custom/btn.png +0 -0
  13. package/dist/images/scrollbar/custom/down.png +0 -0
  14. package/dist/images/scrollbar/custom/top.png +0 -0
  15. package/dist/images/scrollbar/custom/up.png +0 -0
  16. package/dist/images/scrollbar/edit/bar-bg.png +0 -0
  17. package/dist/images/scrollbar/edit/bar-left.png +0 -0
  18. package/dist/images/scrollbar/edit/bar-right.png +0 -0
  19. package/dist/images/scrollbar/edit/thumb-bg.png +0 -0
  20. package/dist/images/scrollbar/edit/thumb-left.png +0 -0
  21. package/dist/images/scrollbar/edit/thumb-right.png +0 -0
  22. package/dist/images/toolbar/btn.png +0 -0
  23. package/dist/index.cjs +24080 -70
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.global.js +162 -156
  26. package/dist/index.global.js.map +1 -1
  27. package/dist/index.js +3768 -21
  28. package/dist/index.js.map +1 -1
  29. package/dist/install-XGCSWTLU.js +5464 -0
  30. package/dist/install-XGCSWTLU.js.map +1 -0
  31. package/dist/install-XVTKACEN.js +1349 -0
  32. package/dist/install-XVTKACEN.js.map +1 -0
  33. package/dist/other.png +0 -0
  34. package/dist/scrollbar.css +78 -0
  35. package/dist/start-CRRRBVTN.js +4926 -0
  36. package/dist/start-CRRRBVTN.js.map +1 -0
  37. package/dist/ui.css +625 -0
  38. package/package.json +11 -6
  39. /package/dist/{KF_AMS_BB-5QF7FUSO.woff → KF_AMS_BB.woff} +0 -0
  40. /package/dist/{KF_AMS_CAL-NXRNLAZN.woff → KF_AMS_CAL.woff} +0 -0
  41. /package/dist/{KF_AMS_FRAK-CO33WWN4.woff → KF_AMS_FRAK.woff} +0 -0
  42. /package/dist/{KF_AMS_MAIN-25QJVAWY.woff → KF_AMS_MAIN.woff} +0 -0
  43. /package/dist/{KF_AMS_ROMAN-243BR7HH.woff → KF_AMS_ROMAN.woff} +0 -0
  44. /package/dist/{btn-5DANP6JY.png → btn.png} +0 -0
  45. /package/dist/{editor-JT5KLVXX.css → editor.css} +0 -0
  46. /package/dist/{other-OMWJFGL5.png → images/toolbar/other.png} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../kity-runtime/src/vendor/runtime-interop.ts","../../kity-runtime/src/legacy/editor.ts","../../kity-runtime/src/legacy/factory.ts","../../kity-runtime/src/legacy/button.ts","../../kity-runtime/src/legacy/list.ts","../../kity-runtime/src/legacy/box.ts","../../kity-runtime/src/legacy/area.ts","../../kity-runtime/src/legacy/delimiter.ts","../../kity-runtime/src/legacy/dropdown-box.ts","../../kity-runtime/src/legacy/ui-impl.ts","../../kity-runtime/src/legacy/toolbar.ts","../../kity-runtime/src/legacy/scrollbar.ts","../../kity-runtime/src/formula-symbols.ts","../../kity-runtime/src/legacy/toolbar-config.ts","../../kity-runtime/src/legacy/ui.ts","../../kity-runtime/src/legacy/kf-ext-placeholder-operator.ts","../../kity-runtime/src/legacy/kf-ext-placeholder-expression.ts","../../kity-runtime/src/legacy/kf-ext-extension.ts","../../kity-runtime/src/legacy/vgroup-def.ts","../../kity-runtime/src/legacy/parser.ts","../../kity-runtime/src/legacy/render.ts","../../kity-runtime/src/legacy/position.ts","../../kity-runtime/src/legacy/syntax-delete.ts","../../kity-runtime/src/legacy/syntax-move.ts","../../kity-runtime/src/legacy/syntax.ts","../../kity-runtime/src/legacy/input.ts","../../kity-runtime/src/legacy/location.ts","../../kity-runtime/src/legacy/selection.ts","../../kity-runtime/src/legacy/listener.ts","../../kity-runtime/src/legacy/controller.ts","../../kity-runtime/src/legacy/printer.ts","../../kity-runtime/src/boot/start.ts"],"sourcesContent":["import type { LegacyBaseUtils } from './legacy-utils';\r\n\r\ntype LegacyKityCreateClassDefinition = {\r\n base?: unknown;\r\n constructor?: (...args: any[]) => void;\r\n [key: string]: unknown;\r\n};\r\n\r\nexport type LegacyKity = {\r\n Utils: LegacyBaseUtils;\r\n createClass: (name: string, definition: LegacyKityCreateClassDefinition) => any;\r\n};\r\n\r\nexport type LegacyKf = {\r\n ResourceManager: {\r\n ready: (callback: (formula: unknown) => void, options?: { path?: string }) => void;\r\n };\r\n Assembly: new (formula: unknown) => {\r\n formula: unknown;\r\n };\r\n EditorFactory?: unknown;\r\n};\r\n\r\ntype RuntimeWindow = Window &\r\n typeof globalThis & {\r\n __FORMULAX_KITY_RUNTIME__?: {\r\n kf?: unknown;\r\n kity?: unknown;\r\n };\r\n };\r\n\r\nexport function getLegacyRuntime() {\r\n const runtime = (window as RuntimeWindow).__FORMULAX_KITY_RUNTIME__;\r\n\r\n if (!runtime) {\r\n throw new Error('Missing FormulaX legacy runtime');\r\n }\r\n\r\n return runtime;\r\n}\r\n\r\nexport function getLegacyKity(): LegacyKity {\r\n const runtime = getLegacyRuntime();\r\n\r\n if (!runtime.kity) {\r\n throw new Error('Missing FormulaX legacy kity runtime');\r\n }\r\n\r\n return runtime.kity as LegacyKity;\r\n}\r\n\r\nexport function getLegacyKf(): LegacyKf {\r\n const runtime = getLegacyRuntime();\r\n\r\n if (!runtime.kf) {\r\n throw new Error('Missing FormulaX legacy kf runtime');\r\n }\r\n\r\n return runtime.kf as LegacyKf;\r\n}","import { legacyBaseUtils } from '../vendor/legacy-utils';\r\nimport { getLegacyKf, getLegacyKity } from '../vendor/runtime-interop';\r\n\r\nconst defaultOptions = {\r\n formula: {\r\n fontsize: 50,\r\n autoresize: false,\r\n },\r\n ui: {\r\n zoom: true,\r\n maxzoom: 2,\r\n minzoom: 1,\r\n },\r\n};\r\n\r\ntype ComponentConstructor = new (editor: LegacyEditorInstance, options?: unknown) => unknown;\r\n\r\ntype RegisteredService = {\r\n provider: unknown;\r\n key: string;\r\n service: Record<string, (...args: any[]) => unknown>;\r\n};\r\n\r\nexport type LegacyEditorInstance = {\r\n options: typeof defaultOptions & Record<string, any>;\r\n FormulaClass: unknown;\r\n _readyState: boolean;\r\n _callbacks: Array<(editor: LegacyEditorInstance) => void>;\r\n container: HTMLElement;\r\n services: Record<string, RegisteredService>;\r\n commands: Record<\r\n string,\r\n {\r\n executor: unknown;\r\n execFn: (...args: any[]) => unknown;\r\n }\r\n >;\r\n initResource: () => void;\r\n initComponents: () => void;\r\n isReady: () => boolean;\r\n triggerReady: () => void;\r\n ready: (cb: (editor: LegacyEditorInstance) => void) => void;\r\n getContainer: () => HTMLElement;\r\n getDocument: () => Document;\r\n getFormulaClass: () => unknown;\r\n getOptions: () => typeof defaultOptions & Record<string, any>;\r\n requestService: (serviceName: string, ...args: any[]) => unknown;\r\n request: (serviceName: string) => Record<string, (...args: any[]) => unknown>;\r\n registerService: (serviceName: string, provider: unknown, serviceObject: Record<string, (...args: any[]) => unknown>) => void;\r\n registerCommand: (commandName: string, executor: unknown, execFn: (...args: any[]) => unknown) => void;\r\n execCommand: (commandName: string, ...args: any[]) => unknown;\r\n};\r\n\r\nconst components: Record<string, ComponentConstructor> = {};\r\n\r\nfunction getService(this: LegacyEditorInstance, serviceName: string) {\r\n const serviceObject = this.services[serviceName];\r\n\r\n if (!serviceObject) {\r\n throw new Error(`KFEditor: not found service, ${serviceName}`);\r\n }\r\n\r\n return serviceObject;\r\n}\r\n\r\nconst kity = getLegacyKity();\r\nconst kf = getLegacyKf();\r\n\r\nconst KFEditor = kity.createClass('KFEditor', {\r\n constructor(this: LegacyEditorInstance, container: HTMLElement, options?: Record<string, unknown>) {\r\n this.options = legacyBaseUtils.extend(true, {}, defaultOptions, options);\r\n this.FormulaClass = null;\r\n this._readyState = false;\r\n this._callbacks = [];\r\n this.container = container;\r\n this.services = {};\r\n this.commands = {};\r\n this.initResource();\r\n },\r\n\r\n isReady(this: LegacyEditorInstance) {\r\n return !!this._readyState;\r\n },\r\n\r\n triggerReady(this: LegacyEditorInstance) {\r\n let callback: ((editor: LegacyEditorInstance) => void) | undefined;\r\n\r\n while ((callback = this._callbacks.shift())) {\r\n callback.call(this, this);\r\n }\r\n },\r\n\r\n ready(this: LegacyEditorInstance, callback: (editor: LegacyEditorInstance) => void) {\r\n if (this._readyState) {\r\n callback.call(this, this);\r\n return;\r\n }\r\n\r\n this._callbacks.push(callback);\r\n },\r\n\r\n getContainer(this: LegacyEditorInstance) {\r\n return this.container;\r\n },\r\n\r\n getDocument(this: LegacyEditorInstance) {\r\n return this.container.ownerDocument;\r\n },\r\n\r\n getFormulaClass(this: LegacyEditorInstance) {\r\n return this.FormulaClass;\r\n },\r\n\r\n getOptions(this: LegacyEditorInstance) {\r\n return this.options;\r\n },\r\n\r\n initResource(this: LegacyEditorInstance) {\r\n kf.ResourceManager.ready((formula) => {\r\n this.FormulaClass = formula;\r\n this.initComponents();\r\n this._readyState = true;\r\n this.triggerReady();\r\n }, this.options.resource);\r\n },\r\n\r\n initComponents(this: LegacyEditorInstance) {\r\n legacyBaseUtils.each(components, (Component: ComponentConstructor, name: string) => {\r\n new Component(this, this.options[name]);\r\n });\r\n },\r\n\r\n requestService(this: LegacyEditorInstance, serviceName: string, ...args: any[]) {\r\n const serviceObject = getService.call(this, serviceName);\r\n return serviceObject.service[serviceObject.key].apply(serviceObject.provider, args);\r\n },\r\n\r\n request(this: LegacyEditorInstance, serviceName: string) {\r\n return getService.call(this, serviceName).service;\r\n },\r\n\r\n registerService(\r\n this: LegacyEditorInstance,\r\n serviceName: string,\r\n provider: unknown,\r\n serviceObject: Record<string, (...args: any[]) => unknown>,\r\n ) {\r\n let key = '';\r\n\r\n for (const currentKey in serviceObject) {\r\n if (Object.prototype.hasOwnProperty.call(serviceObject, currentKey) && serviceObject[currentKey]) {\r\n serviceObject[currentKey] = legacyBaseUtils.proxy(serviceObject[currentKey], provider);\r\n key = currentKey;\r\n }\r\n }\r\n\r\n this.services[serviceName] = {\r\n provider,\r\n key,\r\n service: serviceObject,\r\n };\r\n },\r\n\r\n registerCommand(this: LegacyEditorInstance, commandName: string, executor: unknown, execFn: (...args: any[]) => unknown) {\r\n this.commands[commandName] = {\r\n executor,\r\n execFn,\r\n };\r\n },\r\n\r\n execCommand(this: LegacyEditorInstance, commandName: string, ...args: any[]) {\r\n const commandObject = this.commands[commandName];\r\n\r\n if (!commandObject) {\r\n throw new Error(`KFEditor: not found command, ${commandName}`);\r\n }\r\n\r\n return commandObject.execFn.apply(commandObject.executor, args);\r\n },\r\n});\r\n\r\nlegacyBaseUtils.extend(KFEditor, {\r\n registerComponents(name: string, component: ComponentConstructor) {\r\n components[name] = component;\r\n },\r\n});\r\n\r\nexport default KFEditor as {\r\n new (container: HTMLElement, options?: Record<string, unknown>): LegacyEditorInstance;\r\n registerComponents: (name: string, component: ComponentConstructor) => void;\r\n};\r\n","import KFEditor, { type LegacyEditorInstance } from './editor';\nimport { getLegacyKity } from '../vendor/runtime-interop';\n\ntype EditorReadyCallback = (this: LegacyEditorInstance, editor: LegacyEditorInstance) => void;\nexport type EditorWrapperHandle = {\n ready: (callback: EditorReadyCallback) => void;\n};\n\nexport type LegacyEditorFactory = {\n create: (container: HTMLElement, options?: Record<string, unknown>) => EditorWrapperHandle;\n};\n\nclass EditorWrapper {\n private readonly callbacks: EditorReadyCallback[] = [];\n readonly editor: LegacyEditorInstance;\n\n constructor(container: HTMLElement, options?: Record<string, unknown>) {\n this.editor = new KFEditor(container, options);\n this.editor.ready(() => {\n this.trigger();\n });\n }\n\n private trigger() {\n const editor = this.editor;\n\n getLegacyKity().Utils.each(this.callbacks, (callback: EditorReadyCallback) => {\n callback.call(editor, editor);\n });\n }\n\n ready(callback: EditorReadyCallback) {\n if (this.editor.isReady()) {\n callback.call(this.editor, this.editor);\n return;\n }\n\n this.callbacks.push(callback);\n }\n}\n\nconst factory: LegacyEditorFactory = {\n create(container: HTMLElement, options?: Record<string, unknown>) {\n return new EditorWrapper(container, options);\n },\n};\n\nexport default factory;\n","import { createLegacyUiUtils } from '../vendor/legacy-ui-utils';\nimport { getLegacyKity } from '../vendor/runtime-interop';\n\ntype ButtonIconPosition = {\n src: string;\n x: number;\n y: number;\n};\n\ntype ButtonOptions = {\n className?: string;\n label?: string;\n sign?: boolean;\n fixOffset?: boolean;\n icon?: string | ButtonIconPosition;\n iconSize?: {\n w?: number;\n h?: number;\n };\n};\n\ntype MountElementLike = {\n setOffset?: (x: number, y: number) => void;\n getPositionInfo: () => DOMRect;\n updateSize?: () => void;\n mountTo: (container: HTMLElement) => void;\n};\n\ntype ToolbarLike = {\n getContainer: () => HTMLElement;\n};\n\ntype ButtonInstance = {\n options: Required<Pick<ButtonOptions, 'iconSize'>> & ButtonOptions;\n eventState: boolean;\n toolbar: ToolbarLike | null;\n displayState: boolean;\n fixOffset: boolean;\n doc: Document;\n element: HTMLDivElement;\n disabled: boolean;\n mountElement: MountElementLike | null;\n icon: HTMLDivElement | null;\n label: HTMLDivElement;\n sign: HTMLDivElement | null;\n mountPoint: HTMLDivElement;\n initEvent: () => void;\n setToolbar: (toolbar: ToolbarLike) => void;\n toggleMountElement: () => void;\n setLabel: (labelText: string) => void;\n toggleSelect: () => void;\n unselect: () => void;\n select: () => void;\n show: () => void;\n hide: () => void;\n showMount: () => void;\n hideMount: () => void;\n getNode: () => HTMLDivElement;\n mount: (element: MountElementLike) => void;\n createButton: () => HTMLDivElement;\n createIcon: () => HTMLDivElement | null;\n createLabel: () => HTMLDivElement;\n createSign: () => HTMLDivElement | null;\n createMountPoint: () => HTMLDivElement;\n disable: () => void;\n enable: () => void;\n mergeElement: () => void;\n};\n\nconst PREFIX = 'kf-editor-ui-';\nconst LIST_OFFSET = 7;\nconst DEFAULT_OPTIONS: Required<Pick<ButtonOptions, 'iconSize'>> = {\n iconSize: {\n w: 32,\n h: 32,\n },\n};\n\nconst $$ = createLegacyUiUtils();\nconst kity = getLegacyKity();\n\nfunction getBackgroundStyle(data: ButtonIconPosition) {\n let style = `url( ${data.src} ) no-repeat `;\n style += `${-data.x}px `;\n style += `${-data.y}px`;\n return style;\n}\n\nconst Button = kity.createClass('Button', {\n constructor(this: ButtonInstance, doc: Document, options: ButtonOptions) {\n this.options = kity.Utils.extend({}, DEFAULT_OPTIONS, options) as ButtonInstance['options'];\n this.eventState = false;\n this.toolbar = null;\n this.displayState = false;\n this.fixOffset = !!options.fixOffset;\n this.doc = doc;\n this.element = this.createButton();\n this.disabled = true;\n this.mountElement = null;\n this.icon = this.createIcon();\n this.label = this.createLabel();\n this.sign = this.createSign();\n this.mountPoint = this.createMountPoint();\n this.mergeElement();\n },\n\n initEvent(this: ButtonInstance) {\n if (this.eventState) {\n return;\n }\n\n this.eventState = true;\n\n $$.on(this.element, 'mousedown', (e: Event & { which?: number }) => {\n e.preventDefault();\n e.stopPropagation();\n\n if ((e.which ?? 1) !== 1 || this.disabled) {\n return;\n }\n\n this.toggleSelect();\n this.toggleMountElement();\n });\n },\n\n setToolbar(this: ButtonInstance, toolbar: ToolbarLike) {\n this.toolbar = toolbar;\n },\n\n toggleMountElement(this: ButtonInstance) {\n if (this.displayState) {\n this.hideMount();\n } else {\n this.showMount();\n }\n },\n\n setLabel(this: ButtonInstance, labelText: string) {\n let signText = '';\n if (this.sign) {\n signText = `<div class=\"${PREFIX}button-sign\"></div>`;\n }\n this.label.innerHTML = `${labelText}${signText}`;\n },\n\n toggleSelect(this: ButtonInstance) {\n $$.getClassList(this.element).toggle(`${PREFIX}button-in`);\n },\n\n unselect(this: ButtonInstance) {\n $$.getClassList(this.element).remove(`${PREFIX}button-in`);\n },\n\n select(this: ButtonInstance) {\n $$.getClassList(this.element).add(`${PREFIX}button-in`);\n },\n\n show(this: ButtonInstance) {\n this.select();\n this.showMount();\n },\n\n hide(this: ButtonInstance) {\n this.unselect();\n this.hideMount();\n },\n\n showMount(this: ButtonInstance) {\n this.displayState = true;\n this.mountPoint.style.display = 'block';\n\n if (this.fixOffset && this.mountElement?.setOffset) {\n const elementRect = this.element.getBoundingClientRect();\n this.mountElement.setOffset(elementRect.left + LIST_OFFSET, elementRect.bottom);\n }\n\n const editorContainer = this.toolbar?.getContainer();\n if (!editorContainer || !this.mountElement) {\n return;\n }\n\n const containerBox = $$.getRectBox(editorContainer);\n const mountEleBox = this.mountElement.getPositionInfo();\n\n if (mountEleBox.right > containerBox.right) {\n const currentBox = $$.getRectBox(this.element);\n this.mountPoint.style.left = `${currentBox.right - mountEleBox.right - 1}px`;\n }\n\n this.mountElement.updateSize?.();\n },\n\n hideMount(this: ButtonInstance) {\n this.displayState = false;\n this.mountPoint.style.display = 'none';\n },\n\n getNode(this: ButtonInstance) {\n return this.element;\n },\n\n mount(this: ButtonInstance, element: MountElementLike) {\n this.mountElement = element;\n element.mountTo(this.mountPoint);\n },\n\n createButton(this: ButtonInstance) {\n const buttonNode = $$.ele(this.doc, 'div', {\n className: `${PREFIX}button`,\n }) as HTMLDivElement;\n\n if (this.options.className) {\n buttonNode.className += ` ${PREFIX}${this.options.className}`;\n }\n\n return buttonNode;\n },\n\n createIcon(this: ButtonInstance) {\n if (!this.options.icon) {\n return null;\n }\n\n const iconNode = $$.ele(this.doc, 'div', {\n className: `${PREFIX}button-icon`,\n }) as HTMLDivElement;\n\n if (typeof this.options.icon === 'string') {\n iconNode.style.backgroundImage = `url(${this.options.icon}) no-repeat`;\n } else {\n iconNode.style.background = getBackgroundStyle(this.options.icon);\n }\n\n if (this.options.iconSize.w) {\n iconNode.style.width = `${this.options.iconSize.w}px`;\n }\n\n if (this.options.iconSize.h) {\n iconNode.style.height = `${this.options.iconSize.h}px`;\n }\n\n return iconNode;\n },\n\n createLabel(this: ButtonInstance) {\n return $$.ele(this.doc, 'div', {\n className: `${PREFIX}button-label`,\n content: this.options.label,\n }) as HTMLDivElement;\n },\n\n createSign(this: ButtonInstance) {\n if (this.options.sign === false) {\n return null;\n }\n\n return $$.ele(this.doc, 'div', {\n className: `${PREFIX}button-sign`,\n }) as HTMLDivElement;\n },\n\n createMountPoint(this: ButtonInstance) {\n return $$.ele(this.doc, 'div', {\n className: `${PREFIX}button-mount-point`,\n }) as HTMLDivElement;\n },\n\n disable(this: ButtonInstance) {\n this.disabled = true;\n $$.getClassList(this.element).remove(`${PREFIX}enabled`);\n },\n\n enable(this: ButtonInstance) {\n this.disabled = false;\n $$.getClassList(this.element).add(`${PREFIX}enabled`);\n },\n\n mergeElement(this: ButtonInstance) {\n if (this.icon) {\n this.element.appendChild(this.icon);\n }\n this.element.appendChild(this.label);\n if (this.sign) {\n this.label.appendChild(this.sign);\n }\n this.element.appendChild(this.mountPoint);\n },\n});\n\nexport default Button as new (doc: Document, options: ButtonOptions) => ButtonInstance;\n","import { createLegacyUiUtils } from '../vendor/legacy-ui-utils';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\n\r\ntype ListOptions = {\r\n width?: number;\r\n items: string[];\r\n};\r\n\r\ntype ListItemGroups = {\r\n container: HTMLDivElement;\r\n items: HTMLDivElement[];\r\n};\r\n\r\ntype ListInstance = {\r\n options: ListOptions;\r\n doc: Document;\r\n onselectHandler: (index: number, oldIndex: number) => void;\r\n currentSelect: number;\r\n element: HTMLDivElement;\r\n itemGroups: ListItemGroups;\r\n setSelectHandler: (selectHandler: (index: number, oldIndex: number) => void) => void;\r\n createBox: () => HTMLDivElement;\r\n select: (index: number) => void;\r\n unselect: (index: number) => void;\r\n setOffset: (x: number, y: number) => void;\r\n initEvent: () => void;\r\n getPositionInfo: () => DOMRect;\r\n createItems: () => ListItemGroups;\r\n mergeElement: () => void;\r\n mountTo: (container: HTMLElement) => void;\r\n};\r\n\r\nconst PREFIX = 'kf-editor-ui-';\r\nconst $$ = createLegacyUiUtils();\r\nconst kity = getLegacyKity();\r\n\r\nconst List = kity.createClass('List', {\r\n constructor(this: ListInstance, doc: Document, options: ListOptions) {\r\n this.options = options;\r\n this.doc = doc;\r\n this.onselectHandler = function () {};\r\n this.currentSelect = -1;\r\n this.element = this.createBox();\r\n this.itemGroups = this.createItems();\r\n this.mergeElement();\r\n },\r\n\r\n setSelectHandler(this: ListInstance, selectHandler: (index: number, oldIndex: number) => void) {\r\n this.onselectHandler = selectHandler;\r\n },\r\n\r\n createBox(this: ListInstance) {\r\n const boxNode = $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}list`,\r\n }) as HTMLDivElement;\r\n const bgNode = $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}list-bg`,\r\n }) as HTMLDivElement;\r\n\r\n if ('width' in this.options && this.options.width !== undefined) {\r\n boxNode.style.width = `${this.options.width}px`;\r\n }\r\n\r\n boxNode.appendChild(bgNode);\r\n return boxNode;\r\n },\r\n\r\n select(this: ListInstance, index: number) {\r\n let oldSelect = this.currentSelect;\r\n\r\n if (oldSelect === -1) {\r\n oldSelect = index;\r\n }\r\n\r\n this.unselect(oldSelect);\r\n this.currentSelect = index;\r\n $$.getClassList(this.itemGroups.items[index]).add(`${PREFIX}list-item-select`);\r\n this.onselectHandler(index, oldSelect);\r\n },\r\n\r\n unselect(this: ListInstance, index: number) {\r\n if (!this.itemGroups.items[index]) {\r\n return;\r\n }\r\n\r\n $$.getClassList(this.itemGroups.items[index]).remove(`${PREFIX}list-item-select`);\r\n },\r\n\r\n setOffset(this: ListInstance, x: number, y: number) {\r\n this.element.style.left = `${x}px`;\r\n this.element.style.top = `${y}px`;\r\n },\r\n\r\n initEvent(this: ListInstance) {\r\n const className = `.${PREFIX}list-item`;\r\n const self = this;\r\n\r\n $$.delegate(this.itemGroups.container, className, 'mousedown', function (this: Element, e: Event & { which?: number }) {\r\n e.preventDefault();\r\n\r\n if ((e.which ?? 1) !== 1) {\r\n return;\r\n }\r\n\r\n const index = Number(this.getAttribute('data-index'));\r\n if (!Number.isNaN(index)) {\r\n self.select(index);\r\n }\r\n } as unknown as (event: Event) => void);\r\n\r\n $$.on(this.element, 'mousedown', (e: Event) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n });\r\n },\r\n\r\n getPositionInfo(this: ListInstance) {\r\n return $$.getRectBox(this.element);\r\n },\r\n\r\n createItems(this: ListInstance) {\r\n const doc = this.doc;\r\n const groupNode = $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}list-item`,\r\n }) as HTMLDivElement;\r\n const itemContainer = groupNode.cloneNode(false) as HTMLDivElement;\r\n const items: HTMLDivElement[] = [];\r\n\r\n itemContainer.className = `${PREFIX}list-item-container`;\r\n\r\n kity.Utils.each(this.options.items, (itemText: string, i: number) => {\r\n const itemNode = groupNode.cloneNode(false) as HTMLDivElement;\r\n const iconNode = groupNode.cloneNode(false) as HTMLDivElement;\r\n iconNode.className = `${PREFIX}list-item-icon`;\r\n\r\n itemNode.appendChild(iconNode);\r\n itemNode.appendChild($$.ele(doc, 'text', itemText) as Node);\r\n itemNode.setAttribute('data-index', String(i));\r\n\r\n items.push(itemNode);\r\n itemContainer.appendChild(itemNode);\r\n });\r\n\r\n return {\r\n container: itemContainer,\r\n items,\r\n };\r\n },\r\n\r\n mergeElement(this: ListInstance) {\r\n this.element.appendChild(this.itemGroups.container);\r\n },\r\n\r\n mountTo(this: ListInstance, container: HTMLElement) {\r\n container.appendChild(this.element);\r\n },\r\n});\r\n\r\nexport default List as new (doc: Document, options: ListOptions) => ListInstance;\r\n","import { legacyBoxType } from '../vendor/legacy-box-type';\r\nimport { legacyItemType } from '../vendor/legacy-item-type';\r\nimport { createLegacyUiUtils } from '../vendor/legacy-ui-utils';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\nimport Button from './button';\r\nimport List from './list';\r\n\r\ntype BoxItemImage = {\r\n img: string;\r\n pos: { x: number; y: number };\r\n size?: { width: number; height: number };\r\n val?: string;\r\n key?: string;\r\n label?: string;\r\n item?: BoxItemImage & { val: string };\r\n unicode?: string;\r\n unicodeFont?: string;\r\n};\r\n\r\ntype BoxContentGroup = {\r\n title?: string;\r\n items: Array<{\r\n title: string;\r\n content: BoxItemImage[];\r\n }>;\r\n};\r\n\r\ntype OverlapListConfig = {\r\n width: number;\r\n items: string[];\r\n};\r\n\r\ntype BoxOptions = {\r\n width?: number;\r\n type?: number | string;\r\n fixOffset?: boolean;\r\n group: BoxContentGroup[];\r\n};\r\n\r\ntype BoxItemInstance = {\r\n type: number | string;\r\n doc: Document;\r\n options: BoxItemImage;\r\n element: HTMLDivElement;\r\n labelNode?: HTMLDivElement;\r\n contentNode: HTMLDivElement;\r\n getNode: () => HTMLDivElement;\r\n createItem: () => HTMLDivElement;\r\n createLabel: () => HTMLDivElement | undefined;\r\n getContent: () => void;\r\n createContent: () => HTMLDivElement;\r\n createBigContent: () => HTMLDivElement;\r\n createSmallContent: () => HTMLDivElement;\r\n mergeElement: () => void;\r\n appendTo: (container: HTMLElement) => void;\r\n};\r\n\r\ntype BoxGroupResult = {\r\n title: string[];\r\n items: HTMLDivElement[][];\r\n};\r\n\r\ntype BoxInstance = {\r\n options: BoxOptions;\r\n toolbar: unknown;\r\n doc: Document;\r\n itemPanels: HTMLDivElement[] | null;\r\n overlapButtonObject: InstanceType<typeof Button> | null;\r\n overlapIndex: number;\r\n element: HTMLDivElement;\r\n groupContainer: HTMLDivElement;\r\n itemGroups: HTMLDivElement[] | null;\r\n onselectHandler?: (value: string | null) => void;\r\n onchangeHandler: (index: number) => void;\r\n createBox: () => HTMLDivElement;\r\n setToolbar: (toolbar: unknown) => void;\r\n updateSize: () => void;\r\n initEvent: () => void;\r\n getNode: () => HTMLDivElement;\r\n setSelectHandler: (onselectHandler: (value: string | null) => void) => void;\r\n scroll: (delta: number) => void;\r\n scrollDown: () => void;\r\n scrollUp: () => void;\r\n setChangeHandler: (changeHandler: (index: number) => void) => void;\r\n createGroupContainer: () => HTMLDivElement;\r\n getPositionInfo: () => DOMRect;\r\n createItemGroup: () => HTMLDivElement[] | null;\r\n enable: () => void;\r\n disable: () => void;\r\n hide: () => void;\r\n getOverlapContent: () => BoxContentGroup['items'] | null;\r\n createOverlapGroup: (itemGroup: BoxGroupResult) => HTMLDivElement[];\r\n getCurrentItemPanel: () => HTMLDivElement;\r\n getGroupList: () => OverlapListConfig;\r\n createGroup: () => BoxGroupResult;\r\n mergeElement: () => void;\r\n mountTo: (container: HTMLElement) => void;\r\n appendTo: (container: HTMLElement) => void;\r\n};\r\n\r\nconst kity = getLegacyKity();\r\nconst $$ = createLegacyUiUtils();\r\nconst PREFIX = 'kf-editor-ui-';\r\nconst BOX_TYPE = legacyBoxType;\r\nconst ITEM_TYPE = legacyItemType;\r\nconst SCROLL_STEP = 20;\r\n\r\nfunction getViewportBox(doc: Document) {\r\n const view = doc.documentElement;\r\n\r\n return {\r\n top: 0,\r\n left: 0,\r\n right: view.clientWidth,\r\n bottom: view.clientHeight,\r\n width: view.clientWidth,\r\n height: view.clientHeight,\r\n };\r\n}\r\n\r\nfunction getStyleByData(data: BoxItemImage & { size: { width: number; height: number } }) {\r\n let style = `background: url( ${data.img} ) no-repeat `;\r\n style += `${-data.pos.x}px `;\r\n style += `${-data.pos.y}px;`;\r\n style += ` width: ${data.size.width}px;`;\r\n style += ` height: ${data.size.height}px;`;\r\n return style;\r\n}\r\n\r\nfunction createItems(doc: Document, group: BoxItemImage[], type: number | string) {\r\n const items: BoxItemInstance[] = [];\r\n\r\n kity.Utils.each(group, (itemVal: BoxItemImage) => {\r\n items.push(new (BoxItem as any)(type, doc, itemVal));\r\n });\r\n\r\n return items;\r\n}\r\n\r\nfunction createOverlapContainer(doc: Document) {\r\n return $$.ele(doc, 'div', {\r\n className: `${PREFIX}overlap-container`,\r\n }) as HTMLDivElement;\r\n}\r\n\r\nfunction createOverlapButton(doc: Document, options: { fixOffset?: boolean }) {\r\n return new Button(doc, {\r\n className: 'overlap-button',\r\n label: '',\r\n fixOffset: options.fixOffset,\r\n });\r\n}\r\n\r\nfunction createOverlapList(doc: Document, list: OverlapListConfig) {\r\n return new List(doc, list);\r\n}\r\n\r\nconst BoxItem = kity.createClass('BoxItem', {\r\n constructor(this: BoxItemInstance, type: number | string, doc: Document, options: BoxItemImage) {\r\n this.type = type;\r\n this.doc = doc;\r\n this.options = options;\r\n this.element = this.createItem();\r\n this.labelNode = this.createLabel();\r\n this.contentNode = this.createContent();\r\n this.mergeElement();\r\n },\r\n\r\n getNode(this: BoxItemInstance) {\r\n return this.element;\r\n },\r\n\r\n createItem(this: BoxItemInstance) {\r\n return $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}box-item`,\r\n }) as HTMLDivElement;\r\n },\r\n\r\n createLabel(this: BoxItemInstance) {\r\n if (!('label' in this.options)) {\r\n return undefined;\r\n }\r\n\r\n return $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}box-item-label`,\r\n content: this.options.label,\r\n }) as HTMLDivElement;\r\n },\r\n\r\n getContent(this: BoxItemInstance) {},\r\n\r\n createContent(this: BoxItemInstance) {\r\n switch (this.type) {\r\n case ITEM_TYPE.BIG:\r\n return this.createBigContent();\r\n case ITEM_TYPE.SMALL:\r\n return this.createSmallContent();\r\n default:\r\n return this.createSmallContent();\r\n }\r\n },\r\n\r\n createBigContent(this: BoxItemInstance) {\r\n const contentNode = $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}box-item-content`,\r\n }) as HTMLDivElement;\r\n const cls = `${PREFIX}box-item-val`;\r\n const tmpContent = this.options.item as BoxItemImage & { val: string; size: { width: number; height: number } };\r\n const tmpNode = $$.ele(this.doc, 'div', {\r\n className: cls,\r\n }) as HTMLDivElement;\r\n const styleStr = getStyleByData(tmpContent);\r\n\r\n tmpNode.innerHTML = `<div class=\"${PREFIX}item-image\" style=\"${styleStr}\"></div>`;\r\n this.element.setAttribute('data-value', tmpContent.val);\r\n contentNode.appendChild(tmpNode);\r\n return contentNode;\r\n },\r\n\r\n createSmallContent(this: BoxItemInstance) {\r\n const contentNode = $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}box-item-content`,\r\n }) as HTMLDivElement;\r\n const cls = `${PREFIX}box-item-val`;\r\n const tmpContent = this.options;\r\n\r\n if (tmpContent.unicode) {\r\n const tmpNode = $$.ele(this.doc, 'span', {\r\n className: `${PREFIX}box-item-text`,\r\n content: tmpContent.unicode,\r\n }) as HTMLSpanElement;\r\n\r\n if (tmpContent.unicodeFont) {\r\n tmpNode.style.fontFamily = tmpContent.unicodeFont as string;\r\n }\r\n\r\n if (tmpContent.key) {\r\n this.element.setAttribute('data-value', tmpContent.key);\r\n }\r\n contentNode.appendChild(tmpNode);\r\n return contentNode;\r\n }\r\n\r\n const tmpNode = $$.ele(this.doc, 'div', {\r\n className: cls,\r\n }) as HTMLDivElement;\r\n\r\n tmpNode.style.background = `url( ${tmpContent.img} )`;\r\n tmpNode.style.backgroundPosition = `${-tmpContent.pos.x}px ${-tmpContent.pos.y}px`;\r\n if (tmpContent.key) {\r\n this.element.setAttribute('data-value', tmpContent.key);\r\n }\r\n contentNode.appendChild(tmpNode);\r\n return contentNode;\r\n },\r\n\r\n mergeElement(this: BoxItemInstance) {\r\n if (this.labelNode) {\r\n this.element.appendChild(this.labelNode);\r\n }\r\n this.element.appendChild(this.contentNode);\r\n },\r\n\r\n appendTo(this: BoxItemInstance, container: HTMLElement) {\r\n container.appendChild(this.element);\r\n },\r\n});\r\n\r\nconst Box = kity.createClass('Box', {\r\n constructor(this: BoxInstance, doc: Document, options: BoxOptions) {\r\n this.options = options;\r\n this.toolbar = null;\r\n this.options.type = this.options.type || BOX_TYPE.DETACHED;\r\n this.doc = doc;\r\n this.itemPanels = null;\r\n this.overlapButtonObject = null;\r\n this.overlapIndex = -1;\r\n this.onchangeHandler = function () {};\r\n this.element = this.createBox();\r\n this.groupContainer = this.createGroupContainer();\r\n this.itemGroups = this.createItemGroup();\r\n this.mergeElement();\r\n },\r\n\r\n createBox(this: BoxInstance) {\r\n const boxNode = $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}box`,\r\n }) as HTMLDivElement;\r\n\r\n if ('width' in this.options && this.options.width !== undefined) {\r\n boxNode.style.width = `${this.options.width}px`;\r\n }\r\n\r\n return boxNode;\r\n },\r\n\r\n setToolbar(this: BoxInstance, toolbar: unknown) {\r\n this.toolbar = toolbar;\r\n if (this.overlapButtonObject) {\r\n this.overlapButtonObject.setToolbar(toolbar as any);\r\n }\r\n },\r\n\r\n updateSize(this: BoxInstance) {\r\n const containerBox = getViewportBox(this.doc);\r\n const diff = 30;\r\n const curBox = $$.getRectBox(this.element);\r\n\r\n if (this.options.type === BOX_TYPE.DETACHED) {\r\n if (curBox.bottom <= containerBox.bottom) {\r\n this.element.scrollTop = 0;\r\n return;\r\n }\r\n\r\n this.element.style.height = `${curBox.height - (curBox.bottom - containerBox.bottom + diff)}px`;\r\n return;\r\n }\r\n\r\n const panel = this.getCurrentItemPanel();\r\n panel.scrollTop = 0;\r\n\r\n if (curBox.bottom <= containerBox.bottom) {\r\n return;\r\n }\r\n\r\n const panelRect = $$.getRectBox(panel);\r\n panel.style.height = `${containerBox.bottom - panelRect.top - diff}px`;\r\n },\r\n\r\n initEvent(this: BoxInstance) {\r\n const className = `.${PREFIX}box-item`;\r\n const self = this;\r\n\r\n $$.delegate(this.groupContainer, className, 'mousedown', function (this: Element, e: Event & { which?: number }) {\r\n e.preventDefault();\r\n\r\n if ((e.which ?? 1) !== 1) {\r\n return;\r\n }\r\n\r\n self.onselectHandler?.(this.getAttribute('data-value'));\r\n } as unknown as (event: Event) => void);\r\n\r\n $$.on(this.element, 'mousedown', (e: Event) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n });\r\n\r\n $$.on(this.element, 'mousewheel', (e: Event & { wheelDelta?: number }) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.scroll(e.wheelDelta ?? 0);\r\n });\r\n },\r\n\r\n getNode(this: BoxInstance) {\r\n return this.element;\r\n },\r\n\r\n setSelectHandler(this: BoxInstance, onselectHandler: (value: string | null) => void) {\r\n this.onselectHandler = onselectHandler;\r\n },\r\n\r\n scroll(this: BoxInstance, delta: number) {\r\n if (delta < 0) {\r\n this.scrollDown();\r\n return;\r\n }\r\n\r\n if (delta > 0) {\r\n this.scrollUp();\r\n }\r\n },\r\n\r\n scrollDown(this: BoxInstance) {\r\n if (this.options.type === BOX_TYPE.DETACHED) {\r\n this.element.scrollTop += SCROLL_STEP;\r\n } else {\r\n this.getCurrentItemPanel().scrollTop += SCROLL_STEP;\r\n }\r\n },\r\n\r\n scrollUp(this: BoxInstance) {\r\n if (this.options.type === BOX_TYPE.DETACHED) {\r\n this.element.scrollTop -= SCROLL_STEP;\r\n } else {\r\n this.getCurrentItemPanel().scrollTop -= SCROLL_STEP;\r\n }\r\n },\r\n\r\n setChangeHandler(this: BoxInstance, changeHandler: (index: number) => void) {\r\n this.onchangeHandler = changeHandler;\r\n },\r\n\r\n createGroupContainer(this: BoxInstance) {\r\n return $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}box-container`,\r\n }) as HTMLDivElement;\r\n },\r\n\r\n getPositionInfo(this: BoxInstance) {\r\n return $$.getRectBox(this.element);\r\n },\r\n\r\n createItemGroup(this: BoxInstance) {\r\n const itemGroup = this.createGroup();\r\n\r\n switch (this.options.type) {\r\n case BOX_TYPE.DETACHED:\r\n return itemGroup.items[0];\r\n case BOX_TYPE.OVERLAP:\r\n return this.createOverlapGroup(itemGroup);\r\n default:\r\n return null;\r\n }\r\n },\r\n\r\n enable(this: BoxInstance) {\r\n this.overlapButtonObject?.enable();\r\n },\r\n\r\n disable(this: BoxInstance) {\r\n this.overlapButtonObject?.disable();\r\n },\r\n\r\n hide(this: BoxInstance) {\r\n this.overlapButtonObject?.hideMount();\r\n },\r\n\r\n getOverlapContent(this: BoxInstance) {\r\n if (this.options.type !== BOX_TYPE.OVERLAP || this.overlapIndex < 0) {\r\n return null;\r\n }\r\n\r\n return this.options.group[this.overlapIndex].items;\r\n },\r\n\r\n createOverlapGroup(this: BoxInstance, itemGroup: BoxGroupResult) {\r\n const classifyList = itemGroup.title;\r\n const overlapContainer = createOverlapContainer(this.doc);\r\n const overlapButtonObject = createOverlapButton(this.doc, {\r\n fixOffset: this.options.fixOffset,\r\n });\r\n const overlapListObject = createOverlapList(this.doc, {\r\n width: 150,\r\n items: classifyList,\r\n });\r\n const wrapNode = $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}wrap-group`,\r\n }) as HTMLDivElement;\r\n\r\n this.overlapButtonObject = overlapButtonObject;\r\n overlapButtonObject.mount(overlapListObject as any);\r\n overlapButtonObject.initEvent();\r\n overlapListObject.initEvent();\r\n\r\n kity.Utils.each(itemGroup.items, (itemArr: HTMLDivElement[], index: number) => {\r\n const itemWrapNode = wrapNode.cloneNode(false) as HTMLDivElement;\r\n\r\n kity.Utils.each(itemArr, (item: HTMLDivElement) => {\r\n itemWrapNode.appendChild(item);\r\n });\r\n\r\n itemGroup.items[index] = itemWrapNode as unknown as HTMLDivElement[];\r\n });\r\n\r\n this.itemPanels = itemGroup.items as unknown as HTMLDivElement[];\r\n\r\n overlapListObject.setSelectHandler((index: number, oldIndex: number) => {\r\n this.overlapIndex = index;\r\n overlapButtonObject.setLabel(classifyList[index]);\r\n overlapButtonObject.hideMount();\r\n (itemGroup.items[oldIndex] as unknown as HTMLDivElement).style.display = 'none';\r\n (itemGroup.items[index] as unknown as HTMLDivElement).style.display = 'block';\r\n\r\n if (index !== oldIndex) {\r\n this.updateSize();\r\n }\r\n\r\n this.onchangeHandler(index);\r\n });\r\n\r\n overlapContainer.appendChild(overlapButtonObject.getNode());\r\n\r\n kity.Utils.each(itemGroup.items, (group: unknown, index: number) => {\r\n const groupNode = group as HTMLDivElement;\r\n\r\n if (index > 0) {\r\n groupNode.style.display = 'none';\r\n }\r\n\r\n overlapContainer.appendChild(groupNode);\r\n });\r\n\r\n overlapListObject.select(0);\r\n\r\n return [overlapContainer];\r\n },\r\n\r\n getCurrentItemPanel(this: BoxInstance) {\r\n return this.itemPanels![this.overlapIndex];\r\n },\r\n\r\n getGroupList(this: BoxInstance) {\r\n const lists: string[] = [];\r\n\r\n kity.Utils.each(this.options.group, (group: BoxContentGroup) => {\r\n lists.push(group.title || '');\r\n });\r\n\r\n return {\r\n width: 150,\r\n items: lists,\r\n };\r\n },\r\n\r\n createGroup(this: BoxInstance) {\r\n const doc = this.doc;\r\n const result: BoxGroupResult = {\r\n title: [],\r\n items: [],\r\n };\r\n const baseGroupNode = $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}box-group`,\r\n }) as HTMLDivElement;\r\n const baseItemContainer = baseGroupNode.cloneNode(false) as HTMLDivElement;\r\n baseItemContainer.className = `${PREFIX}box-group-item-container`;\r\n const itemType = BOX_TYPE.DETACHED === this.options.type ? ITEM_TYPE.BIG : ITEM_TYPE.SMALL;\r\n\r\n kity.Utils.each(this.options.group, (group: BoxContentGroup) => {\r\n result.title.push(group.title || '');\r\n const itemGroup: HTMLDivElement[] = [];\r\n\r\n kity.Utils.each(group.items, (item: { title: string; content: BoxItemImage[] }) => {\r\n const groupNode = baseGroupNode.cloneNode(false) as HTMLDivElement;\r\n const itemContainer = baseItemContainer.cloneNode(false) as HTMLDivElement;\r\n const groupTitle = $$.ele(doc, 'div', {\r\n className: `${PREFIX}box-group-title`,\r\n content: item.title,\r\n }) as HTMLDivElement;\r\n\r\n groupNode.appendChild(groupTitle);\r\n groupNode.appendChild(itemContainer);\r\n\r\n kity.Utils.each(createItems(doc, item.content, itemType), (boxItem: BoxItemInstance) => {\r\n boxItem.appendTo(itemContainer);\r\n });\r\n\r\n itemGroup.push(groupNode);\r\n });\r\n\r\n result.items.push(itemGroup);\r\n });\r\n\r\n return result;\r\n },\r\n\r\n mergeElement(this: BoxInstance) {\r\n const groupContainer = this.groupContainer;\r\n this.element.appendChild(groupContainer);\r\n\r\n kity.Utils.each(this.itemGroups, (group: HTMLDivElement) => {\r\n groupContainer.appendChild(group);\r\n });\r\n },\r\n\r\n mountTo(this: BoxInstance, container: HTMLElement) {\r\n container.appendChild(this.element);\r\n },\r\n\r\n appendTo(this: BoxInstance, container: HTMLElement) {\r\n container.appendChild(this.element);\r\n },\r\n});\r\n\r\nexport default Box as new (doc: Document, options: BoxOptions) => BoxInstance;\r\n","import { createLegacyUiUtils } from '../vendor/legacy-ui-utils';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\nimport Box from './box';\r\n\r\ntype AreaOptions = {\r\n width?: number;\r\n box: Record<string, any>;\r\n};\r\n\r\ntype ToolbarLike = {\r\n notify: (type: string, exception?: unknown) => void;\r\n};\r\n\r\ntype AreaInstance = {\r\n options: AreaOptions;\r\n doc: Document;\r\n toolbar: ToolbarLike | null;\r\n disabled: boolean;\r\n panelIndex: number;\r\n maxPanelIndex: number;\r\n currentItemCount: number;\r\n lineMaxCount: number;\r\n element: HTMLDivElement;\r\n container: HTMLDivElement;\r\n panel: HTMLDivElement;\r\n buttonContainer: HTMLDivElement;\r\n button: HTMLDivElement;\r\n mountPoint: HTMLDivElement;\r\n moveDownButton: HTMLDivElement;\r\n moveUpButton: HTMLDivElement;\r\n disabledUp?: boolean;\r\n disabledDown?: boolean;\r\n boxObject: InstanceType<typeof Box>;\r\n initEvent: () => void;\r\n disable: () => void;\r\n enable: () => void;\r\n setListener: () => void;\r\n createArea: () => HTMLDivElement;\r\n checkMaxPanelIndex: () => void;\r\n updateContent: () => void;\r\n mount: () => void;\r\n showMount: () => void;\r\n hideMount: () => void;\r\n hide: () => void;\r\n createButton: () => HTMLDivElement;\r\n createMoveDownButton: () => HTMLDivElement;\r\n createMoveUpButton: () => HTMLDivElement;\r\n createMountPoint: () => HTMLDivElement;\r\n createBox: () => InstanceType<typeof Box>;\r\n createContainer: () => HTMLDivElement;\r\n createPanel: () => HTMLDivElement;\r\n createButtonContainer: () => HTMLDivElement;\r\n mergeElement: () => void;\r\n disablePanelUp: () => void;\r\n enablePanelUp: () => void;\r\n disablePanelDown: () => void;\r\n enablePanelDown: () => void;\r\n updatePanelButtonState: () => void;\r\n nextPanel: () => void;\r\n prevPanel: () => void;\r\n setToolbar: (toolbar: ToolbarLike) => void;\r\n attachTo: (container: HTMLElement) => void;\r\n};\r\n\r\nconst PREFIX = 'kf-editor-ui-';\r\nconst PANEL_HEIGHT = 66;\r\nconst $$ = createLegacyUiUtils();\r\nconst kity = getLegacyKity();\r\n\r\nconst Area = kity.createClass('Area', {\r\n constructor(this: AreaInstance, doc: Document, options: AreaOptions) {\r\n this.options = options;\r\n this.doc = doc;\r\n this.toolbar = null;\r\n this.disabled = true;\r\n this.panelIndex = 0;\r\n this.maxPanelIndex = 0;\r\n this.currentItemCount = 0;\r\n this.lineMaxCount = 9;\r\n this.element = this.createArea();\r\n this.container = this.createContainer();\r\n this.panel = this.createPanel();\r\n this.buttonContainer = this.createButtonContainer();\r\n this.button = this.createButton();\r\n this.mountPoint = this.createMountPoint();\r\n this.moveDownButton = this.createMoveDownButton();\r\n this.moveUpButton = this.createMoveUpButton();\r\n this.boxObject = this.createBox();\r\n this.mergeElement();\r\n this.mount();\r\n this.setListener();\r\n this.initEvent();\r\n },\r\n\r\n initEvent(this: AreaInstance) {\r\n const self = this;\r\n\r\n $$.on(this.button, 'mousedown', (e: Event & { which?: number }) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if ((e.which ?? 1) !== 1 || this.disabled) {\r\n return;\r\n }\r\n\r\n this.showMount();\r\n this.toolbar?.notify('closeOther', this);\r\n });\r\n\r\n $$.on(this.moveDownButton, 'mousedown', (e: Event & { which?: number }) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if ((e.which ?? 1) !== 1 || this.disabled) {\r\n return;\r\n }\r\n\r\n this.nextPanel();\r\n this.toolbar?.notify('closeOther', this);\r\n });\r\n\r\n $$.on(this.moveUpButton, 'mousedown', (e: Event & { which?: number }) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if ((e.which ?? 1) !== 1 || this.disabled) {\r\n return;\r\n }\r\n\r\n this.prevPanel();\r\n this.toolbar?.notify('closeOther', this);\r\n });\r\n\r\n $$.delegate(this.container, '.kf-editor-ui-area-item', 'mousedown', function (this: Element, e: Event & { which?: number }) {\r\n e.preventDefault();\r\n\r\n if ((e.which ?? 1) !== 1 || self.disabled) {\r\n return;\r\n }\r\n\r\n $$.publish('data.select', this.getAttribute('data-value'));\r\n } as unknown as (event: Event) => void);\r\n\r\n this.boxObject.initEvent();\r\n },\r\n\r\n disable(this: AreaInstance) {\r\n this.disabled = true;\r\n this.boxObject.disable();\r\n $$.getClassList(this.element).remove(`${PREFIX}enabled`);\r\n },\r\n\r\n enable(this: AreaInstance) {\r\n this.disabled = false;\r\n this.boxObject.enable();\r\n $$.getClassList(this.element).add(`${PREFIX}enabled`);\r\n },\r\n\r\n setListener(this: AreaInstance) {\r\n this.boxObject.setSelectHandler((val: string | null) => {\r\n $$.publish('data.select', val);\r\n this.hide();\r\n });\r\n\r\n this.boxObject.setChangeHandler(() => {\r\n this.updateContent();\r\n });\r\n },\r\n\r\n createArea(this: AreaInstance) {\r\n const areaNode = $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}area`,\r\n }) as HTMLDivElement;\r\n\r\n if ('width' in this.options && this.options.width !== undefined) {\r\n areaNode.style.width = `${this.options.width}px`;\r\n }\r\n\r\n return areaNode;\r\n },\r\n\r\n checkMaxPanelIndex(this: AreaInstance) {\r\n this.maxPanelIndex = Math.ceil(this.currentItemCount / this.lineMaxCount / 2);\r\n },\r\n\r\n updateContent(this: AreaInstance) {\r\n const items = this.boxObject.getOverlapContent() as Array<{ content: Array<{ key: string; img: string; pos: { x: number; y: number } }> }>;\r\n let count = 0;\r\n let lineno = 0;\r\n let colno = 0;\r\n const lineMaxCount = this.lineMaxCount;\r\n const newContent: string[] = [];\r\n\r\n this.panel.innerHTML = '';\r\n\r\n kity.Utils.each(items, (item: any) => {\r\n const contents = item.content;\r\n\r\n kity.Utils.each(contents, (currentContent: { key: string; img?: string; pos?: { x: number; y: number }; unicode?: string }) => {\r\n lineno = Math.floor(count / lineMaxCount);\r\n colno = count % lineMaxCount;\r\n count += 1;\r\n\r\n const style = `top: ${lineno * 33 + 5}px; left: ${colno * 32 + 5}px;`;\r\n\r\n if (currentContent.unicode !== undefined) {\r\n const fontStyle = (currentContent as any).unicodeFont\r\n ? `font-family: ${(currentContent as any).unicodeFont};`\r\n : '';\r\n newContent.push(\r\n `<div class=\"${PREFIX}area-item ${PREFIX}area-item-unicode\" data-value=\"${currentContent.key}\" style=\"${style}\"><div class=\"${PREFIX}area-item-inner\"><span class=\"${PREFIX}area-item-text\" style=\"${fontStyle}\">${currentContent.unicode}</span></div></div>`,\r\n );\r\n } else {\r\n newContent.push(\r\n `<div class=\"${PREFIX}area-item\" data-value=\"${currentContent.key}\" style=\"${style}\"><div class=\"${PREFIX}area-item-inner\"><div class=\"${PREFIX}area-item-img\" style=\"background: url(${currentContent.img}) no-repeat ${-(currentContent.pos?.x ?? 0)}px ${-(currentContent.pos?.y ?? 0)}px;\"></div></div></div>`,\r\n );\r\n }\r\n });\r\n });\r\n\r\n this.currentItemCount = count;\r\n this.panelIndex = 0;\r\n this.panel.style.top = '0';\r\n this.panel.innerHTML = newContent.join('');\r\n this.checkMaxPanelIndex();\r\n this.updatePanelButtonState();\r\n },\r\n\r\n mount(this: AreaInstance) {\r\n this.boxObject.mountTo(this.mountPoint);\r\n },\r\n\r\n showMount(this: AreaInstance) {\r\n this.mountPoint.style.display = 'block';\r\n this.boxObject.updateSize();\r\n },\r\n\r\n hideMount(this: AreaInstance) {\r\n this.mountPoint.style.display = 'none';\r\n },\r\n\r\n hide(this: AreaInstance) {\r\n this.hideMount();\r\n this.boxObject.hide();\r\n },\r\n\r\n createButton(this: AreaInstance) {\r\n return $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}area-button`,\r\n }) as HTMLDivElement;\r\n },\r\n\r\n createMoveDownButton(this: AreaInstance) {\r\n return $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}movedown-button`,\r\n content: '',\r\n }) as HTMLDivElement;\r\n },\r\n\r\n createMoveUpButton(this: AreaInstance) {\r\n return $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}moveup-button`,\r\n content: '',\r\n }) as HTMLDivElement;\r\n },\r\n\r\n createMountPoint(this: AreaInstance) {\r\n return $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}area-mount`,\r\n }) as HTMLDivElement;\r\n },\r\n\r\n createBox(this: AreaInstance) {\r\n return new Box(this.doc, this.options.box as any);\r\n },\r\n\r\n createContainer(this: AreaInstance) {\r\n return $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}area-container`,\r\n }) as HTMLDivElement;\r\n },\r\n\r\n createPanel(this: AreaInstance) {\r\n return $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}area-panel`,\r\n }) as HTMLDivElement;\r\n },\r\n\r\n createButtonContainer(this: AreaInstance) {\r\n return $$.ele(this.doc, 'div', {\r\n className: `${PREFIX}area-button-container`,\r\n }) as HTMLDivElement;\r\n },\r\n\r\n mergeElement(this: AreaInstance) {\r\n this.buttonContainer.appendChild(this.moveUpButton);\r\n this.buttonContainer.appendChild(this.moveDownButton);\r\n this.buttonContainer.appendChild(this.button);\r\n this.container.appendChild(this.panel);\r\n this.element.appendChild(this.container);\r\n this.element.appendChild(this.buttonContainer);\r\n this.element.appendChild(this.mountPoint);\r\n },\r\n\r\n disablePanelUp(this: AreaInstance) {\r\n this.disabledUp = true;\r\n $$.getClassList(this.moveUpButton).add('kf-editor-ui-disabled');\r\n },\r\n\r\n enablePanelUp(this: AreaInstance) {\r\n this.disabledUp = false;\r\n $$.getClassList(this.moveUpButton).remove('kf-editor-ui-disabled');\r\n },\r\n\r\n disablePanelDown(this: AreaInstance) {\r\n this.disabledDown = true;\r\n $$.getClassList(this.moveDownButton).add('kf-editor-ui-disabled');\r\n },\r\n\r\n enablePanelDown(this: AreaInstance) {\r\n this.disabledDown = false;\r\n $$.getClassList(this.moveDownButton).remove('kf-editor-ui-disabled');\r\n },\r\n\r\n updatePanelButtonState(this: AreaInstance) {\r\n if (this.panelIndex === 0) {\r\n this.disablePanelUp();\r\n } else {\r\n this.enablePanelUp();\r\n }\r\n\r\n if (this.panelIndex + 1 >= this.maxPanelIndex) {\r\n this.disablePanelDown();\r\n } else {\r\n this.enablePanelDown();\r\n }\r\n },\r\n\r\n nextPanel(this: AreaInstance) {\r\n if (this.disabledDown || this.panelIndex + 1 >= this.maxPanelIndex) {\r\n return;\r\n }\r\n\r\n this.panelIndex += 1;\r\n this.panel.style.top = `${-this.panelIndex * PANEL_HEIGHT}px`;\r\n this.updatePanelButtonState();\r\n },\r\n\r\n prevPanel(this: AreaInstance) {\r\n if (this.disabledUp || this.panelIndex === 0) {\r\n return;\r\n }\r\n\r\n this.panelIndex -= 1;\r\n this.panel.style.top = `${-this.panelIndex * PANEL_HEIGHT}px`;\r\n this.updatePanelButtonState();\r\n },\r\n\r\n setToolbar(this: AreaInstance, toolbar: ToolbarLike) {\r\n this.toolbar = toolbar;\r\n this.boxObject.setToolbar(toolbar);\r\n },\r\n\r\n attachTo(this: AreaInstance, container: HTMLElement) {\r\n container.appendChild(this.element);\r\n this.updateContent();\r\n this.updatePanelButtonState();\r\n },\r\n});\r\n\r\nexport default Area as new (doc: Document, options: AreaOptions) => AreaInstance;\r\n","import { createLegacyUiUtils } from '../vendor/legacy-ui-utils';\nimport { getLegacyKity } from '../vendor/runtime-interop';\n\ntype DelimiterInstance = {\n doc: Document;\n element: HTMLDivElement;\n setToolbar: (_toolbar: unknown) => void;\n createDilimiter: () => HTMLDivElement;\n attachTo: (container: HTMLElement) => void;\n};\n\nconst PREFIX = 'kf-editor-ui-';\nconst $$ = createLegacyUiUtils();\nconst kity = getLegacyKity();\n\nconst Delimiter = kity.createClass('Delimiter', {\n constructor(this: DelimiterInstance, doc: Document) {\n this.doc = doc;\n this.element = this.createDilimiter();\n },\n\n setToolbar(this: DelimiterInstance, _toolbar: unknown) {},\n\n createDilimiter(this: DelimiterInstance) {\n const dilimiterNode = $$.ele(this.doc, 'div', {\n className: `${PREFIX}delimiter`,\n }) as HTMLDivElement;\n\n dilimiterNode.appendChild(\n $$.ele(this.doc, 'div', {\n className: `${PREFIX}delimiter-line`,\n }) as HTMLDivElement,\n );\n\n return dilimiterNode;\n },\n\n attachTo(this: DelimiterInstance, container: HTMLElement) {\n container.appendChild(this.element);\n },\n});\n\nexport default Delimiter as new (doc: Document) => DelimiterInstance;\n","import { createLegacyUiUtils } from '../vendor/legacy-ui-utils';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\nimport Box from './box';\r\nimport Button from './button';\r\n\r\ntype DropdownBoxOptions = {\r\n button: Record<string, unknown>;\r\n box: Record<string, unknown>;\r\n};\r\n\r\ntype ToolbarLike = {\r\n notify: (type: string, exception?: unknown) => void;\r\n};\r\n\r\ntype DropdownBoxInstance = {\r\n options: DropdownBoxOptions;\r\n toolbar: ToolbarLike | null;\r\n doc: Document;\r\n buttonElement: InstanceType<typeof Button>;\r\n element: HTMLDivElement;\r\n boxElement: InstanceType<typeof Box>;\r\n initEvent: () => void;\r\n disable: () => void;\r\n enable: () => void;\r\n setToolbar: (toolbar: ToolbarLike) => void;\r\n createButton: () => InstanceType<typeof Button>;\r\n show: () => void;\r\n hide: () => void;\r\n createBox: () => InstanceType<typeof Box>;\r\n attachTo: (container: HTMLElement) => void;\r\n};\r\n\r\nconst $$ = createLegacyUiUtils();\r\nconst kity = getLegacyKity();\r\n\r\nconst DrapdownBox = kity.createClass('DrapdownBox', {\r\n constructor(this: DropdownBoxInstance, doc: Document, options: DropdownBoxOptions) {\r\n this.options = options;\r\n this.toolbar = null;\r\n this.doc = doc;\r\n this.buttonElement = this.createButton();\r\n this.element = this.buttonElement.getNode();\r\n this.boxElement = this.createBox();\r\n this.buttonElement.mount(this.boxElement);\r\n this.initEvent();\r\n },\r\n\r\n initEvent(this: DropdownBoxInstance) {\r\n $$.on(this.element, 'mousedown', (e: Event) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.toolbar?.notify('closeOther', this);\r\n });\r\n\r\n this.buttonElement.initEvent();\r\n this.boxElement.initEvent();\r\n\r\n this.boxElement.setSelectHandler((val: string | null) => {\r\n $$.publish('data.select', val);\r\n this.buttonElement.hide();\r\n });\r\n },\r\n\r\n disable(this: DropdownBoxInstance) {\r\n this.buttonElement.disable();\r\n },\r\n\r\n enable(this: DropdownBoxInstance) {\r\n this.buttonElement.enable();\r\n },\r\n\r\n setToolbar(this: DropdownBoxInstance, toolbar: ToolbarLike) {\r\n this.toolbar = toolbar;\r\n this.buttonElement.setToolbar(toolbar as any);\r\n this.boxElement.setToolbar(toolbar);\r\n },\r\n\r\n createButton(this: DropdownBoxInstance) {\r\n return new Button(this.doc, this.options.button);\r\n },\r\n\r\n show(this: DropdownBoxInstance) {\r\n this.buttonElement.show();\r\n },\r\n\r\n hide(this: DropdownBoxInstance) {\r\n this.buttonElement.hide();\r\n },\r\n\r\n createBox(this: DropdownBoxInstance) {\r\n return new Box(this.doc, this.options.box as any);\r\n },\r\n\r\n attachTo(this: DropdownBoxInstance, container: HTMLElement) {\r\n container.appendChild(this.element);\r\n },\r\n});\r\n\r\nexport default DrapdownBox as new (doc: Document, options: DropdownBoxOptions) => DropdownBoxInstance;\r\n","import Area from './area';\nimport Delimiter from './delimiter';\nimport DrapdownBox from './dropdown-box';\n\nconst UiImpl = {\n DrapdownBox,\n Delimiter,\n Area,\n};\n\nexport default UiImpl;\n","import { legacyEleType } from '../vendor/legacy-ele-type';\r\nimport { createLegacyUiUtils } from '../vendor/legacy-ui-utils';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\nimport UiImpl from './ui-impl';\r\n\r\ntype ToolbarElementDefinition = {\r\n type: unknown;\r\n options?: Record<string, unknown>;\r\n};\r\n\r\ntype ToolbarElementInstance = {\r\n disable?: () => void;\r\n enable?: () => void;\r\n hide?: () => void;\r\n setToolbar: (toolbar: ToolbarInstance) => void;\r\n attachTo: (container: HTMLElement) => void;\r\n};\r\n\r\ntype ToolbarUiComponent = {\r\n toolbarContainer: HTMLDivElement;\r\n};\r\n\r\ntype ToolbarInstance = {\r\n kfEditor: LegacyEditorInstance;\r\n uiComponent: ToolbarUiComponent;\r\n elementList: ToolbarElementDefinition[];\r\n elements: ToolbarElementInstance[];\r\n initToolbarElements: () => void;\r\n initServices: () => void;\r\n initEvent: () => void;\r\n insertSource: (value: string) => void;\r\n disableToolbar: () => void;\r\n enableToolbar: () => void;\r\n getContainer: () => HTMLElement;\r\n closeToolbar: () => void;\r\n notify: (type: string, exception?: ToolbarElementInstance) => void;\r\n closeElement: (exception?: ToolbarElementInstance) => void;\r\n appendElement: (uiElement: ToolbarElementInstance) => void;\r\n};\r\n\r\nconst $$ = createLegacyUiUtils();\r\nconst kity = getLegacyKity();\r\n\r\nconst Toolbar = kity.createClass('Tollbar', {\r\n constructor(this: ToolbarInstance, uiComponent: ToolbarUiComponent, kfEditor: LegacyEditorInstance, elementList: ToolbarElementDefinition[]) {\r\n this.kfEditor = kfEditor;\r\n this.uiComponent = uiComponent;\r\n this.elementList = elementList;\r\n this.elements = [];\r\n\r\n this.initToolbarElements();\r\n this.initServices();\r\n this.initEvent();\r\n },\r\n\r\n initServices(this: ToolbarInstance) {\r\n this.kfEditor.registerService('ui.toolbar.disable', this, {\r\n disableToolbar: this.disableToolbar,\r\n });\r\n\r\n this.kfEditor.registerService('ui.toolbar.enable', this, {\r\n enableToolbar: this.enableToolbar,\r\n });\r\n\r\n this.kfEditor.registerService('ui.toolbar.close', this, {\r\n closeToolbar: this.closeToolbar,\r\n });\r\n },\r\n\r\n initEvent(this: ToolbarInstance) {\r\n $$.on(this.uiComponent.toolbarContainer, 'mousedown', (e: Event) => {\r\n e.preventDefault();\r\n });\r\n\r\n $$.on(this.uiComponent.toolbarContainer, 'mousewheel', (e: Event) => {\r\n e.preventDefault();\r\n });\r\n\r\n $$.on(this.kfEditor.getContainer(), 'mousedown', () => {\r\n this.notify('closeAll');\r\n });\r\n\r\n $$.subscribe('data.select', (...args: unknown[]) => {\r\n this.insertSource(String(args[0] ?? ''));\r\n });\r\n },\r\n\r\n insertSource(this: ToolbarInstance, value: string) {\r\n this.kfEditor.requestService('control.insert.string', value);\r\n },\r\n\r\n disableToolbar(this: ToolbarInstance) {\r\n kity.Utils.each(this.elements, (ele: ToolbarElementInstance) => {\r\n ele.disable?.();\r\n });\r\n },\r\n\r\n enableToolbar(this: ToolbarInstance) {\r\n kity.Utils.each(this.elements, (ele: ToolbarElementInstance) => {\r\n ele.enable?.();\r\n });\r\n },\r\n\r\n getContainer(this: ToolbarInstance) {\r\n return this.kfEditor.requestService('ui.get.canvas.container') as HTMLElement;\r\n },\r\n\r\n closeToolbar(this: ToolbarInstance) {\r\n this.closeElement();\r\n },\r\n\r\n notify(this: ToolbarInstance, type: string, exception?: ToolbarElementInstance) {\r\n switch (type) {\r\n case 'closeAll':\r\n case 'closeOther':\r\n this.closeElement(exception);\r\n return;\r\n default:\r\n return;\r\n }\r\n },\r\n\r\n closeElement(this: ToolbarInstance, exception?: ToolbarElementInstance) {\r\n kity.Utils.each(this.elements, (ele: ToolbarElementInstance) => {\r\n if (ele !== exception) {\r\n ele.hide?.();\r\n }\r\n });\r\n },\r\n\r\n initToolbarElements(this: ToolbarInstance) {\r\n const doc = this.uiComponent.toolbarContainer.ownerDocument;\r\n\r\n kity.Utils.each(this.elementList, (eleInfo: ToolbarElementDefinition) => {\r\n const ele = createElement(eleInfo.type, doc, eleInfo.options);\r\n this.elements.push(ele);\r\n this.appendElement(ele);\r\n });\r\n },\r\n\r\n appendElement(this: ToolbarInstance, uiElement: ToolbarElementInstance) {\r\n uiElement.setToolbar(this);\r\n uiElement.attachTo(this.uiComponent.toolbarContainer);\r\n },\r\n});\r\n\r\nfunction createElement(type: unknown, doc: Document, options?: Record<string, unknown>) {\r\n switch (type) {\r\n case legacyEleType.DRAPDOWN_BOX:\r\n return createDrapdownBox(doc, options);\r\n case legacyEleType.DELIMITER:\r\n return createDelimiter(doc);\r\n case legacyEleType.AREA:\r\n return createArea(doc, options);\r\n default:\r\n throw new Error(`Unknown toolbar element type: ${String(type)}`);\r\n }\r\n}\r\n\r\nfunction createDrapdownBox(doc: Document, options?: Record<string, unknown>) {\r\n return new (UiImpl.DrapdownBox as any)(doc, options) as ToolbarElementInstance;\r\n}\r\n\r\nfunction createDelimiter(doc: Document) {\r\n return new (UiImpl.Delimiter as any)(doc) as ToolbarElementInstance;\r\n}\r\n\r\nfunction createArea(doc: Document, options?: Record<string, unknown>) {\r\n return new (UiImpl.Area as any)(doc, options) as ToolbarElementInstance;\r\n}\r\n\r\nexport default Toolbar as new (\r\n uiComponent: ToolbarUiComponent,\r\n kfEditor: LegacyEditorInstance,\r\n elementList: ToolbarElementDefinition[],\r\n) => ToolbarInstance;\r\n","import { legacySysconf } from '../vendor/legacy-sysconf';\r\nimport { legacyUiDef } from '../vendor/legacy-ui-def';\r\nimport { legacyBaseUtils } from '../vendor/legacy-utils';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\n\r\ntype ScrollbarValues = {\r\n offset: number;\r\n left: number;\r\n viewWidth: number;\r\n contentWidth: number;\r\n trackWidth: number;\r\n thumbWidth: number;\r\n scrollWidth: number;\r\n};\r\n\r\ntype ScrollbarWidgets = {\r\n leftButton: HTMLDivElement;\r\n rightButton: HTMLDivElement;\r\n track: HTMLDivElement;\r\n thumb: HTMLDivElement;\r\n thumbBody: HTMLDivElement;\r\n};\r\n\r\ntype CursorLocation = {\r\n x: number;\r\n};\r\n\r\ntype ScrollbarUiComponent = {\r\n scrollbarContainer: HTMLDivElement;\r\n};\r\n\r\ntype ScrollbarInstance = {\r\n uiComponent: ScrollbarUiComponent;\r\n kfEditor: LegacyEditorInstance;\r\n widgets: ScrollbarWidgets | null;\r\n container: HTMLDivElement;\r\n state: boolean;\r\n values: ScrollbarValues;\r\n thumbLocationX: number;\r\n leftOverflow: number;\r\n rightOverflow: number;\r\n isExpand: boolean;\r\n updateHandler: (proportion: number, offset: number, values: ScrollbarValues) => void;\r\n initWidget: () => void;\r\n initSize: () => void;\r\n initServices: () => void;\r\n initEvent: () => void;\r\n mountWidget: () => void;\r\n show: () => void;\r\n hide: () => void;\r\n update: (contentWidth: number) => void;\r\n setUpdateHandler: (updateHandler: ScrollbarInstance['updateHandler']) => void;\r\n updateOffset: (offset: number) => void;\r\n relocation: () => void;\r\n};\r\n\r\nconst SCROLLBAR_DEF = legacyUiDef.scrollbar;\r\nconst SCROLLBAR_CONF = legacySysconf.scrollbar;\r\nconst CLASS_PREFIX = 'kf-editor-ui-';\r\nconst kity = getLegacyKity();\r\n\r\nfunction createElement(doc: Document, eleName: string, className: string) {\r\n const node = doc.createElement(eleName) as HTMLDivElement;\r\n const str = '<div class=\"$1\"></div><div class=\"$2\"></div>';\r\n\r\n node.className = CLASS_PREFIX + className;\r\n\r\n if (className === 'thumb') {\r\n const thumbClassName = CLASS_PREFIX + className;\r\n node.innerHTML = str.replace('$1', `${thumbClassName}-left`).replace('$2', `${thumbClassName}-right`);\r\n }\r\n\r\n return node;\r\n}\r\n\r\nfunction preventDefault(comp: ScrollbarInstance) {\r\n legacyBaseUtils.addEvent(comp.container, 'mousedown', (e: Event) => {\r\n e.preventDefault();\r\n });\r\n}\r\n\r\nfunction trackClick(comp: ScrollbarInstance) {\r\n legacyBaseUtils.addEvent(comp.widgets!.track, 'mousedown', function (this: HTMLDivElement, e: MouseEvent) {\r\n trackClickHandler(this, comp, e);\r\n });\r\n}\r\n\r\nfunction btnClick(comp: ScrollbarInstance) {\r\n legacyBaseUtils.addEvent(comp.widgets!.leftButton, 'mousedown', () => {\r\n setThumbOffsetByStep(comp, -SCROLLBAR_CONF.step);\r\n });\r\n\r\n legacyBaseUtils.addEvent(comp.widgets!.rightButton, 'mousedown', () => {\r\n setThumbOffsetByStep(comp, SCROLLBAR_CONF.step);\r\n });\r\n}\r\n\r\nfunction thumbHandler(comp: ScrollbarInstance) {\r\n let isMoving = false;\r\n let startPoint = 0;\r\n let startOffset = 0;\r\n const trackWidth = comp.values.trackWidth;\r\n\r\n legacyBaseUtils.addEvent(comp.widgets!.thumb, 'mousedown', (e: MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n isMoving = true;\r\n startPoint = e.clientX;\r\n startOffset = comp.thumbLocationX;\r\n });\r\n\r\n legacyBaseUtils.addEvent(comp.container.ownerDocument, 'mouseup', () => {\r\n isMoving = false;\r\n startPoint = 0;\r\n startOffset = 0;\r\n });\r\n\r\n legacyBaseUtils.addEvent(comp.container.ownerDocument, 'mousemove', (e: MouseEvent) => {\r\n if (!isMoving) {\r\n return;\r\n }\r\n\r\n const distance = e.clientX - startPoint;\r\n let offset = startOffset + distance;\r\n const thumbWidth = comp.values.thumbWidth;\r\n\r\n if (offset < 0) {\r\n offset = 0;\r\n } else if (offset + thumbWidth > trackWidth) {\r\n offset = trackWidth - thumbWidth;\r\n }\r\n\r\n setThumbLocation(comp, offset);\r\n });\r\n}\r\n\r\nfunction trackClickHandler(track: HTMLDivElement, comp: ScrollbarInstance, evt: MouseEvent) {\r\n const trackRect = legacyBaseUtils.getRect(track);\r\n const values = comp.values;\r\n const unitOffset = (values.viewWidth / (values.contentWidth - values.viewWidth)) * values.trackWidth;\r\n const clickOffset = evt.clientX - trackRect.left;\r\n\r\n if (clickOffset > values.offset) {\r\n if (values.offset + unitOffset > values.trackWidth) {\r\n setThumbOffset(comp, values.trackWidth);\r\n } else {\r\n setThumbOffset(comp, values.offset + unitOffset);\r\n }\r\n return;\r\n }\r\n\r\n if (values.offset - unitOffset < 0) {\r\n setThumbOffset(comp, 0);\r\n } else {\r\n setThumbOffset(comp, values.offset - unitOffset);\r\n }\r\n}\r\n\r\nfunction setThumbLocation(comp: ScrollbarInstance, locationX: number) {\r\n const values = comp.values;\r\n const trackPieceWidth = values.trackWidth - values.thumbWidth;\r\n const offset = Math.floor((locationX / trackPieceWidth) * values.trackWidth);\r\n\r\n comp.updateOffset(offset);\r\n comp.thumbLocationX = locationX;\r\n comp.widgets!.thumb.style.left = `${locationX}px`;\r\n}\r\n\r\nfunction setThumbOffsetByStep(comp: ScrollbarInstance, step: number) {\r\n let leftOverflow = comp.leftOverflow + step;\r\n\r\n if (leftOverflow < 0) {\r\n leftOverflow = 0;\r\n } else if (leftOverflow > comp.values.scrollWidth) {\r\n leftOverflow = comp.values.scrollWidth;\r\n }\r\n\r\n setThumbByLeftOverflow(comp, leftOverflow);\r\n}\r\n\r\nfunction setThumbOffset(comp: ScrollbarInstance, offset: number) {\r\n const values = comp.values;\r\n const offsetProportion = offset / values.trackWidth;\r\n const trackPieceWidth = values.trackWidth - values.thumbWidth;\r\n let thumbLocationX = Math.floor(offsetProportion * trackPieceWidth);\r\n\r\n if (offset < 0) {\r\n offset = 0;\r\n thumbLocationX = 0;\r\n }\r\n\r\n comp.updateOffset(offset);\r\n comp.widgets!.thumb.style.left = `${thumbLocationX}px`;\r\n comp.thumbLocationX = thumbLocationX;\r\n}\r\n\r\nfunction setThumbOffsetByViewOffset(comp: ScrollbarInstance, viewOffset: number) {\r\n const values = comp.values;\r\n const offsetProportion = viewOffset / (values.contentWidth - values.viewWidth);\r\n const offset = Math.floor(offsetProportion * values.trackWidth);\r\n\r\n setThumbOffset(comp, offset);\r\n}\r\n\r\nfunction setThumbByLeftOverflow(comp: ScrollbarInstance, leftViewOverflow: number) {\r\n const values = comp.values;\r\n const overflowProportion = leftViewOverflow / (values.contentWidth - values.viewWidth);\r\n\r\n setThumbOffset(comp, overflowProportion * values.trackWidth);\r\n}\r\n\r\nconst Scrollbar = kity.createClass('Scrollbar', {\r\n constructor(this: ScrollbarInstance, uiComponent: ScrollbarUiComponent, kfEditor: LegacyEditorInstance) {\r\n this.uiComponent = uiComponent;\r\n this.kfEditor = kfEditor;\r\n this.widgets = null;\r\n this.container = this.uiComponent.scrollbarContainer;\r\n this.state = false;\r\n this.values = {\r\n offset: 0,\r\n left: 0,\r\n viewWidth: 0,\r\n contentWidth: 0,\r\n trackWidth: 0,\r\n thumbWidth: 0,\r\n scrollWidth: 0,\r\n };\r\n this.thumbLocationX = 0;\r\n this.leftOverflow = 0;\r\n this.rightOverflow = 0;\r\n this.isExpand = true;\r\n\r\n this.initWidget();\r\n this.mountWidget();\r\n this.initSize();\r\n\r\n this.hide();\r\n this.initServices();\r\n this.initEvent();\r\n\r\n this.updateHandler = function () {};\r\n },\r\n\r\n initWidget(this: ScrollbarInstance) {\r\n const doc = this.container.ownerDocument;\r\n\r\n this.widgets = {\r\n leftButton: createElement(doc, 'div', 'left-button'),\r\n rightButton: createElement(doc, 'div', 'right-button'),\r\n track: createElement(doc, 'div', 'track'),\r\n thumb: createElement(doc, 'div', 'thumb'),\r\n thumbBody: createElement(doc, 'div', 'thumb-body'),\r\n };\r\n },\r\n\r\n initSize(this: ScrollbarInstance) {\r\n const leftBtnWidth = legacyBaseUtils.getRect(this.widgets!.leftButton).width;\r\n const rightBtnWidth = legacyBaseUtils.getRect(this.widgets!.rightButton).width;\r\n\r\n this.values.viewWidth = legacyBaseUtils.getRect(this.container).width;\r\n this.values.trackWidth = this.values.viewWidth - leftBtnWidth - rightBtnWidth;\r\n\r\n this.widgets!.track.style.width = `${this.values.trackWidth}px`;\r\n },\r\n\r\n initServices(this: ScrollbarInstance) {\r\n this.kfEditor.registerService('ui.show.scrollbar', this, {\r\n showScrollbar: this.show,\r\n });\r\n this.kfEditor.registerService('ui.hide.scrollbar', this, {\r\n hideScrollbar: this.hide,\r\n });\r\n this.kfEditor.registerService('ui.update.scrollbar', this, {\r\n updateScrollbar: this.update,\r\n });\r\n this.kfEditor.registerService('ui.set.scrollbar.update.handler', this, {\r\n setUpdateHandler: this.setUpdateHandler,\r\n });\r\n this.kfEditor.registerService('ui.relocation.scrollbar', this, {\r\n relocation: this.relocation,\r\n });\r\n },\r\n\r\n initEvent(this: ScrollbarInstance) {\r\n preventDefault(this);\r\n trackClick(this);\r\n thumbHandler(this);\r\n btnClick(this);\r\n },\r\n\r\n mountWidget(this: ScrollbarInstance) {\r\n const widgets = this.widgets!;\r\n const container = this.container;\r\n\r\n for (const wgtName in widgets) {\r\n if (Object.prototype.hasOwnProperty.call(widgets, wgtName)) {\r\n container.appendChild(widgets[wgtName as keyof ScrollbarWidgets]);\r\n }\r\n }\r\n\r\n widgets.thumb.appendChild(widgets.thumbBody);\r\n widgets.track.appendChild(widgets.thumb);\r\n },\r\n\r\n show(this: ScrollbarInstance) {\r\n this.state = true;\r\n this.container.style.display = 'block';\r\n },\r\n\r\n hide(this: ScrollbarInstance) {\r\n this.state = false;\r\n this.container.style.display = 'none';\r\n },\r\n\r\n update(this: ScrollbarInstance, contentWidth: number) {\r\n const trackWidth = this.values.trackWidth;\r\n\r\n this.isExpand = contentWidth > this.values.contentWidth;\r\n this.values.contentWidth = contentWidth;\r\n this.values.scrollWidth = contentWidth - this.values.viewWidth;\r\n\r\n if (trackWidth >= contentWidth) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n const thumbWidth = Math.max(Math.ceil((trackWidth * trackWidth) / contentWidth), SCROLLBAR_DEF.thumbMinSize);\r\n\r\n this.values.thumbWidth = thumbWidth;\r\n this.widgets!.thumb.style.width = `${thumbWidth}px`;\r\n this.widgets!.thumbBody.style.width = `${thumbWidth - 10}px`;\r\n },\r\n\r\n setUpdateHandler(this: ScrollbarInstance, updateHandler: ScrollbarInstance['updateHandler']) {\r\n this.updateHandler = updateHandler;\r\n },\r\n\r\n updateOffset(this: ScrollbarInstance, offset: number) {\r\n const values = this.values;\r\n\r\n values.offset = offset;\r\n values.left = offset / values.trackWidth;\r\n\r\n this.leftOverflow = values.left * (values.contentWidth - values.viewWidth);\r\n this.rightOverflow = values.contentWidth - values.viewWidth - this.leftOverflow;\r\n\r\n this.updateHandler(values.left, values.offset, values);\r\n },\r\n\r\n relocation(this: ScrollbarInstance) {\r\n const cursorLocation = this.kfEditor.requestService('control.get.cursor.location') as CursorLocation;\r\n const padding = SCROLLBAR_CONF.padding;\r\n const contentWidth = this.values.contentWidth;\r\n const viewWidth = this.values.viewWidth;\r\n const viewLeftOverflow = this.values.left * (contentWidth - viewWidth);\r\n\r\n if (cursorLocation.x < viewLeftOverflow) {\r\n if (cursorLocation.x < 0) {\r\n cursorLocation.x = 0;\r\n }\r\n\r\n setThumbOffsetByViewOffset(this, cursorLocation.x);\r\n return;\r\n }\r\n\r\n if (cursorLocation.x + padding > viewLeftOverflow + viewWidth) {\r\n cursorLocation.x += padding;\r\n\r\n if (cursorLocation.x > contentWidth) {\r\n cursorLocation.x = contentWidth;\r\n }\r\n\r\n const diff = cursorLocation.x - viewWidth;\r\n setThumbOffsetByViewOffset(this, diff);\r\n return;\r\n }\r\n\r\n if (this.isExpand) {\r\n setThumbByLeftOverflow(this, this.leftOverflow);\r\n } else {\r\n setThumbByLeftOverflow(this, contentWidth - viewWidth - this.rightOverflow);\r\n }\r\n },\r\n});\r\n\r\nexport default Scrollbar as new (uiComponent: ScrollbarUiComponent, kfEditor: LegacyEditorInstance) => ScrollbarInstance;\r\n","export const UNICODE_SYMBOLS: Record<string, string> = {\n pm: '\\u00B1',\n infty: '\\u221E',\n '=': '=',\n sim: '\\u223C',\n times: '\\u00D7',\n div: '\\u00F7',\n '!': '!',\n '<': '<',\n ll: '\\u226A',\n '>': '>',\n gg: '\\u226B',\n leq: '\\u2264',\n geq: '\\u2265',\n mp: '\\u2213',\n cong: '\\u2245',\n equiv: '\\u2261',\n propto: '\\u221D',\n approx: '\\u2248',\n forall: '\\u2200',\n partial: '\\u2202',\n surd: '\\u221A',\n cup: '\\u222A',\n cap: '\\u2229',\n varnothing: '\\u2205',\n '%': '%',\n circ: '\\u2218',\n exists: '\\u2203',\n nexists: '\\u2204',\n in: '\\u2208',\n ni: '\\u220B',\n gets: '\\u2190',\n uparrow: '\\u2191',\n to: '\\u2192',\n downarrow: '\\u2193',\n leftrightarrow: '\\u2194',\n updownarrow: '\\u2195',\n therefore: '\\u2234',\n because: '\\u2235',\n '+': '+',\n '-': '\\u2212',\n neg: '\\u00AC',\n ast: '\\u2217',\n cdot: '\\u22C5',\n vdots: '\\u22EE',\n aleph: '\\u2135',\n beth: '\\u2136',\n blacksquare: '\\u25A0',\n\n alpha: '\\u03B1',\n beta: '\\u03B2',\n gamma: '\\u03B3',\n delta: '\\u03B4',\n epsilon: '\\u03B5',\n zeta: '\\u03B6',\n eta: '\\u03B7',\n theta: '\\u03B8',\n iota: '\\u03B9',\n kappa: '\\u03BA',\n lambda: '\\u03BB',\n mu: '\\u03BC',\n nu: '\\u03BD',\n xi: '\\u03BE',\n omicron: '\\u03BF',\n pi: '\\u03C0',\n rho: '\\u03C1',\n sigma: '\\u03C3',\n tau: '\\u03C4',\n upsilon: '\\u03C5',\n phi: '\\u03C6',\n chi: '\\u03C7',\n psi: '\\u03C8',\n omega: '\\u03C9',\n\n Alpha: '\\u0391',\n Beta: '\\u0392',\n Gamma: '\\u0393',\n Delta: '\\u0394',\n Epsilon: '\\u0395',\n Zeta: '\\u0396',\n Eta: '\\u0397',\n Theta: '\\u0398',\n Iota: '\\u0399',\n Kappa: '\\u039A',\n Lambda: '\\u039B',\n Mu: '\\u039C',\n Nu: '\\u039D',\n Xi: '\\u039E',\n Omicron: '\\u039F',\n Pi: '\\u03A0',\n Rho: '\\u03A1',\n Sigma: '\\u03A3',\n Tau: '\\u03A4',\n Upsilon: '\\u03A5',\n Phi: '\\u03A6',\n Chi: '\\u03A7',\n Psi: '\\u03A8',\n Omega: '\\u03A9',\n\n digamma: '\\u03DD',\n varepsilon: '\\u03F5',\n varkappa: '\\u03F0',\n varphi: '\\u03C6',\n varpi: '\\u03D6',\n varrho: '\\u03F1',\n varsigma: '\\u03C2',\n vartheta: '\\u03D1',\n\n neq: '\\u2260',\n nless: '\\u226E',\n ngtr: '\\u226F',\n nleq: '\\u2270',\n ngeq: '\\u2271',\n nsim: '\\u2241',\n lneqq: '\\u2268',\n gneqq: '\\u2269',\n nprec: '\\u2280',\n nsucc: '\\u2281',\n notin: '\\u2209',\n nsubseteq: '\\u2288',\n nsupseteq: '\\u2289',\n subsetneq: '\\u228A',\n supsetneq: '\\u228B',\n lnsim: '\\u22E6',\n gnsim: '\\u22E7',\n precnsim: '\\u22E8',\n succnsim: '\\u22E9',\n ntriangleleft: '\\u22EA',\n ntriangleright: '\\u22EB',\n ntrianglelefteq: '\\u22EC',\n ntrianglerighteq: '\\u22ED',\n nmid: '\\u2224',\n nparallel: '\\u2226',\n nvdash: '\\u22AC',\n nVdash: '\\u22AE',\n nvDash: '\\u22AD',\n nVDash: '\\u22AF',\n\n daleth: '\\u2138',\n gimel: '\\u2137',\n complement: '\\u2201',\n ell: '\\u2113',\n eth: '\\u00F0',\n hbar: '\\u210F',\n hslash: '\\u210F',\n mho: '\\u2127',\n wp: '\\u2118',\n circledS: '\\u24C8',\n Bbbk: '\\u212C',\n Finv: '\\u2132',\n Game: '\\u2141',\n Im: '\\u2111',\n Re: '\\u211C',\n\n Leftarrow: '\\u21D0',\n Rightarrow: '\\u21D2',\n Uparrow: '\\u21D1',\n Downarrow: '\\u21D3',\n Leftrightarrow: '\\u21D4',\n Updownarrow: '\\u21D5',\n longleftarrow: '\\u27F5',\n longrightarrow: '\\u27F6',\n longleftrightarrow: '\\u27F7',\n Longleftarrow: '\\u27F8',\n Longrightarrow: '\\u27F9',\n Longleftrightarrow: '\\u27FA',\n nearrow: '\\u2197',\n nwarrow: '\\u2196',\n searrow: '\\u2198',\n swarrow: '\\u2199',\n nleftarrow: '\\u219A',\n nrightarrow: '\\u219B',\n nLeftarrow: '\\u21CD',\n nRightarrow: '\\u21CF',\n nLeftrightarrow: '\\u21CE',\n leftharpoonup: '\\u21BC',\n leftharpoondown: '\\u21BD',\n rightharpoonup: '\\u21C0',\n rightharpoondown: '\\u21C1',\n upharpoonleft: '\\u21BF',\n upharpoonright: '\\u21BE',\n downharpoonleft: '\\u21C3',\n downharpoonright: '\\u21C2',\n leftrightharpoons: '\\u21CB',\n rightleftharpoons: '\\u21CC',\n leftleftarrows: '\\u21C7',\n rightrightarrows: '\\u21C9',\n upuparrows: '\\u21C8',\n downdownarrows: '\\u21CA',\n leftrightarrows: '\\u21C6',\n rightleftarrows: '\\u21C4',\n looparrowleft: '\\u21AB',\n looparrowright: '\\u21AC',\n leftarrowtail: '\\u21A2',\n rightarrowtail: '\\u21A3',\n Lsh: '\\u21B0',\n Rsh: '\\u21B1',\n Lleftarrow: '\\u21DA',\n Rrightarrow: '\\u21DB',\n curvearrowleft: '\\u21B6',\n curvearrowright: '\\u21B7',\n circlearrowleft: '\\u21BA',\n circlearrowright: '\\u21BB',\n multimap: '\\u22B8',\n leftrightsquigarrow: '\\u21AD',\n twoheadleftarrow: '\\u219E',\n twoheadrightarrow: '\\u21A0',\n rightsquigarrow: '\\u21DD',\n};\n\nexport const STYLE_FONT_MAP: Record<string, string> = {\n mathcal: 'KF AMS CAL, serif',\n mathfrak: 'KF AMS FRAK, serif',\n mathbb: 'KF AMS BB, serif',\n mathrm: 'KF AMS ROMAN, serif',\n};\n\nexport function resolveUnicode(key: string): { char: string; fontFamily?: string } | null {\n const clean = key.replace(/^\\\\/, '');\n\n for (const style of ['mathcal', 'mathfrak', 'mathbb', 'mathrm']) {\n const prefix = `${style}{`;\n if (clean.startsWith(prefix) && clean.endsWith('}')) {\n const letter = clean.slice(prefix.length, -1);\n return {\n char: letter,\n fontFamily: STYLE_FONT_MAP[style],\n };\n }\n }\n\n const code = UNICODE_SYMBOLS[clean];\n if (code !== undefined) {\n return { char: code };\n }\n\n return null;\n}\n","// @ts-nocheck\r\nimport { legacyBoxType } from '../vendor/legacy-box-type';\nimport { legacyEleType } from '../vendor/legacy-ele-type';\nimport { legacyOtherPosition } from '../vendor/other-position';\nimport { resolveToolbarAssetPath } from '../toolbar-assets';\nimport { resolveUnicode } from '../formula-symbols';\nimport {\n DEFAULT_FORMULAX_LOCALE,\n normalizeFormulaXLocale,\n translateFormulaXText,\n type FormulaXLocale,\n} from '../i18n';\n\r\ntype ToolbarConfig = Record<string, any>;\r\n\r\ntype ToolbarCollection = ToolbarConfig[];\r\n\r\nconst UI_ELE_TYPE = legacyEleType;\nconst BOX_TYPE = legacyBoxType;\nconst OTHER_POSITION = legacyOtherPosition;\n\nfunction each<T>(list: T[] | Record<string, T>, callback: (item: T, index: number | string) => void) {\n if (Array.isArray(list)) {\n list.forEach((item, index) => callback(item, index));\n return;\r\n }\r\n\r\n Object.keys(list).forEach((key) => callback(list[key], key));\r\n}\n\nfunction translateToolbarText(value: string, locale: FormulaXLocale) {\n return translateFormulaXText('toolbar', value, locale);\n}\n\nfunction localizeToolbarConfig(value: unknown, locale: FormulaXLocale): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => localizeToolbarConfig(item, locale));\n }\n\n if (!value || typeof value !== 'object') {\n return value;\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, currentValue] of Object.entries(value)) {\n if ((key === 'label' || key === 'title') && typeof currentValue === 'string') {\n result[key] = translateToolbarText(currentValue, locale);\n continue;\n }\n\n result[key] = localizeToolbarConfig(currentValue, locale);\n }\n\n return result;\n}\n\nconst baseToolbarConfig: ToolbarCollection = [ {\n type: UI_ELE_TYPE.DRAPDOWN_BOX,\n options: {\n button: {\n label: '预设<br/>',\r\n className: 'yushe-btn',\r\n icon: {\r\n src: resolveToolbarAssetPath(\"btn.png\"),\n x: 0,\r\n y: 0\r\n },\r\n iconSize: {\r\n w: 40\r\n }\r\n },\r\n box: {\r\n width: 367,\r\n group: [ {\r\n title: \"预设公式\",\r\n items: [ {\r\n title: \"预设公式\",\r\n content: [ {\r\n label: \"二次公式\",\r\n item: {\r\n val: \"x=\\\\frac {-b\\\\pm\\\\sqrt {b^2-4ac}}{2a}\"\r\n }\r\n }, {\r\n label: \"二项式定理\",\r\n item: {\r\n val: \"{\\\\left(x+a\\\\right)}^2=\\\\sum^n_{k=0}{\\\\left(^n_k\\\\right)x^ka^{n-k}}\"\r\n }\r\n }, {\r\n label: \"勾股定理\",\r\n item: {\r\n val: \"a^2+b^2=c^2\"\r\n }\r\n } ]\r\n } ]\r\n } ]\r\n }\r\n }\r\n }, {\r\n type: UI_ELE_TYPE.DELIMITER\r\n }, {\r\n type: UI_ELE_TYPE.AREA,\r\n options: {\r\n box: {\r\n fixOffset: true,\r\n width: 527,\r\n type: BOX_TYPE.OVERLAP,\r\n group: [ {\r\n title: \"基础数学\",\r\n items: []\r\n }, {\r\n title: \"希腊字母\",\r\n items: []\r\n }, {\r\n title: \"求反关系运算符\",\r\n items: []\r\n }, {\r\n title: \"字母类符号\",\r\n items: []\r\n }, {\r\n title: \"箭头\",\r\n items: []\r\n }, {\r\n title: \"手写体\",\r\n items: []\r\n } ]\r\n }\r\n }\r\n }, {\r\n type: UI_ELE_TYPE.DELIMITER\r\n }, {\r\n type: UI_ELE_TYPE.DRAPDOWN_BOX,\r\n options: {\r\n button: {\r\n label: \"分数<br/>\",\r\n icon: {\r\n src: resolveToolbarAssetPath(\"btn.png\"),\n x: 45,\r\n y: 0\r\n }\r\n },\r\n box: {\r\n width: 332,\r\n group: [ {\r\n title: \"分数\",\r\n items: [ {\r\n title: \"分数\",\r\n content: [ {\r\n item: {\r\n val: \"\\\\frac \\\\placeholder\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"{\\\\placeholder/\\\\placeholder}\"\r\n }\r\n } ]\r\n }, {\r\n title: \"常用分数\",\r\n content: [ {\r\n item: {\r\n val: \"\\\\frac {dy}{dx}\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\frac {\\\\Delta y}{\\\\Delta x}\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\frac {\\\\delta y}{\\\\delta x}\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\frac \\\\pi 2\"\r\n }\r\n } ]\r\n } ]\r\n } ]\r\n }\r\n }\r\n }, {\r\n type: UI_ELE_TYPE.DRAPDOWN_BOX,\r\n options: {\r\n button: {\r\n label: \"上下标<br/>\",\r\n icon: {\r\n src: resolveToolbarAssetPath(\"btn.png\"),\n x: 82,\r\n y: 0\r\n }\r\n },\r\n box: {\r\n width: 332,\r\n group: [ {\r\n title: \"上标和下标\",\r\n items: [ {\r\n title: \"上标和下标\",\r\n content: [ {\r\n item: {\r\n val: \"\\\\placeholder^\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\placeholder_\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\placeholder^\\\\placeholder_\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"{^\\\\placeholder_\\\\placeholder\\\\placeholder}\"\r\n }\r\n } ]\r\n }, {\r\n title: \"常用的上标和下标\",\r\n content: [ {\r\n item: {\r\n val: \"e^{-i\\\\omega t}\"\r\n }\r\n }, {\r\n item: {\r\n val: \"x^2\"\r\n }\r\n }, {\r\n item: {\r\n val: \"{}^n_1Y\"\r\n }\r\n } ]\r\n } ]\r\n } ]\r\n }\r\n }\r\n }, {\r\n type: UI_ELE_TYPE.DRAPDOWN_BOX,\r\n options: {\r\n button: {\r\n label: \"根式<br/>\",\r\n icon: {\r\n src: resolveToolbarAssetPath(\"btn.png\"),\n x: 119,\r\n y: 0\r\n }\r\n },\r\n box: {\r\n width: 342,\r\n group: [ {\r\n title: \"根式\",\r\n items: [ {\r\n title: \"根式\",\r\n content: [ {\r\n item: {\r\n val: \"\\\\sqrt \\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\sqrt [\\\\placeholder] \\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\sqrt [2] \\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\sqrt [3] \\\\placeholder\"\r\n }\r\n } ]\r\n }, {\r\n title: \"常用根式\",\r\n content: [ {\r\n item: {\r\n val: \"\\\\frac {-b\\\\pm\\\\sqrt{b^2-4ac}}{2a}\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\sqrt {a^2+b^2}\"\r\n }\r\n } ]\r\n } ]\r\n } ]\r\n }\r\n }\r\n }, {\r\n type: UI_ELE_TYPE.DRAPDOWN_BOX,\r\n options: {\r\n button: {\r\n label: \"积分<br/>\",\r\n icon: {\r\n src: resolveToolbarAssetPath(\"btn.png\"),\n x: 156,\r\n y: 0\r\n }\r\n },\r\n box: {\r\n width: 332,\r\n group: [ {\r\n title: \"积分\",\r\n items: [ {\r\n title: \"积分\",\r\n content: [ {\r\n item: {\r\n val: \"\\\\int \\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\int^\\\\placeholder_\\\\placeholder\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\iint\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\iint^\\\\placeholder_\\\\placeholder\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\iiint\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\iiint^\\\\placeholder_\\\\placeholder\\\\placeholder\"\r\n }\r\n } ]\r\n } ]\r\n } ]\r\n }\r\n }\r\n }, {\r\n type: UI_ELE_TYPE.DRAPDOWN_BOX,\r\n options: {\r\n button: {\r\n label: \"大型<br/>运算符\",\r\n icon: {\r\n src: resolveToolbarAssetPath(\"btn.png\"),\n x: 193,\r\n y: 0\r\n }\r\n },\r\n box: {\r\n width: 332,\r\n group: [ {\r\n title: \"求和\",\r\n items: [ {\r\n title: \"求和\",\r\n content: [ {\r\n item: {\r\n val: \"\\\\sum\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\sum^\\\\placeholder_\\\\placeholder\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\sum_\\\\placeholder\\\\placeholder\"\r\n }\r\n } ]\r\n } ]\r\n } ]\r\n }\r\n }\r\n }, {\r\n type: UI_ELE_TYPE.DRAPDOWN_BOX,\r\n options: {\r\n button: {\r\n label: \"括号<br/>\",\r\n icon: {\r\n src: resolveToolbarAssetPath(\"btn.png\"),\n x: 230,\r\n y: 0\r\n }\r\n },\r\n box: {\r\n width: 332,\r\n group: [ {\r\n title: \"方括号\",\r\n items: [ {\r\n title: \"方括号\",\r\n content: [ {\r\n item: {\r\n val: \"\\\\left(\\\\placeholder\\\\right)\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\left[\\\\placeholder\\\\right]\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\left\\\\{\\\\placeholder\\\\right\\\\}\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\left|\\\\placeholder\\\\right|\"\r\n }\r\n } ]\r\n } ]\r\n } ]\r\n }\r\n }\r\n }, {\r\n type: UI_ELE_TYPE.DRAPDOWN_BOX,\r\n options: {\r\n button: {\r\n label: \"函数<br/>\",\r\n icon: {\r\n src: resolveToolbarAssetPath(\"btn.png\"),\n x: 267,\r\n y: 0\r\n }\r\n },\r\n box: {\r\n width: 340,\r\n group: [ {\r\n title: \"函数\",\r\n items: [ {\r\n title: \"三角函数\",\r\n content: [ {\r\n item: {\r\n val: \"\\\\sin\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\cos\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\tan\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\csc\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\sec\\\\placeholder\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\cot\\\\placeholder\"\r\n }\r\n } ]\r\n }, {\r\n title: \"常用函数\",\r\n content: [ {\r\n item: {\r\n val: \"\\\\sin\\\\theta\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\cos{2x}\"\r\n }\r\n }, {\r\n item: {\r\n val: \"\\\\tan\\\\theta=\\\\frac {\\\\sin\\\\theta}{\\\\cos\\\\theta}\"\r\n }\r\n } ]\r\n } ]\r\n } ]\r\n }\r\n }\r\n } ];\r\n\r\n //--------------------------------------------- Initialize items outside the special character area\r\n ( function () {\r\n\r\n let tmp = [],\r\n otherImageSrc = resolveToolbarAssetPath(\"other.png\"),\n currentConf = [];\r\n\r\n each( baseToolbarConfig, function ( conf ) {\n\r\n if ( conf.type === UI_ELE_TYPE.DELIMITER ) {\r\n return;\r\n }\r\n\r\n conf = conf.options.box.group;\r\n\r\n tmp = tmp.concat( conf );\r\n\r\n } );\r\n\r\n each( tmp, function ( conf ) {\r\n\r\n conf = conf.items;\r\n\r\n for ( let i = 0, len = conf.length; i < len; i++ ) {\r\n currentConf = currentConf.concat( conf[ i ].content );\r\n }\r\n\r\n } );\r\n\r\n // Add positioning metadata\r\n each( currentConf, function ( conf ) {\r\n\r\n let data = OTHER_POSITION[ conf.item.val ];\r\n\r\n if ( !data ) {\r\n return;\r\n }\r\n\r\n conf.item.img = otherImageSrc;\r\n conf.item.pos = data.pos;\r\n conf.item.size = data.size;\r\n\r\n } );\r\n\r\n } )();\r\n\r\n //--------------------------------------------- Initialize the special character area\r\n // Basic mathematics\r\n ( function () {\r\n\r\n let list = [\r\n \"pm\", \"infty\", \"=\", \"sim\", \"times\", \"div\", \"!\", \"<\", \"ll\", \">\",\r\n \"gg\", \"leq\", \"geq\", \"mp\", \"cong\", \"equiv\", \"propto\", \"approx\",\r\n \"forall\", \"partial\", \"surd\", \"cup\", \"cap\", \"varnothing\", \"%\",\r\n \"circ\", \"exists\", \"nexists\", \"in\", \"ni\", \"gets\", \"uparrow\",\r\n \"to\", \"downarrow\", \"leftrightarrow\", \"therefore\", \"because\",\r\n \"+\", \"-\", \"neg\", \"ast\", \"cdot\", \"vdots\",/* \"ddots\",*/ \"aleph\",\r\n \"beth\", \"blacksquare\"\r\n\r\n ],\r\n configList = baseToolbarConfig[ 2 ].options.box.group[ 0 ].items;\n\r\n configList.push( {\r\n title: \"基础数学\",\r\n content: getUnicodeContents( list )\r\n } );\r\n\r\n } )();\r\n\r\n // Greek character configuration\r\n ( function () {\r\n\r\n let greekList = [ {\r\n title: \"小写\",\r\n values: [ \"alpha\", \"beta\", \"gamma\", \"delta\", \"epsilon\", \"zeta\", \"eta\", \"theta\", \"iota\", \"kappa\", \"lambda\", \"mu\", \"nu\", \"xi\", \"omicron\", \"pi\", \"rho\", \"sigma\", \"tau\", \"upsilon\", \"phi\", \"chi\", \"psi\", \"omega\" ]\r\n }, {\r\n title: \"大写\",\r\n values: [ \"Alpha\", \"Beta\", \"Gamma\", \"Delta\", \"Epsilon\", \"Zeta\", \"Eta\", \"Theta\", \"Iota\", \"Kappa\", \"Lambda\", \"Mu\", \"Nu\", \"Xi\", \"Omicron\", \"Pi\", \"Rho\", \"Sigma\", \"Tau\", \"Upsilon\", \"Phi\", \"Chi\", \"Psi\", \"Omega\" ]\r\n }, {\r\n title: \"变体\",\r\n values: [ \"digamma\", \"varepsilon\", \"varkappa\", \"varphi\", \"varpi\", \"varrho\", \"varsigma\", \"vartheta\" ]\r\n } ],\r\n greekConfigList = baseToolbarConfig[ 2 ].options.box.group[ 1 ].items;\n\r\n // Lowercase handling\r\n greekConfigList.push( {\r\n title: greekList[ 0 ].title,\r\n content: getUnicodeContents( greekList[ 0 ].values )\r\n } );\r\n\r\n // Uppercase handling\r\n greekConfigList.push( {\r\n title: greekList[ 1 ].title,\r\n content: getUnicodeContents( greekList[ 1 ].values )\r\n } );\r\n\r\n // Variant handling\r\n greekConfigList.push( {\r\n title: greekList[ 2 ].title,\r\n content: getUnicodeContents( greekList[ 2 ].values )\r\n } );\r\n\r\n } )();\r\n\r\n // Negated operators\r\n ( function () {\r\n\r\n let greekList = [ {\r\n title: \"求反关系运算符\",\r\n values: [\r\n \"neq\", \"nless\", \"ngtr\", \"nleq\", \"ngeq\", \"nsim\", \"lneqq\",\r\n \"gneqq\", \"nprec\", \"nsucc\", \"notin\", \"nsubseteq\", \"nsupseteq\",\r\n \"subsetneq\", \"supsetneq\", \"lnsim\", \"gnsim\", \"precnsim\",\r\n \"succnsim\", \"ntriangleleft\", \"ntriangleright\", \"ntrianglelefteq\",\r\n \"ntrianglerighteq\", \"nmid\", \"nparallel\", \"nvdash\", \"nVdash\",\r\n \"nvDash\", \"nVDash\", \"nexists\"\r\n ]\r\n } ],\r\n greekConfigList = baseToolbarConfig[ 2 ].options.box.group[ 2 ].items;\n\r\n greekConfigList.push( {\r\n title: greekList[ 0 ].title,\r\n content: getUnicodeContents( greekList[ 0 ].values )\r\n } );\r\n\r\n } )();\r\n\r\n // Letter-like symbols\r\n ( function () {\r\n\r\n let list = [\r\n \"aleph\", \"beth\", \"daleth\", \"gimel\", \"complement\", \"ell\", \"eth\", \"hbar\",\r\n \"hslash\", \"mho\", \"partial\", \"wp\", \"circledS\", \"Bbbk\", \"Finv\", \"Game\",\r\n \"Im\", \"Re\"\r\n ],\r\n configList = baseToolbarConfig[ 2 ].options.box.group[ 3 ].items;\n\r\n configList.push( {\r\n title: \"字母类符号\",\r\n content: getUnicodeContents( list )\r\n } );\r\n\r\n } )();\r\n\r\n // Arrow symbols\r\n ( function () {\r\n\r\n let list = [\r\n \"gets\", \"to\", \"uparrow\", \"downarrow\", \"leftrightarrow\", \"updownarrow\",\r\n \"Leftarrow\", \"Rightarrow\", \"Uparrow\", \"Downarrow\", \"Leftrightarrow\",\r\n \"Updownarrow\", \"longleftarrow\", \"longrightarrow\", \"longleftrightarrow\",\r\n \"Longleftarrow\", \"Longrightarrow\", \"Longleftrightarrow\", \"nearrow\",\r\n \"nwarrow\", \"searrow\", \"swarrow\", \"nleftarrow\", \"nrightarrow\",\r\n \"nLeftarrow\", \"nRightarrow\", \"nLeftrightarrow\", \"leftharpoonup\",\r\n \"leftharpoondown\", \"rightharpoonup\", \"rightharpoondown\", \"upharpoonleft\",\r\n \"upharpoonright\", \"downharpoonleft\",\r\n \"downharpoonright\", \"leftrightharpoons\", \"rightleftharpoons\", \"leftleftarrows\",\r\n \"rightrightarrows\", \"upuparrows\", \"downdownarrows\", \"leftrightarrows\",\r\n \"rightleftarrows\", \"looparrowleft\", \"looparrowright\", \"leftarrowtail\",\r\n \"rightarrowtail\", \"Lsh\", \"Rsh\", \"Lleftarrow\", \"Rrightarrow\", \"curvearrowleft\",\r\n \"curvearrowright\", \"circlearrowleft\", \"circlearrowright\", \"multimap\",\r\n \"leftrightsquigarrow\", \"twoheadleftarrow\", \"twoheadrightarrow\", \"rightsquigarrow\"\r\n ],\r\n configList = baseToolbarConfig[ 2 ].options.box.group[ 4 ].items;\n\r\n configList.push( {\r\n title: \"箭头\",\r\n content: getUnicodeContents( list )\r\n } );\r\n\r\n } )();\r\n\r\n // Script styles\r\n ( function () {\r\n\r\n let list = [ {\r\n title: \"手写体\",\r\n values: [\r\n \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\",\r\n \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\",\r\n \"Y\", \"Z\" ]\r\n }, {\r\n title: \"花体\",\r\n values: [\r\n \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\",\r\n \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\",\r\n \"Y\", \"Z\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\",\r\n \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\",\r\n \"w\", \"x\", \"y\", \"z\"\r\n ]\r\n }, {\r\n title: \"双线\",\r\n values: [\r\n \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\",\r\n \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\",\r\n \"Y\", \"Z\"\r\n ]\r\n }, {\r\n title: \"罗马\",\r\n values: [\r\n \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\",\r\n \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\",\r\n \"Y\", \"Z\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\",\r\n \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\",\r\n \"w\", \"x\", \"y\", \"z\"\r\n ]\r\n } ],\r\n configList = baseToolbarConfig[ 2 ].options.box.group[ 5 ].items;\n\r\n each( list[ 0 ].values, function ( item, index ) {\r\n\r\n list[ 0 ].values[ index ] = \"mathcal{\" + item + \"}\";\r\n\r\n } );\r\n\r\n each( list[ 1 ].values, function ( item, index ) {\r\n\r\n list[ 1 ].values[ index ] = \"mathfrak{\" + item + \"}\";\r\n\r\n } );\r\n\r\n each( list[ 2 ].values, function ( item, index ) {\r\n\r\n list[ 2 ].values[ index ] = \"mathbb{\" + item + \"}\";\r\n\r\n } );\r\n\r\n each( list[ 3 ].values, function ( item, index ) {\r\n\r\n list[ 3 ].values[ index ] = \"mathrm{\" + item + \"}\";\r\n\r\n } );\r\n\r\n // Script-style glyphs\r\n configList.push( {\r\n title: list[ 0 ].title,\r\n content: getUnicodeContents( list[ 0 ].values )\r\n } );\r\n\r\n configList.push( {\r\n title: list[ 1 ].title,\r\n content: getUnicodeContents( list[ 1 ].values )\r\n } );\r\n\r\n configList.push( {\r\n title: list[ 2 ].title,\r\n content: getUnicodeContents( list[ 2 ].values )\r\n } );\r\n\r\n configList.push( {\r\n title: list[ 3 ].title,\r\n content: getUnicodeContents( list[ 3 ].values )\r\n } );\r\n\r\n } )();\r\n\r\n function getUnicodeContents ( keySet ) {\r\n\r\n let result = [];\r\n\r\n each( keySet, function ( key ) {\r\n\r\n let displayKey = key;\r\n\r\n if ( key.length > 1 ) {\r\n displayKey = \"\\\\\" + key;\r\n }\r\n\r\n const resolved = resolveUnicode(displayKey);\r\n const item: any = {\r\n key: displayKey,\r\n unicode: resolved ? resolved.char : displayKey\r\n };\r\n if (resolved?.fontFamily) {\r\n item.unicodeFont = resolved.fontFamily;\r\n }\r\n result.push( item );\r\n\r\n } );\r\n\r\n return result;\r\n\n }\n\nexport function createToolbarConfig(locale: FormulaXLocale = DEFAULT_FORMULAX_LOCALE): ToolbarCollection {\n return localizeToolbarConfig(\n baseToolbarConfig,\n normalizeFormulaXLocale(locale),\n ) as ToolbarCollection;\n}\n\nexport default createToolbarConfig;\n","import { legacyUiDef } from '../vendor/legacy-ui-def';\r\nimport { createLegacyUiUtils } from '../vendor/legacy-ui-utils';\r\nimport { legacyBaseUtils } from '../vendor/legacy-utils';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\nimport Toolbar from './toolbar';\nimport Scrollbar from './scrollbar';\nimport createToolbarConfig from './toolbar-config';\nimport { normalizeFormulaXLocale } from '../i18n';\n\r\ntype ViewState = (typeof legacyUiDef.VIEW_STATE)[keyof typeof legacyUiDef.VIEW_STATE];\r\n\r\ntype UIComponentInstance = {\r\n options: Record<string, any>;\r\n container: HTMLElement;\r\n components: {\r\n toolbar?: unknown;\r\n scrollZoom?: unknown;\r\n scrollbar?: unknown;\r\n };\r\n canvasRect: DOMRect | null;\r\n viewState: ViewState;\r\n kfEditor: LegacyEditorInstance;\r\n toolbarWrap: HTMLDivElement;\r\n toolbarContainer: HTMLDivElement;\r\n editArea: HTMLDivElement;\r\n canvasContainer: HTMLDivElement;\r\n scrollbarContainer: HTMLDivElement;\r\n initComponents: () => void;\r\n updateContainerSize: (container: HTMLElement, toolbar: HTMLElement, editArea: HTMLElement) => void;\r\n initServices: () => void;\r\n initEvent: () => void;\r\n initScrollEvent: () => void;\r\n getCanvasContainer: () => HTMLDivElement;\r\n addEvent: (type: string, handler: (event: Event) => void) => void;\r\n removeEvent: () => void;\r\n trigger: (type: string) => void;\r\n updateCanvasView: () => void;\r\n toggleViewState: () => void;\r\n};\r\n\r\ntype LegacyFormulaCanvas = {\r\n getContentContainer: () => {\r\n getRenderBox: (scope?: string) => { width: number };\r\n };\r\n};\r\n\r\nconst $$ = createLegacyUiUtils();\r\nconst VIEW_STATE = legacyUiDef.VIEW_STATE;\r\nconst DEFAULT_EDIT_AREA_HEIGHT = 100;\r\nconst kity = getLegacyKity();\r\n\r\nconst UIComponent = kity.createClass('UIComponent', {\r\n constructor(this: UIComponentInstance, kfEditor: LegacyEditorInstance, options?: Record<string, any>) {\r\n const currentDocument = kfEditor.getContainer().ownerDocument;\r\n\r\n this.options = options ?? {};\r\n this.container = kfEditor.getContainer();\r\n this.components = {};\r\n this.canvasRect = null;\r\n this.viewState = VIEW_STATE.NO_OVERFLOW;\r\n this.kfEditor = kfEditor;\r\n this.toolbarWrap = createToolbarWrap(currentDocument);\r\n this.toolbarContainer = createToolbarContainer(currentDocument);\r\n this.editArea = createEditArea(currentDocument);\r\n this.canvasContainer = createCanvasContainer(currentDocument);\r\n this.scrollbarContainer = createScrollbarContainer(currentDocument);\r\n\r\n this.toolbarWrap.appendChild(this.toolbarContainer);\r\n this.container.appendChild(this.toolbarWrap);\r\n this.editArea.appendChild(this.canvasContainer);\r\n this.container.appendChild(this.editArea);\r\n this.container.appendChild(this.scrollbarContainer);\r\n\r\n this.initComponents();\r\n this.initServices();\r\n this.initEvent();\r\n this.updateContainerSize(this.container, this.toolbarWrap, this.editArea);\r\n this.initScrollEvent();\r\n },\r\n\r\n initComponents(this: UIComponentInstance) {\n const toolbarConfig = createToolbarConfig(normalizeFormulaXLocale(this.options.locale));\n\n this.components.toolbar = new (Toolbar as any)(this, this.kfEditor, toolbarConfig);\n\n this.components.scrollbar = new (Scrollbar as any)(this, this.kfEditor);\n },\n\r\n updateContainerSize(this: UIComponentInstance, container: HTMLElement, toolbar: HTMLElement, editArea: HTMLElement) {\r\n const containerBox = container.getBoundingClientRect();\r\n const toolbarBox = toolbar.getBoundingClientRect();\r\n const declaredHeight = container.style.height;\r\n const containerHeight = containerBox.height;\r\n let editAreaHeight = DEFAULT_EDIT_AREA_HEIGHT;\r\n\r\n if (declaredHeight && declaredHeight !== 'auto') {\r\n editAreaHeight = Math.max(containerHeight - toolbarBox.height, DEFAULT_EDIT_AREA_HEIGHT);\r\n }\r\n\r\n editArea.style.width = '100%';\r\n editArea.style.height = `${editAreaHeight}px`;\r\n },\r\n\r\n initServices(this: UIComponentInstance) {\r\n this.kfEditor.registerService('ui.get.canvas.container', this, {\r\n getCanvasContainer: this.getCanvasContainer,\r\n });\r\n\r\n this.kfEditor.registerService('ui.update.canvas.view', this, {\r\n updateCanvasView: this.updateCanvasView,\r\n });\r\n\r\n this.kfEditor.registerService('ui.canvas.container.event', this, {\r\n on: this.addEvent,\r\n off: this.removeEvent,\r\n trigger: this.trigger,\r\n fire: this.trigger,\r\n });\r\n },\r\n\r\n initEvent(this: UIComponentInstance) {},\r\n\r\n initScrollEvent(this: UIComponentInstance) {\r\n this.kfEditor.requestService(\r\n 'ui.set.scrollbar.update.handler',\r\n (proportion: number, _offset: number, values: { contentWidth: number; viewWidth: number }) => {\r\n const offset = Math.floor(proportion * (values.contentWidth - values.viewWidth));\r\n this.kfEditor.requestService('render.set.canvas.offset', offset);\r\n },\r\n );\r\n },\r\n\r\n getCanvasContainer(this: UIComponentInstance) {\r\n return this.canvasContainer;\r\n },\r\n\r\n addEvent(this: UIComponentInstance, type: string, handler: (event: Event) => void) {\r\n legacyBaseUtils.addEvent(this.canvasContainer, type, handler);\r\n },\r\n\r\n removeEvent(this: UIComponentInstance) {},\r\n\r\n trigger(this: UIComponentInstance, type: string) {\r\n legacyBaseUtils.trigger(this.canvasContainer, type);\r\n },\r\n\r\n updateCanvasView(this: UIComponentInstance) {\r\n const canvas = this.kfEditor.requestService('render.get.canvas') as LegacyFormulaCanvas;\r\n const contentContainer = canvas.getContentContainer();\r\n\r\n this.canvasRect = this.canvasContainer.getBoundingClientRect();\r\n\r\n const contentRect = contentContainer.getRenderBox('paper');\r\n\r\n if (contentRect.width > this.canvasRect.width) {\r\n if (this.viewState === VIEW_STATE.NO_OVERFLOW) {\r\n this.toggleViewState();\r\n this.kfEditor.requestService('ui.show.scrollbar');\r\n this.kfEditor.requestService('render.disable.relocation');\r\n }\r\n\r\n this.kfEditor.requestService('render.relocation');\r\n this.kfEditor.requestService('ui.update.scrollbar', contentRect.width);\r\n this.kfEditor.requestService('ui.relocation.scrollbar');\r\n return;\r\n }\r\n\r\n if (this.viewState === VIEW_STATE.OVERFLOW) {\r\n this.toggleViewState();\r\n this.kfEditor.requestService('ui.hide.scrollbar');\r\n this.kfEditor.requestService('render.enable.relocation');\r\n }\r\n\r\n this.kfEditor.requestService('render.relocation');\r\n },\r\n\r\n toggleViewState(this: UIComponentInstance) {\r\n this.viewState = this.viewState === VIEW_STATE.NO_OVERFLOW ? VIEW_STATE.OVERFLOW : VIEW_STATE.NO_OVERFLOW;\r\n },\r\n});\r\n\r\nfunction createToolbarWrap(doc: Document) {\r\n return $$.ele(doc, 'div', {\r\n className: 'kf-editor-toolbar',\r\n }) as HTMLDivElement;\r\n}\r\n\r\nfunction createToolbarContainer(doc: Document) {\r\n return $$.ele(doc, 'div', {\r\n className: 'kf-editor-inner-toolbar',\r\n }) as HTMLDivElement;\r\n}\r\n\r\nfunction createEditArea(doc: Document) {\r\n const container = doc.createElement('div');\r\n container.className = 'kf-editor-edit-area';\r\n container.style.width = '100%';\r\n container.style.height = `${DEFAULT_EDIT_AREA_HEIGHT}px`;\r\n return container;\r\n}\r\n\r\nfunction createCanvasContainer(doc: Document) {\r\n const container = doc.createElement('div');\r\n container.className = 'kf-editor-canvas-container';\r\n return container;\r\n}\r\n\r\nfunction createScrollbarContainer(doc: Document) {\r\n const container = doc.createElement('div');\r\n container.className = 'kf-editor-edit-scrollbar';\r\n return container;\r\n}\r\n\r\nexport default UIComponent as new (kfEditor: LegacyEditorInstance, options?: Record<string, any>) => UIComponentInstance;\r\n\r\n","import { legacyKfExtDef } from '../vendor/legacy-kf-ext-def';\r\nimport { legacySysconf } from '../vendor/legacy-sysconf';\r\nimport { getLegacyKf, getLegacyKity } from '../vendor/runtime-interop';\r\n\r\ntype PlaceholderExpressionLike = {\r\n getLabel: () => string | null;\r\n expand: (width: number, height: number) => void;\r\n translateElement: (x: number, y: number) => void;\r\n};\r\n\r\ntype PlaceholderOperatorInstance = {\r\n opShape: {\r\n fill: (color: string) => void;\r\n } | null;\r\n parentExpression: PlaceholderExpressionLike;\r\n addOperatorShape: (shape: unknown) => void;\r\n applyOperand: () => void;\r\n select: () => void;\r\n selectAll: () => void;\r\n unselect: () => void;\r\n};\r\n\r\nconst kity = getLegacyKity() as any;\r\nconst kf = getLegacyKf() as any;\r\n\r\nfunction createCommonShape(operator: PlaceholderOperatorInstance) {\r\n const shape = new kity.Rect(35, 50, 0, 0).stroke('black').fill('transparent');\r\n shape.setAttr('stroke-dasharray', '5, 5');\r\n operator.addOperatorShape(shape);\r\n return shape;\r\n}\r\n\r\nfunction createRootPlaceholder(operator: PlaceholderOperatorInstance, label: string) {\r\n const textShape = new kity.Text(label).fill(legacySysconf.rootPlaceholder.color);\r\n const shapeGroup = new kity.Group();\r\n const padding = 20;\r\n const radius = 7;\r\n const borderBoxShape = new kity.Rect(0, 0, 0, 0, radius).stroke(legacySysconf.rootPlaceholder.color).fill('transparent');\r\n\r\n textShape.setFontSize(40);\r\n shapeGroup.addShape(borderBoxShape);\r\n shapeGroup.addShape(textShape);\r\n operator.addOperatorShape(shapeGroup);\r\n\r\n const textBox = textShape.getFixRenderBox();\r\n\r\n borderBoxShape.stroke(legacySysconf.rootPlaceholder.color).fill('transparent');\r\n borderBoxShape.setSize(textBox.width + padding * 2, textBox.height + padding * 2);\r\n borderBoxShape.setRadius(radius);\r\n borderBoxShape.setAttr('stroke-dasharray', '5, 5');\r\n\r\n textShape.setAttr({\r\n dx: -textBox.x,\r\n dy: -textBox.y,\r\n });\r\n textShape.translate(padding, padding);\r\n\r\n return borderBoxShape;\r\n}\r\n\r\nfunction generateOpShape(operator: PlaceholderOperatorInstance, label: string | null) {\r\n if (label !== null) {\r\n return createRootPlaceholder(operator, label);\r\n }\r\n\r\n return createCommonShape(operator);\r\n}\r\n\r\nconst PlaceholderOperator = kity.createClass('PlaceholderOperator', {\r\n base: kf.Operator,\r\n\r\n constructor(this: PlaceholderOperatorInstance) {\r\n this.opShape = null;\r\n if ((this as any).__formulaxNeverCallBase__) {\r\n (this as any).callBase('Placeholder');\r\n }\r\n kf.Operator.call(this, 'Placeholder');\r\n },\r\n\r\n applyOperand(this: PlaceholderOperatorInstance) {\r\n this.opShape = generateOpShape(this, this.parentExpression.getLabel());\r\n this.parentExpression.expand(20, 20);\r\n this.parentExpression.translateElement(10, 10);\r\n },\r\n\r\n select(this: PlaceholderOperatorInstance) {\r\n this.opShape?.fill(legacyKfExtDef.selectColor);\r\n },\r\n\r\n selectAll(this: PlaceholderOperatorInstance) {\r\n this.opShape?.fill(legacyKfExtDef.allSelectColor);\r\n },\r\n\r\n unselect(this: PlaceholderOperatorInstance) {\r\n this.opShape?.fill('transparent');\r\n },\r\n});\r\n\r\nexport default PlaceholderOperator;\r\n","import { getLegacyKf, getLegacyKity } from '../vendor/runtime-interop';\nimport PlaceholderOperator from './kf-ext-placeholder-operator';\n\ntype PlaceholderExpressionInstance = {\n label: string | null;\n box: {\n setAttr: (name: string | Record<string, unknown>, value?: unknown) => void;\n };\n setFlag: (flag: string) => void;\n setOperator: (operator: unknown) => void;\n getOperator: () => {\n select: () => void;\n selectAll: () => void;\n unselect: () => void;\n };\n setLabel: (label: string) => void;\n getLabel: () => string | null;\n setAttr: (key: string | Record<string, any>, val?: unknown) => void;\n select: () => void;\n selectAll: () => void;\n unselect: () => void;\n};\n\nconst kity = getLegacyKity() as any;\nconst kf = getLegacyKf() as any;\nconst BaseCompoundExpression = kf.CompoundExpression;\n\nconst PlaceholderExpression = kity.createClass('PlaceholderExpression', {\n base: kf.CompoundExpression,\n\n constructor(this: PlaceholderExpressionInstance) {\n if ((this as any).__formulaxNeverCallBase__) {\n (this as any).callBase();\n }\n BaseCompoundExpression.call(this);\n this.setFlag('Placeholder');\n this.label = null;\n this.box.setAttr('data-type', null);\n this.setOperator(new PlaceholderOperator());\n },\n\n setLabel(this: PlaceholderExpressionInstance, label: string) {\n this.label = label;\n },\n\n getLabel(this: PlaceholderExpressionInstance) {\n return this.label;\n },\n\n setAttr(this: PlaceholderExpressionInstance, key: string | Record<string, any>, val?: unknown) {\n if (key === 'label') {\n this.setLabel(val as string);\n return;\n }\n\n if (typeof key === 'object' && key.label) {\n this.setLabel(key.label);\n delete key.label;\n }\n\n BaseCompoundExpression.prototype.setAttr.call(this, key, val);\n },\n\n select(this: PlaceholderExpressionInstance) {\n this.getOperator().select();\n },\n\n selectAll(this: PlaceholderExpressionInstance) {\n this.getOperator().selectAll();\n },\n\n unselect(this: PlaceholderExpressionInstance) {\n this.getOperator().unselect();\n },\n});\n\nexport default PlaceholderExpression;\n","import { legacyKfExtDef } from '../vendor/legacy-kf-ext-def';\nimport { getLegacyKf } from '../vendor/runtime-interop';\nimport PlaceholderExpression from './kf-ext-placeholder-expression';\n\ntype ParserWithKf = {\n getKFParser: () => {\n expand: (config: unknown) => void;\n };\n};\n\nconst kf = getLegacyKf() as any;\n\nexport function installLegacyKfExtension(parser: ParserWithKf) {\n kf.PlaceholderExpression = PlaceholderExpression;\n\n kf.Expression.prototype.select = function select() {\n this.box.fill(legacyKfExtDef.selectColor);\n };\n\n kf.Expression.prototype.selectAll = function selectAll() {\n this.box.fill(legacyKfExtDef.allSelectColor);\n };\n\n kf.Expression.prototype.unselect = function unselect() {\n this.box.fill('transparent');\n };\n\n parser.getKFParser().expand({\n parse: {\n placeholder: {\n name: 'placeholder',\n handler(info: Record<string, unknown>) {\n delete info.handler;\n info.operand = [];\n return info;\n },\n sign: false,\n },\n },\n reverse: {\n placeholder() {\n return '\\\\placeholder ';\n },\n },\n });\n}\n\nexport default {\n ext: installLegacyKfExtension,\n};\n","export const legacyVirtualGroupMap = {\n radical: true,\n fraction: true,\n summation: true,\n integration: true,\n placeholder: true,\n script: true,\n superscript: true,\n subscript: true,\n brackets: true,\n function: true,\n} as const;\n\nexport default legacyVirtualGroupMap;\n","import { createLegacyBaseComponent } from '../vendor/legacy-component';\r\nimport { legacyGroupType } from '../vendor/legacy-group-type';\r\nimport { legacySysconf } from '../vendor/legacy-sysconf';\r\nimport { getLegacyKf, getLegacyKity } from '../vendor/runtime-interop';\r\nimport extensionModule from './kf-ext-extension';\r\nimport legacyVirtualGroupMap from './vgroup-def';\r\nimport type { LegacyEditorInstance } from './editor';\r\n\r\ntype LegacyTreeNode = {\r\n name: string;\r\n operand: Array<LegacyTreeNode | string | null>;\r\n attr?: Record<string, any>;\r\n traversal?: string;\r\n};\r\n\r\ntype ParserLike = {\r\n parse: (input: string) => {\r\n tree: LegacyTreeNode;\r\n [key: string]: unknown;\r\n };\r\n serialization: (tree: LegacyTreeNode) => string;\r\n expand: (config: unknown) => void;\r\n};\r\n\r\ntype LegacyKfWithParser = ReturnType<typeof getLegacyKf> & {\r\n Parser: {\r\n use: (type: string) => ParserLike;\r\n };\r\n};\r\n\r\ntype ParserComponentInstance = {\r\n kfEditor: LegacyEditorInstance;\r\n kfParser: ParserLike;\r\n pid: string;\r\n groupRecord: number;\r\n tree: LegacyTreeNode | null;\r\n isResetId: boolean;\r\n callBase: () => void;\r\n initServices: () => void;\r\n parse: (str: string, isResetId?: boolean) => {\r\n tree: LegacyTreeNode;\r\n [key: string]: unknown;\r\n };\r\n serialization: (tree: LegacyTreeNode) => string;\r\n getKFParser: () => ParserLike;\r\n initKFormulExtension: () => void;\r\n resetGroupId: () => void;\r\n getGroupId: () => string;\r\n};\r\n\r\nconst CURSOR_CHAR = legacySysconf.cursorCharacter;\nconst COMBINATION_NAME = 'combination';\nconst PID_PREFIX = '_kf_editor_';\n\r\nlet pidSeed = 0;\r\n\r\nconst kity = getLegacyKity();\r\nconst kf = getLegacyKf() as LegacyKfWithParser;\r\nconst BaseComponent = createLegacyBaseComponent(kity as { createClass: (name: string, definition: object) => unknown });\r\n\r\nfunction generateId() {\r\n pidSeed += 1;\r\n return `${PID_PREFIX}${pidSeed}`;\r\n}\r\n\r\nfunction isVirtualGroup(tree: LegacyTreeNode) {\r\n return !!legacyVirtualGroupMap[tree.name as keyof typeof legacyVirtualGroupMap];\r\n}\r\n\r\nfunction isPlaceholder(tree: LegacyTreeNode) {\r\n return tree.name === 'placeholder';\r\n}\r\n\r\nfunction onlyPlaceholder(operands: Array<LegacyTreeNode | string | null>) {\r\n let result = 1;\r\n\r\n if (operands.length > 3) {\r\n return false;\r\n }\r\n\r\n for (const operand of operands) {\r\n if (operand === CURSOR_CHAR) {\r\n continue;\r\n }\r\n\r\n if (operand && typeof operand !== 'string' && operand.name === 'placeholder') {\r\n result -= 1;\r\n }\r\n }\r\n\r\n return !result;\r\n}\r\n\r\nfunction createGroup(parser: ParserComponentInstance): LegacyTreeNode {\n return {\r\n name: COMBINATION_NAME,\r\n attr: {\r\n 'data-type': legacyGroupType.GROUP,\r\n id: parser.getGroupId(),\r\n },\r\n operand: [],\r\n };\r\n}\n\nfunction getRootPlaceholderText() {\n return legacySysconf.rootPlaceholder.content;\n}\n\r\nfunction processRootGroup(parser: ParserComponentInstance, tree: LegacyTreeNode) {\r\n if (!parser.isResetId) {\r\n tree.attr!['data-type'] = legacyGroupType.VIRTUAL;\r\n } else {\r\n tree.attr!['data-root'] = 'true';\r\n }\r\n}\r\n\r\nfunction processVirtualGroup(\r\n parser: ParserComponentInstance,\r\n index: number,\r\n tree: LegacyTreeNode,\r\n subtree: LegacyTreeNode | string | null,\r\n) {\r\n if ((tree.name === 'brackets' && index < 2) || (tree.name === 'function' && index === 0)) {\r\n return;\r\n }\r\n\r\n tree.attr!['data-type'] = legacyGroupType.VIRTUAL;\r\n\r\n if (!subtree) {\r\n tree.operand[index] = subtree;\r\n return;\r\n }\r\n\r\n if (typeof subtree === 'string') {\r\n tree.operand[index] = createGroup(parser);\r\n (tree.operand[index] as LegacyTreeNode).operand[0] = subtree;\r\n return;\r\n }\r\n\r\n if (isPlaceholder(subtree)) {\r\n tree.operand[index] = createGroup(parser);\r\n (tree.operand[index] as LegacyTreeNode).operand[0] = supplementTree(parser, subtree, tree.operand[index] as LegacyTreeNode);\r\n return;\r\n }\r\n\r\n tree.operand[index] = supplementTree(parser, subtree, tree);\r\n}\r\n\r\nfunction processGroup(parser: ParserComponentInstance, index: number, tree: LegacyTreeNode, subtree: LegacyTreeNode | string | null) {\r\n tree.attr!['data-type'] = legacyGroupType.GROUP;\r\n\r\n if (!subtree || typeof subtree === 'string') {\r\n tree.operand[index] = subtree;\r\n return;\r\n }\r\n\r\n if (subtree.name === 'text') {\r\n tree.operand[index] = subtree;\r\n return;\r\n }\r\n\r\n tree.operand[index] = supplementTree(parser, subtree, tree);\r\n}\r\n\r\nfunction supplementTree(parser: ParserComponentInstance, tree: LegacyTreeNode, parentTree?: LegacyTreeNode) {\r\n const isRoot = !parentTree;\r\n\r\n tree.attr = tree.attr || {};\r\n tree.attr.id = parser.getGroupId();\r\n\r\n if (isRoot) {\n processRootGroup(parser, tree);\n } else if (parentTree?.attr?.['data-root'] && tree.name === 'placeholder' && onlyPlaceholder(parentTree.operand)) {\n tree.attr.label = getRootPlaceholderText();\n }\n\r\n for (let i = 0; i < tree.operand.length; i += 1) {\r\n const currentOperand = tree.operand[i] as LegacyTreeNode | string | null;\r\n\r\n if (isVirtualGroup(tree)) {\r\n processVirtualGroup(parser, i, tree, currentOperand);\r\n } else {\r\n processGroup(parser, i, tree, currentOperand);\r\n }\r\n }\r\n\r\n return tree;\r\n}\r\n\r\nconst Parser = kity.createClass('Parser', {\r\n base: BaseComponent,\r\n\r\n constructor(this: ParserComponentInstance, kfEditor: LegacyEditorInstance) {\r\n this.kfEditor = kfEditor;\r\n\r\n if ((this as any).__formulaxNeverCallBase__) {\r\n this.callBase();\r\n }\r\n (BaseComponent as any).call(this);\r\n\r\n this.kfParser = kf.Parser.use('latex');\r\n this.initKFormulExtension();\r\n this.pid = generateId();\r\n this.groupRecord = 0;\r\n this.tree = null;\r\n this.isResetId = true;\r\n this.initServices();\r\n },\r\n\r\n parse(this: ParserComponentInstance, str: string, isResetId?: boolean) {\r\n this.isResetId = !!isResetId;\r\n\r\n if (this.isResetId) {\r\n this.resetGroupId();\r\n }\r\n\r\n const parsedResult = this.kfParser.parse(str);\r\n supplementTree(this, parsedResult.tree);\r\n\r\n return parsedResult;\r\n },\r\n\r\n serialization(this: ParserComponentInstance, tree: LegacyTreeNode) {\r\n return this.kfParser.serialization(tree);\r\n },\r\n\r\n initServices(this: ParserComponentInstance) {\r\n this.kfEditor.registerService('parser.parse', this, {\r\n parse: this.parse,\r\n });\r\n\r\n this.kfEditor.registerService('parser.latex.serialization', this, {\r\n serialization: this.serialization,\r\n });\r\n },\r\n\r\n getKFParser(this: ParserComponentInstance) {\r\n return this.kfParser;\r\n },\r\n\r\n initKFormulExtension(this: ParserComponentInstance) {\r\n extensionModule.ext(this);\r\n },\r\n\r\n resetGroupId(this: ParserComponentInstance) {\r\n this.groupRecord = 0;\r\n },\r\n\r\n getGroupId(this: ParserComponentInstance) {\r\n this.groupRecord += 1;\r\n return `${this.pid}_${this.groupRecord}`;\r\n },\r\n});\r\n\r\nexport default Parser as new (kfEditor: LegacyEditorInstance) => ParserComponentInstance;\r\n","import { createLegacyBaseComponent } from '../vendor/legacy-component';\r\nimport { getLegacyKf, getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\n\r\ntype LegacyViewBox = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n};\r\n\r\ntype LegacyViewport = {\r\n zoom: number;\r\n [key: string]: unknown;\r\n};\r\n\r\ntype LegacyRenderBox = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n};\r\n\r\ntype LegacyContainerTranslate = {\r\n x: number;\r\n y: number;\r\n};\r\n\r\ntype LegacyFormulaContainer = {\r\n getRenderBox: (scope?: string) => LegacyRenderBox;\r\n setTranslate: (x: number | LegacyContainerTranslate, y?: number) => void;\r\n getTranslate: () => LegacyContainerTranslate;\r\n};\r\n\r\ntype LegacyFormula = {\r\n container: LegacyFormulaContainer;\r\n node: {\r\n removeAttribute: (name: string) => void;\r\n };\r\n getViewBox: () => LegacyViewBox;\r\n setViewBox: (x: number, y: number, width: number, height: number) => void;\r\n getViewPort: () => LegacyViewport;\r\n setViewPort: (viewPort: LegacyViewport) => void;\r\n getContentContainer: () => {\r\n getRenderBox: (scope?: string) => LegacyRenderBox;\r\n };\r\n};\r\n\r\ntype LegacyAssembly = {\r\n formula: LegacyFormula;\r\n regenerateBy: (parsedTree: unknown) => unknown;\r\n};\r\n\r\ntype LegacyKfWithAssembly = ReturnType<typeof getLegacyKf> & {\r\n Assembly: new (formula: unknown) => LegacyAssembly;\r\n};\r\n\r\ntype SelectableGroupObject = {\r\n node: Element & {\r\n ownerSVGElement?: SVGSVGElement | null;\r\n };\r\n operands: Array<{\r\n getRenderBox: (group: SelectableGroupObject) => LegacyRenderBox;\r\n node: Element;\r\n }>;\r\n getOperand: (index: number) => {\r\n getRenderBox: (group: SelectableGroupObject) => LegacyRenderBox;\r\n node: Element;\r\n };\r\n select: () => void;\r\n selectAll: () => void;\r\n unselect: () => void;\r\n getRenderBox: (group: SelectableGroupObject) => LegacyRenderBox;\r\n setBoxWidth: (width: number) => void;\r\n getBox: () => {\r\n setTranslate: (x: number, y: number) => void;\r\n };\r\n};\r\n\r\ntype CursorRecord = {\r\n groupId: string;\r\n startOffset: number;\r\n endOffset: number;\r\n};\r\n\r\ntype GroupInfo = {\r\n id: string;\r\n groupObj: Element;\r\n content: Array<{ id: string }>;\r\n};\r\n\r\ntype RenderComponentRecord = {\r\n select: {\r\n lastSelect?: SelectableGroupObject | null;\r\n };\r\n cursor: Record<string, unknown>;\r\n canvas: {\r\n viewBox?: LegacyViewBox | null;\r\n contentOffset?: LegacyContainerTranslate | null;\r\n };\r\n};\r\n\r\ntype RenderComponentInstance = {\r\n options: typeof DEFAULT_OPTIONS & Record<string, unknown>;\r\n kfEditor: LegacyEditorInstance;\r\n assembly: LegacyAssembly | null;\r\n formula: LegacyFormula;\r\n relDisabled: boolean;\r\n canvasZoom: number;\r\n record: RenderComponentRecord;\r\n callBase: () => void;\r\n initCanvas: () => void;\r\n setCanvasOffset: (offsetX: number, offsetY?: number) => void;\r\n setCanvasToCenter: () => void;\r\n initServices: () => void;\r\n initCommands: () => void;\r\n relocation: () => void;\r\n relocationToCenter: () => void;\r\n relocationToLeft: () => void;\r\n selectGroup: (groupId: string) => void;\r\n selectGroupContent: (group: GroupInfo) => void;\r\n selectAllGroup: (group: GroupInfo) => void;\r\n selectCurrentCursor: () => void;\r\n tintCurrentGroup: () => void;\r\n reselect: () => void;\r\n clearSelect: () => void;\r\n getPaper: () => LegacyFormula;\r\n getPaperOffset: () => LegacyContainerTranslate;\r\n render: (latexStr: string) => void;\r\n enableRelocation: () => void;\r\n disableRelocation: () => void;\r\n setCanvasZoom: (zoom: number) => void;\r\n getCanvas: () => LegacyFormula;\r\n getContentSize: () => LegacyRenderBox;\r\n clearCanvasTransform: () => void;\r\n revertCanvasTransform: () => boolean;\r\n getCanvasZoom: () => number;\r\n insertString: (value: string) => string;\r\n insertGroup: (value: unknown) => unknown;\r\n};\r\n\r\nconst DEFAULT_OPTIONS = {\r\n autoresize: false,\r\n fontsize: 50,\r\n padding: [20, 50],\r\n};\r\n\r\nconst kity = getLegacyKity() as ReturnType<typeof getLegacyKity> & {\r\n Utils: {\r\n extend: <T>(deep: boolean | T, target?: T, ...sources: Array<Record<string, unknown>>) => T;\r\n };\r\n};\r\nconst kf = getLegacyKf() as LegacyKfWithAssembly;\r\nconst BaseComponent = createLegacyBaseComponent(kity as { createClass: (name: string, definition: object) => unknown });\r\n\r\nconst RenderComponent = kity.createClass('RenderComponent', {\r\n base: BaseComponent,\r\n\r\n constructor(this: RenderComponentInstance, kfEditor: LegacyEditorInstance, options?: Record<string, unknown>) {\r\n if ((this as any).__formulaxNeverCallBase__) {\r\n this.callBase();\r\n }\r\n (BaseComponent as any).call(this);\r\n\r\n this.options = kity.Utils.extend({}, DEFAULT_OPTIONS, options) as typeof DEFAULT_OPTIONS & Record<string, unknown>;\r\n this.kfEditor = kfEditor;\r\n this.assembly = null;\r\n this.formula = null as unknown as LegacyFormula;\r\n this.relDisabled = false;\r\n this.canvasZoom = 1;\r\n this.record = {\r\n select: {},\r\n cursor: {},\r\n canvas: {},\r\n };\r\n\r\n this.initCanvas();\r\n this.initServices();\r\n this.initCommands();\r\n },\r\n\r\n initCanvas(this: RenderComponentInstance) {\r\n const canvasContainer = this.kfEditor.requestService('ui.get.canvas.container') as HTMLElement;\r\n const Formula = this.kfEditor.getFormulaClass() as new (container: HTMLElement, options: unknown) => LegacyFormula;\r\n\r\n this.assembly = new kf.Assembly(new Formula(canvasContainer, this.options)) as LegacyAssembly;\r\n this.formula = this.assembly.formula;\r\n this.setCanvasToCenter();\r\n },\r\n\r\n setCanvasOffset(this: RenderComponentInstance, offsetX: number, offsetY?: number) {\r\n const viewBox = this.formula.getViewBox();\r\n const nextOffsetY = offsetY !== undefined ? offsetY : -viewBox.height / 2;\r\n\r\n this.formula.setViewBox(offsetX, nextOffsetY, viewBox.width, viewBox.height);\r\n },\r\n\r\n setCanvasToCenter(this: RenderComponentInstance) {\r\n const viewBox = this.formula.getViewBox();\r\n this.formula.setViewBox(-viewBox.width / 2, -viewBox.height / 2, viewBox.width, viewBox.height);\r\n },\r\n\r\n initServices(this: RenderComponentInstance) {\r\n this.kfEditor.registerService('render.get.canvas', this, {\r\n getCanvas: this.getCanvas,\r\n });\r\n this.kfEditor.registerService('render.get.content.size', this, {\r\n getContentSize: this.getContentSize,\r\n });\r\n this.kfEditor.registerService('render.clear.canvas.transform', this, {\r\n clearCanvasOffset: this.clearCanvasTransform,\r\n });\r\n this.kfEditor.registerService('render.set.canvas.offset', this, {\r\n setCanvasOffset: this.setCanvasOffset,\r\n });\r\n this.kfEditor.registerService('render.set.canvas.to.center', this, {\r\n setCanvasToCenter: this.setCanvasToCenter,\r\n });\r\n this.kfEditor.registerService('render.revert.canvas.transform', this, {\r\n revertCanvasTransform: this.revertCanvasTransform,\r\n });\r\n this.kfEditor.registerService('render.relocation', this, {\r\n relocation: this.relocation,\r\n });\r\n this.kfEditor.registerService('render.disable.relocation', this, {\r\n disableRelocation: this.disableRelocation,\r\n });\r\n this.kfEditor.registerService('render.enable.relocation', this, {\r\n enableRelocation: this.enableRelocation,\r\n });\r\n this.kfEditor.registerService('render.select.group.content', this, {\r\n selectGroupContent: this.selectGroupContent,\r\n });\r\n this.kfEditor.registerService('render.select.group', this, {\r\n selectGroup: this.selectGroup,\r\n });\r\n this.kfEditor.registerService('render.select.group.all', this, {\r\n selectAllGroup: this.selectAllGroup,\r\n });\r\n this.kfEditor.registerService('render.tint.current.cursor', this, {\r\n tintCurrentGroup: this.tintCurrentGroup,\r\n });\r\n this.kfEditor.registerService('render.select.current.cursor', this, {\r\n selectCurrentCursor: this.selectCurrentCursor,\r\n });\r\n this.kfEditor.registerService('render.reselect', this, {\r\n reselect: this.reselect,\r\n });\r\n this.kfEditor.registerService('render.clear.select', this, {\r\n clearSelect: this.clearSelect,\r\n });\r\n this.kfEditor.registerService('render.set.canvas.zoom', this, {\r\n setCanvasZoom: this.setCanvasZoom,\r\n });\r\n this.kfEditor.registerService('render.get.canvas.zoom', this, {\r\n getCanvasZoom: this.getCanvasZoom,\r\n });\r\n this.kfEditor.registerService('render.get.paper.offset', this, {\r\n getPaperOffset: this.getPaperOffset,\r\n });\r\n this.kfEditor.registerService('render.draw', this, {\r\n render: this.render,\r\n });\r\n this.kfEditor.registerService('render.insert.string', this, {\r\n insertString: this.insertString,\r\n });\r\n this.kfEditor.registerService('render.insert.group', this, {\r\n insertGroup: this.insertGroup,\r\n });\r\n this.kfEditor.registerService('render.get.paper', this, {\r\n getPaper: this.getPaper,\r\n });\r\n },\r\n\r\n initCommands(this: RenderComponentInstance) {\r\n this.kfEditor.registerCommand('render', this, function (this: RenderComponentInstance, str: string) {\r\n this.render(str);\r\n this.kfEditor.requestService('ui.update.canvas.view');\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n this.kfEditor.requestService('ui.update.canvas.view');\r\n });\r\n });\r\n });\r\n\r\n this.kfEditor.registerCommand('getPaper', this, this.getPaper);\r\n },\r\n\r\n relocation(this: RenderComponentInstance) {\r\n if (!this.relDisabled) {\r\n this.relocationToCenter();\r\n return;\r\n }\r\n\r\n this.relocationToLeft();\r\n },\r\n\r\n relocationToCenter(this: RenderComponentInstance) {\r\n const formulaSpace = this.formula.container.getRenderBox();\r\n\r\n this.formula.container.setTranslate(-formulaSpace.width / 2, -formulaSpace.height / 2);\r\n this.setCanvasToCenter();\r\n },\r\n\r\n relocationToLeft(this: RenderComponentInstance) {\r\n const formulaSpace = this.formula.container.getRenderBox();\r\n\r\n this.formula.container.setTranslate(0, -formulaSpace.height / 2);\r\n this.setCanvasOffset(0);\r\n },\r\n\r\n selectGroup(this: RenderComponentInstance, groupId: string) {\r\n const groupObject = this.kfEditor.requestService('syntax.get.group.object', groupId) as SelectableGroupObject;\r\n\r\n this.clearSelect();\r\n\r\n if (groupObject.node.getAttribute('data-root')) {\r\n return;\r\n }\r\n\r\n this.record.select.lastSelect = groupObject;\r\n groupObject.select();\r\n },\r\n\r\n selectGroupContent(this: RenderComponentInstance, group: GroupInfo) {\r\n let nextGroup = group;\r\n\r\n if (group.groupObj.getAttribute('data-placeholder') !== null) {\r\n nextGroup = {\r\n id: group.content[0].id,\r\n groupObj: group.groupObj,\r\n content: group.content,\r\n };\r\n }\r\n\r\n const groupObject = this.kfEditor.requestService('syntax.get.group.object', nextGroup.id) as SelectableGroupObject;\r\n\r\n this.clearSelect();\r\n this.record.select.lastSelect = groupObject;\r\n\r\n if (groupObject.node.getAttribute('data-root')) {\r\n return;\r\n }\r\n\r\n groupObject.select();\r\n },\r\n\r\n selectAllGroup(this: RenderComponentInstance, group: GroupInfo) {\r\n let nextGroup = group;\r\n\r\n if (group.groupObj.getAttribute('data-placeholder') !== null) {\r\n nextGroup = {\r\n id: group.content[0].id,\r\n groupObj: group.groupObj,\r\n content: group.content,\r\n };\r\n }\r\n\r\n const groupObject = this.kfEditor.requestService('syntax.get.group.object', nextGroup.id) as SelectableGroupObject;\r\n\r\n this.clearSelect();\r\n this.record.select.lastSelect = groupObject;\r\n groupObject.selectAll();\r\n },\r\n\r\n selectCurrentCursor(this: RenderComponentInstance) {\r\n const cursorInfo = this.kfEditor.requestService('syntax.get.record.cursor') as CursorRecord;\r\n const group = this.kfEditor.requestService('syntax.get.group.object', cursorInfo.groupId) as SelectableGroupObject;\r\n let offset = -1;\r\n let width = 0;\r\n const startIndex = Math.min(cursorInfo.startOffset, cursorInfo.endOffset);\r\n const endIndex = Math.max(cursorInfo.startOffset, cursorInfo.endOffset);\r\n\r\n this.clearSelect();\r\n this.record.select.lastSelect = group;\r\n\r\n for (let i = startIndex; i < endIndex; i += 1) {\r\n const box = group.getOperand(i).getRenderBox(group);\r\n\r\n if (offset === -1) {\r\n offset = box.x;\r\n }\r\n\r\n width += box.width;\r\n }\r\n\r\n group.setBoxWidth(width);\r\n group.selectAll();\r\n group.getBox().setTranslate(offset, 0);\r\n },\r\n\r\n tintCurrentGroup(this: RenderComponentInstance) {\r\n const groupId = (this.kfEditor.requestService('syntax.get.record.cursor') as CursorRecord).groupId;\r\n let groupObject = this.kfEditor.requestService('syntax.get.group.object', groupId) as SelectableGroupObject;\r\n const isPlaceholder = this.kfEditor.requestService('syntax.is.placeholder.node', groupId) as boolean;\r\n\r\n this.clearSelect();\r\n\r\n if (groupObject.node.getAttribute('data-root')) {\r\n return;\r\n }\r\n\r\n if (isPlaceholder) {\r\n groupObject = this.kfEditor.requestService(\r\n 'syntax.get.group.object',\r\n (groupObject.operands[0].node as Element & { id: string }).id,\r\n ) as SelectableGroupObject;\r\n }\r\n\r\n this.record.select.lastSelect = groupObject;\r\n groupObject.select();\r\n },\r\n\r\n reselect(this: RenderComponentInstance) {\r\n const cursorInfo = this.kfEditor.requestService('syntax.get.record.cursor') as CursorRecord;\r\n const groupObject = this.kfEditor.requestService('syntax.get.group.object', cursorInfo.groupId) as SelectableGroupObject;\r\n\r\n this.clearSelect();\r\n this.record.select.lastSelect = groupObject;\r\n\r\n if (groupObject.node.getAttribute('data-root')) {\r\n return;\r\n }\r\n\r\n groupObject.select();\r\n },\r\n\r\n clearSelect(this: RenderComponentInstance) {\r\n const currentSelect = this.record.select.lastSelect;\r\n\r\n if (!currentSelect || !currentSelect.node.ownerSVGElement) {\r\n return;\r\n }\r\n\r\n currentSelect.unselect();\r\n const box = currentSelect.getRenderBox(currentSelect);\r\n currentSelect.setBoxWidth(box.width);\r\n currentSelect.getBox().setTranslate(0, 0);\r\n },\r\n\r\n getPaper(this: RenderComponentInstance) {\r\n return this.formula;\r\n },\r\n\r\n getPaperOffset(this: RenderComponentInstance) {\r\n return this.formula.container.getTranslate();\r\n },\r\n\r\n render(this: RenderComponentInstance, latexStr: string) {\r\n const parsedTree = this.kfEditor.requestService('parser.parse', latexStr, true);\r\n const objTree = this.assembly!.regenerateBy(parsedTree);\r\n\r\n this.kfEditor.requestService('syntax.update.objtree', objTree);\r\n },\r\n\r\n enableRelocation(this: RenderComponentInstance) {\r\n this.relDisabled = false;\r\n },\r\n\r\n disableRelocation(this: RenderComponentInstance) {\r\n this.relDisabled = true;\r\n },\r\n\r\n setCanvasZoom(this: RenderComponentInstance, zoom: number) {\r\n const viewPort = this.formula.getViewPort();\r\n\r\n this.canvasZoom = zoom;\r\n viewPort.zoom = zoom;\r\n this.formula.setViewPort(viewPort);\r\n },\r\n\r\n getCanvas(this: RenderComponentInstance) {\r\n return this.formula;\r\n },\r\n\r\n getContentSize(this: RenderComponentInstance) {\r\n return this.formula.container.getRenderBox();\r\n },\r\n\r\n clearCanvasTransform(this: RenderComponentInstance) {\r\n const canvasInfo = this.record.canvas;\r\n\r\n canvasInfo.viewBox = this.formula.getViewBox();\r\n canvasInfo.contentOffset = this.formula.container.getTranslate();\r\n\r\n this.setCanvasToCenter();\r\n this.formula.node.removeAttribute('viewBox');\r\n this.formula.container.setTranslate(0, 0);\r\n },\r\n\r\n revertCanvasTransform(this: RenderComponentInstance) {\r\n const canvasInfo = this.record.canvas;\r\n const viewBox = canvasInfo.viewBox;\r\n\r\n if (!viewBox) {\r\n return false;\r\n }\r\n\r\n this.formula.setViewBox(viewBox.x, viewBox.y, viewBox.width, viewBox.height);\r\n this.formula.container.setTranslate(canvasInfo.contentOffset!);\r\n\r\n canvasInfo.viewBox = null;\r\n canvasInfo.contentOffset = null;\r\n\r\n return true;\r\n },\r\n\r\n getCanvasZoom(this: RenderComponentInstance) {\r\n return this.canvasZoom;\r\n },\r\n\r\n insertString(this: RenderComponentInstance, value: string) {\r\n return value;\r\n },\r\n\r\n insertGroup(this: RenderComponentInstance, value: unknown) {\r\n return value;\r\n },\r\n});\r\n\r\nexport default RenderComponent as new (kfEditor: LegacyEditorInstance, options?: Record<string, unknown>) => RenderComponentInstance;\r\n","import { legacyBaseUtils } from '../vendor/legacy-utils';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\n\r\ntype GroupNode = Element & { id: string };\r\ntype SvgLinkedNode = Element & { ownerSVGElement?: SVGElement | null };\r\n\r\ntype GroupContentInfo = {\r\n id: string;\r\n groupObj: GroupNode;\r\n content: GroupNode[];\r\n};\r\n\r\ntype PositionComponentInstance = {\r\n kfEditor: LegacyEditorInstance;\r\n initServices: () => void;\r\n getGroupByTarget: (target: EventTarget | null) => GroupContentInfo | null;\r\n getIndexByTargetInGroup: (groupNode: GroupNode, targetNode: EventTarget | null) => number;\r\n getLocationInfo: (distance: number, groupInfo: GroupContentInfo) => number;\r\n getParentGroupByTarget: (target: EventTarget | null) => GroupContentInfo | null;\r\n getWrap: (node: EventTarget | null) => GroupNode | null;\r\n getAreaByCursorInGroup: (groupNode: Element, offset: number) => boolean;\r\n getGroupInfoByNode: (target: EventTarget | null) => { group: GroupContentInfo; index: number } | null;\r\n getParentInfoByNode: (target: GroupNode) => { group: GroupContentInfo; index: number };\r\n};\r\n\r\nconst kity = getLegacyKity();\r\n\r\nfunction getGroup(node: EventTarget | null, isAllowVirtual: boolean, isAllowWrap: boolean): GroupNode | null {\r\n const target = node as SvgLinkedNode | null;\r\n\r\n if (!target || !target.ownerSVGElement) {\r\n return null;\r\n }\r\n\r\n const parentNode = target.parentNode as Element | null;\r\n\r\n if (!parentNode) {\r\n return null;\r\n }\r\n\r\n const tagName = parentNode.tagName.toLowerCase();\r\n\r\n if (tagName === 'body' || tagName === 'svg') {\r\n return null;\r\n }\r\n\r\n if (parentNode.getAttribute('data-type') === 'kf-editor-group') {\r\n return parentNode as GroupNode;\r\n }\r\n\r\n if (isAllowVirtual && parentNode.getAttribute('data-type') === 'kf-editor-virtual-group') {\r\n return parentNode as GroupNode;\r\n }\r\n\r\n if (isAllowWrap && parentNode.getAttribute('data-flag') !== null) {\r\n return parentNode as GroupNode;\r\n }\r\n\r\n return getGroup(parentNode, isAllowVirtual, isAllowWrap);\r\n}\r\n\r\nconst PositionComponent = kity.createClass('PositionComponenet', {\r\n constructor(this: PositionComponentInstance, kfEditor: LegacyEditorInstance) {\r\n this.kfEditor = kfEditor;\r\n this.initServices();\r\n },\r\n\r\n initServices(this: PositionComponentInstance) {\r\n this.kfEditor.registerService('position.get.group', this, {\r\n getGroupByTarget: this.getGroupByTarget,\r\n });\r\n\r\n this.kfEditor.registerService('position.get.index', this, {\r\n getIndexByTargetInGroup: this.getIndexByTargetInGroup,\r\n });\r\n\r\n this.kfEditor.registerService('position.get.location.info', this, {\r\n getLocationInfo: this.getLocationInfo,\r\n });\r\n\r\n this.kfEditor.registerService('position.get.parent.group', this, {\r\n getParentGroupByTarget: this.getParentGroupByTarget,\r\n });\r\n\r\n this.kfEditor.registerService('position.get.wrap', this, {\r\n getWrap: this.getWrap,\r\n });\r\n\r\n this.kfEditor.registerService('position.get.area', this, {\r\n getAreaByCursorInGroup: this.getAreaByCursorInGroup,\r\n });\r\n\r\n this.kfEditor.registerService('position.get.group.info', this, {\r\n getGroupInfoByNode: this.getGroupInfoByNode,\r\n });\r\n\r\n this.kfEditor.registerService('position.get.parent.info', this, {\r\n getParentInfoByNode: this.getParentInfoByNode,\r\n });\r\n },\r\n\r\n getGroupByTarget(this: PositionComponentInstance, target: EventTarget | null) {\r\n const groupDom = getGroup(target, false, false);\r\n\r\n if (!groupDom) {\r\n return null;\r\n }\r\n\r\n return this.kfEditor.requestService('syntax.get.group.content', groupDom.id) as GroupContentInfo;\r\n },\r\n\r\n getIndexByTargetInGroup(this: PositionComponentInstance, groupNode: GroupNode, targetNode: EventTarget | null) {\r\n const groupInfo = this.kfEditor.requestService('syntax.get.group.content', groupNode.id) as GroupContentInfo;\r\n let index = -1;\r\n\r\n kity.Utils.each(groupInfo.content, (child: GroupNode, i: number) => {\r\n index = i;\r\n\r\n if (legacyBaseUtils.contains(child, targetNode as Node)) {\r\n return false;\r\n }\r\n\r\n return undefined;\r\n });\r\n\r\n return index;\r\n },\r\n\r\n getAreaByCursorInGroup(this: PositionComponentInstance, groupNode: Element, offset: number) {\r\n const groupRect = legacyBaseUtils.getRect(groupNode);\r\n return groupRect.left + groupRect.width / 2 < offset;\r\n },\r\n\r\n getLocationInfo(this: PositionComponentInstance, distance: number, groupInfo: GroupContentInfo) {\r\n let index = -1;\r\n\r\n for (let i = groupInfo.content.length - 1; i >= 0; i -= 1) {\r\n index = i;\r\n\r\n const child = groupInfo.content[i];\r\n const boundingRect = legacyBaseUtils.getRect(child);\r\n\r\n if (boundingRect.left < distance) {\r\n if (boundingRect.left + boundingRect.width / 2 < distance) {\r\n index += 1;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n return index;\r\n },\r\n\r\n getParentGroupByTarget(this: PositionComponentInstance, target: EventTarget | null) {\r\n const groupDom = getGroup(target, true, false);\r\n\r\n if (!groupDom) {\r\n return null;\r\n }\r\n\r\n return this.kfEditor.requestService('syntax.get.group.content', groupDom.id) as GroupContentInfo;\r\n },\r\n\r\n getWrap(this: PositionComponentInstance, node: EventTarget | null) {\r\n return getGroup(node, true, true);\r\n },\r\n\r\n getGroupInfoByNode(this: PositionComponentInstance, target: EventTarget | null) {\r\n const containerNode = getGroup(target, false, false);\r\n\r\n if (!containerNode) {\r\n return null;\r\n }\r\n\r\n const containerInfo = this.kfEditor.requestService('syntax.get.group.content', containerNode.id) as GroupContentInfo;\r\n let index = 0;\r\n\r\n for (let i = 0, len = containerInfo.content.length; i < len; i += 1) {\r\n index = i;\r\n\r\n if (legacyBaseUtils.contains(containerInfo.content[i], target as Node)) {\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n group: containerInfo,\r\n index,\r\n };\r\n },\r\n\r\n getParentInfoByNode(this: PositionComponentInstance, target: GroupNode) {\r\n const groupNode = getGroup(target, true, false);\r\n\r\n if (!groupNode) {\r\n throw new Error('PositionComponent: failed to resolve parent group');\r\n }\r\n\r\n const group = this.kfEditor.requestService('syntax.get.group.content', groupNode.id) as GroupContentInfo;\r\n\r\n return {\r\n group,\r\n index: group.content.indexOf(target),\r\n };\r\n },\r\n});\r\n\r\nexport default PositionComponent as new (kfEditor: LegacyEditorInstance) => PositionComponentInstance;\r\n","import { getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\n\r\ntype CursorInfo = {\r\n groupId: string;\r\n startOffset: number;\r\n endOffset: number;\r\n};\r\n\r\ntype CursorState = {\r\n groupId: string | null;\r\n startOffset: number;\r\n endOffset: number;\r\n};\r\n\r\ntype TreeNode = {\r\n name: string;\r\n operand: Array<TreeNode | string>;\r\n attr?: Record<string, any>;\r\n};\r\n\r\ntype SyntaxParent = {\r\n getCursorRecord: () => CursorState;\r\n getObjectTree: () => any;\r\n isRootTree: (tree: TreeNode) => boolean;\r\n updateCursor: (cursorInfo: CursorState) => void;\r\n isGroupNode: (groupId: string) => boolean;\r\n isSelectPlaceholder: () => boolean;\r\n isLeafTree: (tree: TreeNode | string) => boolean;\r\n getGroupObject: (id: string) => { node: Element & { id: string } } | null;\r\n isPlaceholder: (groupId: string) => boolean;\r\n};\r\n\r\ntype DeleteComponentInstance = {\r\n parentComponent: SyntaxParent;\r\n kfEditor: LegacyEditorInstance;\r\n deleteGroup: () => boolean;\r\n deletePrevGroup: (tree: TreeNode, cursorInfo: CursorInfo) => CursorInfo;\r\n deleteSelection: (tree: TreeNode, cursorInfo: CursorInfo) => boolean;\r\n selectParentContainer: (groupId: string) => CursorInfo;\r\n};\r\n\r\nconst kity = getLegacyKity();\r\n\r\nconst DeleteComponent = kity.createClass('DeleteComponent', {\r\n constructor(this: DeleteComponentInstance, parentComponent: SyntaxParent, kfEditor: LegacyEditorInstance) {\r\n this.parentComponent = parentComponent;\r\n this.kfEditor = kfEditor;\r\n },\r\n\r\n deleteGroup(this: DeleteComponentInstance) {\r\n let cursorInfo = this.parentComponent.getCursorRecord();\r\n const cursorGroupId = cursorInfo.groupId as string;\r\n const objTree = this.parentComponent.getObjectTree();\r\n const currentTree = objTree.mapping[cursorGroupId].strGroup as TreeNode;\r\n\r\n if (cursorInfo.startOffset === cursorInfo.endOffset) {\r\n if (cursorInfo.startOffset === 0) {\r\n if (this.parentComponent.isRootTree(currentTree)) {\r\n return false;\r\n }\r\n\r\n cursorInfo = this.selectParentContainer(cursorGroupId);\r\n this.parentComponent.updateCursor(cursorInfo);\r\n return false;\r\n }\r\n\r\n if (currentTree.operand.length > 1) {\r\n cursorInfo = this.deletePrevGroup(currentTree, cursorInfo as CursorInfo);\r\n } else {\r\n cursorInfo.startOffset = 0;\r\n cursorInfo.endOffset = 1;\r\n\r\n const operand0 = currentTree.operand[0] as TreeNode;\r\n\r\n if (operand0.attr && this.parentComponent.isGroupNode(operand0.attr.id)) {\r\n this.parentComponent.updateCursor(cursorInfo);\r\n return false;\r\n }\r\n\r\n currentTree.operand[0] = {\r\n name: 'placeholder',\r\n operand: [],\r\n };\r\n\r\n this.parentComponent.updateCursor(cursorInfo);\r\n return true;\r\n }\r\n } else if (this.parentComponent.isSelectPlaceholder()) {\r\n if (this.parentComponent.isRootTree(currentTree)) {\r\n return false;\r\n }\r\n\r\n cursorInfo = this.selectParentContainer(cursorGroupId);\r\n this.parentComponent.updateCursor(cursorInfo);\r\n return false;\r\n } else {\r\n return this.deleteSelection(currentTree, cursorInfo as CursorInfo);\r\n }\r\n\r\n this.parentComponent.updateCursor(cursorInfo);\r\n return cursorInfo.startOffset === cursorInfo.endOffset;\r\n },\r\n\r\n deletePrevGroup(this: DeleteComponentInstance, tree: TreeNode, cursorInfo: CursorInfo) {\r\n const index = cursorInfo.startOffset - 1;\r\n const group = tree.operand[index];\r\n\r\n if (this.parentComponent.isLeafTree(group)) {\r\n tree.operand.splice(index, 1);\r\n cursorInfo.startOffset -= 1;\r\n cursorInfo.endOffset -= 1;\r\n } else {\r\n cursorInfo.startOffset -= 1;\r\n }\r\n\r\n return cursorInfo;\r\n },\r\n\r\n deleteSelection(this: DeleteComponentInstance, tree: TreeNode, cursorInfo: CursorInfo) {\r\n if (cursorInfo.startOffset === 0 && cursorInfo.endOffset === tree.operand.length) {\r\n tree.operand.length = 1;\r\n tree.operand[0] = {\r\n name: 'placeholder',\r\n operand: [],\r\n };\r\n cursorInfo.endOffset = 1;\r\n } else {\r\n tree.operand.splice(cursorInfo.startOffset, cursorInfo.endOffset - cursorInfo.startOffset);\r\n cursorInfo.endOffset = cursorInfo.startOffset;\r\n }\r\n\r\n this.parentComponent.updateCursor(cursorInfo);\r\n return true;\r\n },\r\n\r\n selectParentContainer(this: DeleteComponentInstance, groupId: string) {\r\n const currentGroup = this.parentComponent.getGroupObject(groupId);\r\n\r\n if (!currentGroup) {\r\n throw new Error(`DeleteComponent: missing group object for ${groupId}`);\r\n }\r\n\r\n const currentGroupNode = currentGroup.node;\r\n const parentContainerInfo = this.kfEditor.requestService('position.get.group', currentGroupNode) as {\r\n id: string;\r\n groupObj: Element & { id: string };\r\n };\r\n const index = this.kfEditor.requestService('position.get.index', parentContainerInfo.groupObj, currentGroupNode) as number;\r\n\r\n return {\r\n groupId: parentContainerInfo.id,\r\n startOffset: index,\r\n endOffset: index + 1,\r\n };\r\n },\r\n});\r\n\r\nexport default DeleteComponent as new (parentComponent: SyntaxParent, kfEditor: LegacyEditorInstance) => DeleteComponentInstance;\r\n","import { getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\n\r\ntype CursorInfo = {\r\n groupId: string;\r\n startOffset: number;\r\n endOffset: number;\r\n};\r\n\r\ntype CursorState = {\r\n groupId: string | null;\r\n startOffset: number;\r\n endOffset: number;\r\n};\r\n\r\ntype GroupInfo = {\r\n id: string;\r\n groupObj: Element & { id: string };\r\n content: Array<Element & { id: string }>;\r\n};\r\n\r\ntype ParentInfo = {\r\n group: GroupInfo;\r\n index: number;\r\n};\r\n\r\ntype SyntaxParent = {\r\n getCursorRecord: () => CursorState;\r\n updateCursor: (cursorInfo: CursorState) => void;\r\n getGroupContent: (groupId: string) => GroupInfo;\r\n isSelectPlaceholder: () => boolean;\r\n isPlaceholder: (groupId: string) => boolean;\r\n};\r\n\r\ntype MoveComponentInstance = {\r\n parentComponent: SyntaxParent;\r\n kfEditor: LegacyEditorInstance;\r\n leftMove: () => void;\r\n rightMove: () => void;\r\n};\r\n\r\nconst kity = getLegacyKity();\r\n\r\nfunction isRootNode(node: Element) {\r\n return !!node.getAttribute('data-root');\r\n}\r\n\r\nfunction isContainerNode(node: Element) {\r\n return node.getAttribute('data-type') === 'kf-editor-group';\r\n}\r\n\r\nfunction isGroupNode(node: Element) {\r\n const dataType = node.getAttribute('data-type');\r\n return dataType === 'kf-editor-group' || dataType === 'kf-editor-virtual-group';\r\n}\r\n\r\nfunction isPlaceholderNode(node: Element) {\r\n return node.getAttribute('data-flag') === 'Placeholder';\r\n}\r\n\r\nfunction isEmptyNode(node: Element) {\r\n return node.getAttribute('data-flag') === 'Empty';\r\n}\r\n\r\nfunction locateLeftIndex(moveComponent: MoveComponentInstance, groupNode: Element & { id: string }): CursorInfo | null {\r\n const syntaxComponent = moveComponent.parentComponent;\r\n\r\n if (isPlaceholderNode(groupNode) || isEmptyNode(groupNode)) {\r\n return locateOuterLeftIndex(moveComponent, groupNode);\r\n }\r\n\r\n if (!isGroupNode(groupNode)) {\r\n return null;\r\n }\r\n\r\n let groupInfo = syntaxComponent.getGroupContent(groupNode.id);\r\n let groupElement = groupInfo.content[groupInfo.content.length - 1];\r\n\r\n if (isEmptyNode(groupElement)) {\r\n return locateOuterLeftIndex(moveComponent, groupElement);\r\n }\r\n\r\n if (isContainerNode(groupNode)) {\r\n if (isPlaceholderNode(groupElement)) {\r\n return {\r\n groupId: groupNode.id,\r\n startOffset: groupInfo.content.length - 1,\r\n endOffset: groupInfo.content.length,\r\n };\r\n }\r\n\r\n if (isContainerNode(groupElement) && groupInfo.content.length === 1) {\r\n return locateLeftIndex(moveComponent, groupElement);\r\n }\r\n\r\n return {\r\n groupId: groupNode.id,\r\n startOffset: groupInfo.content.length,\r\n endOffset: groupInfo.content.length,\r\n };\r\n }\r\n\r\n while (!isContainerNode(groupElement) && !isEmptyNode(groupElement) && !isPlaceholderNode(groupElement)) {\r\n groupInfo = syntaxComponent.getGroupContent(groupElement.id);\r\n groupElement = groupInfo.content[groupInfo.content.length - 1];\r\n }\r\n\r\n if (isEmptyNode(groupElement)) {\r\n return locateOuterLeftIndex(moveComponent, groupElement);\r\n }\r\n\r\n if (isPlaceholderNode(groupElement)) {\r\n return {\r\n groupId: groupElement.id,\r\n startOffset: groupInfo.content.length,\r\n endOffset: groupInfo.content.length,\r\n };\r\n }\r\n\r\n return locateLeftIndex(moveComponent, groupElement);\r\n}\r\n\r\nfunction locateOuterLeftIndex(moveComponent: MoveComponentInstance, groupNode: Element & { id: string }): CursorInfo | null {\r\n const kfEditor = moveComponent.kfEditor;\r\n let outerGroupInfo = kfEditor.requestService('position.get.parent.info', groupNode) as ParentInfo;\r\n\r\n if (isRootNode(groupNode)) {\r\n return null;\r\n }\r\n\r\n while (outerGroupInfo.index === 0) {\r\n if (isRootNode(outerGroupInfo.group.groupObj)) {\r\n return {\r\n groupId: outerGroupInfo.group.id,\r\n startOffset: 0,\r\n endOffset: 0,\r\n };\r\n }\r\n\r\n if (isContainerNode(outerGroupInfo.group.groupObj) && outerGroupInfo.group.content.length > 1) {\r\n return {\r\n groupId: outerGroupInfo.group.id,\r\n startOffset: 0,\r\n endOffset: 0,\r\n };\r\n }\r\n\r\n outerGroupInfo = kfEditor.requestService('position.get.parent.info', outerGroupInfo.group.groupObj) as ParentInfo;\r\n }\r\n\r\n groupNode = outerGroupInfo.group.content[outerGroupInfo.index - 1];\r\n\r\n if (isGroupNode(groupNode)) {\r\n return locateLeftIndex(moveComponent, groupNode);\r\n }\r\n\r\n if (isEmptyNode(groupNode)) {\r\n return locateOuterLeftIndex(moveComponent, groupNode);\r\n }\r\n\r\n return {\r\n groupId: outerGroupInfo.group.id,\r\n startOffset: outerGroupInfo.index,\r\n endOffset: outerGroupInfo.index,\r\n };\r\n}\r\n\r\nfunction locateRightIndex(moveComponent: MoveComponentInstance, groupNode: Element & { id: string }): CursorInfo | null {\r\n const syntaxComponent = moveComponent.parentComponent;\r\n\r\n if (!isGroupNode(groupNode)) {\r\n return null;\r\n }\r\n\r\n let groupInfo = syntaxComponent.getGroupContent(groupNode.id);\r\n let groupElement = groupInfo.content[0];\r\n\r\n if (isContainerNode(groupNode)) {\r\n if (isContainerNode(groupElement)) {\r\n return locateRightIndex(moveComponent, groupElement);\r\n }\r\n\r\n if (isPlaceholderNode(groupElement)) {\r\n return {\r\n groupId: groupNode.id,\r\n startOffset: 0,\r\n endOffset: 1,\r\n };\r\n }\r\n\r\n return {\r\n groupId: groupNode.id,\r\n startOffset: 0,\r\n endOffset: 0,\r\n };\r\n }\r\n\r\n while (!isContainerNode(groupElement) && !isPlaceholderNode(groupElement) && !isEmptyNode(groupElement)) {\r\n groupInfo = syntaxComponent.getGroupContent(groupElement.id);\r\n groupElement = groupInfo.content[0];\r\n }\r\n\r\n if (isPlaceholderNode(groupElement)) {\r\n return {\r\n groupId: groupElement.id,\r\n startOffset: 0,\r\n endOffset: 0,\r\n };\r\n }\r\n\r\n if (isEmptyNode(groupElement)) {\r\n return locateOuterRightIndex(moveComponent, groupElement);\r\n }\r\n\r\n return locateRightIndex(moveComponent, groupElement);\r\n}\r\n\r\nfunction locateOuterRightIndex(moveComponent: MoveComponentInstance, groupNode: Element & { id: string }): CursorInfo | null {\r\n const kfEditor = moveComponent.kfEditor;\r\n const syntaxComponent = moveComponent.parentComponent;\r\n\r\n if (isRootNode(groupNode)) {\r\n return null;\r\n }\r\n\r\n let outerGroupInfo = kfEditor.requestService('position.get.parent.info', groupNode) as ParentInfo;\r\n\r\n while (outerGroupInfo.index === outerGroupInfo.group.content.length - 1) {\r\n if (isRootNode(outerGroupInfo.group.groupObj)) {\r\n return {\r\n groupId: outerGroupInfo.group.id,\r\n startOffset: outerGroupInfo.group.content.length,\r\n endOffset: outerGroupInfo.group.content.length,\r\n };\r\n }\r\n\r\n if (isContainerNode(outerGroupInfo.group.groupObj) && outerGroupInfo.group.content.length > 1) {\r\n return {\r\n groupId: outerGroupInfo.group.id,\r\n startOffset: outerGroupInfo.group.content.length,\r\n endOffset: outerGroupInfo.group.content.length,\r\n };\r\n }\r\n\r\n outerGroupInfo = kfEditor.requestService('position.get.parent.info', outerGroupInfo.group.groupObj) as ParentInfo;\r\n }\r\n\r\n groupNode = outerGroupInfo.group.content[outerGroupInfo.index + 1];\r\n\r\n if (isEmptyNode(groupNode)) {\r\n return locateOuterRightIndex(moveComponent, groupNode);\r\n }\r\n\r\n if (isContainerNode(groupNode)) {\r\n const groupInfo = syntaxComponent.getGroupContent(groupNode.id);\r\n\r\n if (syntaxComponent.isPlaceholder(groupInfo.content[0].id)) {\r\n return {\r\n groupId: groupNode.id,\r\n startOffset: 0,\r\n endOffset: 1,\r\n };\r\n }\r\n\r\n return {\r\n groupId: groupNode.id,\r\n startOffset: 0,\r\n endOffset: 0,\r\n };\r\n }\r\n\r\n return {\r\n groupId: outerGroupInfo.group.id,\r\n startOffset: outerGroupInfo.index + 1,\r\n endOffset: outerGroupInfo.index + 1,\r\n };\r\n}\r\n\r\nfunction updateCursorGoLeft(moveComponent: MoveComponentInstance, cursorInfo: CursorInfo) {\r\n const syntaxComponent = moveComponent.parentComponent;\r\n const containerInfo = syntaxComponent.getGroupContent(cursorInfo.groupId);\r\n\r\n if (syntaxComponent.isSelectPlaceholder()) {\r\n return locateOuterLeftIndex(moveComponent, containerInfo.content[cursorInfo.startOffset]);\r\n }\r\n\r\n if (cursorInfo.startOffset === cursorInfo.endOffset) {\r\n if (cursorInfo.startOffset > 0) {\r\n const prevGroupNode = containerInfo.content[cursorInfo.startOffset - 1];\r\n\r\n if (isGroupNode(prevGroupNode)) {\r\n return locateLeftIndex(moveComponent, prevGroupNode);\r\n }\r\n\r\n cursorInfo.startOffset -= 1;\r\n\r\n if (!isPlaceholderNode(prevGroupNode)) {\r\n cursorInfo.endOffset = cursorInfo.startOffset;\r\n }\r\n\r\n return cursorInfo;\r\n }\r\n\r\n return locateOuterLeftIndex(moveComponent, containerInfo.groupObj);\r\n }\r\n\r\n cursorInfo.startOffset = Math.min(cursorInfo.startOffset, cursorInfo.endOffset);\r\n cursorInfo.endOffset = cursorInfo.startOffset;\r\n return cursorInfo;\r\n}\r\n\r\nfunction updateCursorGoRight(moveComponent: MoveComponentInstance, cursorInfo: CursorInfo) {\r\n const syntaxComponent = moveComponent.parentComponent;\r\n const containerInfo = syntaxComponent.getGroupContent(cursorInfo.groupId);\r\n\r\n if (syntaxComponent.isSelectPlaceholder()) {\r\n return locateOuterRightIndex(moveComponent, containerInfo.content[cursorInfo.startOffset]);\r\n }\r\n\r\n if (cursorInfo.startOffset === cursorInfo.endOffset) {\r\n if (cursorInfo.startOffset < containerInfo.content.length) {\r\n const nextGroupNode = containerInfo.content[cursorInfo.startOffset];\r\n\r\n if (isGroupNode(nextGroupNode)) {\r\n return locateRightIndex(moveComponent, nextGroupNode);\r\n }\r\n\r\n cursorInfo.startOffset += 1;\r\n\r\n if (!isPlaceholderNode(nextGroupNode)) {\r\n cursorInfo.endOffset = cursorInfo.startOffset;\r\n }\r\n\r\n return cursorInfo;\r\n }\r\n\r\n return locateOuterRightIndex(moveComponent, containerInfo.groupObj);\r\n }\r\n\r\n cursorInfo.endOffset = Math.max(cursorInfo.startOffset, cursorInfo.endOffset);\r\n cursorInfo.startOffset = cursorInfo.endOffset;\r\n return cursorInfo;\r\n}\r\n\r\nconst MoveComponent = kity.createClass('MoveComponent', {\r\n constructor(this: MoveComponentInstance, parentComponent: SyntaxParent, kfEditor: LegacyEditorInstance) {\r\n this.parentComponent = parentComponent;\r\n this.kfEditor = kfEditor;\r\n },\r\n\r\n leftMove(this: MoveComponentInstance) {\r\n let cursorInfo = this.parentComponent.getCursorRecord();\r\n cursorInfo = updateCursorGoLeft(this, cursorInfo as CursorInfo) as CursorState;\r\n\r\n if (cursorInfo) {\r\n this.parentComponent.updateCursor(cursorInfo);\r\n }\r\n },\r\n\r\n rightMove(this: MoveComponentInstance) {\r\n let cursorInfo = this.parentComponent.getCursorRecord();\r\n cursorInfo = updateCursorGoRight(this, cursorInfo as CursorInfo) as CursorState;\r\n\r\n if (cursorInfo) {\r\n this.parentComponent.updateCursor(cursorInfo);\r\n }\r\n },\r\n});\r\n\r\nexport default MoveComponent as new (parentComponent: SyntaxParent, kfEditor: LegacyEditorInstance) => MoveComponentInstance;\r\n","import { legacyGroupType } from '../vendor/legacy-group-type';\r\nimport { legacySysconf } from '../vendor/legacy-sysconf';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\nimport DeleteComponent from './syntax-delete';\r\nimport MoveComponent from './syntax-move';\r\n\r\ntype CursorRecord = {\r\n groupId: string | null;\r\n startOffset: number;\r\n endOffset: number;\r\n};\r\n\r\ntype GroupNode = Element & { id: string };\r\n\r\ntype StringTree = {\r\n name?: string;\r\n attr?: Record<string, any>;\r\n traversal?: string;\r\n operand: Array<StringTree | string>;\r\n};\r\n\r\ntype ObjectGroup = {\r\n node: GroupNode;\r\n operands: Array<{ node: GroupNode }>;\r\n};\r\n\r\ntype ObjectTreeMappingEntry = {\r\n strGroup: StringTree;\r\n objGroup: ObjectGroup;\r\n};\r\n\r\ntype ObjectTree = {\r\n mapping: Record<string, ObjectTreeMappingEntry> & {\r\n root: ObjectTreeMappingEntry;\r\n };\r\n parsedTree: StringTree;\r\n select?: {\r\n groupId: string;\r\n startOffset: number;\r\n endOffset: number;\r\n };\r\n};\r\n\r\ntype GroupContentInfo = {\r\n id: string;\r\n traversal: string;\r\n groupObj: GroupNode;\r\n content: GroupNode[];\r\n};\r\n\r\ntype SyntaxComponentInstance = {\n kfEditor: LegacyEditorInstance;\r\n record: {\r\n cursor: CursorRecord;\r\n };\r\n components: {\r\n move: InstanceType<typeof MoveComponent>;\r\n delete: InstanceType<typeof DeleteComponent>;\r\n };\r\n objTree: ObjectTree | null;\r\n initComponents: () => void;\r\n initServices: () => void;\r\n initCommands: () => void;\r\n updateObjTree: (objTree: ObjectTree) => void;\r\n hasCursorInfo: () => boolean;\r\n isRootNode: (groupId: string) => boolean;\r\n isGroupNode: (groupId: string) => boolean;\r\n isVirtualNode: (groupId: string) => boolean;\r\n isPlaceholder: (groupId: string) => boolean;\r\n isBrackets: (groupId: string) => boolean;\r\n hasRootplaceholder: () => boolean;\r\n isSelectPlaceholder: () => boolean;\r\n isLeafTree: (tree: StringTree | string) => boolean;\r\n isRootTree: (tree: StringTree) => boolean;\r\n getObjectTree: () => ObjectTree;\r\n getGroupObject: (id: string) => ObjectGroup | null;\r\n getCursorRecord: () => CursorRecord;\r\n getGroupContent: (groupId: string) => GroupContentInfo;\r\n getRootObject: () => ObjectGroup;\r\n getRootGroupInfo: () => GroupContentInfo;\r\n updateSelection: (group: GroupContentInfo) => { str: string; startOffset: number; endOffset: number };\r\n getSource: () => string;\r\n isEmpty: () => boolean;\r\n serialization: () => { str: string; startOffset: number; endOffset: number };\r\n updateCursor: (groupId: string | CursorRecord, startOffset?: number, endOffset?: number) => void;\r\n leftMove: () => void;\r\n rightMove: () => void;\r\n deleteGroup: () => boolean;\r\n insertSubtree: (subtree: StringTree) => void;\r\n replaceTree: (subtree: StringTree) => void;\n};\n\nconst CURSOR_CHAR = legacySysconf.cursorCharacter;\nconst kity = getLegacyKity();\n\nfunction clampOffset(offset: number, maxOffset: number) {\n return Math.max(0, Math.min(offset, maxOffset));\n}\n\nfunction normalizeCursorRecord(\n objTree: ObjectTree,\n cursor: CursorRecord,\n): CursorRecord {\n const fallbackGroupId = objTree.mapping.root.strGroup.attr!.id as string;\n const targetGroupId =\n cursor.groupId && objTree.mapping[cursor.groupId]\n ? cursor.groupId\n : fallbackGroupId;\n const operandCount = objTree.mapping[targetGroupId].strGroup.operand.length;\n const startOffset = clampOffset(cursor.startOffset, operandCount);\n const endOffset = clampOffset(cursor.endOffset, operandCount);\n\n return {\n groupId: targetGroupId,\n startOffset: Math.min(startOffset, endOffset),\n endOffset: Math.max(startOffset, endOffset),\n };\n}\n\nconst SyntaxComponent = kity.createClass('SyntaxComponenet', {\n constructor(this: SyntaxComponentInstance, kfEditor: LegacyEditorInstance) {\r\n this.kfEditor = kfEditor;\r\n this.record = {\r\n cursor: {\r\n groupId: null,\r\n startOffset: -1,\r\n endOffset: -1,\r\n },\r\n };\r\n this.components = {} as SyntaxComponentInstance['components'];\r\n this.objTree = null;\r\n this.initComponents();\r\n this.initServices();\r\n this.initCommands();\r\n },\r\n\r\n initComponents(this: SyntaxComponentInstance) {\r\n this.components.move = new MoveComponent(this, this.kfEditor);\r\n this.components.delete = new DeleteComponent(this, this.kfEditor);\r\n },\r\n\r\n initServices(this: SyntaxComponentInstance) {\r\n this.kfEditor.registerService('syntax.update.objtree', this, { updateObjTree: this.updateObjTree });\r\n this.kfEditor.registerService('syntax.get.objtree', this, { getObjectTree: this.getObjectTree });\r\n this.kfEditor.registerService('syntax.get.group.object', this, { getGroupObject: this.getGroupObject });\r\n this.kfEditor.registerService('syntax.is.root.node', this, { isRootNode: this.isRootNode });\r\n this.kfEditor.registerService('syntax.is.group.node', this, { isGroupNode: this.isGroupNode });\r\n this.kfEditor.registerService('syntax.is.virtual.node', this, { isVirtualNode: this.isVirtualNode });\r\n this.kfEditor.registerService('syntax.is.placeholder.node', this, { isPlaceholder: this.isPlaceholder });\r\n this.kfEditor.registerService('syntax.is.select.placeholder', this, { isSelectPlaceholder: this.isSelectPlaceholder });\r\n this.kfEditor.registerService('syntax.has.root.placeholder', this, { hasRootplaceholder: this.hasRootplaceholder });\r\n this.kfEditor.registerService('syntax.valid.brackets', this, { isBrackets: this.isBrackets });\r\n this.kfEditor.registerService('syntax.get.group.content', this, { getGroupContent: this.getGroupContent });\r\n this.kfEditor.registerService('syntax.get.root.group.info', this, { getRootGroupInfo: this.getRootGroupInfo });\r\n this.kfEditor.registerService('syntax.get.root', this, { getRootObject: this.getRootObject });\r\n this.kfEditor.registerService('syntax.update.record.cursor', this, { updateCursor: this.updateCursor });\r\n this.kfEditor.registerService('syntax.update.selection', this, { updateSelection: this.updateSelection });\r\n this.kfEditor.registerService('syntax.get.record.cursor', this, { getCursorRecord: this.getCursorRecord });\r\n this.kfEditor.registerService('syntax.has.cursor.info', this, { hasCursorInfo: this.hasCursorInfo });\r\n this.kfEditor.registerService('syntax.serialization', this, { serialization: this.serialization });\r\n this.kfEditor.registerService('syntax.cursor.move.left', this, { leftMove: this.leftMove });\r\n this.kfEditor.registerService('syntax.cursor.move.right', this, { rightMove: this.rightMove });\r\n this.kfEditor.registerService('syntax.delete.group', this, { deleteGroup: this.deleteGroup });\r\n },\r\n\r\n initCommands(this: SyntaxComponentInstance) {\r\n this.kfEditor.registerCommand('get.source', this, this.getSource);\r\n this.kfEditor.registerCommand('content.is.empty', this, this.isEmpty);\r\n },\r\n\r\n updateObjTree(this: SyntaxComponentInstance, objTree: ObjectTree) {\n const selectInfo = objTree.select;\n\n this.objTree = objTree;\n\n if (selectInfo?.groupId) {\n this.updateCursor(selectInfo.groupId, selectInfo.startOffset, selectInfo.endOffset);\n return;\n }\n\n if (this.record.cursor.groupId !== null) {\n this.record.cursor = normalizeCursorRecord(objTree, this.record.cursor);\n }\n },\n\r\n hasCursorInfo(this: SyntaxComponentInstance) {\r\n return this.record.cursor.groupId !== null;\r\n },\r\n\r\n isRootNode(this: SyntaxComponentInstance, groupId: string) {\r\n return this.objTree!.mapping.root.strGroup.attr!.id === groupId;\r\n },\r\n\r\n isGroupNode(this: SyntaxComponentInstance, groupId: string) {\r\n const type = this.objTree!.mapping[groupId].strGroup.attr!['data-type'];\r\n return type === legacyGroupType.GROUP || type === legacyGroupType.VIRTUAL;\r\n },\r\n\r\n isVirtualNode(this: SyntaxComponentInstance, groupId: string) {\r\n return this.objTree!.mapping[groupId].strGroup.attr!['data-type'] === legacyGroupType.VIRTUAL;\r\n },\r\n\r\n isPlaceholder(this: SyntaxComponentInstance, groupId: string) {\r\n const currentNode = this.objTree!.mapping[groupId];\r\n\r\n if (!currentNode) {\r\n return false;\r\n }\r\n\r\n return currentNode.objGroup.node.getAttribute('data-flag') === 'Placeholder';\r\n },\r\n\r\n isBrackets(this: SyntaxComponentInstance, groupId: string) {\r\n return !!this.objTree!.mapping[groupId].objGroup.node.getAttribute('data-brackets');\r\n },\r\n\r\n hasRootplaceholder(this: SyntaxComponentInstance) {\r\n return (this.objTree!.mapping.root.strGroup.operand[0] as StringTree).name === 'placeholder';\r\n },\r\n\r\n isSelectPlaceholder(this: SyntaxComponentInstance) {\r\n const cursorInfo = this.record.cursor;\r\n\r\n if (cursorInfo.endOffset - cursorInfo.startOffset !== 1 || !cursorInfo.groupId) {\r\n return false;\r\n }\r\n\r\n const groupInfo = this.getGroupContent(cursorInfo.groupId);\r\n return this.isPlaceholder(groupInfo.content[cursorInfo.startOffset].id);\r\n },\r\n\r\n isLeafTree(this: SyntaxComponentInstance, tree: StringTree | string) {\r\n return typeof tree === 'string';\r\n },\r\n\r\n isRootTree(this: SyntaxComponentInstance, tree: StringTree) {\r\n return !!tree.attr?.['data-root'];\r\n },\r\n\r\n getObjectTree(this: SyntaxComponentInstance) {\r\n return this.objTree!;\r\n },\r\n\r\n getGroupObject(this: SyntaxComponentInstance, id: string) {\n const groupInfo = this.objTree!.mapping[id];\n return groupInfo ? groupInfo.objGroup : null;\n },\n\r\n getCursorRecord(this: SyntaxComponentInstance) {\r\n return kity.Utils.extend({}, this.record.cursor) as CursorRecord;\r\n },\r\n\r\n getGroupContent(this: SyntaxComponentInstance, groupId: string) {\r\n const groupInfo = this.objTree!.mapping[groupId];\r\n const operands = groupInfo.objGroup.operands;\r\n const offset = operands.length - 1;\r\n const isLtr = groupInfo.strGroup.traversal !== 'rtl';\r\n const content: GroupNode[] = [];\r\n\r\n kity.Utils.each(operands, (operand: { node: GroupNode }, i: number) => {\r\n if (isLtr) {\r\n content.push(operand.node);\r\n } else {\r\n content[offset - i] = operand.node;\r\n }\r\n });\r\n\r\n return {\r\n id: groupId,\r\n traversal: groupInfo.strGroup.traversal || 'ltr',\r\n groupObj: groupInfo.objGroup.node,\r\n content,\r\n };\r\n },\r\n\r\n getRootObject(this: SyntaxComponentInstance) {\r\n return this.objTree!.mapping.root.objGroup;\r\n },\r\n\r\n getRootGroupInfo(this: SyntaxComponentInstance) {\r\n const rootGroupId = this.objTree!.mapping.root.strGroup.attr!.id as string;\r\n return this.getGroupContent(rootGroupId);\r\n },\r\n\r\n updateSelection(this: SyntaxComponentInstance, group: GroupContentInfo) {\r\n let groupObj = this.objTree!.mapping[group.id];\r\n let curStrGroup = groupObj.strGroup;\r\n let parentGroup = group;\r\n let parentGroupObj = groupObj;\r\n\r\n if (curStrGroup.name === 'combination') {\r\n this.record.cursor = {\r\n groupId: parentGroup.id,\r\n startOffset: 0,\r\n endOffset: curStrGroup.operand.length,\r\n };\r\n\r\n curStrGroup.operand.unshift(CURSOR_CHAR);\r\n curStrGroup.operand.push(CURSOR_CHAR);\r\n } else {\r\n while (parentGroupObj.strGroup.name !== 'combination' || (parentGroup as any).content === 1) {\r\n group = parentGroup;\r\n groupObj = parentGroupObj;\r\n parentGroup = this.kfEditor.requestService('position.get.parent.group', groupObj.objGroup.node) as GroupContentInfo;\r\n parentGroupObj = this.objTree!.mapping[parentGroup.id];\r\n }\r\n\r\n const parentIndex = parentGroup.content.indexOf(group.groupObj);\r\n\r\n this.record.cursor = {\r\n groupId: parentGroup.id,\r\n startOffset: parentIndex,\r\n endOffset: parentIndex + 1,\r\n };\r\n\r\n parentGroupObj.strGroup.operand.splice(parentIndex + 1, 0, CURSOR_CHAR);\r\n parentGroupObj.strGroup.operand.splice(parentIndex, 0, CURSOR_CHAR);\r\n }\r\n\r\n let resultStr = this.kfEditor.requestService('parser.latex.serialization', this.objTree!.parsedTree) as string;\r\n const startOffset = resultStr.indexOf(CURSOR_CHAR);\r\n resultStr = resultStr.replace(CURSOR_CHAR, '');\r\n const endOffset = resultStr.indexOf(CURSOR_CHAR);\r\n\r\n parentGroupObj.strGroup.operand.splice(this.record.cursor.startOffset, 1);\r\n parentGroupObj.strGroup.operand.splice(this.record.cursor.endOffset, 1);\r\n\r\n return { str: resultStr, startOffset, endOffset };\r\n },\r\n\r\n getSource(this: SyntaxComponentInstance) {\r\n return this.serialization().str.replace(CURSOR_CHAR, '').replace(CURSOR_CHAR, '');\r\n },\r\n\r\n isEmpty(this: SyntaxComponentInstance) {\r\n return this.hasRootplaceholder();\r\n },\r\n\r\n serialization(this: SyntaxComponentInstance) {\n const cursor = normalizeCursorRecord(this.objTree!, this.record.cursor);\n const objGroup = this.objTree!.mapping[cursor.groupId as string];\n const curStrGroup = objGroup.strGroup;\n let strStartIndex = Math.min(cursor.endOffset, cursor.startOffset);\n let strEndIndex = Math.max(cursor.endOffset, cursor.startOffset);\n\r\n curStrGroup.operand.splice(strEndIndex, 0, CURSOR_CHAR);\r\n curStrGroup.operand.splice(strStartIndex, 0, CURSOR_CHAR);\r\n strEndIndex += 1;\r\n\r\n let resultStr = this.kfEditor.requestService('parser.latex.serialization', this.objTree!.parsedTree) as string;\r\n\r\n curStrGroup.operand.splice(strEndIndex, 1);\r\n curStrGroup.operand.splice(strStartIndex, 1);\r\n\r\n strStartIndex = resultStr.indexOf(CURSOR_CHAR);\r\n\r\n if (cursor.startOffset === cursor.endOffset) {\r\n resultStr = resultStr.replace(CURSOR_CHAR, '');\r\n }\r\n\r\n strEndIndex = resultStr.lastIndexOf(CURSOR_CHAR);\r\n\r\n return {\r\n str: resultStr,\r\n startOffset: strStartIndex,\r\n endOffset: strEndIndex,\r\n };\r\n },\r\n\r\n updateCursor(this: SyntaxComponentInstance, groupId: string | CursorRecord, startOffset?: number, endOffset?: number) {\n if (arguments.length === 1) {\n endOffset = (groupId as CursorRecord).endOffset;\n startOffset = (groupId as CursorRecord).startOffset;\r\n groupId = (groupId as CursorRecord).groupId as string;\r\n }\r\n\r\n if (endOffset === undefined) {\r\n endOffset = startOffset;\r\n }\r\n\r\n if ((startOffset as number) > (endOffset as number)) {\n const tmp = endOffset as number;\n endOffset = startOffset as number;\n startOffset = tmp;\n }\n\n const nextCursor = {\n groupId: groupId as string,\n startOffset: startOffset as number,\n endOffset: endOffset as number,\n };\n\n this.record.cursor = this.objTree\n ? normalizeCursorRecord(this.objTree, nextCursor)\n : nextCursor;\n },\n\r\n leftMove(this: SyntaxComponentInstance) {\r\n this.components.move.leftMove();\r\n },\r\n\r\n rightMove(this: SyntaxComponentInstance) {\r\n this.components.move.rightMove();\r\n },\r\n\r\n deleteGroup(this: SyntaxComponentInstance) {\r\n return this.components.delete.deleteGroup();\r\n },\r\n\r\n insertSubtree(this: SyntaxComponentInstance, subtree: StringTree) {\r\n const cursorInfo = this.record.cursor;\r\n\r\n if (this.isPlaceholder(cursorInfo.groupId as string)) {\r\n this.replaceTree(subtree);\r\n return;\r\n }\r\n\r\n const startOffset = Math.min(cursorInfo.startOffset, cursorInfo.endOffset);\r\n const endOffset = Math.max(cursorInfo.startOffset, cursorInfo.endOffset);\r\n const diff = endOffset - startOffset;\r\n const currentTree = this.objTree!.mapping[cursorInfo.groupId as string].strGroup;\r\n\r\n currentTree.operand.splice(startOffset, diff, subtree);\r\n cursorInfo.startOffset += 1;\r\n cursorInfo.endOffset = cursorInfo.startOffset;\r\n },\r\n\r\n replaceTree(this: SyntaxComponentInstance, subtree: StringTree) {\r\n const cursorInfo = this.record.cursor;\r\n const groupNode = this.objTree!.mapping[cursorInfo.groupId as string].objGroup.node;\r\n const parentInfo = this.kfEditor.requestService('position.get.parent.info', groupNode) as { group: GroupContentInfo; index: number };\r\n const currentTree = this.objTree!.mapping[parentInfo.group.id].strGroup;\r\n\r\n currentTree.operand[parentInfo.index] = subtree;\r\n cursorInfo.groupId = parentInfo.group.id;\r\n cursorInfo.startOffset = parentInfo.index + 1;\r\n cursorInfo.endOffset = parentInfo.index + 1;\r\n },\r\n});\r\n\r\nexport default SyntaxComponent as new (kfEditor: LegacyEditorInstance) => SyntaxComponentInstance;\r\n","import { legacyBaseUtils } from '../vendor/legacy-utils';\nimport { legacyInputFilter } from '../vendor/legacy-input-filter';\nimport { legacySysconf } from '../vendor/legacy-sysconf';\nimport { getLegacyKity } from '../vendor/runtime-interop';\nimport type { LegacyEditorInstance } from './editor';\n\r\ntype ExtendedInputElement = HTMLInputElement & {\r\n isTrusted: boolean;\r\n};\r\n\r\ntype LatexInfo = {\r\n str: string;\r\n startOffset: number;\r\n endOffset: number;\r\n};\r\n\r\ntype RootGroupInfo = {\r\n id: string;\r\n content: unknown[];\r\n};\r\n\r\ntype InputComponentInstance = {\r\n parentComponent: unknown;\r\n kfEditor: LegacyEditorInstance;\r\n inputBox: ExtendedInputElement;\r\n initServices: () => void;\r\n initCommands: () => void;\r\n initEvent: () => void;\r\n createInputBox: () => ExtendedInputElement;\r\n focus: () => void;\r\n setUntrusted: () => void;\r\n setTrusted: () => void;\r\n updateInput: () => void;\r\n insertStr: (str: string) => void;\r\n hasRootplaceholder: () => boolean;\r\n leftMove: () => void;\r\n rightMove: () => void;\r\n delete: () => void;\r\n processUserCtrl: (e: KeyboardEvent) => void;\r\n pretreatmentInput: (evt: KeyboardEvent) => boolean;\r\n getKeyCode: (e: KeyboardEvent) => string;\r\n processingInput: () => void;\r\n restruct: (latexStr: string) => void;\r\n update: () => void;\r\n};\r\n\r\nconst KEY_CODE = {\n LEFT: 37,\n RIGHT: 39,\n DELETE: 8,\n INPUT: 229,\n};\n\nconst CURSOR_CHAR = legacySysconf.cursorCharacter;\nconst kity = getLegacyKity();\n\nfunction insertCursorMarkers(value: string, selectionStart: number | null, selectionEnd: number | null) {\n const normalizedStart = Math.max(0, Math.min(selectionStart ?? value.length, value.length));\n const normalizedEnd = Math.max(0, Math.min(selectionEnd ?? normalizedStart, value.length));\n const rangeStart = Math.min(normalizedStart, normalizedEnd);\n const rangeEnd = Math.max(normalizedStart, normalizedEnd);\n\n return (\n value.slice(0, rangeStart) +\n CURSOR_CHAR +\n value.slice(rangeStart, rangeEnd) +\n CURSOR_CHAR +\n value.slice(rangeEnd)\n );\n}\n\nconst InputComponent = kity.createClass('InputComponent', {\n constructor(this: InputComponentInstance, parentComponent: unknown, kfEditor: LegacyEditorInstance) {\r\n this.parentComponent = parentComponent;\r\n this.kfEditor = kfEditor;\r\n this.inputBox = this.createInputBox();\r\n this.initServices();\r\n this.initCommands();\r\n this.initEvent();\r\n },\r\n\r\n initServices(this: InputComponentInstance) {\r\n this.kfEditor.registerService('control.update.input', this, {\r\n updateInput: this.updateInput,\r\n });\r\n\r\n this.kfEditor.registerService('control.insert.string', this, {\r\n insertStr: this.insertStr,\r\n });\r\n },\r\n\r\n initCommands(this: InputComponentInstance) {\r\n this.kfEditor.registerCommand('focus', this, this.focus);\r\n },\r\n\r\n createInputBox(this: InputComponentInstance) {\r\n const editorContainer = this.kfEditor.getContainer();\r\n const box = this.kfEditor.getDocument().createElement('input') as ExtendedInputElement;\r\n\r\n box.className = 'kf-editor-input-box';\r\n box.type = 'text';\r\n box.isTrusted = false;\r\n\r\n editorContainer.appendChild(box);\r\n\r\n return box;\r\n },\r\n\r\n focus(this: InputComponentInstance) {\r\n this.inputBox.focus();\r\n\r\n if (!this.kfEditor.requestService('syntax.has.cursor.info')) {\r\n const rootInfo = this.kfEditor.requestService('syntax.get.root.group.info') as RootGroupInfo;\r\n\r\n this.kfEditor.requestService('syntax.update.record.cursor', {\r\n groupId: rootInfo.id,\r\n startOffset: 0,\r\n endOffset: rootInfo.content.length,\r\n });\r\n\r\n this.kfEditor.requestService('control.update.input');\r\n }\r\n\r\n this.kfEditor.requestService('control.reselect');\r\n },\r\n\r\n setUntrusted(this: InputComponentInstance) {\r\n this.inputBox.isTrusted = false;\r\n },\r\n\r\n setTrusted(this: InputComponentInstance) {\r\n this.inputBox.isTrusted = true;\r\n },\r\n\r\n updateInput(this: InputComponentInstance) {\r\n const latexInfo = this.kfEditor.requestService('syntax.serialization') as LatexInfo;\r\n\r\n this.setUntrusted();\r\n this.inputBox.value = latexInfo.str;\r\n this.inputBox.selectionStart = latexInfo.startOffset;\r\n this.inputBox.selectionEnd = latexInfo.endOffset;\r\n this.inputBox.focus();\r\n this.setTrusted();\r\n },\r\n\r\n insertStr(this: InputComponentInstance, str: string) {\r\n const latexInfo = this.kfEditor.requestService('syntax.serialization') as LatexInfo;\r\n\r\n let originString = latexInfo.str;\r\n originString = originString.substring(0, latexInfo.startOffset) + ` ${str} ` + originString.substring(latexInfo.endOffset);\r\n\r\n this.restruct(originString);\r\n this.updateInput();\r\n this.kfEditor.requestService('ui.update.canvas.view');\r\n },\r\n\r\n initEvent(this: InputComponentInstance) {\r\n legacyBaseUtils.addEvent(this.inputBox, 'keydown', (e: KeyboardEvent) => {\r\n let isControl = false;\r\n\r\n if (e.ctrlKey) {\r\n this.processUserCtrl(e);\r\n return;\r\n }\r\n\r\n switch (e.keyCode) {\r\n case KEY_CODE.INPUT:\r\n return;\r\n case KEY_CODE.LEFT:\r\n e.preventDefault();\r\n this.leftMove();\r\n isControl = true;\r\n break;\r\n case KEY_CODE.RIGHT:\r\n e.preventDefault();\r\n this.rightMove();\r\n isControl = true;\r\n break;\r\n case KEY_CODE.DELETE:\r\n e.preventDefault();\r\n this.delete();\r\n isControl = true;\r\n break;\r\n }\r\n\r\n if (isControl) {\r\n this.kfEditor.requestService('ui.update.canvas.view');\r\n }\r\n\r\n if (!this.pretreatmentInput(e)) {\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n legacyBaseUtils.addEvent(this.inputBox, 'input', () => {\r\n this.processingInput();\r\n });\r\n\r\n legacyBaseUtils.addEvent(this.inputBox, 'blur', () => {\r\n this.kfEditor.requestService('ui.toolbar.disable');\r\n this.kfEditor.requestService('ui.toolbar.close');\r\n this.kfEditor.requestService('control.cursor.hide');\r\n this.kfEditor.requestService('render.clear.select');\r\n });\r\n\r\n legacyBaseUtils.addEvent(this.inputBox, 'focus', () => {\r\n this.kfEditor.requestService('ui.toolbar.enable');\r\n\r\n if (this.inputBox.isTrusted) {\r\n this.kfEditor.requestService('control.reselect');\r\n }\r\n });\r\n\r\n legacyBaseUtils.addEvent(this.inputBox, 'paste', (e: ClipboardEvent) => {\r\n e.preventDefault();\r\n });\r\n },\r\n\r\n hasRootplaceholder(this: InputComponentInstance) {\r\n return this.kfEditor.requestService('syntax.has.root.placeholder') as boolean;\r\n },\r\n\r\n leftMove(this: InputComponentInstance) {\r\n if (this.hasRootplaceholder()) {\r\n return;\r\n }\r\n\r\n this.kfEditor.requestService('syntax.cursor.move.left');\r\n this.update();\r\n },\r\n\r\n rightMove(this: InputComponentInstance) {\r\n if (this.hasRootplaceholder()) {\r\n return;\r\n }\r\n\r\n this.kfEditor.requestService('syntax.cursor.move.right');\r\n this.update();\r\n },\r\n\r\n delete(this: InputComponentInstance) {\r\n if (this.hasRootplaceholder()) {\r\n return;\r\n }\r\n\r\n const isNeedRedraw = this.kfEditor.requestService('syntax.delete.group') as boolean;\r\n\r\n if (isNeedRedraw) {\r\n this.updateInput();\r\n this.processingInput();\r\n return;\r\n }\r\n\r\n this.updateInput();\r\n this.kfEditor.requestService('control.reselect');\r\n },\r\n\r\n processUserCtrl(this: InputComponentInstance, e: KeyboardEvent) {\r\n e.preventDefault();\r\n\r\n switch (e.keyCode) {\r\n case 65:\r\n this.kfEditor.requestService('control.select.all');\r\n break;\r\n case 83:\r\n this.kfEditor.requestService('print.image');\r\n break;\r\n }\r\n },\r\n\r\n pretreatmentInput(this: InputComponentInstance, evt: KeyboardEvent) {\r\n const keyCode = this.getKeyCode(evt);\r\n const replaceStr = legacyInputFilter.getReplaceString(keyCode);\r\n\r\n if (replaceStr === null) {\r\n return true;\r\n }\r\n\r\n this.insertStr(replaceStr);\r\n return false;\r\n },\r\n\r\n getKeyCode(this: InputComponentInstance, e: KeyboardEvent) {\r\n return `${e.shiftKey ? 's+' : ''}${e.keyCode}`;\r\n },\r\n\r\n processingInput(this: InputComponentInstance) {\n const latexWithCursor = insertCursorMarkers(\n this.inputBox.value,\n this.inputBox.selectionStart,\n this.inputBox.selectionEnd,\n );\n\n this.restruct(latexWithCursor);\n this.kfEditor.requestService('ui.update.canvas.view');\n },\n\r\n restruct(this: InputComponentInstance, latexStr: string) {\r\n this.kfEditor.requestService('render.draw', latexStr);\r\n this.kfEditor.requestService('control.reselect');\r\n },\r\n\r\n update(this: InputComponentInstance) {\r\n this.updateInput();\r\n this.kfEditor.requestService('control.reselect');\r\n },\r\n});\r\n\r\nexport default InputComponent as new (parentComponent: unknown, kfEditor: LegacyEditorInstance) => InputComponentInstance;\r\n","import { getLegacyKity } from '../vendor/runtime-interop';\r\nimport { legacyBaseUtils } from '../vendor/legacy-utils';\r\nimport type { LegacyEditorInstance } from './editor';\r\n\r\ntype LegacyRectShape = {\r\n fill: (color: string) => LegacyRectShape;\r\n setAttr: (name: string, value: string) => void;\r\n setHeight: (height: number) => void;\r\n getTransform: (shape: LegacyRectShape) => {\r\n m: {\r\n e: number;\r\n f: number;\r\n };\r\n };\r\n setMatrix: (transform: unknown) => void;\r\n getRenderBox: (mode: string) => {\r\n x: number;\r\n y: number;\r\n };\r\n};\r\n\r\ntype LegacyKityWithRect = ReturnType<typeof getLegacyKity> & {\r\n Rect: new (width: number, height: number, x: number, y: number) => LegacyRectShape;\r\n};\r\n\r\ntype PaperLike = {\r\n container: {\r\n node: Element;\r\n };\r\n addShape: (shape: LegacyRectShape) => void;\r\n getZoom: () => number;\r\n};\r\n\r\ntype CursorInfo = {\r\n groupId: string;\r\n startOffset: number;\r\n endOffset: number;\r\n};\r\n\r\ntype GroupInfo = {\r\n id: string;\r\n content: Array<Element & { id: string }>;\r\n};\r\n\r\ntype LocationComponentInstance = {\r\n parentComponent: unknown;\r\n kfEditor: LegacyEditorInstance;\r\n paper: PaperLike;\r\n cursorShape: LegacyRectShape;\r\n getPaper: () => PaperLike;\r\n initServices: () => void;\r\n initEvent: () => void;\r\n createCursor: () => LegacyRectShape;\r\n updateCursorInfo: (evt: MouseEvent) => false | void;\r\n hideCursor: () => void;\r\n reselect: () => void;\r\n updateCursor: () => void;\r\n getCursorLocation: () => { x: number; y: number };\r\n getIndex: (distance: number, groupInfo: GroupInfo) => number;\r\n};\r\n\r\nconst kity = getLegacyKity() as LegacyKityWithRect;\r\n\r\nconst LocationComponent = kity.createClass('LocationComponent', {\r\n constructor(this: LocationComponentInstance, parentComponent: unknown, kfEditor: LegacyEditorInstance) {\r\n this.parentComponent = parentComponent;\r\n this.kfEditor = kfEditor;\r\n this.paper = this.getPaper();\r\n this.cursorShape = this.createCursor();\r\n this.initServices();\r\n this.initEvent();\r\n },\r\n\r\n getPaper(this: LocationComponentInstance) {\r\n return this.kfEditor.requestService('render.get.paper') as PaperLike;\r\n },\r\n\r\n initServices(this: LocationComponentInstance) {\r\n this.kfEditor.registerService('control.cursor.relocation', this, {\r\n relocationCursor: this.updateCursor,\r\n });\r\n\r\n this.kfEditor.registerService('control.cursor.hide', this, {\r\n hideCursor: this.hideCursor,\r\n });\r\n\r\n this.kfEditor.registerService('control.reselect', this, {\r\n reselect: this.reselect,\r\n });\r\n\r\n this.kfEditor.registerService('control.get.cursor.location', this, {\r\n getCursorLocation: this.getCursorLocation,\r\n });\r\n },\r\n\r\n createCursor(this: LocationComponentInstance) {\r\n const cursorShape = new kity.Rect(1, 0, 0, 0).fill('black');\r\n\r\n cursorShape.setAttr('style', 'display: none');\r\n this.paper.addShape(cursorShape);\r\n\r\n return cursorShape;\r\n },\r\n\r\n initEvent(this: LocationComponentInstance) {\r\n const eventServiceObject = this.kfEditor.request('ui.canvas.container.event');\r\n\r\n eventServiceObject.on('mousedown', (e: MouseEvent) => {\r\n e.preventDefault();\r\n this.updateCursorInfo(e);\r\n this.kfEditor.requestService('control.update.input');\r\n this.reselect();\r\n });\r\n },\r\n\r\n updateCursorInfo(this: LocationComponentInstance, evt: MouseEvent) {\r\n if (this.kfEditor.requestService('syntax.has.root.placeholder')) {\r\n this.kfEditor.requestService('syntax.update.record.cursor', {\r\n groupId: (this.kfEditor.requestService('syntax.get.root.group.info') as GroupInfo).id,\r\n startOffset: 0,\r\n endOffset: 1,\r\n });\r\n\r\n return false;\r\n }\r\n\r\n const wrapNode = this.kfEditor.requestService('position.get.wrap', evt.target) as (Element & { id: string }) | null;\r\n\r\n if (wrapNode && this.kfEditor.requestService('syntax.is.placeholder.node', wrapNode.id)) {\r\n const groupInfo = this.kfEditor.requestService('position.get.group.info', wrapNode) as {\r\n group: GroupInfo;\r\n index: number;\r\n };\r\n\r\n this.kfEditor.requestService('syntax.update.record.cursor', groupInfo.group.id, groupInfo.index, groupInfo.index + 1);\r\n return;\r\n }\r\n\r\n let groupInfo = this.kfEditor.requestService('position.get.group', evt.target) as GroupInfo | null;\r\n\r\n if (groupInfo === null) {\r\n groupInfo = this.kfEditor.requestService('syntax.get.root.group.info') as GroupInfo;\r\n }\r\n\r\n const index = this.getIndex(evt.clientX, groupInfo);\r\n this.kfEditor.requestService('syntax.update.record.cursor', groupInfo.id, index);\r\n },\r\n\r\n hideCursor(this: LocationComponentInstance) {\r\n this.cursorShape.setAttr('style', 'display: none');\r\n },\r\n\r\n reselect(this: LocationComponentInstance) {\r\n const cursorInfo = this.kfEditor.requestService('syntax.get.record.cursor') as CursorInfo;\r\n\r\n this.hideCursor();\r\n\r\n if (this.kfEditor.requestService('syntax.is.select.placeholder')) {\r\n const groupInfo = this.kfEditor.requestService('syntax.get.group.content', cursorInfo.groupId) as GroupInfo;\r\n this.kfEditor.requestService('render.select.group', groupInfo.content[cursorInfo.startOffset].id);\r\n return;\r\n }\r\n\r\n if (cursorInfo.startOffset === cursorInfo.endOffset) {\r\n this.updateCursor();\r\n this.kfEditor.requestService('render.tint.current.cursor');\r\n return;\r\n }\r\n\r\n this.kfEditor.requestService('render.select.current.cursor');\r\n },\r\n\r\n updateCursor(this: LocationComponentInstance) {\r\n const cursorInfo = this.kfEditor.requestService('syntax.get.record.cursor') as CursorInfo;\r\n\r\n if (cursorInfo.startOffset !== cursorInfo.endOffset) {\r\n this.hideCursor();\r\n return;\r\n }\r\n\r\n const groupInfo = this.kfEditor.requestService('syntax.get.group.content', cursorInfo.groupId) as GroupInfo;\r\n const isBefore = cursorInfo.endOffset === 0;\r\n const index = isBefore ? 0 : cursorInfo.endOffset - 1;\r\n const focusChild = groupInfo.content[index];\r\n const paperContainerRect = legacyBaseUtils.getRect(this.paper.container.node);\r\n const focusChildRect = legacyBaseUtils.getRect(focusChild);\r\n const cursorTransform = this.cursorShape.getTransform(this.cursorShape);\r\n const canvasZoom = this.kfEditor.requestService('render.get.canvas.zoom') as number;\r\n const formulaZoom = this.paper.getZoom();\r\n\r\n this.cursorShape.setHeight(focusChildRect.height / canvasZoom / formulaZoom);\r\n\r\n let cursorOffset = isBefore ? focusChildRect.left - 2 : focusChildRect.left + focusChildRect.width - 2;\r\n cursorOffset -= paperContainerRect.left;\r\n\r\n cursorTransform.m.e = Math.floor(cursorOffset / canvasZoom / formulaZoom) + 0.5;\r\n cursorTransform.m.f = (focusChildRect.top - paperContainerRect.top) / canvasZoom / formulaZoom;\r\n\r\n this.cursorShape.setMatrix(cursorTransform);\r\n this.cursorShape.setAttr('style', 'display: block');\r\n },\r\n\r\n getCursorLocation(this: LocationComponentInstance) {\r\n const rect = this.cursorShape.getRenderBox('paper');\r\n\r\n return {\r\n x: rect.x,\r\n y: rect.y,\r\n };\r\n },\r\n\r\n getIndex(this: LocationComponentInstance, distance: number, groupInfo: GroupInfo) {\r\n let index = -1;\r\n\r\n for (let i = groupInfo.content.length - 1; i >= 0; i -= 1) {\r\n index = i;\r\n\r\n const child = groupInfo.content[i];\r\n const boundingRect = legacyBaseUtils.getRect(child);\r\n\r\n if (boundingRect.left < distance) {\r\n if (boundingRect.left + boundingRect.width / 2 < distance) {\r\n index += 1;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n return index;\r\n },\r\n});\r\n\r\nexport default LocationComponent as new (parentComponent: unknown, kfEditor: LegacyEditorInstance) => LocationComponentInstance;\r\n","import { legacyBaseUtils } from '../vendor/legacy-utils';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\n\r\ntype CursorInfo = {\r\n groupId: string;\r\n startOffset: number;\r\n endOffset: number;\r\n};\r\n\r\ntype GroupContentInfo = {\r\n id: string;\r\n groupObj: Element & { id: string };\r\n content: Array<Element & { id: string }>;\r\n};\r\n\r\ntype CommunityGroupInfo = {\r\n group: GroupContentInfo;\r\n startOffset: number;\r\n endOffset: number;\r\n};\r\n\r\ntype SelectionState = {\r\n groupInfo: GroupContentInfo;\r\n offset: number;\r\n};\r\n\r\ntype SelectionComponentInstance = {\r\n parentComponent: unknown;\r\n kfEditor: LegacyEditorInstance;\r\n isDrag: boolean;\r\n isMousedown: boolean;\r\n startPoint: {\r\n x: number;\r\n y: number;\r\n };\r\n startGroupIsPlaceholder: boolean;\r\n startGroup: SelectionState;\r\n initServices: () => void;\r\n initEvent: () => void;\r\n getDistance: (x: number, y: number) => number;\r\n updateStartPoint: (x: number, y: number) => void;\r\n updateStartGroup: () => void;\r\n startUpdateSelection: () => void;\r\n stopUpdateSelection: () => void;\r\n clearSelection: () => void;\r\n updateSelection: (target: EventTarget | null, x: number, y: number) => void;\r\n updateSelectionByTarget: (target: EventTarget | null) => void;\r\n selectAll: () => void;\r\n getGroupInof: (offset: number, target: EventTarget | null) => SelectionState;\r\n getIndex: (groupNode: Element & { id: string }, targetNode: EventTarget | null, offset: number) => number;\r\n getCommunityGroup: (startGroupInfo: GroupContentInfo, endGroupInfo: GroupContentInfo) => CommunityGroupInfo;\r\n};\r\n\r\nconst MAX_DISTANCE = 10;\r\nconst kity = getLegacyKity();\r\n\r\nconst SelectionComponent = kity.createClass('SelectionComponent', {\r\n constructor(this: SelectionComponentInstance, parentComponent: unknown, kfEditor: LegacyEditorInstance) {\r\n this.parentComponent = parentComponent;\r\n this.kfEditor = kfEditor;\r\n this.isDrag = false;\r\n this.isMousedown = false;\r\n this.startPoint = { x: -1, y: -1 };\r\n this.startGroupIsPlaceholder = false;\r\n this.startGroup = {} as SelectionState;\r\n this.initServices();\r\n this.initEvent();\r\n },\r\n\r\n initServices(this: SelectionComponentInstance) {\r\n this.kfEditor.registerService('control.select.all', this, {\r\n selectAll: this.selectAll,\r\n });\r\n },\r\n\r\n initEvent(this: SelectionComponentInstance) {\r\n const eventServiceObject = this.kfEditor.request('ui.canvas.container.event');\r\n\r\n eventServiceObject.on('mousedown', (e: MouseEvent) => {\r\n e.preventDefault();\r\n\r\n if (this.kfEditor.requestService('syntax.has.root.placeholder')) {\r\n return false;\r\n }\r\n\r\n this.isMousedown = true;\r\n this.updateStartPoint(e.clientX, e.clientY);\r\n this.updateStartGroup();\r\n });\r\n\r\n eventServiceObject.on('mouseup', (e: MouseEvent) => {\r\n e.preventDefault();\r\n this.stopUpdateSelection();\r\n });\r\n\r\n eventServiceObject.on('mousemove', (e: MouseEvent) => {\r\n e.preventDefault();\r\n\r\n if (!this.isDrag) {\r\n if (this.isMousedown && MAX_DISTANCE < this.getDistance(e.clientX, e.clientY)) {\r\n this.kfEditor.requestService('control.cursor.hide');\r\n this.startUpdateSelection();\r\n }\r\n return;\r\n }\r\n\r\n if (e.which !== 1) {\r\n this.stopUpdateSelection();\r\n return;\r\n }\r\n\r\n this.updateSelection(e.target, e.clientX, e.clientY);\r\n });\r\n\r\n eventServiceObject.on('dblclick', (e: MouseEvent) => {\r\n this.updateSelectionByTarget(e.target);\r\n });\r\n },\r\n\r\n getDistance(this: SelectionComponentInstance, x: number, y: number) {\r\n const distanceX = Math.abs(x - this.startPoint.x);\r\n const distanceY = Math.abs(y - this.startPoint.y);\r\n\r\n return Math.max(distanceX, distanceY);\r\n },\r\n\r\n updateStartPoint(this: SelectionComponentInstance, x: number, y: number) {\r\n this.startPoint.x = x;\r\n this.startPoint.y = y;\r\n },\r\n\r\n updateStartGroup(this: SelectionComponentInstance) {\r\n const cursorInfo = this.kfEditor.requestService('syntax.get.record.cursor') as CursorInfo;\r\n\r\n this.startGroupIsPlaceholder = this.kfEditor.requestService('syntax.is.select.placeholder') as boolean;\r\n this.startGroup = {\r\n groupInfo: this.kfEditor.requestService('syntax.get.group.content', cursorInfo.groupId) as GroupContentInfo,\r\n offset: cursorInfo.startOffset,\r\n };\r\n },\r\n\r\n startUpdateSelection(this: SelectionComponentInstance) {\r\n this.isDrag = true;\r\n this.isMousedown = false;\r\n this.clearSelection();\r\n },\r\n\r\n stopUpdateSelection(this: SelectionComponentInstance) {\r\n this.isDrag = false;\r\n this.isMousedown = false;\r\n this.kfEditor.requestService('control.update.input');\r\n },\r\n\r\n clearSelection(this: SelectionComponentInstance) {\r\n this.kfEditor.requestService('render.clear.select');\r\n },\r\n\r\n updateSelection(this: SelectionComponentInstance, target: EventTarget | null, x: number) {\r\n const dir = x > this.startPoint.x;\r\n const startGroupInfo = this.startGroup;\r\n const currentGroupInfo = this.getGroupInof(x, target);\r\n let cursorInfo: CursorInfo;\r\n\r\n if (currentGroupInfo.groupInfo.id === startGroupInfo.groupInfo.id) {\r\n cursorInfo = {\r\n groupId: currentGroupInfo.groupInfo.id,\r\n startOffset: startGroupInfo.offset,\r\n endOffset: currentGroupInfo.offset,\r\n };\r\n\r\n if (this.startGroupIsPlaceholder) {\r\n if (!dir) {\r\n cursorInfo.startOffset += 1;\r\n } else if (cursorInfo.startOffset === cursorInfo.endOffset) {\r\n cursorInfo.endOffset += 1;\r\n }\r\n }\r\n } else if (legacyBaseUtils.contains(startGroupInfo.groupInfo.groupObj, currentGroupInfo.groupInfo.groupObj)) {\r\n cursorInfo = {\r\n groupId: startGroupInfo.groupInfo.id,\r\n startOffset: startGroupInfo.offset,\r\n endOffset: this.getIndex(startGroupInfo.groupInfo.groupObj, target, x),\r\n };\r\n } else if (legacyBaseUtils.contains(currentGroupInfo.groupInfo.groupObj, startGroupInfo.groupInfo.groupObj)) {\r\n cursorInfo = {\r\n groupId: currentGroupInfo.groupInfo.id,\r\n startOffset: this.kfEditor.requestService(\r\n 'position.get.index',\r\n currentGroupInfo.groupInfo.groupObj,\r\n startGroupInfo.groupInfo.groupObj,\r\n ) as number,\r\n endOffset: currentGroupInfo.offset,\r\n };\r\n\r\n if (!dir) {\r\n cursorInfo.startOffset += 1;\r\n }\r\n } else {\r\n const communityGroupInfo = this.getCommunityGroup(startGroupInfo.groupInfo, currentGroupInfo.groupInfo);\r\n\r\n if (communityGroupInfo.startOffset === communityGroupInfo.endOffset) {\r\n communityGroupInfo.endOffset += 1;\r\n } else {\r\n const currentGroupNode = communityGroupInfo.group.content[communityGroupInfo.endOffset];\r\n const inRightArea = this.kfEditor.requestService('position.get.area', currentGroupNode, x) as boolean;\r\n\r\n if (inRightArea) {\r\n communityGroupInfo.endOffset += 1;\r\n }\r\n\r\n if (!dir) {\r\n communityGroupInfo.startOffset += 1;\r\n }\r\n }\r\n\r\n cursorInfo = {\r\n groupId: communityGroupInfo.group.id,\r\n startOffset: communityGroupInfo.startOffset,\r\n endOffset: communityGroupInfo.endOffset,\r\n };\r\n }\r\n\r\n this.kfEditor.requestService('syntax.update.record.cursor', cursorInfo.groupId, cursorInfo.startOffset, cursorInfo.endOffset);\r\n this.kfEditor.requestService('control.reselect');\r\n },\r\n\r\n updateSelectionByTarget(this: SelectionComponentInstance, target: EventTarget | null) {\r\n const parentGroupInfo = this.kfEditor.requestService('position.get.parent.group', target) as GroupContentInfo | null;\r\n\r\n if (parentGroupInfo === null) {\r\n return;\r\n }\r\n\r\n if (this.kfEditor.requestService('syntax.is.root.node', parentGroupInfo.id)) {\r\n this.selectAll();\r\n return;\r\n }\r\n\r\n let cursorInfo: CursorInfo;\r\n\r\n if (!this.kfEditor.requestService('syntax.is.virtual.node', parentGroupInfo.id)) {\r\n cursorInfo = {\r\n groupId: parentGroupInfo.id,\r\n startOffset: 0,\r\n endOffset: parentGroupInfo.content.length,\r\n };\r\n } else {\r\n const containerInfo = this.kfEditor.requestService('position.get.group.info', parentGroupInfo.groupObj) as {\r\n group: GroupContentInfo;\r\n index: number;\r\n };\r\n\r\n cursorInfo = {\r\n groupId: containerInfo.group.id,\r\n startOffset: containerInfo.index,\r\n endOffset: containerInfo.index + 1,\r\n };\r\n }\r\n\r\n this.kfEditor.requestService('syntax.update.record.cursor', cursorInfo);\r\n this.kfEditor.requestService('control.reselect');\r\n this.kfEditor.requestService('control.update.input');\r\n },\r\n\r\n selectAll(this: SelectionComponentInstance) {\r\n const rootGroupInfo = this.kfEditor.requestService('syntax.get.root.group.info') as GroupContentInfo;\r\n\r\n const cursorInfo = {\r\n groupId: rootGroupInfo.id,\r\n startOffset: 0,\r\n endOffset: rootGroupInfo.content.length,\r\n };\r\n\r\n this.kfEditor.requestService('syntax.update.record.cursor', cursorInfo);\r\n this.kfEditor.requestService('control.reselect');\r\n this.kfEditor.requestService('control.update.input');\r\n },\r\n\r\n getGroupInof(this: SelectionComponentInstance, offset: number, target: EventTarget | null) {\r\n let groupInfo = this.kfEditor.requestService('position.get.group', target) as GroupContentInfo | null;\r\n\r\n if (groupInfo === null) {\r\n groupInfo = this.kfEditor.requestService('syntax.get.root.group.info') as GroupContentInfo;\r\n }\r\n\r\n const index = this.kfEditor.requestService('position.get.location.info', offset, groupInfo) as number;\r\n\r\n return {\r\n groupInfo,\r\n offset: index,\r\n };\r\n },\r\n\r\n getIndex(this: SelectionComponentInstance, groupNode: Element & { id: string }, targetNode: EventTarget | null, offset: number) {\r\n let index = this.kfEditor.requestService('position.get.index', groupNode, targetNode) as number;\r\n const groupInfo = this.kfEditor.requestService('syntax.get.group.content', groupNode.id) as GroupContentInfo;\r\n const targetWrapNode = groupInfo.content[index];\r\n const targetRect = legacyBaseUtils.getRect(targetWrapNode);\r\n\r\n if (targetRect.left + targetRect.width / 2 < offset) {\r\n index += 1;\r\n }\r\n\r\n return index;\r\n },\r\n\r\n getCommunityGroup(this: SelectionComponentInstance, startGroupInfo: GroupContentInfo, endGroupInfo: GroupContentInfo) {\r\n let targetGroup = startGroupInfo.groupObj;\r\n let bigBoundingGroup: { group: GroupContentInfo; index: number } | null = null;\r\n\r\n while ((bigBoundingGroup = this.kfEditor.requestService('position.get.group.info', targetGroup) as { group: GroupContentInfo; index: number } | null)) {\r\n targetGroup = bigBoundingGroup.group.groupObj;\r\n\r\n if (legacyBaseUtils.contains(bigBoundingGroup.group.groupObj, endGroupInfo.groupObj)) {\r\n break;\r\n }\r\n }\r\n\r\n if (!bigBoundingGroup) {\r\n throw new Error('SelectionComponent: failed to find community group');\r\n }\r\n\r\n const groupNode = bigBoundingGroup.group.groupObj;\r\n\r\n return {\r\n group: bigBoundingGroup.group,\r\n startOffset: bigBoundingGroup.index,\r\n endOffset: this.kfEditor.requestService('position.get.index', groupNode, endGroupInfo.groupObj) as number,\r\n };\r\n },\r\n});\r\n\r\nexport default SelectionComponent as new (parentComponent: unknown, kfEditor: LegacyEditorInstance) => SelectionComponentInstance;\r\n","import InputComponent from './input';\r\nimport LocationComponent from './location';\r\nimport SelectionComponent from './selection';\r\nimport { getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\n\r\ntype ListenerComponentInstance = {\r\n parentComponent: unknown;\r\n kfEditor: LegacyEditorInstance;\r\n components: {\r\n location?: unknown;\r\n selection?: unknown;\r\n input?: unknown;\r\n };\r\n initComponents: () => void;\r\n};\r\n\r\nconst kity = getLegacyKity();\r\n\r\nconst ListenerComponent = kity.createClass('MoveComponent', {\r\n constructor(this: ListenerComponentInstance, parentComponent: unknown, kfEditor: LegacyEditorInstance) {\r\n this.parentComponent = parentComponent;\r\n this.kfEditor = kfEditor;\r\n this.components = {};\r\n this.initComponents();\r\n },\r\n\r\n initComponents(this: ListenerComponentInstance) {\r\n this.components.location = new LocationComponent(this, this.kfEditor);\r\n this.components.selection = new SelectionComponent(this, this.kfEditor);\r\n this.components.input = new InputComponent(this, this.kfEditor);\r\n },\r\n});\r\n\r\nexport default ListenerComponent as new (parentComponent: unknown, kfEditor: LegacyEditorInstance) => ListenerComponentInstance;\r\n","import ListenerComponent from './listener';\nimport { getLegacyKity } from '../vendor/runtime-interop';\nimport type { LegacyEditorInstance } from './editor';\n\ntype ControllerInstance = {\n kfEditor: LegacyEditorInstance;\n components: Record<string, unknown>;\n initComponents: () => void;\n};\n\nconst kity = getLegacyKity();\n\nconst ControllerComponent = kity.createClass('ControllerComponent', {\n constructor(this: ControllerInstance, kfEditor: LegacyEditorInstance) {\n this.kfEditor = kfEditor;\n this.components = {};\n this.initComponents();\n },\n\n initComponents(this: ControllerInstance) {\n this.components.listener = new ListenerComponent(this, this.kfEditor);\n },\n});\n\nexport default ControllerComponent;\n","import { getLegacyKity } from '../vendor/runtime-interop';\r\nimport type { LegacyEditorInstance } from './editor';\r\n\r\ntype CanvasLike = {\r\n width: number;\r\n height: number;\r\n node: {\r\n setAttribute: (name: string, value: string | number) => void;\r\n };\r\n container: {\r\n getRenderBox: () => {\r\n width: number;\r\n height: number;\r\n };\r\n };\r\n};\r\n\r\ntype PaperLike = {\r\n toPNG: (callback: (dataUrl: string) => void) => void;\r\n};\r\n\r\ntype PrinterComponentInstance = {\r\n kfEditor: LegacyEditorInstance;\r\n initServices: () => void;\r\n initCommands: () => void;\r\n printImage: (type?: string) => void;\r\n getImageData: (cb: (payload: { width: number; height: number; img: string }) => void) => void;\r\n _formatCanvas: () => void;\r\n _restoreCanvas: () => void;\r\n};\r\n\r\nconst kity = getLegacyKity();\r\n\r\nconst Printer = kity.createClass('Printer', {\r\n constructor(this: PrinterComponentInstance, kfEditor: LegacyEditorInstance) {\r\n this.kfEditor = kfEditor;\r\n this.initServices();\r\n this.initCommands();\r\n },\r\n\r\n initServices(this: PrinterComponentInstance) {\r\n this.kfEditor.registerService('print.image', this, {\r\n printImage: this.printImage,\r\n });\r\n },\r\n\r\n initCommands(this: PrinterComponentInstance) {\r\n this.kfEditor.registerCommand('get.image.data', this, this.getImageData);\r\n },\r\n\r\n printImage(this: PrinterComponentInstance) {\r\n const formula = this.kfEditor.requestService('render.get.paper') as PaperLike;\r\n\r\n this._formatCanvas();\r\n\r\n formula.toPNG((dataUrl) => {\r\n document.body.innerHTML = `<img style=\"background: red;\" src=\"${dataUrl}\">`;\r\n });\r\n\r\n this._restoreCanvas();\r\n },\r\n\r\n getImageData(this: PrinterComponentInstance, cb: (payload: { width: number; height: number; img: string }) => void) {\r\n const canvas = this.kfEditor.requestService('render.get.canvas') as CanvasLike;\r\n const formula = this.kfEditor.requestService('render.get.paper') as PaperLike;\r\n\r\n this._formatCanvas();\r\n\r\n formula.toPNG((dataUrl) => {\r\n cb({\r\n width: canvas.width,\r\n height: canvas.height,\r\n img: dataUrl,\r\n });\r\n });\r\n\r\n this._restoreCanvas();\r\n },\r\n\r\n _formatCanvas(this: PrinterComponentInstance) {\r\n const canvas = this.kfEditor.requestService('render.get.canvas') as CanvasLike;\r\n const rect = canvas.container.getRenderBox();\r\n\r\n canvas.node.setAttribute('width', rect.width);\r\n canvas.node.setAttribute('height', rect.height);\r\n\r\n this.kfEditor.requestService('render.clear.canvas.transform');\r\n this.kfEditor.requestService('control.cursor.hide');\r\n this.kfEditor.requestService('render.clear.select');\r\n },\r\n\r\n _restoreCanvas(this: PrinterComponentInstance) {\r\n const canvas = this.kfEditor.requestService('render.get.canvas') as CanvasLike;\r\n\r\n canvas.node.setAttribute('width', '100%');\r\n canvas.node.setAttribute('height', '100%');\r\n\r\n this.kfEditor.requestService('render.revert.canvas.transform');\r\n this.kfEditor.requestService('control.cursor.relocation');\r\n this.kfEditor.requestService('render.reselect');\r\n },\r\n});\r\n\r\nexport default Printer as new (kfEditor: LegacyEditorInstance) => PrinterComponentInstance;\r\n","import KFEditor, { type LegacyEditorInstance } from '../legacy/editor';\r\nimport Factory from '../legacy/factory';\r\nimport UIComponent from '../legacy/ui';\r\nimport Parser from '../legacy/parser';\r\nimport Render from '../legacy/render';\r\nimport Position from '../legacy/position';\r\nimport Syntax from '../legacy/syntax';\r\nimport Controller from '../legacy/controller';\r\nimport Printer from '../legacy/printer';\r\n\r\ntype RuntimeWindow = Window &\r\n typeof globalThis & {\r\n kf?: Record<string, unknown> & {\r\n EditorFactory?: typeof Factory;\r\n };\r\n };\r\n\r\nlet installed = false;\r\n\r\nexport function installKityEditorStart(target: Window & typeof globalThis = window) {\r\n const runtimeTarget = target as RuntimeWindow;\r\n\r\n if (!installed) {\r\n KFEditor.registerComponents('ui', UIComponent as unknown as new (editor: LegacyEditorInstance, options?: unknown) => unknown);\r\n KFEditor.registerComponents('parser', Parser);\r\n KFEditor.registerComponents('render', Render as unknown as new (editor: LegacyEditorInstance, options?: unknown) => unknown);\r\n KFEditor.registerComponents('position', Position);\r\n KFEditor.registerComponents('syntax', Syntax);\r\n KFEditor.registerComponents('control', Controller);\r\n KFEditor.registerComponents('print', Printer);\r\n installed = true;\r\n }\r\n\r\n runtimeTarget.kf = runtimeTarget.kf ?? {};\r\n runtimeTarget.kf.EditorFactory = Factory;\r\n\r\n return {\r\n KFEditor,\r\n Factory,\r\n };\r\n}\r\n\r\nexport { KFEditor, Factory };\r\n\r\nexport default installKityEditorStart;\r\n"],"mappings":"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","names":["kity","PREFIX","$$","kity","kity","$$","PREFIX","tmpNode","PREFIX","$$","kity","PREFIX","$$","kity","$$","kity","$$","kity","kity","createElement","BOX_TYPE","$$","kity","kity","kf","kity","kf","kf","kity","kf","DEFAULT_OPTIONS","kity","kf","BaseComponent","isPlaceholder","kity","kity","kity","CURSOR_CHAR","kity","CURSOR_CHAR","kity","kity","groupInfo","kity","kity","kity","kity"]}