@sd-angular/core 19.0.0-beta.4 → 19.0.0-beta.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/scss/ckeditor5.scss +60 -2
- package/assets/scss/core/bootstrap.scss +17 -0
- package/assets/scss/core/grid.scss +40 -0
- package/assets/scss/sd-core.scss +1 -0
- package/components/avatar/index.d.ts +1 -0
- package/components/avatar/src/avatar.component.d.ts +15 -0
- package/components/badge/src/badge.component.d.ts +77 -19
- package/components/button/src/button.component.d.ts +26 -28
- package/components/document-builder/index.d.ts +1 -0
- package/components/document-builder/src/document-builder.component.d.ts +20 -37
- package/components/document-builder/src/document-builder.model.d.ts +11 -10
- package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +9 -0
- package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +43 -0
- package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +50 -0
- package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +5 -0
- package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +4 -0
- package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +31 -0
- package/components/document-builder/src/plugins/{image-upload.plugin.d.ts → image-upload/image-upload.plugin.d.ts} +0 -4
- package/components/document-builder/src/plugins/index.d.ts +11 -5
- package/components/document-builder/src/plugins/{page-orientation.plugin.d.ts → page-orientation/page-orientation.plugin.d.ts} +2 -2
- package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +14 -0
- package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +25 -0
- package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +29 -0
- package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +35 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +15 -0
- package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +54 -0
- package/components/document-builder/src/plugins/paste-handler/filters/replacetabswithinprewithspaces.d.ts +24 -0
- package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +27 -0
- package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +16 -0
- package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +25 -0
- package/components/document-builder/src/plugins/paste-handler/index.d.ts +35 -0
- package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +31 -0
- package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +31 -0
- package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +29 -0
- package/components/document-builder/src/plugins/paste-handler/types.d.ts +30 -0
- package/components/document-builder/src/plugins/table-custom/index.d.ts +34 -0
- package/components/index.d.ts +3 -0
- package/components/mini-editor/index.d.ts +2 -0
- package/components/mini-editor/src/mini-editor.component.d.ts +90 -0
- package/components/mini-editor/src/mini-editor.model.d.ts +42 -0
- package/components/side-drawer/src/side-drawer.component.d.ts +1 -2
- package/components/table/src/components/selector-action/action-filter.pipe.d.ts +11 -10
- package/components/table/src/directives/index.d.ts +2 -0
- package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts +9 -0
- package/components/table/src/directives/sticky-shadow.directive.d.ts +17 -0
- package/components/table/src/models/table-column.model.d.ts +32 -32
- package/components/table/src/models/table-command.model.d.ts +7 -3
- package/components/table/src/models/table-item.model.d.ts +5 -3
- package/components/table/src/models/table-option-export.model.d.ts +3 -2
- package/components/table/src/models/table-option-selector.model.d.ts +11 -10
- package/components/table/src/models/table-option.model.d.ts +10 -8
- package/components/table/src/services/table-filter/table-filter.model.d.ts +2 -2
- package/components/table/src/table.component.d.ts +33 -35
- package/components/view/index.d.ts +1 -0
- package/components/view/src/view.component.d.ts +16 -0
- package/components/workflow/src/models/index.d.ts +1 -0
- package/directives/index.d.ts +1 -0
- package/directives/src/sd-href.directive.d.ts +9 -0
- package/fesm2022/sd-angular-core-components-avatar.mjs +90 -0
- package/fesm2022/sd-angular-core-components-avatar.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-badge.mjs +102 -91
- package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-button.mjs +64 -96
- package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-document-builder.mjs +3860 -963
- package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-history.mjs +1 -1
- package/fesm2022/sd-angular-core-components-history.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-import-excel.mjs +1 -1
- package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-mini-editor.mjs +326 -0
- package/fesm2022/sd-angular-core-components-mini-editor.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-preview.mjs +1 -1
- package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-side-drawer.mjs +21 -8
- package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tab-router.mjs +1 -1
- package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-table.mjs +724 -472
- package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-upload-file.mjs +1 -1
- package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-view.mjs +45 -0
- package/fesm2022/sd-angular-core-components-view.mjs.map +1 -0
- package/fesm2022/sd-angular-core-components-workflow.mjs +33 -43
- package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components.mjs +3 -0
- package/fesm2022/sd-angular-core-components.mjs.map +1 -1
- package/fesm2022/sd-angular-core-directives.mjs +80 -27
- package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs +257 -361
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-date-range.mjs +145 -245
- package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-date.mjs +137 -271
- package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-datetime.mjs +138 -276
- package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input-number.mjs +174 -336
- package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input.mjs +130 -283
- package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-radio.mjs +5 -2
- package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-select.mjs +303 -419
- package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-textarea.mjs +133 -226
- package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-keycloak.mjs +126 -0
- package/fesm2022/sd-angular-core-modules-keycloak.mjs.map +1 -0
- package/fesm2022/sd-angular-core-modules-layout.mjs +54 -19
- package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules.mjs +1 -1
- package/fesm2022/sd-angular-core-pipes.mjs +21 -1
- package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-confirm.mjs +2 -2
- package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-docx.mjs +173 -0
- package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -0
- package/fesm2022/sd-angular-core-services-notify.mjs +2 -2
- package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services.mjs +1 -0
- package/fesm2022/sd-angular-core-services.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-extensions.mjs +10 -6
- package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-models.mjs +15 -1
- package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
- package/forms/autocomplete/src/autocomplete.component.d.ts +51 -56
- package/forms/date/src/date.component.d.ts +41 -45
- package/forms/date-range/src/date-range.component.d.ts +28 -33
- package/forms/datetime/src/datetime.component.d.ts +41 -45
- package/forms/input/src/input.component.d.ts +46 -56
- package/forms/input-number/src/input-number.component.d.ts +47 -54
- package/forms/select/src/select.component.d.ts +54 -58
- package/forms/textarea/src/textarea.component.d.ts +34 -41
- package/modules/index.d.ts +1 -1
- package/modules/keycloak/index.d.ts +4 -0
- package/modules/keycloak/keycloak.configuration.d.ts +11 -0
- package/modules/keycloak/keycloak.interceptor.d.ts +2 -0
- package/modules/keycloak/keycloak.module.d.ts +18 -0
- package/modules/keycloak/keycloak.service.d.ts +14 -0
- package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +1 -0
- package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +5 -2
- package/modules/layout/configurations/layout.configuration.d.ts +3 -0
- package/modules/layout/services/storage/storage.service.d.ts +1 -0
- package/package.json +96 -78
- package/pipes/index.d.ts +1 -0
- package/pipes/src/empty.pipe.d.ts +7 -0
- package/sd-angular-core-19.0.0-beta.41.tgz +0 -0
- package/services/confirm/src/lib/confirm.service.d.ts +1 -0
- package/services/docx/index.d.ts +1 -0
- package/services/docx/src/lib/docx.model.d.ts +9 -0
- package/services/docx/src/lib/docx.service.d.ts +13 -0
- package/services/docx/src/public-api.d.ts +2 -0
- package/services/index.d.ts +1 -0
- package/utilities/extensions/src/string.extension.d.ts +2 -0
- package/utilities/models/index.d.ts +3 -0
- package/utilities/models/src/filter.model.d.ts +14 -2
- package/utilities/models/src/icon.model.d.ts +2 -0
- package/utilities/models/src/nested-key-of.model.d.ts +5 -0
- package/utilities/models/src/pattern.model.d.ts +1 -1
- package/utilities/models/src/unwrap-signal.model.d.ts +6 -0
- package/components/document-builder/src/plugins/comment.plugin.d.ts +0 -4
- package/components/document-builder/src/plugins/table-fit.plugin.d.ts +0 -4
- package/fesm2022/sd-angular-core-modules-oidc.mjs +0 -127
- package/fesm2022/sd-angular-core-modules-oidc.mjs.map +0 -1
- package/modules/oidc/dynamic-sts.loader.d.ts +0 -11
- package/modules/oidc/index.d.ts +0 -2
- package/modules/oidc/oidc.configuration.d.ts +0 -11
- package/modules/oidc/oidc.module.d.ts +0 -14
- /package/components/document-builder/src/plugins/{variable.plugin.d.ts → variable/variable.plugin.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components-document-builder.mjs","sources":["../../../projects/sd-angular/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.ts","../../../projects/sd-angular/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.ts","../../../projects/sd-angular/components/document-builder/src/plugins/page-orientation.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/comment.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/variable.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/table-fit.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/image-upload.plugin.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.config.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.utils.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.component.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.component.html","../../../projects/sd-angular/components/document-builder/sd-angular-core-components-document-builder.ts"],"sourcesContent":["import { Plugin, ButtonView } from 'ckeditor5';\r\n\r\nexport class PageNumberPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n // 1. Đăng ký nút \"Số trang hiện tại\"\r\n editor.ui.componentFactory.add('pageNumber', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n view.set({\r\n label: 'Số trang hiện tại',\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M16 2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H4V4h12v12zM6 6h2v2H6zm0 4h2v2H6zm0 4h2v2H6zm4-8h4v2h-4zm0 4h4v2h-4zm0 4h4v2h-4z\"/></svg>', // Icon đơn giản\r\n tooltip: true\r\n });\r\n\r\n // Khi bấm nút -> Chèn HTML đánh dấu\r\n view.on('execute', () => {\r\n editor.model.change(writer => {\r\n const viewFragment = editor.data.processor.toView(\r\n // Đây là HTML chuẩn để Word hiểu là số trang (dùng cho cách xuất MHTML/.doc)\r\n // Hoặc là marker để Backend replace\r\n '<span class=\"page-number-marker\" style=\"mso-field-code: PAGE; background: #eee; border: 1px dashed #999; padding: 0 4px;\">[PAGE]</span> ' \r\n );\r\n const modelFragment = editor.data.toModel(viewFragment);\r\n editor.model.insertContent(modelFragment);\r\n });\r\n });\r\n return view;\r\n });\r\n\r\n // 2. Đăng ký nút \"Tổng số trang\"\r\n editor.ui.componentFactory.add('totalPages', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n view.set({\r\n label: 'Tổng số trang',\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\"/></svg>',\r\n tooltip: true\r\n });\r\n\r\n view.on('execute', () => {\r\n editor.model.change(writer => {\r\n const viewFragment = editor.data.processor.toView(\r\n '<span class=\"total-page-marker\" style=\"mso-field-code: NUMPAGES; background: #eee; border: 1px dashed #999; padding: 0 4px;\">[TOTAL]</span> '\r\n );\r\n const modelFragment = editor.data.toModel(viewFragment);\r\n editor.model.insertContent(modelFragment);\r\n });\r\n });\r\n return view;\r\n });\r\n }\r\n}","import { Component, ViewEncapsulation, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\n\r\nimport {\r\n ClassicEditor,\r\n EditorConfig,\r\n Essentials,\r\n Paragraph,\r\n Bold,\r\n Italic,\r\n Underline,\r\n FontSize,\r\n FontColor,\r\n FontBackgroundColor,\r\n Alignment,\r\n // Import Plugin tự viết\r\n // PageNumberPlugin (nếu import từ file ngoài)\r\n} from 'ckeditor5';\r\nimport { PageNumberPlugin } from './plugins/page-number.plugin';\r\n\r\n@Component({\r\n selector: 'sd-header-footer-builder',\r\n standalone: true,\r\n imports: [CommonModule, CKEditorModule],\r\n template: `\r\n <div class=\"header-footer-editor-wrapper\">\r\n <ckeditor [editor]=\"Editor\" [config]=\"config\" (ready)=\"onReady($event)\"> </ckeditor>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Style tối giản cho vùng soạn thảo Header/Footer */\r\n :host ::ng-deep .header-footer-editor-wrapper .ck-editor__editable_inline {\r\n min-height: 100px; /* Header thường ngắn */\r\n max-height: 200px;\r\n padding: 10px 20px;\r\n border: 1px solid #ddd;\r\n }\r\n\r\n /* Style hiển thị cho Placeholder số trang trong lúc soạn thảo */\r\n :host ::ng-deep .page-number-marker,\r\n :host ::ng-deep .total-page-marker {\r\n font-size: 11px;\r\n color: #555;\r\n cursor: default;\r\n user-select: none;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class SdHeaderFooterBuilder {\r\n #editor!: ClassicEditor;\r\n Editor = ClassicEditor;\r\n\r\n #model: string | undefined | null;\r\n @Input() set model(value: string | undefined | null) {\r\n if (this.#model !== value) {\r\n this.#model = value;\r\n }\r\n }\r\n\r\n @Output() modelChange = new EventEmitter<string>();\r\n config: EditorConfig = {\r\n licenseKey: 'GPL', // Hoặc key thương mại nếu có\r\n // 1. PLUGIN RÚT GỌN (Bỏ Table, List, PageBreak...)\r\n plugins: [\r\n Essentials,\r\n Paragraph,\r\n Bold,\r\n Italic,\r\n Underline,\r\n FontSize,\r\n FontColor,\r\n FontBackgroundColor,\r\n Alignment,\r\n PageNumberPlugin, // <--- Plugin số trang\r\n ],\r\n // 2. TOOLBAR ĐƠN GIẢN\r\n toolbar: {\r\n items: [\r\n 'undo',\r\n 'redo',\r\n '|',\r\n 'fontSize',\r\n 'fontColor',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n '|',\r\n 'alignment', // Căn trái/phải/giữa (Quan trọng cho Header/Footer)\r\n '|',\r\n 'pageNumber',\r\n 'totalPages', // <--- 2 nút mới\r\n ],\r\n shouldNotGroupWhenFull: true,\r\n },\r\n // Cấu hình alignment\r\n alignment: {\r\n options: ['left', 'center', 'right'],\r\n },\r\n };\r\n\r\n onReady(editor: ClassicEditor): void {\r\n this.#editor = editor;\r\n this.#editor.setData(this.#model || '');\r\n this.#editor.model.document.on('change:data', () => {\r\n this.#model = this.#editor.getData();\r\n this.modelChange.next(this.#model);\r\n });\r\n }\r\n}\r\n","import { ButtonView, Plugin } from 'ckeditor5';\r\n// Icon khổ dọc (Mặc định cũ)\r\nconst ICON_PORTRAIT =\r\n '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6V4h8v12z\"/></svg>';\r\n\r\n// Icon khổ ngang (Mới)\r\nconst ICON_LANDSCAPE =\r\n '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 4H2C.9 4 0 4.9 0 6v8c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 10H2V6h16v8z\"/></svg>';\r\nexport class PageOrientationPlugin extends Plugin {\r\n public static readonly pluginName = 'PageOrientationPlugin';\r\n \r\n private _currentOrientation: 'PORTRAIT' | 'LANDSCAPE' = 'PORTRAIT';\r\n private orientationChangeEmitter?: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void;\r\n private buttonView?: ButtonView;\r\n\r\n init() {\r\n const editor = this.editor;\r\n const componentFactory = editor.ui.componentFactory;\r\n\r\n // Đăng ký nút tên là 'pageOrientation'\r\n componentFactory.add('pageOrientation', locale => {\r\n const view = new ButtonView(locale);\r\n this.buttonView = view;\r\n\r\n view.set({\r\n // label: 'Xoay giấy (A4)',\r\n icon: ICON_PORTRAIT,\r\n // tooltip: true,\r\n // withText: true,\r\n class: 'btn-orientation', // Class để style nếu cần\r\n });\r\n\r\n // Xử lý khi bấm nút\r\n view.on('execute', () => {\r\n this.toggleOrientation();\r\n });\r\n\r\n return view;\r\n });\r\n }\r\n\r\n /**\r\n * Toggle between portrait and landscape orientation\r\n */\r\n toggleOrientation(): void {\r\n const newOrientation = this._currentOrientation === 'PORTRAIT' ? 'LANDSCAPE' : 'PORTRAIT';\r\n this.setOrientation(newOrientation);\r\n }\r\n\r\n /**\r\n * Set orientation programmatically\r\n */\r\n setOrientation(orientation: 'PORTRAIT' | 'LANDSCAPE'): void {\r\n const editor = this.editor;\r\n const editingView = editor.editing.view;\r\n const rootElement = editingView.document.getRoot();\r\n\r\n editor.editing.view.change(writer => {\r\n if (orientation === 'LANDSCAPE') {\r\n writer.addClass('landscape', rootElement!);\r\n } else {\r\n writer.removeClass('landscape', rootElement!);\r\n }\r\n });\r\n\r\n // Update button icon\r\n if (this.buttonView) {\r\n this.buttonView.icon = orientation === 'LANDSCAPE' ? ICON_LANDSCAPE : ICON_PORTRAIT;\r\n }\r\n\r\n this._currentOrientation = orientation;\r\n this.orientationChangeEmitter?.(orientation);\r\n }\r\n\r\n /**\r\n * Get current orientation\r\n */\r\n getOrientation(): 'PORTRAIT' | 'LANDSCAPE' {\r\n return this._currentOrientation;\r\n }\r\n\r\n /**\r\n * Register callback for orientation changes\r\n */\r\n onOrientationChange(callback: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void): void {\r\n this.orientationChangeEmitter = callback;\r\n }\r\n}\r\n","import { Plugin, ButtonView, Config } from 'ckeditor5';\r\nimport { SdDocumentBuilderComment, SdEditorConfig } from '../document-builder.model';\r\nimport { SdResolveMaybeAsync } from '@sd-angular/core/utilities';\r\n\r\nexport class CommentPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n // --- 1. CONVERSION: MODEL MARKER -> VIEW CSS ---\r\n // Biến Marker thành Highlight màu vàng\r\n editor.conversion.for('downcast').markerToHighlight({\r\n model: 'comment',\r\n view: data => {\r\n return {\r\n classes: 'ck-comment-marker',\r\n attributes: {\r\n 'data-comment-id': data.markerName,\r\n },\r\n };\r\n },\r\n });\r\n\r\n // --- 3. ĐĂNG KÝ UI COMPONENT: 'addCommentBtn' ---\r\n editor.ui.componentFactory.add('addCommentBtn', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n // Lấy config từ Angular\r\n const config = editor.config as Config<SdEditorConfig>;\r\n const getOption = config.get('getOption') as SdEditorConfig['getOption'];\r\n const option = getOption?.();\r\n\r\n // ⭐ ẨN BUTTON NẾU KHÔNG CÓ onAddComment\r\n if (!option?.onAddComment) {\r\n // Trả về button rỗng hoặc null để không hiển thị\r\n view.set({\r\n label: '',\r\n isVisible: false,\r\n });\r\n return view;\r\n }\r\n\r\n view.set({\r\n label: 'Thêm bình luận',\r\n // Icon SVG comment\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 13v6l-4-4H4a2 2 0 01-2-2V4a2 2 0 012-2h14a2 2 0 012 2v9zM5 7h10v2H5V7zm0 4h10v2H5v-2z\"/></svg>',\r\n tooltip: true,\r\n isEnabled: false, // Mặc định disable\r\n });\r\n\r\n // 4. Logic Enable/Disable: Dựa theo Selection\r\n const selection = editor.model.document.selection;\r\n\r\n // Lắng nghe sự kiện change selection để bật/tắt nút\r\n this.listenTo(selection, 'change', () => {\r\n // Enable khi có bôi đen text (không phải collapsed)\r\n view.isEnabled = !selection.isCollapsed;\r\n });\r\n\r\n // 5. Logic Execute: Khi bấm nút\r\n this.listenTo(view, 'execute', () => {\r\n const range = selection.getFirstRange();\r\n if (!range || !option?.onAddComment) return;\r\n // Helper lấy text thuần từ range\r\n let selectedText = '';\r\n for (const item of range.getItems()) {\r\n if (item.is('$text') || item.is('$textProxy')) {\r\n selectedText += (item as any).data;\r\n }\r\n }\r\n // ⭐ BẮN EVENT RA NGOÀI - KHÔNG TỰ ADD MARKER\r\n // Angular component sẽ xử lý logic (mở modal, validation, etc.)\r\n // và gọi lại hàm addComment() nếu cần\r\n option.onAddComment(range);\r\n });\r\n\r\n return view;\r\n });\r\n\r\n // 8. Xử lý sự kiện Copy (Clipboard Output)\r\n this.listenTo(editor.editing.view.document, 'clipboardOutput', (evt, data) => {\r\n const content = data.content;\r\n\r\n editor.editing.view.change(writer => {\r\n // Tạo range bao quanh toàn bộ nội dung clipboard\r\n const range = writer.createRangeIn(content);\r\n // Mảng chứa các item cần xử lý\r\n const itemsToClean = [];\r\n\r\n // 1. Duyệt qua để tìm các thẻ có class ck-comment-marker\r\n for (const item of range.getItems()) {\r\n if (item.is('element') && item.hasClass('ck-comment-marker')) {\r\n itemsToClean.push(item);\r\n }\r\n }\r\n\r\n // 2. Thực hiện xóa Class và Attribute\r\n for (const item of itemsToClean) {\r\n // Xóa class 'ck-comment-marker'\r\n writer.removeClass('ck-comment-marker', item);\r\n // Xóa thuộc tính 'data-comment-id'\r\n writer.removeAttribute('data-comment-id', item);\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","import { Config, ModelNode, ModelWriter, Plugin, Widget, toWidget } from 'ckeditor5';\r\nimport { SdDocumentBuilderVariable, SdEditorConfig } from '../document-builder.model';\r\nimport { SdResolveMaybeAsync } from '@sd-angular/core/utilities';\r\n\r\nexport class VariablePlugin extends Plugin {\r\n // Khai báo dependencies nếu cần (VD: Widget)\r\n static get requires() {\r\n return [Widget];\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n const schema = editor.model.schema;\r\n const conversion = editor.conversion;\r\n const editingView = editor.editing.view;\r\n\r\n // 1. Định nghĩa Schema (Model)\r\n schema.register('variable', {\r\n inheritAllFrom: '$inlineObject',\r\n allowWhere: '$text',\r\n isInline: true,\r\n isObject: true,\r\n allowAttributes: ['id', 'value', 'display', 'data'],\r\n });\r\n\r\n // 2. Conversion: Model -> View (Hiển thị ra HTML)\r\n conversion.for('downcast').elementToElement({\r\n model: 'variable',\r\n view: (modelItem, { writer: viewWriter }) => {\r\n const id = modelItem.getAttribute('id') as string;\r\n const display = modelItem.getAttribute('display') as string;\r\n const value = modelItem.getAttribute('value') as string;\r\n // Xử lý data (Object -> String)\r\n const rawData = modelItem.getAttribute('data');\r\n const dataJson = rawData ? JSON.stringify(rawData) : '';\r\n const widgetElement = viewWriter.createContainerElement('span', {\r\n class: 'variable-widget',\r\n 'data-id': id,\r\n 'data-value': value,\r\n 'data-display': display,\r\n 'data-json': dataJson,\r\n });\r\n const innerText = viewWriter.createText(`{{${display}}}`);\r\n viewWriter.insert(viewWriter.createPositionAt(widgetElement, 0), innerText);\r\n return toWidget(widgetElement, viewWriter);\r\n },\r\n });\r\n\r\n // 3. Conversion: View -> Model (Khi load data hoặc paste)\r\n conversion.for('upcast').elementToElement({\r\n view: {\r\n name: 'span',\r\n classes: 'variable-widget',\r\n },\r\n model: (viewElement, { writer: modelWriter }) => {\r\n const dataJson = viewElement.getAttribute('data-json');\r\n let parsedData = null;\r\n try {\r\n parsedData = dataJson ? JSON.parse(dataJson) : null;\r\n } catch (e) {\r\n console.error('Lỗi parse variable data', e);\r\n }\r\n return modelWriter.createElement('variable', {\r\n id: viewElement.getAttribute('data-id'),\r\n value: viewElement.getAttribute('data-value'),\r\n display: viewElement.getAttribute('data-display'),\r\n data: parsedData, // Lưu vào model dưới dạng Object gốc\r\n });\r\n },\r\n });\r\n\r\n // 4. Xử lý sự kiện Drop\r\n this.listenTo(editingView.document, 'drop', async (evt, data) => {\r\n const dataTransfer = (data as any).dataTransfer;\r\n const jsonData = dataTransfer.getData('ck-variable');\r\n\r\n if (!jsonData) return;\r\n\r\n // Ngăn trình duyệt xử lý mặc định\r\n evt.stop();\r\n\r\n let variable: SdDocumentBuilderVariable = JSON.parse(jsonData);\r\n\r\n const config = editor.config as Config<SdEditorConfig>;\r\n const getOption = config.get('getOption') as SdEditorConfig['getOption'];\r\n const option = getOption?.();\r\n if (option?.onDropVariable) {\r\n const result = await SdResolveMaybeAsync<boolean | SdDocumentBuilderVariable>(option.onDropVariable(variable, 0));\r\n //* Hỗ trợ dữ liệu có sẵn sẽ chỉ cần nhận vào boolean\r\n if (typeof result === 'boolean') {\r\n if (!result) return;\r\n } else {\r\n //* Hỗ trợ dữ liệu lấy từ API (Kiểm tra xem result có đúng định dạng interface SdDocumentBuilderVariable hay không?)\r\n if (this.#isSdDocumentBuilderVariableResult(result)) {\r\n variable = result;\r\n } else {\r\n throw new Error('Dữ liệu variable không hợp lệ');\r\n }\r\n }\r\n }\r\n\r\n // Xác định vị trí thả chính xác (Quan trọng)\r\n // data.dropRange là vị trí con chuột trên View khi thả\r\n const viewRange = (data as any).dropRange;\r\n const modelRange = editor.editing.mapper.toModelRange(viewRange);\r\n\r\n editor.model.change(writer => {\r\n // A. Chèn biến\r\n const variableElem = writer.createElement('variable', {\r\n id: variable.id,\r\n value: variable.value,\r\n display: variable.display,\r\n data: variable.data,\r\n });\r\n\r\n editor.model.insertContent(variableElem, modelRange);\r\n\r\n // B. Đặt con trỏ ra sau biến\r\n writer.setSelection(variableElem, 'after');\r\n\r\n // C. [QUAN TRỌNG] XÓA SẠCH CÁC MARKER DROP\r\n // Thay vì chỉ xóa 'drop-target', ta duyệt tìm tất cả marker có tên bắt đầu bằng 'drop-target'\r\n // Vì đôi khi CKEditor tạo ra các biến thể khác nhau\r\n for (const marker of editor.model.markers) {\r\n if (marker.name.startsWith('drop-target')) {\r\n writer.removeMarker(marker);\r\n }\r\n }\r\n });\r\n\r\n // FIX LỖI: Focus lại vào editor để xóa các artifact của việc kéo thả\r\n editor.editing.view.focus();\r\n\r\n // [BỔ SUNG] XÓA CLASS RÁC TRÊN VIEW (NẾU MARKER KHÔNG HẾT)\r\n // Đôi khi View chưa kịp render lại, ta ép xóa class thủ công trên root nếu cần\r\n // (Thường bước C ở trên là đủ, nhưng đây là chốt chặn cuối cùng bằng JS)\r\n const viewRoot = editor.editing.view.document.getRoot();\r\n if (viewRoot) {\r\n editor.editing.view.change(viewWriter => {\r\n // Loại bỏ class decoration nếu nó bị dính vào root (hiếm gặp nhưng có thể)\r\n viewWriter.removeClass('ck-clipboard-drop-target-position', viewRoot);\r\n viewWriter.removeClass('ck-clipboard-drop-target-line', viewRoot);\r\n });\r\n }\r\n });\r\n\r\n // 5. Lắng nghe sự kiện bàn phím\r\n let isNavigating = false;\r\n this.editor.editing.view.document.on(\r\n 'keydown',\r\n (evt, data) => {\r\n // Mã phím mũi tên: 37 (Left), 38 (Up), 39 (Right), 40 (Down)\r\n const isArrowKey = data.keyCode >= 37 && data.keyCode <= 40;\r\n if (isArrowKey) {\r\n isNavigating = true;\r\n } else {\r\n isNavigating = false;\r\n }\r\n },\r\n { priority: 'high' }\r\n );\r\n\r\n // 6. Lắng nghe sự kiện Click chuột\r\n this.editor.editing.view.document.on('mousedown', () => {\r\n isNavigating = true;\r\n });\r\n\r\n this.listenTo(editor.model.document.selection, 'change:range', () => {\r\n // Nếu không phải là hành động click hoặc mũi tên thì thoát hàm.\r\n if (!isNavigating) {\r\n return;\r\n }\r\n\r\n const model = editor.model;\r\n const selection = model.document.selection;\r\n if (!selection.isCollapsed) return;\r\n\r\n const position = selection.getFirstPosition();\r\n const nodeBefore = position?.nodeBefore;\r\n if (!position) return;\r\n\r\n // Kiểm tra: Node đứng trước con trỏ là variable\r\n if (nodeBefore && nodeBefore.is('element', 'variable')) {\r\n // Lấy node ngay sau variable để kiểm tra\r\n const nextNode = nodeBefore.nextSibling;\r\n\r\n // Logic: Nếu phía sau KHÔNG CÓ GÌ hoặc KHÔNG PHẢI LÀ TEXT\r\n if (!nextNode || !nextNode.is('$text')) {\r\n model.change(writer => {\r\n // Chèn thêm con trỏ variable\r\n writer.insertText('\\u00A0', nodeBefore, 'after');\r\n\r\n // Lấy vị trí ngay sau variable (lúc này đang là đầu của text node mới)\r\n const posAfterVariable = writer.createPositionAfter(nodeBefore);\r\n\r\n // Dịch chuyển vị trí đó sang phải 1 đơn vị (bỏ qua ký tự vừa thêm)\r\n const targetPos = posAfterVariable.getShiftedBy(1);\r\n\r\n // 3. Đặt con trỏ vào vị trí đã tính toán\r\n writer.setSelection(targetPos);\r\n });\r\n }\r\n }\r\n });\r\n\r\n // 7. Handle xóa variable\r\n this.editor.editing.view.document.on(\r\n 'keydown',\r\n (evt, data) => {\r\n // Mã phím 8 là Backspace, 46 là Delete\r\n const btnBackspace = data.keyCode === 8;\r\n const btnDelete = data.keyCode === 46;\r\n if (btnBackspace || btnDelete) {\r\n const selection = editor.model.document.selection;\r\n const model = editor.model;\r\n\r\n // CASE 1: Nếu con trỏ đang nhấp nháy (Collapsed)\r\n if (selection.isCollapsed) {\r\n const position = selection.getFirstPosition();\r\n // Với Backspace ta kiểm tra nodeBefore, với Delete ta kiểm tra nodeAfter\r\n const targetNode = data.keyCode === 8 ? position?.nodeBefore : position?.nodeAfter;\r\n\r\n if (targetNode && targetNode.is('element', 'variable')) {\r\n data.preventDefault();\r\n evt.stop();\r\n\r\n model.change(writer => {\r\n // Chọn bao quanh Variable đó\r\n writer.setSelection(targetNode, 'on');\r\n });\r\n return;\r\n }\r\n }\r\n // CASE 2: Nếu đang có một vùng chọn (đã được highlight từ lần bấm trước)\r\n else {\r\n const selectedElement = selection.getSelectedElement();\r\n\r\n // Nếu phần tử đang được chọn chính là variable\r\n if (selectedElement && selectedElement.is('element', 'variable')) {\r\n // Cho phép hành động mặc định diễn ra (CKEditor sẽ tự xóa phần tử đang được chọn)\r\n // Hoặc chủ động xóa để chắc chắn:\r\n data.preventDefault();\r\n evt.stop();\r\n\r\n model.change(writer => {\r\n writer.remove(selectedElement);\r\n });\r\n }\r\n }\r\n }\r\n },\r\n { priority: 'highest' }\r\n );\r\n\r\n // 8. Xử lý sự kiện Copy (Clipboard Output)\r\n // Khi copy, thay thế variable bằng text\r\n this.listenTo(editor.editing.view.document, 'clipboardOutput', (evt, data) => {\r\n const content = data.content;\r\n editor.editing.view.change(writer => {\r\n // Tạo range bao quanh toàn bộ nội dung clipboard\r\n const range = writer.createRangeIn(content);\r\n const itemsToReplace: any[] = [];\r\n\r\n // Duyệt qua tất cả các phần tử trong clipboard để tìm variable\r\n for (const item of range.getItems()) {\r\n // Kiểm tra đúng là thẻ span và có class variable-widget\r\n if (item.is('element', 'span') && item.hasClass('variable-widget')) {\r\n itemsToReplace.push(item);\r\n }\r\n }\r\n\r\n // Thay thế variable bằng text\r\n for (const item of itemsToReplace) {\r\n const displayText = item.getAttribute('data-display');\r\n\r\n if (displayText) {\r\n // Tạo một node text thuần túy\r\n const textNode = writer.createText(`{{${displayText}}}`);\r\n\r\n // Chèn text node vào ngay trước widget cũ\r\n writer.insert(writer.createPositionBefore(item), textNode);\r\n\r\n // Xóa widget cũ đi\r\n writer.remove(item);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n #isSdDocumentBuilderVariableResult = (obj: any): obj is SdDocumentBuilderVariable => {\r\n return (\r\n obj !== null &&\r\n obj !== undefined &&\r\n typeof obj === 'object' &&\r\n !Array.isArray(obj) &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.value === 'string' &&\r\n typeof obj.display === 'string'\r\n );\r\n };\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class TableFitPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n // Can thiệp vào quá trình convert từ View (HTML Paste) sang Model\r\n editor.conversion.for('upcast').add(dispatcher => {\r\n dispatcher.on(\r\n 'element:table',\r\n (evt, data, conversionApi) => {\r\n // 1. Gọi consume để báo với CKEditor là chúng ta sẽ xử lý element này\r\n if (!conversionApi.consumable.consume(data.viewItem, { name: true })) {\r\n return;\r\n }\r\n\r\n // 2. Thực hiện chuyển đổi mặc định để tạo ra model element\r\n const { modelCursor, modelRange } = conversionApi.convertChildren(data.viewItem, data.modelCursor);\r\n\r\n // 3. Bây giờ modelRange chắc chắn tồn tại, ta tìm element table trong đó\r\n for (const item of modelRange.getItems()) {\r\n if (item.is('element', 'table')) {\r\n editor.model.change(writer => {\r\n writer.setAttribute('tableWidth', '100%', item);\r\n });\r\n }\r\n }\r\n\r\n // 4. Cập nhật modelCursor để dispatcher biết đã xử lý xong tới đâu\r\n data.modelRange = modelRange;\r\n data.modelCursor = modelCursor;\r\n },\r\n { priority: 'low' }\r\n );\r\n // Chạy sau cùng để ghi đè các logic mặc định\r\n });\r\n\r\n // Lắng nghe lệnh insertTable để can thiệp ngay sau khi bảng được tạo\r\n const insertTableCommand = editor.commands.get('insertTable');\r\n\r\n if (insertTableCommand) {\r\n // Dùng 'on' event để hook vào sau khi lệnh thực thi\r\n this.listenTo(insertTableCommand, 'execute', (evt, args) => {\r\n editor.model.change(writer => {\r\n // Lấy vị trí con trỏ hiện tại (nơi bảng vừa được chèn)\r\n const selection = editor.model.document.selection;\r\n const position = selection.getFirstPosition();\r\n\r\n if (!position) return;\r\n\r\n // Tìm element table vừa chèn (nó nằm ở vị trí cha của selection)\r\n // Khi vừa insert, con trỏ thường nằm trong ô đầu tiên của bảng\r\n const tableElement = position.findAncestor('table');\r\n\r\n if (tableElement) {\r\n // Ép width 100% cho bảng mới vẽ\r\n writer.setAttribute('tableWidth', '100%', tableElement);\r\n }\r\n });\r\n });\r\n }\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\n/**\r\n * Custom base64 upload adapter plugin for CKEditor 5.\r\n * Converts uploaded images to base64 data URLs instead of uploading to a server.\r\n */\r\nexport class ImageUploadPlugin extends Plugin {\r\n static get pluginName() {\r\n return 'ImageUploadPlugin' as const;\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n\r\n // Register the custom upload adapter\r\n editor.plugins.get('FileRepository').createUploadAdapter = (loader: any) => {\r\n return new Base64UploadAdapter(loader);\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Custom upload adapter that converts images to base64 data URLs.\r\n */\r\nclass Base64UploadAdapter {\r\n private loader: any;\r\n\r\n constructor(loader: any) {\r\n this.loader = loader;\r\n }\r\n\r\n /**\r\n * Starts the upload process and converts the file to base64.\r\n * @returns Promise that resolves with the base64 URL\r\n */\r\n upload(): Promise<{ default: string }> {\r\n return this.loader.file.then((file: File) => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n const base64Url = reader.result as string;\r\n resolve({ default: base64Url });\r\n };\r\n\r\n reader.onerror = () => {\r\n reject('Failed to convert image to base64');\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Aborts the upload process.\r\n */\r\n abort(): void {\r\n // For base64 conversion, there's nothing to abort\r\n // This method is required by the UploadAdapter interface\r\n }\r\n}\r\n","/**\r\n * Cấu hình màu cho Document Builder\r\n * Bảng màu tập trung và cấu hình cho việc lựa chọn màu nhất quán\r\n */\r\n\r\nimport { ColorPickerConfig, FontColorConfig, FontSizeConfig, HeadingConfig } from 'ckeditor5';\r\n\r\n/**\r\n * Trả về bảng màu chung được sử dụng trong tất cả tính năng của document builder\r\n * @returns Mảng các tùy chọn màu được định sẵn với giá trị hex và label\r\n */\r\nexport function getPresetColors(): FontColorConfig['colors'] {\r\n return [\r\n { color: '#000000', label: 'Black' },\r\n { color: '#4D4D4D', label: 'Dim grey' },\r\n { color: '#999999', label: 'Grey' },\r\n { color: '#E6E6E6', label: 'Light grey' },\r\n { color: '#FFFFFF', label: 'White' },\r\n { color: '#E64D4D', label: 'Red' },\r\n { color: '#E6994D', label: 'Orange' },\r\n { color: '#E6E64D', label: 'Yellow' },\r\n { color: '#99E64D', label: 'Light green' },\r\n { color: '#4DE64D', label: 'Green' },\r\n { color: '#4DE699', label: 'Aquamarine' },\r\n { color: '#4DE6E6', label: 'Turquoise' },\r\n { color: '#4D99E6', label: 'Light blue' },\r\n { color: '#4D4DE6', label: 'Blue' },\r\n { color: '#994DE6', label: 'Purple' },\r\n ];\r\n}\r\n\r\n/**\r\n * Trả về cấu hình bộ chọn màu với định dạng hex\r\n * @returns Đối tượng cấu hình bộ chọn màu\r\n */\r\nexport function getColorPickerConfig(): ColorPickerConfig {\r\n return {\r\n format: 'hex',\r\n };\r\n}\r\n\r\n/**\r\n * Trả về cấu hình kích thước font cho document builder\r\n * @returns Mảng các tùy chọn kích thước font được định sẵn\r\n */\r\nexport function getFontSizeOptions(): FontSizeConfig['options'] {\r\n return [\r\n {\r\n title: '9',\r\n model: '9pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '9pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '10',\r\n model: '10pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '10pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '11',\r\n model: '11pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '11pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '12',\r\n model: '12pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '12pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '13',\r\n model: '13pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '13pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '14',\r\n model: '14pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '14pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '16',\r\n model: '16pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '16pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '18',\r\n model: '18pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '18pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '20',\r\n model: '20pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '20pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '24',\r\n model: '24pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '24pt' },\r\n priority: 7,\r\n },\r\n },\r\n ];\r\n}\r\n\r\nexport function getHeadingOptions(): HeadingConfig['options'] {\r\n return [\r\n { model: 'paragraph', title: 'Paragraph', class: 'ck-heading_paragraph' },\r\n { model: 'heading1', view: 'h1', title: 'Heading 1', class: 'ck-heading_heading1' },\r\n { model: 'heading2', view: 'h2', title: 'Heading 2', class: 'ck-heading_heading2' },\r\n { model: 'heading3', view: 'h3', title: 'Heading 3', class: 'ck-heading_heading3' },\r\n ];\r\n}\r\n","/**\r\n * Document Builder Utilities\r\n * Các hàm tiện ích cho document builder\r\n */\r\n\r\nimport { hslToHex, rgbToHex } from '@sd-angular/core/utilities';\r\n\r\n/**\r\n * Chuẩn hóa nội dung bằng cách chuyển đổi tất cả màu HSL và RGB sang hex\r\n * @param content - Nội dung HTML cần chuẩn hóa\r\n * @returns Nội dung đã được chuẩn hóa với màu hex\r\n */\r\nexport function normalize(content: string): string {\r\n let normalized = content;\r\n\r\n // Chuyển đổi HSL sang hex\r\n const hslRegex = /hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*\\)/gi;\r\n normalized = normalized.replace(hslRegex, (match, h, s, l) => {\r\n try {\r\n const hue = parseInt(h, 10);\r\n const saturation = parseInt(s, 10);\r\n const lightness = parseInt(l, 10);\r\n\r\n // Kiểm tra giá trị hợp lệ\r\n if (hue >= 0 && hue <= 360 && saturation >= 0 && saturation <= 100 && lightness >= 0 && lightness <= 100) {\r\n return hslToHex(hue, saturation, lightness);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to convert HSL to hex:', error, match);\r\n }\r\n\r\n return match; // Giữ nguyên nếu không thể chuyển đổi\r\n });\r\n\r\n // Chuyển đổi RGB sang hex\r\n const rgbRegex = /rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/gi;\r\n normalized = normalized.replace(rgbRegex, (match, r, g, b) => {\r\n try {\r\n const red = parseInt(r, 10);\r\n const green = parseInt(g, 10);\r\n const blue = parseInt(b, 10);\r\n\r\n if (red >= 0 && red <= 255 && green >= 0 && green <= 255 && blue >= 0 && blue <= 255) {\r\n return rgbToHex(red, green, blue);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to convert RGB to hex:', error, match);\r\n }\r\n\r\n return match;\r\n });\r\n\r\n return normalized;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\nimport {\r\n Alignment, // Canh lề\r\n Bold,\r\n ClassicEditor,\r\n Essentials,\r\n FontBackgroundColor,\r\n FontColor,\r\n FontFamily,\r\n FontSize,\r\n GeneralHtmlSupport,\r\n Heading,\r\n Image,\r\n ImageCaption,\r\n ImageResize,\r\n ImageStyle,\r\n ImageToolbar,\r\n ImageUpload,\r\n Italic,\r\n List,\r\n ModelElement,\r\n ModelRange,\r\n PageBreak,\r\n Paragraph,\r\n PasteFromOffice,\r\n Subscript, // Mũ dưới (H₂O)\r\n Superscript,\r\n Table, // <--- 1. Quản lý viền/màu của cả bảng\r\n TableCellProperties, // <--- 2. Quản lý viền/màu của từng ô\r\n TableColumnResize,\r\n TableProperties,\r\n TableToolbar,\r\n Underline,\r\n Undo,\r\n} from 'ckeditor5';\r\nimport { throttleTime, Subject, Subscription } from 'rxjs';\r\n\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n\r\nimport { CommentPlugin, PageOrientationPlugin, TableFitPlugin, VariablePlugin, ImageUploadPlugin } from './plugins';\r\nimport { getPresetColors, getColorPickerConfig, getFontSizeOptions, getHeadingOptions } from './document-builder.config';\r\nimport {\r\n SdDocumentBuilderComment,\r\n SdDocumentBuilderHeading,\r\n SdDocumentBuilderOption,\r\n SdDocumentBuilderVariable,\r\n SdEditorConfig,\r\n} from './document-builder.model';\r\nimport { normalize } from './document-builder.utils';\r\n\r\n@Component({\r\n selector: 'sd-document-builder',\r\n standalone: true,\r\n imports: [CommonModule, CKEditorModule],\r\n templateUrl: './document-builder.component.html',\r\n styleUrls: [\r\n './document-builder.component.scss',\r\n './plugins/comment.plugin.scss',\r\n './plugins/variable.plugin.scss',\r\n './plugins/table-fit.plugin.scss',\r\n './scss/toolbar.scss',\r\n ],\r\n})\r\nexport class SdDocumentBuilder {\r\n #id = '1212';\r\n\r\n // Shared color palette and configuration\r\n readonly #sharedColors = getPresetColors();\r\n readonly #colorPickerConfig = getColorPickerConfig();\r\n readonly #fontSizeOptions = getFontSizeOptions();\r\n readonly #headingOptions = getHeadingOptions();\r\n\r\n @Input({ required: true }) option!: SdDocumentBuilderOption;\r\n disabled = false;\r\n\r\n @Input('disabled') set _disabled(val: boolean | '' | undefined | null) {\r\n this.disabled = val === '' || !!val;\r\n this.#updateState();\r\n }\r\n\r\n Editor = ClassicEditor;\r\n #editor!: ClassicEditor;\r\n #idTimeOutScrollHeading: ReturnType<typeof setTimeout> | null = null;\r\n\r\n // Config\r\n config: SdEditorConfig = {\r\n getOption: () => this.option,\r\n licenseKey: 'GPL', // Hoặc key thương mại nếu có\r\n plugins: [\r\n GeneralHtmlSupport,\r\n FontSize,\r\n FontColor,\r\n FontFamily,\r\n FontBackgroundColor,\r\n Bold,\r\n Italic,\r\n Underline,\r\n Essentials,\r\n Paragraph,\r\n Heading,\r\n List,\r\n Table,\r\n TableToolbar,\r\n TableProperties,\r\n TableCellProperties,\r\n TableColumnResize,\r\n PasteFromOffice,\r\n PageBreak,\r\n Undo,\r\n Alignment, // Canh lề\r\n Subscript, // Mũ dưới (H₂O)\r\n Superscript, // Mũ trên (x²)\r\n // Image\r\n Image,\r\n ImageUpload,\r\n ImageToolbar,\r\n ImageCaption,\r\n ImageResize,\r\n ImageStyle,\r\n // Custom Plugin\r\n PageOrientationPlugin,\r\n CommentPlugin,\r\n VariablePlugin,\r\n TableFitPlugin,\r\n ImageUploadPlugin,\r\n ],\r\n toolbar: {\r\n items: [\r\n 'pageOrientation',\r\n '|',\r\n 'heading',\r\n 'fontFamily',\r\n '|',\r\n 'fontSize',\r\n 'fontColor',\r\n 'fontBackgroundColor',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'subscript',\r\n 'superscript',\r\n '|',\r\n 'alignment',\r\n 'bulletedList',\r\n 'numberedList',\r\n '|',\r\n 'insertTable',\r\n 'imageUpload',\r\n 'pageBreak',\r\n '|',\r\n 'undo',\r\n 'redo',\r\n '|',\r\n 'addCommentBtn',\r\n ],\r\n shouldNotGroupWhenFull: true,\r\n },\r\n\r\n image: {\r\n toolbar: ['toggleImageCaption', '|', 'imageStyle:inline', 'imageStyle:block', 'imageStyle:side'],\r\n },\r\n\r\n fontSize: {\r\n options: this.#fontSizeOptions,\r\n supportAllValues: false, // Khuyên dùng false để ép user chọn đúng size chuẩn\r\n },\r\n\r\n heading: {\r\n options: this.#headingOptions,\r\n },\r\n\r\n // 4. Cấu hình bảng màu (Tùy chọn)\r\n fontColor: {\r\n // columns: 5,\r\n documentColors: 10,\r\n colorPicker: this.#colorPickerConfig,\r\n colors: this.#sharedColors,\r\n },\r\n\r\n fontBackgroundColor: {\r\n // columns: 5,\r\n documentColors: 10,\r\n colorPicker: this.#colorPickerConfig,\r\n colors: this.#sharedColors,\r\n },\r\n\r\n table: {\r\n contentToolbar: [\r\n 'tableColumn',\r\n 'tableRow',\r\n 'mergeTableCells',\r\n '|',\r\n 'tableProperties', // <--- Nút chỉnh thuộc tính bảng (Viền, Màu, Width)\r\n 'tableCellProperties',\r\n ],\r\n tableProperties: {\r\n borderColors: this.#sharedColors,\r\n colorPicker: this.#colorPickerConfig,\r\n },\r\n tableCellProperties: {\r\n borderColors: this.#sharedColors,\r\n colorPicker: this.#colorPickerConfig,\r\n },\r\n },\r\n\r\n // Quan trọng: Cho phép paste style từ Word nhưng bỏ qua margin/padding\r\n htmlSupport: {\r\n allow: [\r\n {\r\n name: /.*/,\r\n attributes: /.*/, // attributes chấp nhận boolean\r\n classes: /.*/, // Cho phép mọi class\r\n styles: {\r\n // Cho phép tất cả styles trừ margin và padding\r\n match: /^(?!margin|padding).*/,\r\n },\r\n },\r\n ],\r\n },\r\n };\r\n @Output() contentChange = new EventEmitter<string>(); // Emit HTML content\r\n\r\n #subscription = new Subscription();\r\n\r\n #contentChangeSubject = new Subject<string>();\r\n\r\n ngOnInit() {\r\n // https://onemount.atlassian.net/browse/SM-1862\r\n // Debounce trong rxjs không hỗ trợ leading -->\r\n this.#subscription.add(\r\n this.#contentChangeSubject.pipe(throttleTime(500, undefined, { leading: true, trailing: true })).subscribe(content => {\r\n this.contentChange.emit(normalize(content));\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n onReady(editor: ClassicEditor) {\r\n this.#editor = editor;\r\n\r\n editor.conversion.for('editingDowncast').markerToHighlight({\r\n model: 'highlightMarker',\r\n view: {\r\n classes: 'ck-heading-highlight',\r\n },\r\n });\r\n\r\n // Setup orientation plugin callback\r\n try {\r\n const orientationPlugin = editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && typeof orientationPlugin.onOrientationChange === 'function') {\r\n orientationPlugin.onOrientationChange(orientation => {\r\n this.option.onOrientation?.(orientation);\r\n });\r\n\r\n // Set initial orientation if provided\r\n if (this.option.orientation) {\r\n orientationPlugin.setOrientation(this.option.orientation);\r\n }\r\n }\r\n } catch (error) {\r\n console.warn('PageOrientationPlugin not available:', error);\r\n }\r\n\r\n // Đăng ký sự kiện lắng nghe Selection để làm Comment\r\n editor.model.document.selection.on('change', $event => {\r\n this.option.onSelection?.(this.#editor.model.document.selection, $event);\r\n });\r\n\r\n // ⭐ ĐĂNG KÝ SỰ KIỆN LẮNG NGHE THAY ĐỔI NỘI DUNG\r\n editor.model.document.on('change:data', () => {\r\n const content = editor.getData();\r\n this.#contentChangeSubject.next(content);\r\n });\r\n\r\n this.#updateState();\r\n }\r\n\r\n #updateState(): void {\r\n if (!this.#editor) return;\r\n if (this.disabled) {\r\n // Bật chế độ chỉ đọc với ID khóa\r\n this.#editor.enableReadOnlyMode(this.#id);\r\n\r\n // Disable page orientation button\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && (orientationPlugin as any).buttonView) {\r\n (orientationPlugin as any).buttonView.isEnabled = false;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to disable orientation button:', error);\r\n }\r\n } else {\r\n // Tắt chế độ chỉ đọc với ID khóa tương ứng\r\n this.#editor.disableReadOnlyMode(this.#id);\r\n\r\n // Enable page orientation button\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && (orientationPlugin as any).buttonView) {\r\n (orientationPlugin as any).buttonView.isEnabled = true;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to enable orientation button:', error);\r\n }\r\n }\r\n }\r\n\r\n scrollToComment = (markerId: string) => {\r\n if (!this.#editor) return;\r\n\r\n const editor = this.#editor;\r\n const marker = editor.model.markers.get(markerId);\r\n\r\n if (marker) {\r\n // 1. Set Selection vào Marker đó trước\r\n this.#editor.model.change(writer => {\r\n writer.setSelection(marker.getRange());\r\n });\r\n\r\n // 2. Sau đó gọi scrollToTheSelection\r\n this.#editor.editing.view.scrollToTheSelection({\r\n alignToTop: true,\r\n });\r\n editor.editing.view.focus();\r\n } else {\r\n console.warn(`Marker with id ${markerId} not found.`);\r\n }\r\n };\r\n\r\n setContent = (html: string) => {\r\n this.#editor?.setData?.(html);\r\n };\r\n\r\n getContent = () => {\r\n if (this.#editor) {\r\n return this.#editor.getData();\r\n }\r\n return '';\r\n };\r\n\r\n setOrientation = (orientation: 'PORTRAIT' | 'LANDSCAPE'): void => {\r\n if (!this.#editor) return;\r\n\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && typeof orientationPlugin.setOrientation === 'function') {\r\n orientationPlugin.setOrientation(orientation);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to set orientation:', error);\r\n }\r\n };\r\n\r\n getOrientation = (): 'PORTRAIT' | 'LANDSCAPE' => {\r\n if (!this.#editor) return 'PORTRAIT';\r\n\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && typeof orientationPlugin.getOrientation === 'function') {\r\n return orientationPlugin.getOrientation();\r\n }\r\n } catch (error) {\r\n console.warn('Failed to get orientation:', error);\r\n }\r\n\r\n return 'PORTRAIT';\r\n };\r\n\r\n getVariables = (): SdDocumentBuilderVariable[] => {\r\n if (!this.#editor) return [];\r\n\r\n const model = this.#editor.model;\r\n const root = model.document.getRoot();\r\n\r\n if (!root) return [];\r\n\r\n const variables: SdDocumentBuilderVariable[] = [];\r\n // Duyệt qua tất cả các phần tử trong range\r\n // range.getItems() sẽ trả về từng node (text, element...)\r\n try {\r\n const range = model.createRangeIn(root);\r\n\r\n for (const item of range.getItems()) {\r\n // Sử dụng item.is('element', 'variable') là chính xác\r\n if (item.is('element', 'variable')) {\r\n variables.push({\r\n id: item.getAttribute('id') as string,\r\n value: item.getAttribute('value') as string,\r\n display: item.getAttribute('display') as string,\r\n data: item.getAttribute('data'),\r\n });\r\n }\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n return [];\r\n }\r\n\r\n return variables;\r\n };\r\n\r\n getComments(): SdDocumentBuilderComment[] {\r\n if (!this.#editor) return [];\r\n\r\n const markers = this.#editor.model.markers;\r\n const comments: SdDocumentBuilderComment[] = [];\r\n\r\n // Duyệt qua tất cả markers trong Model\r\n for (const marker of markers) {\r\n // Chỉ lấy marker do plugin comment tạo ra (prefix 'comment:')\r\n if (marker.name.startsWith('comment:')) {\r\n // Lấy text nằm trong vùng marker đó\r\n const currentText = this.#getTextFromRange(marker.getRange());\r\n comments.push({\r\n markerId: marker.name,\r\n selectedText: currentText,\r\n });\r\n }\r\n }\r\n\r\n return comments;\r\n }\r\n\r\n scrollToTop() {\r\n setTimeout(() => {\r\n if (this.#editor) {\r\n const editableElement = this.#editor.ui.view.editable.element;\r\n if (editableElement) {\r\n const scrollContainer = editableElement.closest('.builder-container');\r\n if (scrollContainer) {\r\n scrollContainer.scrollTo({\r\n top: 0,\r\n behavior: 'smooth',\r\n });\r\n } else {\r\n editableElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n }\r\n }\r\n }, 100);\r\n }\r\n\r\n // Kho lưu trữ tham chiếu Model của Heading (để phục vụ scroll)\r\n #headingElementsMap = new Map<string, ModelElement>();\r\n heading = {\r\n // ========================================================================\r\n // HÀM LẤY DANH SÁCH HEADING (TOC)\r\n // ========================================================================\r\n getHeadings: (): SdDocumentBuilderHeading[] => {\r\n if (!this.#editor) return [];\r\n\r\n const root = this.#editor.model.document.getRoot();\r\n if (!root) return [];\r\n\r\n // Reset lại map mỗi lần quét\r\n this.#headingElementsMap.clear();\r\n\r\n const headings: SdDocumentBuilderHeading[] = [];\r\n const range = this.#editor.model.createRangeIn(root);\r\n\r\n // Biến đếm để tạo ID unique\r\n let index = 0;\r\n\r\n for (const item of range.getItems()) {\r\n // Kiểm tra xem item có phải là Element và tên bắt đầu bằng 'heading' không\r\n if (item.is('element') && item.name.startsWith('heading')) {\r\n // 1. Lấy text của heading\r\n const text = this.#getTextFromElement(item);\r\n // 2. Xác định Level (heading1 -> 1, heading2 -> 2)\r\n // item.name có dạng 'heading1', 'heading2'\r\n const level = parseInt(item.name.replace('heading', ''), 10) || 1;\r\n // 3. Tạo ID runtime (Dùng để map khi click scroll)\r\n // Bạn có thể generate slug từ text nếu muốn, ở đây mình dùng index cho đơn giản và unique\r\n const id = `heading_${index}_${Date.now()}`;\r\n // 4. Lưu tham chiếu Model Element vào Map\r\n this.#headingElementsMap.set(id, item as ModelElement);\r\n headings.push({\r\n id: id,\r\n text: text,\r\n level: level,\r\n type: item.name,\r\n });\r\n index++;\r\n }\r\n }\r\n\r\n return headings;\r\n },\r\n // ========================================================================\r\n // HÀM SCROLL TO HEADING\r\n // ========================================================================\r\n\r\n scrollToHeading: (id: string) => {\r\n if (!this.#editor) return;\r\n\r\n const modelElement = this.#headingElementsMap.get(id);\r\n\r\n if (modelElement) {\r\n this.#editor.model.change(writer => {\r\n // Xóa marker cũ\r\n if (this.#idTimeOutScrollHeading) {\r\n clearTimeout(this.#idTimeOutScrollHeading);\r\n }\r\n const currentMarker = this.#editor.model.markers.get('highlightMarker');\r\n if (currentMarker) {\r\n writer.removeMarker(currentMarker);\r\n }\r\n\r\n // Tạo Range bao trùm highlight\r\n const range = writer.createRangeOn(modelElement);\r\n\r\n // Thêm Marker mới\r\n writer.addMarker('highlightMarker', {\r\n range: range,\r\n usingOperation: false,\r\n });\r\n });\r\n\r\n // Scroll tới vị trí đó\r\n const viewElement = this.#editor.editing.mapper.toViewElement(modelElement);\r\n if (viewElement) {\r\n const domElement = this.#editor.editing.view.domConverter.viewToDom(viewElement);\r\n if (domElement) {\r\n domElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n\r\n // Tự động tắt marker sau 10 giây\r\n this.#idTimeOutScrollHeading = setTimeout(() => {\r\n if (this.#editor) {\r\n this.#editor.model.change(writer => {\r\n const marker = this.#editor.model.markers.get('highlightMarker');\r\n if (marker) writer.removeMarker(marker);\r\n });\r\n }\r\n }, 10000);\r\n } else {\r\n console.warn(`Heading with id ${id} not found.`);\r\n }\r\n },\r\n };\r\n\r\n // ========================================================================\r\n // HELPER: LẤY TEXT TỪ ELEMENT (Đệ quy nhẹ)\r\n // ========================================================================\r\n #getTextFromElement = (element: ModelElement): string => {\r\n let text = '';\r\n // Heading trong Model chứa các text node con\r\n for (const child of element.getChildren()) {\r\n if (child.is('$text') || child.is('$textProxy')) {\r\n text += (child as any).data;\r\n }\r\n }\r\n return text;\r\n };\r\n\r\n #getTextFromRange = (range: ModelRange): string => {\r\n let text = '';\r\n for (const item of range.getItems()) {\r\n // TextProxy là một phần của Text Node nằm trong Range\r\n if (item.is('$textProxy') || item.is('$text')) {\r\n text += (item as any).data;\r\n }\r\n }\r\n return text;\r\n };\r\n\r\n // ========================================================================\r\n // COMMENT MANAGEMENT\r\n // ========================================================================\r\n comment = {\r\n /**\r\n * Lấy tất cả comments trong document\r\n * @returns Danh sách tất cả comments\r\n */\r\n all: (): SdDocumentBuilderComment[] => {\r\n if (!this.#editor) return [];\r\n\r\n const markers = this.#editor.model.markers;\r\n const comments: SdDocumentBuilderComment[] = [];\r\n\r\n // Duyệt qua tất cả markers trong Model\r\n for (const marker of markers) {\r\n // Chỉ lấy marker do plugin comment tạo ra (prefix 'comment:')\r\n if (marker.name.startsWith('comment:')) {\r\n // Lấy text nằm trong vùng marker đó\r\n const currentText = this.#getTextFromRange(marker.getRange());\r\n comments.push({\r\n markerId: marker.name,\r\n selectedText: currentText,\r\n });\r\n }\r\n }\r\n\r\n return comments;\r\n },\r\n\r\n /**\r\n * Thêm comment vào vùng text đang được chọn\r\n * @param comment - Dữ liệu comment\r\n * @param data - Dữ liệu extra data\r\n * @returns SdDocumentBuilderComment hoặc null nếu không có text được chọn\r\n */\r\n add: <T = any>(range: ModelRange, comment: string, data?: T): SdDocumentBuilderComment<T> | null => {\r\n if (!this.#editor) return null;\r\n const model = this.#editor.model;\r\n if (!range) return null;\r\n // 3. Lấy text từ range\r\n const selectedText = this.#getTextFromRange(range);\r\n if (!selectedText.trim()) {\r\n console.warn('Selected text is empty');\r\n return null;\r\n }\r\n // 4. Tạo ID unique cho marker\r\n const markerId = `comment:${Date.now()}`;\r\n // 5. Tạo marker trong model\r\n model.change(writer => {\r\n writer.addMarker(markerId, {\r\n range,\r\n usingOperation: true, // Quan trọng: Cho phép undo/redo\r\n affectsData: true, // Lưu marker vào data khi getData()\r\n });\r\n });\r\n return {\r\n markerId,\r\n selectedText,\r\n comment,\r\n createdAt: new Date(),\r\n data,\r\n };\r\n },\r\n\r\n /**\r\n * Cập nhật nội dung comment\r\n * @param markerId - ID của marker\r\n * @param commentData - Dữ liệu mới\r\n * @returns Comment đã cập nhật hoặc null\r\n */\r\n update: <T = any>(markerId: string, comment: string, data?: T): SdDocumentBuilderComment<T> | null => {\r\n if (!this.#editor) return null;\r\n const marker = this.#editor.model.markers.get(markerId);\r\n if (!marker) {\r\n console.warn(`Marker ${markerId} not found`);\r\n return null;\r\n }\r\n // Lấy text hiện tại từ marker (có thể đã thay đổi)\r\n const currentText = this.#getTextFromRange(marker.getRange());\r\n return {\r\n markerId: markerId,\r\n selectedText: currentText,\r\n comment,\r\n data,\r\n };\r\n },\r\n\r\n /**\r\n * Lấy chi tiết comment theo markerId\r\n * @param markerId - ID của marker\r\n * @returns Comment hoặc null\r\n */\r\n detail: (markerId: string): SdDocumentBuilderComment | null => {\r\n if (!this.#editor) return null;\r\n const marker = this.#editor.model.markers.get(markerId);\r\n if (!marker) return null;\r\n const currentText = this.#getTextFromRange(marker.getRange());\r\n return {\r\n markerId: markerId,\r\n selectedText: currentText,\r\n };\r\n },\r\n\r\n /**\r\n * Xóa comment theo markerId\r\n * @param markerId - ID của marker cần xóa\r\n * @returns true nếu xóa thành công, false nếu không tìm thấy\r\n */\r\n remove: (markerId: string): boolean => {\r\n if (!this.#editor) return false;\r\n const model = this.#editor.model;\r\n const marker = model.markers.get(markerId);\r\n if (!marker) {\r\n console.warn(`Marker ${markerId} not found`);\r\n return false;\r\n }\r\n model.change(writer => {\r\n writer.removeMarker(markerId);\r\n });\r\n return true;\r\n },\r\n\r\n /**\r\n * Scroll đến vị trí comment\r\n * @param markerId - ID của marker cần scroll tới\r\n */\r\n scroll: (markerId: string): void => {\r\n if (!this.#editor) return;\r\n const editor = this.#editor;\r\n const marker = editor.model.markers.get(markerId);\r\n if (marker) {\r\n // 1. Set Selection vào Marker đó trước\r\n editor.model.change(writer => {\r\n writer.setSelection(marker.getRange());\r\n });\r\n\r\n // 2. Sau đó gọi scrollToTheSelection\r\n editor.editing.view.scrollToTheSelection({\r\n alignToTop: true,\r\n });\r\n editor.editing.view.focus();\r\n } else {\r\n console.warn(`Marker with id ${markerId} not found.`);\r\n }\r\n },\r\n };\r\n\r\n // exportDocx(fileName: string = 'document.docx'): void {\r\n // if (!this.#editor) return;\r\n\r\n // // 1. Kiểm tra xem Editor đang ở chế độ Landscape hay Portrait\r\n // // (Dựa vào class 'landscape' mà Plugin PageOrientation đã toggle trên View)\r\n // const rootElement = this.#editor.editing.view.document.getRoot();\r\n // const isLandscape = rootElement?.hasClass('landscape');\r\n\r\n // const orientation = isLandscape ? 'landscape' : 'portrait';\r\n\r\n // // 2. Lấy nội dung HTML\r\n // const contentHtml = this.#editor.getData();\r\n\r\n // // 3. Chuẩn bị HTML với CSS @page động\r\n // const fullHtml = `\r\n // <!DOCTYPE html>\r\n // <html>\r\n // <head>\r\n // <meta charset=\"UTF-8\">\r\n // <style>\r\n // /* --- CẤU HÌNH KHỔ GIẤY DỰA TRÊN TRẠNG THÁI --- */\r\n // @page {\r\n // size: A4 ${orientation}; /* Thêm portrait hoặc landscape vào đây */\r\n // margin: 20mm;\r\n // }\r\n\r\n // body {\r\n // font-family: 'Times New Roman', serif;\r\n // font-size: 13pt;\r\n // line-height: 1.5;\r\n // }\r\n\r\n // /* --- STYLE CHO BẢNG BIỂU --- */\r\n // table {\r\n // width: 100%;\r\n // border-collapse: collapse;\r\n // }\r\n // td, th {\r\n // border: 1px solid black;\r\n // padding: 5px;\r\n // }\r\n\r\n // /* --- STYLE CHO BIẾN --- */\r\n // .variable-widget {\r\n // color: #1565c0;\r\n // background-color: #e3f2fd;\r\n // font-weight: bold;\r\n // border: 1px solid #90caf9;\r\n // padding: 0 4px;\r\n // border-radius: 4px;\r\n // }\r\n\r\n // /* --- ẨN COMMENT KHI IN --- */\r\n // .ck-comment-marker {\r\n // background-color: transparent;\r\n // border: none;\r\n // }\r\n // </style>\r\n // </head>\r\n // <body>\r\n // ${contentHtml}\r\n // </body>\r\n // </html>\r\n // `;\r\n\r\n // // 3. Convert sang Blob (Dạng file Binary)\r\n // asBlob(fullHtml, {\r\n // orientation: 'portrait', // 'portrait' hoặc 'landscape'\r\n // margins: { top: 720, right: 720, bottom: 720, left: 720 }, // Đơn vị twips (1440 twips = 1 inch)\r\n // }).then(blob => {\r\n // if (blob instanceof Blob) {\r\n // SdUtilities.downloadBlob(blob, fileName);\r\n // }\r\n // });\r\n // }\r\n\r\n // ========================================================================\r\n // 4. HÀM EXPORT DOCX (FULL HEADER/FOOTER + PAGE NUMBER)\r\n // ========================================================================\r\n /**\r\n * Xuất file Word có Header/Footer\r\n * @param fileName Tên file\r\n * @param headerText Nội dung Header (hoặc HTML)\r\n * '<p style=\"text-align: center; font-weight: bold;\">CÔNG TY CỔ PHẦN CÔNG NGHỆ ABC</p>'\r\n * @param footerText Nội dung Footer (hoặc HTML)\r\n * '<p style=\"text-align: right; font-size: 10pt;\">Trang <span style=\"mso-field-code: PAGE\"></span> / <span style=\"mso-field-code: NUMPAGES\"></span></p>'\r\n */\r\n exportDocx(args: { fileName?: string; header?: string; footer?: string }): void {\r\n if (!this.#editor) return;\r\n const fileName = args?.fileName || `document_${Date.now()}.docx`;\r\n const header = args?.header || ``;\r\n const footer = args?.footer || ``;\r\n // 1. Kiểm tra xoay giấy\r\n const rootElement = this.#editor.editing.view.document.getRoot();\r\n const isLandscape = rootElement?.hasClass('landscape');\r\n const orientation = isLandscape ? 'landscape' : 'portrait';\r\n\r\n // Kích thước giấy cho Word (A4)\r\n // Portrait: 21cm x 29.7cm\r\n // Landscape: 29.7cm x 21cm\r\n // @page size trong CSS Word đôi khi cần set cứng width/height để header không bị lệch\r\n const pageCss = isLandscape\r\n ? 'size: 29.7cm 21cm; mso-page-orientation: landscape;'\r\n : 'size: 21cm 29.7cm; mso-page-orientation: portrait;';\r\n\r\n const contentHtml = this.#editor.getData();\r\n\r\n // 2. TẠO HTML CHUẨN MICROSOFT WORD XML\r\n // Phải có xmlns:o và xmlns:w thì Word mới hiểu được các lệnh mso-\r\n const fullHtml = `\r\n <html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'>\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <title>Export Document</title>\r\n \r\n <style>\r\n /* --- 1. SETUP TRANG GIẤY & HEADER/FOOTER --- */\r\n @page {\r\n ${pageCss}\r\n margin: 2.0cm; /* Lề chuẩn 2cm */\r\n \r\n /* Kỹ thuật map ID của Word */\r\n mso-header: header1;\r\n mso-footer: footer1;\r\n }\r\n\r\n /* Quan trọng: Ẩn các div header/footer khỏi luồng văn bản chính */\r\n /* Chúng sẽ chỉ hiện thị khi được @page gọi thông qua mso-header/footer */\r\n div#header1 { display: none; }\r\n div#footer1 { display: none; }\r\n\r\n /* --- 2. STYLE CƠ BẢN --- */\r\n body {\r\n font-family: 'Times New Roman', serif;\r\n font-size: 13pt;\r\n line-height: 1.5;\r\n tab-interval: 36pt;\r\n }\r\n \r\n /* Style Bảng */\r\n table { width: 100%; border-collapse: collapse; }\r\n td, th { border: 1px solid black; padding: 5px; }\r\n\r\n /* Style Biến (Giữ nguyên giao diện đẹp của bạn) */\r\n .variable-widget {\r\n color: #1565c0; font-weight: bold;\r\n background: #e3f2fd; padding: 0 4px; border-radius: 4px;\r\n border: 1px solid #90caf9;\r\n }\r\n \r\n /* Ẩn Comment khi in/xuất file */\r\n .ck-comment-marker { background-color: transparent; border: none; text-decoration: none; }\r\n </style>\r\n </head>\r\n <body>\r\n \r\n <div id=\"header1\">\r\n <div style=\"mso-element:header\">\r\n ${header}\r\n <div style='border-bottom: 1px solid #000; margin-top: 5px; margin-bottom: 20px;'></div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"footer1\">\r\n <div style=\"mso-element:footer\">\r\n <div style='border-top: 1px solid #000; margin-top: 20px; margin-bottom: 5px;'></div>\r\n ${footer}\r\n </div>\r\n </div>\r\n\r\n <div class=\"content\">\r\n ${contentHtml}\r\n </div>\r\n\r\n </body>\r\n </html>\r\n `;\r\n\r\n // 3. TẠO BLOB VÀ TẢI XUỐNG\r\n // Lưu ý: Dùng type 'application/msword' thay vì dùng thư viện html-docx-js\r\n // Thêm '\\ufeff' (BOM) để fix lỗi font tiếng Việt\r\n const blob = new Blob(['\\ufeff', fullHtml], { type: 'application/msword' });\r\n SdUtilities.downloadBlob(blob, fileName);\r\n // 3. Convert & Save\r\n // asBlob(fullHtml, {\r\n // orientation: orientation as 'portrait' | 'landscape',\r\n // margins: { top: 720, right: 720, bottom: 720, left: 720 },\r\n // }).then(blob => {\r\n // if (blob instanceof Blob) {\r\n // SdUtilities.downloadBlob(blob, fileName);\r\n // }\r\n // });\r\n }\r\n}\r\n","<div class=\"builder-container\">\n <ckeditor\n style=\"width: 100%\"\n [editor]=\"Editor\" \n [config]=\"config\" \n (ready)=\"onReady($event)\"\n [disabled]=\"disabled\">\n </ckeditor>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-document-builder.mjs","sources":["../../../projects/sd-angular/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.ts","../../../projects/sd-angular/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.config.ts","../../../projects/sd-angular/components/document-builder/src/plugins/heading/heading.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/variable/variable.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/table-custom/index.ts","../../../projects/sd-angular/components/document-builder/src/plugins/image-upload/image-upload.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/image-custom/image-custom.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/bookmark.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/image.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/utils.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/table.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/br.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/list.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/removexmlns.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/space.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/filters/parse.ts","../../../projects/sd-angular/components/document-builder/src/plugins/paste-handler/index.ts","../../../projects/sd-angular/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/block-space/block-space.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.utils.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.component.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.component.html","../../../projects/sd-angular/components/document-builder/sd-angular-core-components-document-builder.ts"],"sourcesContent":["import { Plugin, ButtonView } from 'ckeditor5';\r\n\r\nexport class PageNumberPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n // 1. Đăng ký nút \"Số trang hiện tại\"\r\n editor.ui.componentFactory.add('pageNumber', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n view.set({\r\n label: 'Số trang hiện tại',\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M16 2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H4V4h12v12zM6 6h2v2H6zm0 4h2v2H6zm0 4h2v2H6zm4-8h4v2h-4zm0 4h4v2h-4zm0 4h4v2h-4z\"/></svg>', // Icon đơn giản\r\n tooltip: true\r\n });\r\n\r\n // Khi bấm nút -> Chèn HTML đánh dấu\r\n view.on('execute', () => {\r\n editor.model.change(writer => {\r\n const viewFragment = editor.data.processor.toView(\r\n // Đây là HTML chuẩn để Word hiểu là số trang (dùng cho cách xuất MHTML/.doc)\r\n // Hoặc là marker để Backend replace\r\n '<span class=\"page-number-marker\" style=\"mso-field-code: PAGE; background: #eee; border: 1px dashed #999; padding: 0 4px;\">[PAGE]</span> ' \r\n );\r\n const modelFragment = editor.data.toModel(viewFragment);\r\n editor.model.insertContent(modelFragment);\r\n });\r\n });\r\n return view;\r\n });\r\n\r\n // 2. Đăng ký nút \"Tổng số trang\"\r\n editor.ui.componentFactory.add('totalPages', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n view.set({\r\n label: 'Tổng số trang',\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\"/></svg>',\r\n tooltip: true\r\n });\r\n\r\n view.on('execute', () => {\r\n editor.model.change(writer => {\r\n const viewFragment = editor.data.processor.toView(\r\n '<span class=\"total-page-marker\" style=\"mso-field-code: NUMPAGES; background: #eee; border: 1px dashed #999; padding: 0 4px;\">[TOTAL]</span> '\r\n );\r\n const modelFragment = editor.data.toModel(viewFragment);\r\n editor.model.insertContent(modelFragment);\r\n });\r\n });\r\n return view;\r\n });\r\n }\r\n}","import { Component, ViewEncapsulation, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\n\r\nimport {\r\n ClassicEditor,\r\n EditorConfig,\r\n Essentials,\r\n Paragraph,\r\n Bold,\r\n Italic,\r\n Underline,\r\n FontSize,\r\n FontColor,\r\n FontBackgroundColor,\r\n Alignment,\r\n // Import Plugin tự viết\r\n // PageNumberPlugin (nếu import từ file ngoài)\r\n} from 'ckeditor5';\r\nimport { PageNumberPlugin } from './plugins/page-number.plugin';\r\n\r\n@Component({\r\n selector: 'sd-header-footer-builder',\r\n standalone: true,\r\n imports: [CommonModule, CKEditorModule],\r\n template: `\r\n <div class=\"header-footer-editor-wrapper\">\r\n <ckeditor [editor]=\"Editor\" [config]=\"config\" (ready)=\"onReady($event)\"> </ckeditor>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Style tối giản cho vùng soạn thảo Header/Footer */\r\n :host ::ng-deep .header-footer-editor-wrapper .ck-editor__editable_inline {\r\n min-height: 100px; /* Header thường ngắn */\r\n max-height: 200px;\r\n padding: 10px 20px;\r\n border: 1px solid #ddd;\r\n }\r\n\r\n /* Style hiển thị cho Placeholder số trang trong lúc soạn thảo */\r\n :host ::ng-deep .page-number-marker,\r\n :host ::ng-deep .total-page-marker {\r\n font-size: 11px;\r\n color: #555;\r\n cursor: default;\r\n user-select: none;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class SdHeaderFooterBuilder {\r\n #editor!: ClassicEditor;\r\n Editor = ClassicEditor;\r\n\r\n #model: string | undefined | null;\r\n @Input() set model(value: string | undefined | null) {\r\n if (this.#model !== value) {\r\n this.#model = value;\r\n }\r\n }\r\n\r\n @Output() modelChange = new EventEmitter<string>();\r\n config: EditorConfig = {\r\n licenseKey: 'GPL', // Hoặc key thương mại nếu có\r\n // 1. PLUGIN RÚT GỌN (Bỏ Table, List, PageBreak...)\r\n plugins: [\r\n Essentials,\r\n Paragraph,\r\n Bold,\r\n Italic,\r\n Underline,\r\n FontSize,\r\n FontColor,\r\n FontBackgroundColor,\r\n Alignment,\r\n PageNumberPlugin, // <--- Plugin số trang\r\n ],\r\n // 2. TOOLBAR ĐƠN GIẢN\r\n toolbar: {\r\n items: [\r\n 'undo',\r\n 'redo',\r\n '|',\r\n 'fontSize',\r\n 'fontColor',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n '|',\r\n 'alignment', // Căn trái/phải/giữa (Quan trọng cho Header/Footer)\r\n '|',\r\n 'pageNumber',\r\n 'totalPages', // <--- 2 nút mới\r\n ],\r\n shouldNotGroupWhenFull: true,\r\n },\r\n // Cấu hình alignment\r\n alignment: {\r\n options: ['left', 'center', 'right'],\r\n },\r\n };\r\n\r\n onReady(editor: ClassicEditor): void {\r\n this.#editor = editor;\r\n this.#editor.setData(this.#model || '');\r\n this.#editor.model.document.on('change:data', () => {\r\n this.#model = this.#editor.getData();\r\n this.modelChange.next(this.#model);\r\n });\r\n }\r\n}\r\n","/**\r\n * Cấu hình màu cho Document Builder\r\n * Bảng màu tập trung và cấu hình cho việc lựa chọn màu nhất quán\r\n */\r\n\r\nimport { ColorPickerConfig, FontColorConfig, FontSizeConfig, HeadingConfig } from 'ckeditor5';\r\n\r\n/**\r\n * Trả về bảng màu chung được sử dụng trong tất cả tính năng của document builder\r\n * @returns Mảng các tùy chọn màu được định sẵn với giá trị hex và label\r\n */\r\nexport function getPresetColors(): FontColorConfig['colors'] {\r\n return [\r\n { color: '#000000', label: 'Black' },\r\n { color: '#4D4D4D', label: 'Dim grey' },\r\n { color: '#999999', label: 'Grey' },\r\n { color: '#E6E6E6', label: 'Light grey' },\r\n { color: '#FFFFFF', label: 'White' },\r\n { color: '#E64D4D', label: 'Red' },\r\n { color: '#E6994D', label: 'Orange' },\r\n { color: '#E6E64D', label: 'Yellow' },\r\n { color: '#99E64D', label: 'Light green' },\r\n { color: '#4DE64D', label: 'Green' },\r\n { color: '#4DE699', label: 'Aquamarine' },\r\n { color: '#4DE6E6', label: 'Turquoise' },\r\n { color: '#4D99E6', label: 'Light blue' },\r\n { color: '#4D4DE6', label: 'Blue' },\r\n { color: '#994DE6', label: 'Purple' },\r\n ];\r\n}\r\n\r\n/**\r\n * Trả về cấu hình bộ chọn màu với định dạng hex\r\n * @returns Đối tượng cấu hình bộ chọn màu\r\n */\r\nexport function getColorPickerConfig(): ColorPickerConfig {\r\n return {\r\n format: 'hex',\r\n };\r\n}\r\n\r\n/**\r\n * Trả về cấu hình kích thước font cho document builder\r\n * @returns Mảng các tùy chọn kích thước font được định sẵn\r\n */\r\nexport function getFontSizeOptions(): FontSizeConfig['options'] {\r\n return [\r\n {\r\n title: '9',\r\n model: '9pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '9pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '10',\r\n model: '10pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '10pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '11',\r\n model: '11pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '11pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '12',\r\n model: '12pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '12pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '13',\r\n model: '13pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '13pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '14',\r\n model: '14pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '14pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '16',\r\n model: '16pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '16pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '18',\r\n model: '18pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '18pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '20',\r\n model: '20pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '20pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '24',\r\n model: '24pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '24pt' },\r\n priority: 7,\r\n },\r\n },\r\n ];\r\n}\r\n\r\nexport function getHeadingOptions(): HeadingConfig['options'] {\r\n return [\r\n {\r\n model: 'paragraph',\r\n title: 'Paragraph',\r\n class: 'ck-heading_paragraph',\r\n },\r\n {\r\n model: 'heading1',\r\n view: {\r\n name: 'h1',\r\n styles: { 'font-size': '24pt', 'font-weight': 'bold', 'line-height': '1.15' },\r\n },\r\n title: 'Heading 1',\r\n class: 'ck-heading_heading1',\r\n },\r\n {\r\n model: 'heading2',\r\n view: {\r\n name: 'h2',\r\n styles: { 'font-size': '20pt', 'font-weight': 'bold', 'line-height': '1.15' },\r\n },\r\n title: 'Heading 2',\r\n class: 'ck-heading_heading2',\r\n },\r\n {\r\n model: 'heading3',\r\n view: {\r\n name: 'h3',\r\n styles: { 'font-size': '16pt', 'font-weight': 'bold', 'line-height': '1.15' },\r\n },\r\n title: 'Heading 3',\r\n class: 'ck-heading_heading3',\r\n },\r\n ];\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\nimport { getHeadingOptions } from '../../document-builder.config';\r\n\r\nexport class HeadingPlugin extends Plugin {\r\n static get pluginName() {\r\n return 'HeadingPlugin';\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n\r\n editor.conversion.for('editingDowncast').markerToHighlight({\r\n model: 'highlightMarker',\r\n view: {\r\n classes: 'ck-heading-highlight',\r\n },\r\n });\r\n\r\n // Lấy default styles từ config\r\n const headingOptions = getHeadingOptions();\r\n const headingDefaults: Record<string, { fontSize: string; lineHeight: string }> = {};\r\n\r\n headingOptions?.forEach((opt: any) => {\r\n if (opt.model?.match(/^heading[1-3]$/)) {\r\n headingDefaults[opt.model] = {\r\n fontSize: opt.view?.styles?.['font-size'] || 'inherit',\r\n lineHeight: opt.view?.styles?.['line-height'] || 'inherit',\r\n };\r\n }\r\n });\r\n\r\n // Downcast: Kiểm tra heading có styled text và set style inherit\r\n const downcastConversion = editor.conversion.for('downcast');\r\n Object.keys(headingDefaults).forEach(modelName => {\r\n downcastConversion.add(dispatcher => {\r\n dispatcher.on(`insert:${modelName}`, createHeadingHandler(editor, modelName, headingDefaults), { priority: 'low' });\r\n });\r\n });\r\n }\r\n}\r\n\r\nfunction createHeadingHandler(editor: any, modelName: string, headingDefaults: Record<string, { fontSize: string; lineHeight: string }>) {\r\n return (evt: any, data: any, conversionApi: any) => {\r\n const element = data.item;\r\n const viewElement = editor.editing.mapper.toViewElement(element);\r\n if (!viewElement) return;\r\n\r\n const children = Array.from(element.getChildren());\r\n const hasStyledText = children.some((child: any) => {\r\n if (child.is('$text')) {\r\n const attrs = Array.from(child.getAttributes());\r\n return attrs.length > 0;\r\n }\r\n return !child.is('$text');\r\n });\r\n\r\n editor.editing.view.change((writer: any) => {\r\n if (children.length === 1 && hasStyledText) {\r\n // Có styled text → bỏ style mặc định\r\n writer.setStyle('font-size', 'inherit', viewElement);\r\n writer.setStyle('line-height', 'inherit', viewElement);\r\n } else {\r\n // Không có styled text → set lại style mặc định từ config\r\n const defaults = headingDefaults[modelName];\r\n writer.setStyle('font-size', defaults.fontSize, viewElement);\r\n writer.setStyle('line-height', defaults.lineHeight, viewElement);\r\n }\r\n });\r\n };\r\n}\r\n","import { v4 as uuidv4 } from 'uuid';\r\nimport { Config, Plugin, Widget, toWidget } from 'ckeditor5';\r\nimport { SdDocumentBuilderVariable, SdEditorConfig } from '../../document-builder.model';\r\nimport { SdResolveMaybeAsync } from '@sd-angular/core/utilities';\r\n\r\nexport class VariablePlugin extends Plugin {\r\n // Khai báo dependencies nếu cần (VD: Widget)\r\n static get requires() {\r\n return [Widget];\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n const schema = editor.model.schema;\r\n const conversion = editor.conversion;\r\n const editingView = editor.editing.view;\r\n\r\n // 1. Định nghĩa Schema (Model)\r\n schema.register('variable', {\r\n inheritAllFrom: '$inlineObject',\r\n allowWhere: '$text',\r\n isInline: true,\r\n isObject: true,\r\n allowAttributes: ['id', 'uuid', 'value', 'display'],\r\n });\r\n\r\n // 2. Model -> HTML\r\n conversion.for('downcast').elementToElement({\r\n model: 'variable',\r\n view: (modelItem, { writer: viewWriter }) => {\r\n const id = modelItem.getAttribute('id') as string;\r\n const uuid = modelItem.getAttribute('uuid') as string;\r\n const display = modelItem.getAttribute('display') as string;\r\n const value = modelItem.getAttribute('value') as string;\r\n const widgetElement = viewWriter.createContainerElement('span', {\r\n class: 'variable-widget',\r\n 'data-id': id,\r\n 'data-uuid': uuid,\r\n 'data-value': value,\r\n 'data-display': display,\r\n });\r\n const innerText = viewWriter.createText(`{{${display}}}`);\r\n viewWriter.insert(viewWriter.createPositionAt(widgetElement, 0), innerText);\r\n return toWidget(widgetElement, viewWriter);\r\n },\r\n });\r\n\r\n // 3. HTML -> Model\r\n conversion.for('upcast').elementToElement({\r\n // NOTE: Khi bổ sung thêm attribute vào element variable, dev nên bổ sung thêm \"[atribute]: true\" vào view\r\n // Để:\r\n // - Nếu lọc chính xác sẽ không sinh ra thẻ span thừa bọc ngoài\r\n // - Nếu chưa bổ sung thì sẽ sinh ra thẻ <span> bọc ngoài kèm [atribute] chưa lọc\r\n view: {\r\n name: 'span',\r\n classes: 'variable-widget ck-widget',\r\n attributes: {\r\n 'data-id': true,\r\n 'data-uuid': true,\r\n 'data-value': true,\r\n 'data-display': true,\r\n contenteditable: true,\r\n },\r\n },\r\n model: (viewElement, { writer: modelWriter }) => {\r\n return modelWriter.createElement('variable', {\r\n id: viewElement.getAttribute('data-id'),\r\n uuid: viewElement.getAttribute('data-uuid'),\r\n value: viewElement.getAttribute('data-value'),\r\n display: viewElement.getAttribute('data-display'),\r\n });\r\n },\r\n });\r\n\r\n // 4. Xử lý sự kiện Drop\r\n this.listenTo(editingView.document, 'drop', async (evt, data) => {\r\n const dataTransfer = (data as any).dataTransfer;\r\n const jsonData = dataTransfer.getData('ck-variable');\r\n if (!jsonData) return;\r\n\r\n // data.dropRange là vị trí con chuột trên View khi thả\r\n const viewRange = (data as any).dropRange;\r\n const modelRange = editor.editing.mapper.toModelRange(viewRange);\r\n evt.stop();\r\n\r\n try {\r\n let variable: SdDocumentBuilderVariable = JSON.parse(jsonData);\r\n const config = editor.config as Config<SdEditorConfig>;\r\n const getOption = config.get('getOption') as SdEditorConfig['getOption'];\r\n const option = getOption?.();\r\n if (option?.onDropVariable) {\r\n const result = await SdResolveMaybeAsync<boolean | SdDocumentBuilderVariable>(option.onDropVariable(variable, 0));\r\n // * Hỗ trợ dữ liệu có sẵn sẽ chỉ cần nhận vào boolean có cho phép thả hay không?\r\n if (typeof result === 'boolean') {\r\n if (!result) {\r\n throw new Error('Không cho phép thêm variable vào văn bản');\r\n }\r\n } else {\r\n // * Hỗ trợ dữ liệu lấy từ API (Kiểm tra xem result có đúng định dạng interface SdDocumentBuilderVariable hay không?)\r\n if (this.#isSdDocumentBuilderVariableResult(result)) {\r\n variable = result;\r\n } else {\r\n throw new Error('Dữ liệu variable không hợp lệ');\r\n }\r\n }\r\n }\r\n\r\n editor.model.change(writer => {\r\n // 4.1. Chèn biến\r\n const variableElem = writer.createElement('variable', {\r\n id: variable.id,\r\n uuid: uuidv4(),\r\n value: variable.value,\r\n display: variable.display,\r\n });\r\n\r\n editor.model.insertContent(variableElem, modelRange);\r\n // 4.2. Đặt con trỏ ra sau biến\r\n writer.setSelection(variableElem, 'after');\r\n });\r\n } catch (e) {\r\n // Đặt con trỏ ngay tại vị trí lỗi\r\n if (modelRange) {\r\n editor.model.change(writer => {\r\n writer.setSelection(modelRange);\r\n });\r\n }\r\n console.error(e);\r\n } finally {\r\n // 5. Dọn dẹp drop-target dù thành công hay lỗi\r\n editor.model.change(writer => {\r\n for (const marker of editor.model.markers) {\r\n if (marker.name.startsWith('drop-target')) {\r\n writer.removeMarker(marker);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n // 5. Lắng nghe sự kiện bàn phím\r\n let isNavigating = false;\r\n this.editor.editing.view.document.on(\r\n 'keydown',\r\n (evt, data) => {\r\n // Mã phím mũi tên: 37 (Left), 38 (Up), 39 (Right), 40 (Down)\r\n const isArrowKey = data.keyCode >= 37 && data.keyCode <= 40;\r\n if (isArrowKey) {\r\n isNavigating = true;\r\n } else {\r\n isNavigating = false;\r\n }\r\n },\r\n { priority: 'high' }\r\n );\r\n\r\n // 6. Lắng nghe sự kiện Click chuột\r\n this.editor.editing.view.document.on('mousedown', () => {\r\n isNavigating = true;\r\n });\r\n\r\n this.listenTo(editor.model.document.selection, 'change:range', () => {\r\n // Nếu không phải là hành động click hoặc mũi tên thì thoát hàm.\r\n if (!isNavigating) {\r\n return;\r\n }\r\n\r\n const model = editor.model;\r\n const selection = model.document.selection;\r\n if (!selection.isCollapsed) return;\r\n\r\n const position = selection.getFirstPosition();\r\n const nodeBefore = position?.nodeBefore;\r\n if (!position) return;\r\n\r\n // Kiểm tra: Node đứng trước con trỏ là variable\r\n if (nodeBefore && nodeBefore.is('element', 'variable')) {\r\n // Lấy node ngay sau variable để kiểm tra\r\n const nextNode = nodeBefore.nextSibling;\r\n\r\n // Logic: Nếu phía sau KHÔNG CÓ GÌ hoặc KHÔNG PHẢI LÀ TEXT\r\n if (!nextNode || !nextNode.is('$text')) {\r\n model.change(writer => {\r\n // Chèn thêm con trỏ variable\r\n writer.insertText('\\u00A0', nodeBefore, 'after');\r\n // Lấy vị trí ngay sau variable (lúc này đang là đầu của text node mới)\r\n const posAfterVariable = writer.createPositionAfter(nodeBefore);\r\n // Dịch chuyển vị trí đó sang phải 1 đơn vị (bỏ qua ký tự vừa thêm)\r\n const targetPos = posAfterVariable.getShiftedBy(1);\r\n // 3. Đặt con trỏ vào vị trí đã tính toán\r\n writer.setSelection(targetPos);\r\n });\r\n }\r\n }\r\n });\r\n\r\n // 7. Handle xóa variable\r\n this.editor.editing.view.document.on(\r\n 'keydown',\r\n (evt, data) => {\r\n // Mã phím 8 là Backspace, 46 là Delete\r\n const btnBackspace = data.keyCode === 8;\r\n const btnDelete = data.keyCode === 46;\r\n if (btnBackspace || btnDelete) {\r\n const selection = editor.model.document.selection;\r\n const model = editor.model;\r\n\r\n // CASE 1: Nếu con trỏ đang nhấp nháy (Collapsed)\r\n if (selection.isCollapsed) {\r\n const position = selection.getFirstPosition();\r\n // Với Backspace ta kiểm tra nodeBefore, với Delete ta kiểm tra nodeAfter\r\n const targetNode = data.keyCode === 8 ? position?.nodeBefore : position?.nodeAfter;\r\n\r\n if (targetNode && targetNode.is('element', 'variable')) {\r\n data.preventDefault();\r\n evt.stop();\r\n\r\n model.change(writer => {\r\n // Chọn bao quanh Variable đó\r\n writer.setSelection(targetNode, 'on');\r\n });\r\n return;\r\n }\r\n }\r\n // CASE 2: Nếu đang có một vùng chọn (đã được highlight từ lần bấm trước)\r\n else {\r\n const selectedElement = selection.getSelectedElement();\r\n\r\n // Nếu phần tử đang được chọn chính là variable\r\n if (selectedElement && selectedElement.is('element', 'variable')) {\r\n // Cho phép hành động mặc định diễn ra (CKEditor sẽ tự xóa phần tử đang được chọn)\r\n // Hoặc chủ động xóa để chắc chắn:\r\n data.preventDefault();\r\n evt.stop();\r\n\r\n model.change(writer => {\r\n writer.remove(selectedElement);\r\n });\r\n }\r\n }\r\n }\r\n },\r\n { priority: 'highest' }\r\n );\r\n\r\n // 8. Xử lý sự kiện Copy (Clipboard Output)\r\n // Chỉ set thêm text/plain fallback, không thay đổi HTML content\r\n this.listenTo(editor.editing.view.document, 'clipboardOutput', (evt, data) => {\r\n const isCopyOrCut = data.method === 'copy' || data.method === 'cut';\r\n if (!isCopyOrCut) return;\r\n\r\n // Set thêm plain text fallback cho external apps\r\n const dataTransfer = data.dataTransfer;\r\n const content = data.content;\r\n\r\n // Lấy tất cả text từ content (bao gồm cả variable dạng {{text}})\r\n let plainText = '';\r\n const viewRange = editor.editing.view.createRangeIn(content);\r\n for (const item of viewRange.getItems()) {\r\n if (item.is('$text') || item.is('element', 'span')) {\r\n const itemAny = item as any;\r\n if (item.is('$text') && itemAny.data) {\r\n plainText += itemAny.data;\r\n } else if (item.is('element', 'span') && item.hasClass('variable-widget')) {\r\n const display = item.getAttribute('data-display');\r\n if (display) plainText += `{{${display}}}`;\r\n }\r\n }\r\n }\r\n\r\n if (plainText) {\r\n dataTransfer.setData('text/plain', plainText);\r\n }\r\n\r\n // HTML content giữ nguyên - CKEditor sẽ tự xử lý\r\n }, { priority: 'low' });\r\n\r\n // 9. Xử lý sự kiện Paste (Clipboard Input)\r\n // Nếu paste từ external source (chỉ có text, không có HTML variable)\r\n // thì chuyển {{text}} thành variable widget\r\n this.listenTo(editor.editing.view.document, 'clipboardInput', (evt, data: any) => {\r\n const dataTransfer = data.dataTransfer;\r\n\r\n // Nếu có HTML chứa variable-widget thì để CKEditor xử lý (upcast converter)\r\n const html = dataTransfer.getData('text/html');\r\n if (html && html.includes('variable-widget')) {\r\n return; // Để CKEditor upcast converter xử lý\r\n }\r\n\r\n // Chỉ xử lý nếu chỉ có plain text với pattern {{text}}\r\n let text = dataTransfer.getData('text/plain');\r\n if (!text) return;\r\n\r\n // Kiểm tra có chứa pattern {{text}} không (không cần id, value)\r\n const variablePattern = /\\{\\{([^}]+)\\}\\}/g;\r\n if (!variablePattern.test(text)) {\r\n return;\r\n }\r\n\r\n // Reset lastIndex sau khi test\r\n variablePattern.lastIndex = 0;\r\n\r\n evt.stop();\r\n\r\n editor.model.change(writer => {\r\n const selection = editor.model.document.selection;\r\n const position = selection.getFirstPosition();\r\n if (!position) return;\r\n\r\n // Tách text thành các phần: normal text và variables\r\n let lastIndex = 0;\r\n let match;\r\n const fragments: Array<{ type: 'text' | 'variable'; content: string; display?: string }> = [];\r\n\r\n while ((match = variablePattern.exec(text)) !== null) {\r\n // Thêm text trước variable\r\n if (match.index > lastIndex) {\r\n fragments.push({\r\n type: 'text',\r\n content: text.slice(lastIndex, match.index),\r\n });\r\n }\r\n\r\n // Thêm variable\r\n const display = match[1];\r\n fragments.push({\r\n type: 'variable',\r\n content: match[0],\r\n display,\r\n });\r\n\r\n lastIndex = match.index + match[0].length;\r\n }\r\n\r\n // Thêm text còn lại sau variable cuối cùng\r\n if (lastIndex < text.length) {\r\n fragments.push({\r\n type: 'text',\r\n content: text.slice(lastIndex),\r\n });\r\n }\r\n\r\n // Chèn từng fragment vào document\r\n let currentPosition = position;\r\n for (const fragment of fragments) {\r\n if (fragment.type === 'text' && fragment.content) {\r\n const textNode = writer.createText(fragment.content);\r\n writer.insert(textNode, currentPosition);\r\n currentPosition = writer.createPositionAfter(textNode);\r\n } else if (fragment.type === 'variable' && fragment.display) {\r\n const variableElem = writer.createElement('variable', {\r\n id: uuidv4(),\r\n uuid: uuidv4(),\r\n value: fragment.display,\r\n display: fragment.display,\r\n });\r\n\r\n writer.insert(variableElem, currentPosition);\r\n currentPosition = writer.createPositionAfter(variableElem);\r\n }\r\n }\r\n\r\n // Đặt con trỏ sau nội dung vừa paste\r\n writer.setSelection(currentPosition);\r\n });\r\n });\r\n }\r\n\r\n #isSdDocumentBuilderVariableResult = (obj: any): obj is SdDocumentBuilderVariable => {\r\n return (\r\n obj !== null &&\r\n obj !== undefined &&\r\n typeof obj === 'object' &&\r\n !Array.isArray(obj) &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.value === 'string' &&\r\n typeof obj.display === 'string'\r\n );\r\n };\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class TableCustom extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n // Can thiệp vào quá trình convert từ View (HTML Paste) sang Model\r\n editor.conversion.for('upcast').add(dispatcher => {\r\n dispatcher.on(\r\n 'element:table',\r\n (evt, data) => {\r\n if (!data.modelRange) return;\r\n\r\n for (const item of data.modelRange.getItems()) {\r\n if (item.is('element', 'table')) {\r\n editor.model.change(writer => {\r\n this._applyTableDefaults(writer, item);\r\n this._applyCellBorders(writer, item);\r\n });\r\n }\r\n }\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý data-column-widths từ colgroup preservation\r\n editor.conversion.for('upcast').attributeToAttribute({\r\n view: 'data-column-widths',\r\n model: 'tableColumnWidth'\r\n });\r\n console.log('[TableCustom] Registered data-column-widths upcast converter');\r\n\r\n // Xử lý border-style: none cho tableCell - phải explicit set 'none'\r\n dispatcher.on('element:td', (evt, data) => {\r\n if (!data.modelRange || !data.viewItem) return;\r\n\r\n const viewElement = data.viewItem;\r\n const borderStyle = viewElement.getStyle('border-style') ||\r\n this._parseBorderStyleFromShorthand(viewElement.getStyle('border'));\r\n\r\n // Nếu border-style là none hoặc border shorthand là none/0, explicit set 'none'\r\n if (borderStyle === 'none' || borderStyle === 'hidden') {\r\n for (const item of data.modelRange.getItems()) {\r\n if (item.is('element', 'tableCell')) {\r\n editor.model.change(writer => {\r\n writer.setAttribute('tableCellBorderStyle', 'none', item);\r\n // Khi border là none, set width về 0 để không có border\r\n writer.setAttribute('tableCellBorderWidth', '0pt', item);\r\n });\r\n }\r\n }\r\n }\r\n }, { priority: 'high' });\r\n\r\n dispatcher.on('element:th', (evt, data) => {\r\n if (!data.modelRange || !data.viewItem) return;\r\n\r\n const viewElement = data.viewItem;\r\n const borderStyle = viewElement.getStyle('border-style') ||\r\n this._parseBorderStyleFromShorthand(viewElement.getStyle('border'));\r\n\r\n // Nếu border-style là none hoặc border shorthand là none/0, explicit set 'none'\r\n if (borderStyle === 'none' || borderStyle === 'hidden') {\r\n for (const item of data.modelRange.getItems()) {\r\n if (item.is('element', 'tableCell')) {\r\n editor.model.change(writer => {\r\n writer.setAttribute('tableCellBorderStyle', 'none', item);\r\n // Khi border là none, set width về 0 để không có border\r\n writer.setAttribute('tableCellBorderWidth', '0pt', item);\r\n });\r\n }\r\n }\r\n }\r\n }, { priority: 'high' });\r\n });\r\n\r\n const findInnerTable = (viewElement: any): any => {\r\n if (!viewElement) return null;\r\n if (viewElement.name === 'table') return viewElement;\r\n\r\n for (const child of viewElement.getChildren()) {\r\n if (child.name === 'table') return child;\r\n const found = findInnerTable(child);\r\n if (found) return found;\r\n }\r\n return null;\r\n };\r\n\r\n editor.conversion.for('downcast').add(dispatcher => {\r\n dispatcher.on('attribute:tableWidth:table', (evt, data, conversionApi) => {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n const innerTable = findInnerTable(viewElement);\r\n if (!innerTable) return;\r\n\r\n viewWriter.setStyle('border-collapse', 'collapse', innerTable);\r\n viewWriter.setStyle('margin', '0', innerTable);\r\n viewWriter.setStyle('width', '100%', innerTable);\r\n viewWriter.setStyle('width', '100%', viewElement);\r\n });\r\n\r\n dispatcher.on('insert:table', (evt, data, conversionApi) => {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n const innerTable = findInnerTable(viewElement);\r\n if (!innerTable) return;\r\n\r\n viewWriter.setStyle('border-collapse', 'collapse', innerTable);\r\n viewWriter.setStyle('margin', '0', innerTable);\r\n viewWriter.setStyle('width', '100%', innerTable);\r\n viewWriter.setStyle('width', '100%', viewElement);\r\n });\r\n\r\n // Downcast tableColumnWidth to colgroup\r\n dispatcher.on('attribute:tableColumnWidth:table', (evt, data, conversionApi) => {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n const innerTable = findInnerTable(viewElement);\r\n if (!innerTable) return;\r\n\r\n const columnWidths = data.item.getAttribute('tableColumnWidth') as string;\r\n if (!columnWidths) return;\r\n\r\n // Remove existing colgroup if any\r\n for (const child of innerTable.getChildren()) {\r\n if (child.is('element', 'colgroup')) {\r\n viewWriter.remove(child);\r\n break;\r\n }\r\n }\r\n\r\n // Create new colgroup with col elements\r\n const colgroup = viewWriter.createContainerElement('colgroup');\r\n const widths = columnWidths.split(',');\r\n\r\n for (const width of widths) {\r\n const col = viewWriter.createEmptyElement('col');\r\n viewWriter.setAttribute('width', width.trim(), col);\r\n viewWriter.setStyle('width', width.trim(), col);\r\n viewWriter.insertChild(0, col, colgroup);\r\n }\r\n\r\n // Insert colgroup as first child of table\r\n viewWriter.insertChild(0, colgroup, innerTable);\r\n });\r\n });\r\n\r\n // Lắng nghe lệnh insertTable\r\n const insertTableCommand = editor.commands.get('insertTable');\r\n if (insertTableCommand) {\r\n this.listenTo(insertTableCommand, 'execute', () => {\r\n editor.model.change(writer => {\r\n const position = editor.model.document.selection.getFirstPosition();\r\n if (!position) return;\r\n\r\n const tableElement = position.findAncestor('table');\r\n if (tableElement) {\r\n this._applyTableDefaults(writer, tableElement);\r\n writer.setAttribute('tableBorderColor', '#000000', tableElement);\r\n writer.setAttribute('tableBorderStyle', 'solid', tableElement);\r\n writer.setAttribute('tableBorderWidth', '1pt', tableElement);\r\n this._applyCellBorders(writer, tableElement);\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Listen for row/column commands\r\n const tableCommands = [\r\n 'insertTableRowAbove',\r\n 'insertTableRowBelow',\r\n 'insertTableColumnLeft',\r\n 'insertTableColumnRight',\r\n 'resizeTableRow',\r\n 'resizeTableColumn',\r\n 'setTableColumnWidth',\r\n 'tableColumnWidth'\r\n ];\r\n\r\n tableCommands.forEach(cmdName => {\r\n const cmd = editor.commands.get(cmdName);\r\n if (cmd) {\r\n this.listenTo(cmd, 'execute', () => {\r\n editor.model.change(writer => {\r\n const position = editor.model.document.selection.getFirstPosition();\r\n if (!position) return;\r\n\r\n const tableElement = position.findAncestor('table');\r\n if (tableElement) {\r\n this._applyTableDefaults(writer, tableElement);\r\n this._applyCellBorders(writer, tableElement);\r\n }\r\n });\r\n });\r\n }\r\n });\r\n\r\n // Setup style preservation on model change\r\n this._setupStylePreservationOnModelChange();\r\n }\r\n\r\n /**\r\n * Parse border style from CSS shorthand (e.g., \"1px solid red\" or \"none\")\r\n */\r\n private _parseBorderStyleFromShorthand(borderValue: string | null | undefined): string | null {\r\n if (!borderValue) return null;\r\n const val = borderValue.toLowerCase().trim();\r\n if (val === 'none' || val === '0') return 'none';\r\n\r\n // Parse shorthand: width style color (e.g., \"1px solid red\")\r\n const parts = val.split(/\\s+/);\r\n for (const part of parts) {\r\n if (['none', 'hidden', 'dotted', 'dashed', 'solid', 'double', 'groove', 'ridge', 'inset', 'outset'].includes(part)) {\r\n return part;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Apply default table width\r\n */\r\n private _applyTableDefaults(writer: any, tableElement: any): void {\r\n if (!tableElement) return;\r\n writer.setAttribute('tableWidth', '100%', tableElement);\r\n }\r\n\r\n /**\r\n * Apply default borders to all cells in a table\r\n * Nếu cell đã có border rồi thì bỏ qua\r\n */\r\n private _applyCellBorders(writer: any, tableElement: any): void {\r\n if (!tableElement) return;\r\n\r\n // Lấy border info từ table để cell kế thừa\r\n const tableBorderColor = tableElement.getAttribute('tableBorderColor');\r\n const tableBorderStyle = tableElement.getAttribute('tableBorderStyle');\r\n const tableBorderWidth = tableElement.getAttribute('tableBorderWidth');\r\n\r\n for (const row of tableElement.getChildren()) {\r\n for (const cell of row.getChildren()) {\r\n // Nếu cell đã có border attribute nào rồi thì bỏ qua\r\n if (cell.hasAttribute('tableCellBorderStyle') ||\r\n cell.hasAttribute('tableCellBorderColor') ||\r\n cell.hasAttribute('tableCellBorderWidth')) {\r\n continue;\r\n }\r\n\r\n // Áp dụng border từ table hoặc default\r\n const inheritedStyle = tableBorderStyle || 'solid';\r\n const inheritedColor = tableBorderColor || '#000000';\r\n const inheritedWidth = tableBorderWidth || '1pt';\r\n\r\n writer.setAttribute('tableCellBorderStyle', inheritedStyle, cell);\r\n writer.setAttribute('tableCellBorderColor', inheritedColor, cell);\r\n writer.setAttribute('tableCellBorderWidth', inheritedWidth, cell);\r\n\r\n if (!cell.hasAttribute('tableCellPadding')) {\r\n writer.setAttribute('tableCellPadding', '0.4em', cell);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Setup listener to preserve cell/table styles when model changes\r\n */\r\n private _setupStylePreservationOnModelChange(): void {\r\n const editor = this.editor;\r\n\r\n // Use listenTo for proper cleanup via destroy()\r\n this.listenTo(editor.model.document, 'change', (evt: unknown, batch: any) => {\r\n if (batch?.isLocal === false) return;\r\n\r\n const changes = editor.model.document.differ.getChanges();\r\n const tablesToFix = this._findTablesNeedingFix(changes);\r\n\r\n if (tablesToFix.size > 0) {\r\n editor.model.enqueueChange(() => {\r\n editor.model.change(writer => {\r\n for (const table of tablesToFix) {\r\n this._applyTableDefaults(writer, table);\r\n this._applyCellBorders(writer, table);\r\n }\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Find tables that need border fixes from model changes\r\n */\r\n private _findTablesNeedingFix(changes: any): Set<any> {\r\n const tablesToFix = new Set<any>();\r\n\r\n for (const change of changes) {\r\n if (change.type === 'attribute') {\r\n const attrKey = change.attributeKey;\r\n if (attrKey && (attrKey.includes('table') || attrKey.includes('column') || attrKey.includes('width'))) {\r\n const element = change.item;\r\n if (element) {\r\n const parentTable = this._findParentTable(element);\r\n if (parentTable) tablesToFix.add(parentTable);\r\n }\r\n }\r\n }\r\n\r\n if (change.type === 'insert' && change.position) {\r\n const tableElement = change.position.findAncestor?.('table') ||\r\n change.position.parent?.findAncestor?.('table');\r\n if (tableElement) tablesToFix.add(tableElement);\r\n }\r\n }\r\n\r\n return tablesToFix;\r\n }\r\n\r\n /**\r\n * Find parent table element\r\n */\r\n private _findParentTable(element: any): any {\r\n if (!element) return null;\r\n let parent = element;\r\n while (parent && !parent.is?.('element', 'table')) {\r\n parent = parent.parent;\r\n }\r\n return parent;\r\n }\r\n\r\n /**\r\n * Cleanup listeners when plugin is destroyed\r\n * Note: this.listenTo() listeners are automatically cleaned up by super.destroy()\r\n */\r\n override destroy(): void {\r\n super.destroy();\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class ImageUploadPlugin extends Plugin {\r\n static get pluginName() {\r\n return 'ImageUploadPlugin' as const;\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n \r\n editor.plugins.get('FileRepository').createUploadAdapter = (loader: any) => {\r\n return new Base64UploadAdapter(loader);\r\n };\r\n }\r\n}\r\n\r\nclass Base64UploadAdapter {\r\n private loader: any;\r\n\r\n constructor(loader: any) {\r\n this.loader = loader;\r\n }\r\n\r\n /**\r\n * Starts the upload process and converts the file to base64.\r\n * @returns Promise that resolves with the base64 URL\r\n */\r\n upload(): Promise<{ default: string }> {\r\n return this.loader.file.then((file: File) => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n const base64Url = reader.result as string;\r\n resolve({ default: base64Url });\r\n };\r\n\r\n reader.onerror = () => {\r\n reject('Failed to convert image to base64');\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Aborts the upload process.\r\n */\r\n abort(): void {\r\n // For base64 conversion, there's nothing to abort\r\n // This method is required by the UploadAdapter interface\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class ImageCustomPlugin extends Plugin {\r\n static get pluginName() {\r\n return 'ImageCustomPlugin' as const;\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n\r\n // Thiết lập style mặc định là alignCenter khi chèn ảnh\r\n editor.commands.get('imageUpload')?.on('execute', (evt, args) => {\r\n // Đặt style mặc định sau khi ảnh được chèn\r\n setTimeout(() => {\r\n const selection = editor.model.document.selection;\r\n const imageElement = selection.getSelectedElement();\r\n if (imageElement && (imageElement.name === 'imageBlock' || imageElement.name === 'imageInline')) {\r\n const currentStyle = imageElement.getAttribute('imageStyle');\r\n // Chỉ đặt mặc định nếu chưa có style nào\r\n if (!currentStyle) {\r\n editor.model.change(writer => {\r\n writer.setAttribute('imageStyle', 'alignCenter', imageElement);\r\n });\r\n }\r\n }\r\n }, 0);\r\n });\r\n\r\n // Downcast: Model -> View (HTML output)\r\n // CKEditor 5 có 2 loại ảnh: imageBlock và imageInline\r\n editor.conversion.for('downcast').add(dispatcher => {\r\n // Xử lý ảnh block (được wrap trong figure)\r\n dispatcher.on(\r\n 'insert:imageBlock',\r\n (evt, data, conversionApi) => {\r\n this.handleImageInsert(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý ảnh inline\r\n dispatcher.on(\r\n 'insert:imageInline',\r\n (evt, data, conversionApi) => {\r\n this.handleImageInsert(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi attribute cho cả 2 loại ảnh\r\n ['imageBlock', 'imageInline'].forEach(imageType => {\r\n // Xử lý thay đổi src\r\n dispatcher.on(\r\n `attribute:src:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageAttributeChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi width\r\n dispatcher.on(\r\n `attribute:width:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageAttributeChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi height\r\n dispatcher.on(\r\n `attribute:height:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageAttributeChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi imageStyle (căn chỉnh) - thêm float inline style\r\n dispatcher.on(\r\n `attribute:imageStyle:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageStyleChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n });\r\n });\r\n\r\n // Xử lý upcast (HTML paste) - xóa aspect-ratio từ HTML đầu vào\r\n editor.conversion.for('upcast').add(dispatcher => {\r\n dispatcher.on(\r\n 'element:img',\r\n (evt, data, conversionApi) => {\r\n const viewItem = data.viewItem;\r\n if (!viewItem) return;\r\n\r\n // Kiểm tra viewItem có các method cần thiết\r\n if (typeof viewItem.getStyle !== 'function') return;\r\n\r\n // Xóa aspect-ratio từ inline styles nếu có\r\n const hasAspectRatio = viewItem.getStyle('aspect-ratio');\r\n if (hasAspectRatio && typeof viewItem.removeStyle === 'function') {\r\n viewItem.removeStyle('aspect-ratio');\r\n }\r\n\r\n // Đặt custom styles nếu _styles map tồn tại\r\n if (viewItem._styles && typeof viewItem._styles.set === 'function') {\r\n viewItem._styles.set('margin', '0');\r\n viewItem._styles.set('border', '0');\r\n viewItem._styles.set('max-width', '100%');\r\n viewItem._styles.set('height', 'auto');\r\n }\r\n },\r\n { priority: 'high' }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Xử lý sự kiện chèn ảnh\r\n */\r\n private handleImageInsert(evt: any, data: any, conversionApi: any): void {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n // viewElement có thể là figure (cho block) hoặc img itself (cho inline)\r\n // Tìm element img thực tế\r\n const imgElement = this.findImgElement(viewElement);\r\n if (!imgElement) return;\r\n\r\n this.applyCustomStyles(viewWriter, imgElement);\r\n }\r\n\r\n /**\r\n * Xử lý sự kiện thay đổi attribute ảnh\r\n */\r\n private handleImageAttributeChange(evt: any, data: any, conversionApi: any): void {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n const imgElement = this.findImgElement(viewElement);\r\n if (!imgElement) return;\r\n\r\n this.applyCustomStyles(viewWriter, imgElement);\r\n }\r\n\r\n /**\r\n * Xử lý sự kiện thay đổi style ảnh - thêm float inline style cho căn chỉnh\r\n */\r\n private handleImageStyleChange(evt: any, data: any, conversionApi: any): void {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n // Tìm container ck-widget (element figure)\r\n const widgetElement = this.findWidgetElement(viewElement);\r\n if (!widgetElement) return;\r\n\r\n // Lấy giá trị imageStyle (căn chỉnh)\r\n const imageStyle = data.item.getAttribute('imageStyle') as string;\r\n\r\n // Xóa các style hiện có trước\r\n viewWriter.removeStyle('float', widgetElement);\r\n viewWriter.removeStyle('margin', widgetElement);\r\n viewWriter.removeStyle('text-align', widgetElement);\r\n\r\n // Áp dụng style dựa trên căn chỉnh ảnh\r\n // Các options đã cấu hình: ['inline', 'alignLeft', 'alignRight', 'alignCenter']\r\n switch (imageStyle) {\r\n case 'inline':\r\n // Ảnh inline - không style đặc biệt, chỉ flow inline\r\n break;\r\n case 'alignLeft':\r\n // Float trái\r\n viewWriter.setStyle('float', 'left', widgetElement);\r\n viewWriter.setStyle('margin', '0 16px 16px 0', widgetElement);\r\n break;\r\n case 'alignRight':\r\n // Float phải\r\n viewWriter.setStyle('float', 'right', widgetElement);\r\n viewWriter.setStyle('margin', '0 0 16px 16px', widgetElement);\r\n break;\r\n case 'alignCenter':\r\n case 'block':\r\n // Căn giữa\r\n viewWriter.setStyle('text-align', 'center', widgetElement);\r\n viewWriter.setStyle('margin', '16px auto', widgetElement);\r\n break;\r\n default:\r\n // Mặc định - căn giữa\r\n viewWriter.setStyle('text-align', 'center', widgetElement);\r\n viewWriter.setStyle('margin', '16px auto', widgetElement);\r\n break;\r\n }\r\n\r\n // Áp dụng custom styles cơ bản cho element img\r\n const imgElement = this.findImgElement(viewElement);\r\n if (imgElement) {\r\n this.applyCustomStyles(viewWriter, imgElement);\r\n }\r\n }\r\n\r\n /**\r\n * Áp dụng custom styles cho element ảnh\r\n */\r\n private applyCustomStyles(viewWriter: any, imgElement: any): void {\r\n // Xóa aspect-ratio nếu tồn tại\r\n if (imgElement.getStyle('aspect-ratio')) {\r\n viewWriter.removeStyle('aspect-ratio', imgElement);\r\n }\r\n\r\n // Áp dụng custom styles\r\n viewWriter.setStyle('margin', '0', imgElement);\r\n viewWriter.setStyle('border', '0', imgElement);\r\n viewWriter.setStyle('max-width', '100%', imgElement);\r\n viewWriter.setStyle('height', 'auto', imgElement);\r\n }\r\n\r\n /**\r\n * Tìm container ck-widget (element figure)\r\n * CKEditor wrap ảnh block trong <figure class=\"ck-widget\"><img></figure>\r\n */\r\n private findWidgetElement(viewElement: any): any {\r\n if (!viewElement) return null;\r\n\r\n // Nếu đây là element figure itself\r\n if (viewElement.name === 'figure') {\r\n return viewElement;\r\n }\r\n\r\n // Cho ảnh inline, trả về element itself (span wrapper)\r\n if (viewElement.name === 'span') {\r\n return viewElement;\r\n }\r\n\r\n // Tìm ngược lên tree để tìm figure/ck-widget\r\n let current = viewElement;\r\n while (current) {\r\n if (current.name === 'figure' || current.name === 'span') {\r\n return current;\r\n }\r\n // Di chuyển lên parent\r\n if (current.parent) {\r\n current = current.parent;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Nếu không tìm thấy widget, trả về element gốc\r\n return viewElement;\r\n }\r\n\r\n /**\r\n * Tìm element img thực tế bên trong widget structure\r\n * CKEditor wrap ảnh block trong <figure class=\"ck-widget\"><img></figure>\r\n */\r\n private findImgElement(viewElement: any): any {\r\n if (!viewElement) return null;\r\n\r\n // Nếu đây là element img itself\r\n if (viewElement.name === 'img') {\r\n return viewElement;\r\n }\r\n\r\n // Cho structure widget của CKEditor, tìm đệ quy\r\n // Ảnh block: figure > span > img\r\n // Ảnh thường được wrap trong một container\r\n const queue = [viewElement];\r\n while (queue.length > 0) {\r\n const current = queue.shift();\r\n if (!current) continue;\r\n\r\n if (current.name === 'img') {\r\n return current;\r\n }\r\n\r\n // Thêm children vào queue\r\n if (current.getChildren) {\r\n for (const child of current.getChildren()) {\r\n queue.push(child);\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { ButtonView, Plugin } from 'ckeditor5';\r\n// Icon khổ dọc (Mặc định cũ)\r\nconst ICON_PORTRAIT =\r\n '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6V4h8v12z\"/></svg>';\r\n\r\n// Icon khổ ngang (Mới)\r\nconst ICON_LANDSCAPE =\r\n '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 4H2C.9 4 0 4.9 0 6v8c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 10H2V6h16v8z\"/></svg>';\r\nexport class PageOrientation extends Plugin {\r\n public static readonly pluginName = 'PageOrientation';\r\n\r\n private _currentOrientation: 'PORTRAIT' | 'LANDSCAPE' = 'PORTRAIT';\r\n private orientationChangeEmitter?: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void;\r\n private buttonView?: ButtonView;\r\n\r\n init() {\r\n const editor = this.editor;\r\n const componentFactory = editor.ui.componentFactory;\r\n\r\n // Đăng ký nút tên là 'pageOrientation'\r\n componentFactory.add('pageOrientation', locale => {\r\n const view = new ButtonView(locale);\r\n this.buttonView = view;\r\n\r\n view.set({\r\n // label: 'Xoay giấy (A4)',\r\n icon: ICON_PORTRAIT,\r\n // tooltip: true,\r\n // withText: true,\r\n class: 'btn-orientation', // Class để style nếu cần\r\n });\r\n\r\n // Xử lý khi bấm nút\r\n view.on('execute', () => {\r\n this.toggleOrientation();\r\n });\r\n\r\n return view;\r\n });\r\n }\r\n\r\n /**\r\n * Toggle between portrait and landscape orientation\r\n */\r\n toggleOrientation(): void {\r\n const newOrientation = this._currentOrientation === 'PORTRAIT' ? 'LANDSCAPE' : 'PORTRAIT';\r\n this.setOrientation(newOrientation);\r\n }\r\n\r\n /**\r\n * Set orientation programmatically\r\n */\r\n setOrientation(orientation: 'PORTRAIT' | 'LANDSCAPE'): void {\r\n const editor = this.editor;\r\n const editingView = editor.editing.view;\r\n const rootElement = editingView.document.getRoot();\r\n\r\n editor.editing.view.change(writer => {\r\n if (orientation === 'LANDSCAPE') {\r\n writer.addClass('landscape', rootElement!);\r\n } else {\r\n writer.removeClass('landscape', rootElement!);\r\n }\r\n });\r\n\r\n // Update button icon\r\n if (this.buttonView) {\r\n this.buttonView.icon = orientation === 'LANDSCAPE' ? ICON_LANDSCAPE : ICON_PORTRAIT;\r\n }\r\n\r\n this._currentOrientation = orientation;\r\n this.orientationChangeEmitter?.(orientation);\r\n }\r\n\r\n /**\r\n * Get current orientation\r\n */\r\n getOrientation(): 'PORTRAIT' | 'LANDSCAPE' {\r\n return this._currentOrientation;\r\n }\r\n\r\n /**\r\n * Register callback for orientation changes\r\n */\r\n onOrientationChange(callback: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void): void {\r\n this.orientationChangeEmitter = callback;\r\n }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/bookmark\r\n */\r\n\r\nimport {\r\n\ttype ViewUpcastWriter,\r\n\ttype ViewDocumentFragment\r\n} from 'ckeditor5';\r\n\r\n/**\r\n * Transforms `<a>` elements which are bookmarks by moving their children after the element.\r\n *\r\n * @internal\r\n */\r\nexport function transformBookmarks(\r\n\tdocumentFragment: ViewDocumentFragment,\r\n\twriter: ViewUpcastWriter\r\n): void {\r\n\tconst elementsToChange = [];\r\n\r\n\tfor ( const value of writer.createRangeIn( documentFragment ) ) {\r\n\t\tconst element = value.item;\r\n\r\n\t\tif (\r\n\t\t\telement.is( 'element', 'a' ) &&\r\n\t\t\t!element.hasAttribute( 'href' ) &&\r\n\t\t\t( element.hasAttribute( 'id' ) || element.hasAttribute( 'name' ) ) )\r\n\t\t{\r\n\t\t\telementsToChange.push( element );\r\n\t\t}\r\n\t}\r\n\r\n\tfor ( const element of elementsToChange ) {\r\n\t\tconst index = element.parent!.getChildIndex( element ) + 1;\r\n\t\tconst children = element.getChildren();\r\n\r\n\t\twriter.insertChild( index, children, element.parent! );\r\n\t}\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/image\r\n */\r\n\r\nimport { Matcher, ViewUpcastWriter, type ViewDocumentFragment, type ViewElement, type ViewNode } from 'ckeditor5';\r\n\r\n/**\r\n * Replaces source attribute of all `<img>` elements representing regular\r\n * images (not the Word shapes) with inlined base64 image representation extracted from RTF or Blob data.\r\n *\r\n * @param documentFragment Document fragment on which transform images.\r\n * @param rtfData The RTF data from which images representation will be used.\r\n * @internal\r\n */\r\nexport function replaceImagesSourceWithBase64(documentFragment: ViewDocumentFragment, rtfData: string): void {\r\n if (!documentFragment.childCount) {\r\n return;\r\n }\r\n\r\n const upcastWriter = new ViewUpcastWriter(documentFragment.document);\r\n const shapesIds = findAllShapesIds(documentFragment, upcastWriter);\r\n\r\n removeAllImgElementsRepresentingShapes(shapesIds, documentFragment, upcastWriter);\r\n insertMissingImgs(shapesIds, documentFragment, upcastWriter);\r\n removeAllShapeElements(documentFragment, upcastWriter);\r\n\r\n const images = findAllImageElementsWithLocalSource(documentFragment, upcastWriter);\r\n\r\n if (images.length) {\r\n replaceImagesFileSourceWithInlineRepresentation(images, extractImageDataFromRtf(rtfData), upcastWriter);\r\n }\r\n}\r\n\r\n/**\r\n * Converts given HEX string to base64 representation.\r\n *\r\n * @internal\r\n * @param hexString The HEX string to be converted.\r\n * @returns Base64 representation of a given HEX string.\r\n */\r\nexport function _convertHexToBase64(hexString: string): string {\r\n return btoa(\r\n hexString\r\n .match(/\\w{2}/g)!\r\n .map(char => {\r\n return String.fromCharCode(parseInt(char, 16));\r\n })\r\n .join('')\r\n );\r\n}\r\n\r\n/**\r\n * Finds all shapes (`<v:*>...</v:*>`) ids. Shapes can represent images (canvas)\r\n * or Word shapes (which does not have RTF or Blob representation).\r\n *\r\n * @param documentFragment Document fragment from which to extract shape ids.\r\n * @returns Array of shape ids.\r\n */\r\nfunction findAllShapesIds(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): Array<string> {\r\n const range = writer.createRangeIn(documentFragment);\r\n\r\n const shapeElementsMatcher = new Matcher({\r\n name: /v:(.+)/,\r\n });\r\n\r\n const shapesIds = [];\r\n\r\n for (const value of range) {\r\n if (value.type != 'elementStart') {\r\n continue;\r\n }\r\n\r\n const el = value.item as ViewElement;\r\n const previousSibling = el.previousSibling;\r\n const prevSiblingName = previousSibling && previousSibling.is('element') ? previousSibling.name : null;\r\n // List of ids which should not be considered as shapes.\r\n // https://github.com/ckeditor/ckeditor5/pull/15847#issuecomment-1941543983\r\n const exceptionIds = ['Chart'];\r\n\r\n const isElementAShape = shapeElementsMatcher.match(el);\r\n const hasElementGfxdataAttribute = el.getAttribute('o:gfxdata');\r\n const isPreviousSiblingAShapeType = prevSiblingName === 'v:shapetype';\r\n const isElementIdInExceptionsArray = hasElementGfxdataAttribute && exceptionIds.some(item => el.getAttribute('id')!.includes(item));\r\n\r\n // If shape element has 'o:gfxdata' attribute and is not directly before\r\n // `<v:shapetype>` element it means that it represents a Word shape.\r\n if (isElementAShape && hasElementGfxdataAttribute && !isPreviousSiblingAShapeType && !isElementIdInExceptionsArray) {\r\n shapesIds.push((value.item as ViewElement).getAttribute('id')!);\r\n }\r\n }\r\n\r\n return shapesIds;\r\n}\r\n\r\n/**\r\n * Removes all `<img>` elements which represents Word shapes and not regular images.\r\n *\r\n * @param shapesIds Shape ids which will be checked against `<img>` elements.\r\n * @param documentFragment Document fragment from which to remove `<img>` elements.\r\n */\r\nfunction removeAllImgElementsRepresentingShapes(\r\n shapesIds: Array<string>,\r\n documentFragment: ViewDocumentFragment,\r\n writer: ViewUpcastWriter\r\n): void {\r\n const range = writer.createRangeIn(documentFragment);\r\n\r\n const imageElementsMatcher = new Matcher({\r\n name: 'img',\r\n });\r\n\r\n const imgs = [];\r\n\r\n for (const value of range) {\r\n if (value.item.is('element') && imageElementsMatcher.match(value.item)) {\r\n const el = value.item;\r\n const shapes = el.getAttribute('v:shapes') ? el.getAttribute('v:shapes')!.split(' ') : [];\r\n\r\n if (shapes.length && shapes.every(shape => shapesIds.indexOf(shape) > -1)) {\r\n imgs.push(el);\r\n // Shapes may also have empty source while content is paste in some browsers (Safari).\r\n } else if (!el.getAttribute('src')) {\r\n imgs.push(el);\r\n }\r\n }\r\n }\r\n\r\n for (const img of imgs) {\r\n writer.remove(img);\r\n }\r\n}\r\n\r\n/**\r\n * Removes all shape elements (`<v:*>...</v:*>`) so they do not pollute the output structure.\r\n *\r\n * @param documentFragment Document fragment from which to remove shape elements.\r\n */\r\nfunction removeAllShapeElements(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter) {\r\n const range = writer.createRangeIn(documentFragment);\r\n\r\n const shapeElementsMatcher = new Matcher({\r\n name: /v:(.+)/,\r\n });\r\n\r\n const shapes = [];\r\n\r\n for (const value of range) {\r\n if (value.type == 'elementStart' && shapeElementsMatcher.match(value.item as ViewElement)) {\r\n shapes.push(value.item as ViewElement);\r\n }\r\n }\r\n\r\n for (const shape of shapes) {\r\n writer.remove(shape);\r\n }\r\n}\r\n\r\n/**\r\n * Inserts `img` tags if there is none after a shape.\r\n */\r\nfunction insertMissingImgs(shapeIds: Array<string>, documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter) {\r\n const range = writer.createRangeIn(documentFragment);\r\n\r\n const shapes: Array<ViewElement> = [];\r\n\r\n for (const value of range) {\r\n if (value.type == 'elementStart' && value.item.is('element', 'v:shape')) {\r\n const id = value.item.getAttribute('id')!;\r\n\r\n if (shapeIds.includes(id)) {\r\n continue;\r\n }\r\n\r\n if (!containsMatchingImg(value.item.parent!.getChildren(), id)) {\r\n shapes.push(value.item);\r\n }\r\n }\r\n }\r\n\r\n for (const shape of shapes) {\r\n const attrs: Record<string, unknown> = {\r\n src: findSrc(shape),\r\n };\r\n\r\n if (shape.hasAttribute('alt')) {\r\n attrs['alt'] = shape.getAttribute('alt');\r\n }\r\n\r\n const img = writer.createElement('img', attrs);\r\n\r\n writer.insertChild(shape.index! + 1, img, shape.parent!);\r\n }\r\n\r\n function containsMatchingImg(nodes: Iterable<ViewNode>, id: string): boolean {\r\n for (const node of nodes) {\r\n /* istanbul ignore else -- @preserve */\r\n if (node.is('element')) {\r\n if (node.name == 'img' && node.getAttribute('v:shapes') == id) {\r\n return true;\r\n }\r\n\r\n if (containsMatchingImg(node.getChildren(), id)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function findSrc(shape: ViewElement): string {\r\n for (const child of shape.getChildren()) {\r\n /* istanbul ignore else -- @preserve */\r\n if (child.is('element') && child.getAttribute('src')) {\r\n return child.getAttribute('src') as string;\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Finds all `<img>` elements in a given document fragment which have source pointing to local `file://` resource.\r\n * This function also tracks the index position of each image in the document, which is essential for\r\n * precise matching with hexadecimal representations in RTF data.\r\n *\r\n * @param documentFragment Document fragment in which to look for `<img>` elements.\r\n * @returns Array of found images along with their position index in the document.\r\n */\r\nfunction findAllImageElementsWithLocalSource(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): Array<ImageWithIndex> {\r\n const range = writer.createRangeIn(documentFragment);\r\n\r\n const imageElementsMatcher = new Matcher({\r\n name: 'img',\r\n });\r\n\r\n const imgs: Array<ImageWithIndex> = [];\r\n let currentImageIndex = 0;\r\n\r\n for (const value of range) {\r\n if (value.item.is('element') && imageElementsMatcher.match(value.item)) {\r\n if (value.item.getAttribute('src')!.startsWith('file://')) {\r\n imgs.push({\r\n element: value.item,\r\n imageIndex: currentImageIndex,\r\n });\r\n }\r\n\r\n currentImageIndex++;\r\n }\r\n }\r\n\r\n return imgs;\r\n}\r\n\r\n/**\r\n * Represents an image element with its index position in the document.\r\n * This index is crucial for correctly matching images with their\r\n * corresponding hexadecimal representations in RTF data.\r\n */\r\ntype ImageWithIndex = {\r\n /**\r\n * The position index of the image in the document.\r\n * Used to map the image to its corresponding hexadecimal representation in RTF data.\r\n * RTF data contains hexadecimal representations of ALL images in the document,\r\n * not just those with file:// URLs.\r\n */\r\n imageIndex: number;\r\n\r\n /**\r\n * The image element.\r\n */\r\n element: ViewElement;\r\n};\r\n\r\n/**\r\n * Extracts all images HEX representations from a given RTF data.\r\n *\r\n * @param rtfData The RTF data from which to extract images HEX representation.\r\n * @returns Array of found HEX representations. Each array item is an object containing:\r\n *\r\n * * hex Image representation in HEX format.\r\n * * type Type of image, `image/png` or `image/jpeg`.\r\n */\r\nfunction extractImageDataFromRtf(rtfData: string): Array<{ hex: string; type: string }> {\r\n if (!rtfData) {\r\n return [];\r\n }\r\n\r\n const regexPictureHeader = /{\\\\pict[\\s\\S]+?\\\\bliptag-?\\d+(\\\\blipupi-?\\d+)?({\\\\\\*\\\\blipuid\\s?[\\da-fA-F]+)?[\\s}]*?/;\r\n const regexPicture = new RegExp('(?:(' + regexPictureHeader.source + '))([\\\\da-fA-F\\\\s]+)\\\\}', 'g');\r\n const images = rtfData.match(regexPicture);\r\n const result = [];\r\n\r\n if (images) {\r\n for (const image of images) {\r\n let imageType: string | false = false;\r\n\r\n if (image.includes('\\\\pngblip')) {\r\n imageType = 'image/png';\r\n } else if (image.includes('\\\\jpegblip')) {\r\n imageType = 'image/jpeg';\r\n }\r\n\r\n if (imageType) {\r\n result.push({\r\n hex: image.replace(regexPictureHeader, '').replace(/[^\\da-fA-F]/g, ''),\r\n type: imageType,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Replaces `src` attribute value of all given images with the corresponding base64 image representation.\r\n * Uses the image index to precisely match with the correct hexadecimal representation from RTF data.\r\n *\r\n * @param imageElements Array of image elements along with their indices which will have their sources replaced.\r\n * @param imagesHexSources Array of images hex sources (usually the result of `extractImageDataFromRtf()` function).\r\n * Contains hexadecimal representations of ALL images in the document, not just those with `file://` URLs.\r\n * In XML documents, the same image might be defined both as base64 in HTML and as hexadecimal in RTF data.\r\n */\r\nfunction replaceImagesFileSourceWithInlineRepresentation(\r\n imageElements: Array<ImageWithIndex>,\r\n imagesHexSources: ReturnType<typeof extractImageDataFromRtf>,\r\n writer: ViewUpcastWriter\r\n) {\r\n for (let i = 0; i < imageElements.length; i++) {\r\n const { element, imageIndex } = imageElements[i];\r\n const rtfHexSource = imagesHexSources[imageIndex];\r\n\r\n if (rtfHexSource) {\r\n const newSrc = `data:${rtfHexSource.type};base64,${_convertHexToBase64(rtfHexSource.hex)}`;\r\n writer.setAttribute('src', newSrc, element);\r\n }\r\n }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/removemsattributes\r\n */\r\n\r\nimport { ViewUpcastWriter, type ViewDocumentFragment, type ViewElement } from 'ckeditor5';\r\n\r\n/**\r\n * Cleanup MS attributes like styles, attributes and elements.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard.\r\n * @internal\r\n */\r\nexport function removeMSAttributes( documentFragment: ViewDocumentFragment ): void {\r\n\tconst elementsToUnwrap: Array<ViewElement> = [];\r\n\r\n\tconst writer = new ViewUpcastWriter( documentFragment.document );\r\n\r\n\tfor ( const { item } of writer.createRangeIn( documentFragment ) ) {\r\n\t\tif ( !item.is( 'element' ) ) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tfor ( const className of item.getClassNames() ) {\r\n\t\t\tif ( /\\bmso/gi.exec( className ) ) {\r\n\t\t\t\twriter.removeClass( className, item );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor ( const styleName of item.getStyleNames() ) {\r\n\t\t\tif ( /\\bmso/gi.exec( styleName ) ) {\r\n\t\t\t\twriter.removeStyle( styleName, item );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\titem.is( 'element', 'w:sdt' ) ||\r\n\t\t\titem.is( 'element', 'w:sdtpr' ) && item.isEmpty ||\r\n\t\t\titem.is( 'element', 'o:p' ) && item.isEmpty\r\n\t\t) {\r\n\t\t\telementsToUnwrap.push( item );\r\n\t\t}\r\n\t}\r\n\r\n\tfor ( const item of elementsToUnwrap ) {\r\n\t\tconst itemParent = item.parent!;\r\n\t\tconst childIndex = itemParent.getChildIndex( item );\r\n\r\n\t\twriter.insertChild( childIndex, item.getChildren(), itemParent );\r\n\t\twriter.remove( item );\r\n\t}\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/utils\r\n */\r\n\r\n/**\r\n * Normalizes CSS length value to 'px'.\r\n *\r\n * @internal\r\n */\r\nexport function convertCssLengthToPx( value: string ): string {\r\n\tconst numericValue = parseFloat( value );\r\n\r\n\tif ( value.endsWith( 'pt' ) ) {\r\n\t\t// 1pt = 1in / 72\r\n\t\treturn toPx( numericValue * 96 / 72 );\r\n\t}\r\n\telse if ( value.endsWith( 'pc' ) ) {\r\n\t\t// 1pc = 12pt = 1in / 6.\r\n\t\treturn toPx( numericValue * 12 * 96 / 72 );\r\n\t}\r\n\telse if ( value.endsWith( 'in' ) ) {\r\n\t\t// 1in = 2.54cm = 96px\r\n\t\treturn toPx( numericValue * 96 );\r\n\t}\r\n\telse if ( value.endsWith( 'cm' ) ) {\r\n\t\t// 1cm = 96px / 2.54\r\n\t\treturn toPx( numericValue * 96 / 2.54 );\r\n\t}\r\n\telse if ( value.endsWith( 'mm' ) ) {\r\n\t\t// 1mm = 1cm / 10\r\n\t\treturn toPx( numericValue / 10 * 96 / 2.54 );\r\n\t}\r\n\r\n\treturn value;\r\n}\r\n\r\n/**\r\n * Returns true for value with 'px' unit.\r\n *\r\n * @internal\r\n */\r\nexport function isPx( value?: string ): value is string {\r\n\treturn value !== undefined && value.endsWith( 'px' );\r\n}\r\n\r\n/**\r\n * Returns a rounded 'px' value.\r\n *\r\n * @internal\r\n */\r\nexport function toPx( value: number ): string {\r\n\treturn Math.round( value ) + 'px';\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/table\r\n */\r\n\r\nimport { type ViewUpcastWriter, type ViewDocumentFragment } from 'ckeditor5';\r\n\r\nimport { convertCssLengthToPx } from './utils';\r\n\r\n/**\r\n * Applies border none for table and cells without a border specified.\r\n * Normalizes style length units to px.\r\n * Handles left block table alignment.\r\n *\r\n * @internal\r\n */\r\nexport function transformTables(\r\n documentFragment: ViewDocumentFragment,\r\n writer: ViewUpcastWriter,\r\n hasTablePropertiesPlugin: boolean = false,\r\n hasExtendedTableBlockAlignment: boolean = false\r\n): void {\r\n for (const item of writer.createRangeIn(documentFragment).getItems()) {\r\n if (!item.is('element', 'table') && !item.is('element', 'td') && !item.is('element', 'th')) {\r\n continue;\r\n }\r\n\r\n // In MS Word, left-aligned tables (default) have no align attribute on the `<table>` and are not wrapped in a `<div>`.\r\n // In such cases, we need to set `margin-left: 0` and `margin-right: auto` to indicate to the editor that\r\n // the table is block-aligned to the left.\r\n //\r\n // Center- and right-aligned tables in MS Word are wrapped in a `<div>` with the `align` attribute set to\r\n // `center` or `right`, respectively with no align attribute on the `<table>` itself.\r\n //\r\n // Additionally, the structure may change when pasting content from MS Word.\r\n // Some browsers (e.g., Safari) may insert extra elements around the table (e.g., a <span>),\r\n // so the surrounding `<div>` with the `align` attribute may end up being the table's grandparent.\r\n\r\n if (hasTablePropertiesPlugin && hasExtendedTableBlockAlignment && item.is('element', 'table')) {\r\n const directParent = item.parent?.is('element', 'div') ? item.parent : null;\r\n const grandParent = item.parent?.parent?.is('element', 'div') ? item.parent.parent : null;\r\n const divParent = directParent ?? grandParent;\r\n\r\n // Center block table alignment.\r\n if (divParent && divParent.getAttribute('align') === 'center' && !item.getAttribute('align')) {\r\n writer.setStyle('margin-left', 'auto', item);\r\n writer.setStyle('margin-right', 'auto', item);\r\n }\r\n // Right block table alignment.\r\n else if (divParent && divParent.getAttribute('align') === 'right' && !item.getAttribute('align')) {\r\n writer.setStyle('margin-left', 'auto', item);\r\n writer.setStyle('margin-right', '0', item);\r\n }\r\n // Left block table alignment.\r\n else if (!divParent && !item.getAttribute('align')) {\r\n writer.setStyle('margin-left', '0', item);\r\n writer.setStyle('margin-right', 'auto', item);\r\n }\r\n }\r\n\r\n const sides = ['left', 'top', 'right', 'bottom'];\r\n\r\n // As this is a pasted table, we do not want default table styles to apply here\r\n // so we set border node for sides that does not have any border style.\r\n // It is enough to verify border style as border color and border width properties have default values in DOM.\r\n if (sides.every(side => !item.hasStyle(`border-${side}-style`))) {\r\n writer.setStyle('border-style', 'none', item);\r\n } else {\r\n for (const side of sides) {\r\n if (!item.hasStyle(`border-${side}-style`)) {\r\n writer.setStyle(`border-${side}-style`, 'none', item);\r\n }\r\n }\r\n }\r\n\r\n // Translate style length units to px.\r\n const props = ['width', 'height', ...sides.map(side => `border-${side}-width`), ...sides.map(side => `padding-${side}`)];\r\n\r\n for (const prop of props) {\r\n if (item.hasStyle(prop)) {\r\n writer.setStyle(prop, convertCssLengthToPx(item.getStyle(prop)!), item);\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/removeinvalidtablewidth\r\n */\r\n\r\nimport type { ViewUpcastWriter, ViewDocumentFragment } from 'ckeditor5';\r\n\r\n/**\r\n * Removes the `width:0px` style from table pasted from Google Sheets and `width=\"0\"` attribute from Word tables.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard\r\n * @internal\r\n */\r\nexport function removeInvalidTableWidth( documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter ): void {\r\n\tfor ( const child of writer.createRangeIn( documentFragment ).getItems() ) {\r\n\t\tif ( child.is( 'element', 'table' ) ) {\r\n\t\t\t// Remove invalid width style (Google Sheets: width:0px).\r\n\t\t\tif ( child.getStyle( 'width' ) === '0px' ) {\r\n\t\t\t\twriter.removeStyle( 'width', child );\r\n\t\t\t}\r\n\r\n\t\t\t// Remove invalid width attribute (Word: width=\"0\").\r\n\t\t\tif ( child.getAttribute( 'width' ) === '0' ) {\r\n\t\t\t\twriter.removeAttribute( 'width', child );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/replacemsfootnotes\r\n */\r\n\r\nimport type { ViewDocumentFragment, ViewElement, ViewText, ViewUpcastWriter } from 'ckeditor5';\r\n\r\n/**\r\n * Replaces MS Word specific footnotes references and definitions with proper elements.\r\n *\r\n * Things to know about MS Word footnotes:\r\n *\r\n * * Footnote references in Word are marked with `mso-footnote-id` style.\r\n * * Word does not support nested footnotes, so references within definitions are ignored.\r\n * * Word appends extra spaces after footnote references within definitions, which are trimmed.\r\n * * Footnote definitions list is marked with `mso-element: footnote-list` style it contain `mso-element: footnote` elements.\r\n * * Footnote definition might contain tables, lists and other elements, not only text. They are placed directly within `li` element,\r\n * without any wrapper (in opposition to text content of the definition, which is placed within `MsoFootnoteText` element).\r\n *\r\n * Example pseudo document showing MS Word footnote structure:\r\n *\r\n * ```html\r\n * <p>Text with footnote<a style='mso-footnote-id:ftn1'>[1]</a> reference.</p>\r\n *\r\n * <div style='mso-element:footnote-list'>\r\n * \t<div style='mso-element:footnote' id=ftn1>\r\n * \t\t<p class=MsoFootnoteText><a style='mso-footnote-id:ftn1'>[1]</a> Footnote content</p>\r\n * \t\t<table class=\"MsoTableGrid\">...</table>\r\n * \t</div>\r\n * </div>\r\n * ```\r\n *\r\n * Will be transformed into:\r\n *\r\n * ```html\r\n * <p>Text with footnote<sup class=\"footnote\"><a id=\"ref-footnote-ftn1\" href=\"#footnote-ftn1\">1</a></sup> reference.</p>\r\n *\r\n * <ol class=\"footnotes\">\r\n * \t<li class=\"footnote-definition\" id=\"footnote-ftn1\">\r\n * \t\t<a href=\"#ref-footnote-ftn1\" class=\"footnote-backlink\">^</a>\r\n * \t\t<div class=\"footnote-content\">\r\n * \t\t\t<p>Footnote content</p>\r\n * \t\t\t<table>...</table>\r\n * \t\t</div>\r\n * \t</li>\r\n * </ol>\r\n * ```\r\n *\r\n * @param documentFragment `data.content` obtained from clipboard.\r\n * @param writer The view writer instance.\r\n * @internal\r\n */\r\nexport function replaceMSFootnotes(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\r\n const msFootnotesRefs = new Map<string, ViewElement>();\r\n const msFootnotesDefs = new Map<string, ViewElement>();\r\n let msFootnotesDefinitionsList: ViewElement | null = null;\r\n\r\n // Phase 1: Collect all footnotes references and definitions. Find the footnotes definitions list element.\r\n for (const { item } of writer.createRangeIn(documentFragment)) {\r\n if (!item.is('element')) {\r\n continue;\r\n }\r\n\r\n // If spot a footnotes definitions element, let's store it. It'll be replaced later.\r\n // There should be only one such element in the document.\r\n if (item.getStyle('mso-element') === 'footnote-list') {\r\n msFootnotesDefinitionsList = item;\r\n continue;\r\n }\r\n\r\n // If spot a footnote reference or definition, store it in the corresponding map.\r\n if (item.hasStyle('mso-footnote-id')) {\r\n const msFootnoteDef = item.findAncestor('element', el => el.getStyle('mso-element') === 'footnote');\r\n\r\n if (msFootnoteDef) {\r\n // If it's a reference within a definition, ignore it and track only the definition.\r\n // MS Word do not support nested footnotes, so it's safe to assume that all references within\r\n // a definition point to the same definition.\r\n const msFootnoteDefId = msFootnoteDef.getAttribute('id')!;\r\n\r\n msFootnotesDefs.set(msFootnoteDefId, msFootnoteDef);\r\n } else {\r\n // If it's a reference outside of a definition, track it as a reference.\r\n const msFootnoteRefId = item.getStyle('mso-footnote-id')!;\r\n\r\n msFootnotesRefs.set(msFootnoteRefId, item);\r\n }\r\n\r\n continue;\r\n }\r\n }\r\n\r\n // If there are no footnotes references or definitions, or no definitions list, there's nothing to normalize.\r\n if (!msFootnotesRefs.size || !msFootnotesDefinitionsList) {\r\n return;\r\n }\r\n\r\n // Phase 2: Replace footnotes definitions list with proper element.\r\n const footnotesDefinitionsList = createFootnotesListViewElement(writer);\r\n\r\n writer.replace(msFootnotesDefinitionsList, footnotesDefinitionsList);\r\n\r\n // Phase 3: Replace all footnotes references and add matching definitions to the definitions list.\r\n for (const [footnoteId, msFootnoteRef] of msFootnotesRefs) {\r\n const msFootnoteDef = msFootnotesDefs.get(footnoteId);\r\n\r\n if (!msFootnoteDef) {\r\n continue;\r\n }\r\n\r\n // Replace footnote reference.\r\n writer.replace(msFootnoteRef, createFootnoteRefViewElement(writer, footnoteId));\r\n\r\n // Append found matching definition to the definitions list.\r\n // Order doesn't matter here, as it'll be fixed in the post-fixer.\r\n const defElements = createFootnoteDefViewElement(writer, footnoteId);\r\n\r\n removeMSReferences(writer, msFootnoteDef);\r\n\r\n // Insert content within the `MsoFootnoteText` element. It's usually a definition text content.\r\n for (const child of msFootnoteDef.getChildren()) {\r\n let clonedChild = child;\r\n\r\n if (child.is('element')) {\r\n clonedChild = writer.clone(child, true);\r\n }\r\n\r\n writer.appendChild(clonedChild, defElements.content);\r\n }\r\n\r\n writer.appendChild(defElements.listItem, footnotesDefinitionsList);\r\n }\r\n}\r\n\r\n/**\r\n * Removes all MS Office specific references from the given element.\r\n *\r\n * It also removes leading space from text nodes following the references, as MS Word adds\r\n * them to separate the reference from the rest of the text.\r\n *\r\n * @param writer The view writer.\r\n * @param element The element to trim.\r\n * @returns The trimmed element.\r\n */\r\nfunction removeMSReferences(writer: ViewUpcastWriter, element: ViewElement): ViewElement {\r\n const elementsToRemove: Array<ViewElement> = [];\r\n const textNodesToTrim: Array<ViewText> = [];\r\n\r\n for (const { item } of writer.createRangeIn(element)) {\r\n if (item.is('element') && item.getStyle('mso-footnote-id')) {\r\n elementsToRemove.unshift(item);\r\n\r\n // MS Word used to add spaces after footnote references within definitions. Let's check if there's a space after\r\n // the footnote reference and mark it for trimming.\r\n const { nextSibling } = item;\r\n\r\n if (nextSibling?.is('$text') && nextSibling.data.startsWith(' ')) {\r\n textNodesToTrim.unshift(nextSibling);\r\n }\r\n }\r\n }\r\n\r\n for (const element of elementsToRemove) {\r\n writer.remove(element);\r\n }\r\n\r\n // Remove only the leading space from text nodes following reference within definition, preserve the rest of the text.\r\n for (const textNode of textNodesToTrim) {\r\n const trimmedData = textNode.data.substring(1);\r\n\r\n if (trimmedData.length > 0) {\r\n // Create a new text node and replace the old one.\r\n const parent = textNode.parent!;\r\n const index = parent.getChildIndex(textNode);\r\n const newTextNode = writer.createText(trimmedData);\r\n\r\n writer.remove(textNode);\r\n writer.insertChild(index, newTextNode, parent);\r\n } else {\r\n // If the text node contained only a space, remove it entirely.\r\n writer.remove(textNode);\r\n }\r\n }\r\n\r\n return element;\r\n}\r\n\r\n/**\r\n * Creates a footnotes list view element.\r\n *\r\n * @param writer The view writer instance.\r\n * @returns The footnotes list view element.\r\n */\r\nfunction createFootnotesListViewElement(writer: ViewUpcastWriter): ViewElement {\r\n return writer.createElement('ol', { class: 'footnotes' });\r\n}\r\n\r\n/**\r\n * Creates a footnote reference view element.\r\n *\r\n * @param writer The view writer instance.\r\n * @param footnoteId The footnote ID.\r\n * @returns The footnote reference view element.\r\n */\r\nfunction createFootnoteRefViewElement(writer: ViewUpcastWriter, footnoteId: string): ViewElement {\r\n const sup = writer.createElement('sup', { class: 'footnote' });\r\n const link = writer.createElement('a', {\r\n id: `ref-${footnoteId}`,\r\n href: `#${footnoteId}`,\r\n });\r\n\r\n writer.appendChild(link, sup);\r\n\r\n return sup;\r\n}\r\n\r\n/**\r\n * Creates a footnote definition view element with a backlink and a content container.\r\n *\r\n * @param writer The view writer instance.\r\n * @param footnoteId The footnote ID.\r\n * @returns An object containing the list item element, backlink and content container.\r\n */\r\nfunction createFootnoteDefViewElement(\r\n writer: ViewUpcastWriter,\r\n footnoteId: string\r\n): {\r\n listItem: ViewElement;\r\n content: ViewElement;\r\n} {\r\n const listItem = writer.createElement('li', {\r\n id: footnoteId,\r\n class: 'footnote-definition',\r\n });\r\n\r\n const backLink = writer.createElement('a', {\r\n href: `#ref-${footnoteId}`,\r\n class: 'footnote-backlink',\r\n });\r\n\r\n const content = writer.createElement('div', {\r\n class: 'footnote-content',\r\n });\r\n\r\n writer.appendChild(writer.createText('^'), backLink);\r\n writer.appendChild(backLink, listItem);\r\n writer.appendChild(content, listItem);\r\n\r\n return {\r\n listItem,\r\n content,\r\n };\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/normalizers/mswordnormalizer\r\n */\r\n\r\nimport { transformBookmarks } from '../filters/bookmark';\r\nimport { transformListItemLikeElementsIntoLists } from '../filters/list';\r\nimport { replaceImagesSourceWithBase64 } from '../filters/image';\r\nimport { removeMSAttributes } from '../filters/removemsattributes';\r\nimport { transformTables } from '../filters/table';\r\nimport { removeInvalidTableWidth } from '../filters/removeinvalidtablewidth';\r\nimport { replaceMSFootnotes } from '../filters/replacemsfootnotes';\r\nimport { ViewUpcastWriter, type ViewDocument } from 'ckeditor5';\r\nimport type { PasteFromOfficeNormalizer, PasteFromOfficeNormalizerData } from '../types';\r\n\r\nconst msWordMatch1 = /<meta\\s*name=\"?generator\"?\\s*content=\"?microsoft\\s*word\\s*\\d+\"?\\/?>/i;\r\nconst msWordMatch2 = /xmlns:o=\"urn:schemas-microsoft-com/i;\r\n\r\n/**\r\n * Normalizer for the content pasted from Microsoft Word.\r\n */\r\nexport class PasteFromOfficeMSWordNormalizer implements PasteFromOfficeNormalizer {\r\n public readonly document: ViewDocument;\r\n\r\n public readonly hasMultiLevelListPlugin: boolean;\r\n\r\n public readonly hasTablePropertiesPlugin: boolean;\r\n\r\n public readonly hasExtendedTableBlockAlignment: boolean;\r\n\r\n /**\r\n * Creates a new `PasteFromOfficeMSWordNormalizer` instance.\r\n *\r\n * @param document View document.\r\n */\r\n constructor(\r\n document: ViewDocument,\r\n hasMultiLevelListPlugin: boolean = false,\r\n hasTablePropertiesPlugin: boolean = false,\r\n hasExtendedTableBlockAlignment: boolean = false\r\n ) {\r\n this.document = document;\r\n this.hasMultiLevelListPlugin = hasMultiLevelListPlugin;\r\n this.hasTablePropertiesPlugin = hasTablePropertiesPlugin;\r\n this.hasExtendedTableBlockAlignment = hasExtendedTableBlockAlignment;\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public isActive(htmlString: string): boolean {\r\n return msWordMatch1.test(htmlString) || msWordMatch2.test(htmlString);\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public execute(data: PasteFromOfficeNormalizerData): void {\r\n const writer = new ViewUpcastWriter(this.document);\r\n const { body: documentFragment, stylesString } = data._parsedData;\r\n\r\n transformBookmarks(documentFragment, writer);\r\n // transformListItemLikeElementsIntoLists(documentFragment, stylesString, this.hasMultiLevelListPlugin);\r\n replaceImagesSourceWithBase64(documentFragment, data.dataTransfer.getData('text/rtf'));\r\n transformTables(documentFragment, writer, this.hasTablePropertiesPlugin, this.hasExtendedTableBlockAlignment);\r\n removeInvalidTableWidth(documentFragment, writer);\r\n replaceMSFootnotes(documentFragment, writer);\r\n removeMSAttributes(documentFragment);\r\n\r\n data.content = documentFragment;\r\n }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/removeboldwrapper\r\n */\r\n\r\nimport type { ViewUpcastWriter, ViewDocumentFragment } from 'ckeditor5';\r\n\r\n/**\r\n * Removes the `<b>` tag wrapper added by Google Docs to a copied content.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard\r\n * @internal\r\n */\r\nexport function removeBoldWrapper( documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter ): void {\r\n\tfor ( const child of documentFragment.getChildren() ) {\r\n\t\tif ( child.is( 'element', 'b' ) && child.getStyle( 'font-weight' ) === 'normal' ) {\r\n\t\t\tconst childIndex = documentFragment.getChildIndex( child );\r\n\r\n\t\t\twriter.remove( child );\r\n\t\t\twriter.insertChild( childIndex, child.getChildren(), documentFragment );\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/br\r\n */\r\n\r\nimport {\r\n\tViewDomConverter,\r\n\tViewDocument,\r\n\ttype ViewUpcastWriter,\r\n\ttype ViewDocumentFragment,\r\n\ttype ViewElement,\r\n\ttype ViewNode\r\n} from 'ckeditor5';\r\n\r\n/**\r\n * Transforms `<br>` elements that are siblings to some block element into a paragraphs.\r\n *\r\n * @param documentFragment The view structure to be transformed.\r\n * @internal\r\n */\r\nexport function transformBlockBrsToParagraphs(\r\n\tdocumentFragment: ViewDocumentFragment,\r\n\twriter: ViewUpcastWriter\r\n): void {\r\n\tconst viewDocument = new ViewDocument( writer.document.stylesProcessor );\r\n\tconst domConverter = new ViewDomConverter( viewDocument, { renderingMode: 'data' } );\r\n\r\n\tconst blockElements = domConverter.blockElements;\r\n\tconst inlineObjectElements = domConverter.inlineObjectElements;\r\n\r\n\tconst elementsToReplace = [];\r\n\r\n\tfor ( const value of writer.createRangeIn( documentFragment ) ) {\r\n\t\tconst element = value.item;\r\n\r\n\t\tif ( element.is( 'element', 'br' ) ) {\r\n\t\t\tconst nextSibling = findSibling( element, 'forward', writer, { blockElements, inlineObjectElements } );\r\n\t\t\tconst previousSibling = findSibling( element, 'backward', writer, { blockElements, inlineObjectElements } );\r\n\r\n\t\t\tconst nextSiblingIsBlock = isBlockViewElement( nextSibling, blockElements );\r\n\t\t\tconst previousSiblingIsBlock = isBlockViewElement( previousSibling, blockElements );\r\n\r\n\t\t\t// If the <br> is surrounded by blocks then convert it to a paragraph:\r\n\t\t\t// * <p>foo</p>[<br>]<p>bar</p> -> <p>foo</p>[<p></p>]<p>bar</p>\r\n\t\t\t// * <p>foo</p>[<br>] -> <p>foo</p>[<p></p>]\r\n\t\t\t// * [<br>]<p>foo</p> -> [<p></p>]<p>foo</p>\r\n\t\t\tif ( previousSiblingIsBlock || nextSiblingIsBlock ) {\r\n\t\t\t\telementsToReplace.push( element );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfor ( const element of elementsToReplace ) {\r\n\t\tif ( element.hasClass( 'Apple-interchange-newline' ) ) {\r\n\t\t\twriter.remove( element );\r\n\t\t} else {\r\n\t\t\twriter.replace( element, writer.createElement( 'p' ) );\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Returns sibling node, threats inline elements as transparent (but should stop on an inline objects).\r\n */\r\nfunction findSibling(\r\n\tviewElement: ViewElement,\r\n\tdirection: 'forward' | 'backward',\r\n\twriter: ViewUpcastWriter,\r\n\t{ blockElements, inlineObjectElements }: { blockElements: Array<string>; inlineObjectElements: Array<string> }\r\n) {\r\n\tlet position = writer.createPositionAt( viewElement, direction == 'forward' ? 'after' : 'before' );\r\n\r\n\t// Find first position that is just before a first:\r\n\t// * text node,\r\n\t// * block element,\r\n\t// * inline object element.\r\n\t// It's ignoring any inline (non-object) elements like span, strong, etc.\r\n\tposition = position.getLastMatchingPosition( ( { item } ) => (\r\n\t\titem.is( 'element' ) &&\r\n\t\t!blockElements.includes( item.name ) &&\r\n\t\t!inlineObjectElements.includes( item.name )\r\n\t), { direction } );\r\n\r\n\treturn direction == 'forward' ? position.nodeAfter : position.nodeBefore;\r\n}\r\n\r\n/**\r\n * Returns true for view elements that are listed as block view elements.\r\n */\r\nfunction isBlockViewElement( node: ViewNode | null, blockElements: Array<string> ) {\r\n\treturn !!node && node.is( 'element' ) && blockElements.includes( node.name );\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/list\r\n */\r\n\r\nimport {\r\n Matcher,\r\n ViewUpcastWriter,\r\n type ViewDocumentFragment,\r\n type ViewElement,\r\n type ViewNode,\r\n type ViewText,\r\n} from 'ckeditor5';\r\n\r\nimport { convertCssLengthToPx, toPx } from './utils';\r\n\r\n/**\r\n * Transforms Word specific list-like elements to the semantic HTML lists.\r\n *\r\n * Lists in Word are represented by block elements with special attributes like:\r\n *\r\n * ```xml\r\n * <p class=MsoListParagraphCxSpFirst style='mso-list:l1 level1 lfo1'>...</p> // Paragraph based list.\r\n * <h1 style='mso-list:l0 level1 lfo1'>...</h1> // Heading 1 based list.\r\n * ```\r\n *\r\n * @param documentFragment The view structure to be transformed.\r\n * @param stylesString Styles from which list-like elements styling will be extracted.\r\n * @internal\r\n */\r\nexport function transformListItemLikeElementsIntoLists(\r\n documentFragment: ViewDocumentFragment,\r\n stylesString: string,\r\n hasMultiLevelListPlugin: boolean\r\n): void {\r\n if (!documentFragment.childCount) {\r\n return;\r\n }\r\n\r\n const writer = new ViewUpcastWriter(documentFragment.document);\r\n const itemLikeElements = findAllItemLikeElements(documentFragment, writer);\r\n\r\n if (!itemLikeElements.length) {\r\n return;\r\n }\r\n\r\n const encounteredLists: Record<string, number> = {};\r\n\r\n const stack: ListStack = [];\r\n\r\n let topLevelListInfo: TopLevelListInfo = createTopLevelListInfo();\r\n\r\n for (const itemLikeElement of itemLikeElements) {\r\n if (itemLikeElement.indent !== undefined) {\r\n if (!isListContinuation(itemLikeElement)) {\r\n applyIndentationToTopLevelList(writer, stack, topLevelListInfo);\r\n topLevelListInfo = createTopLevelListInfo();\r\n stack.length = 0;\r\n }\r\n\r\n // Combined list ID for addressing encounter lists counters.\r\n const originalListId = `${itemLikeElement.id}:${itemLikeElement.indent}`;\r\n\r\n // Normalized list item indentation.\r\n const indent = Math.min(itemLikeElement.indent - 1, stack.length);\r\n\r\n // Trimming of the list stack on list ID change.\r\n if (indent < stack.length && stack[indent].id !== itemLikeElement.id) {\r\n stack.length = indent;\r\n }\r\n\r\n // Trimming of the list stack on lower indent list encountered.\r\n if (indent < stack.length - 1) {\r\n stack.length = indent + 1;\r\n } else {\r\n const listStyle = detectListStyle(itemLikeElement, stylesString);\r\n\r\n // Create a new OL/UL if required (greater indent or different list type).\r\n if (indent > stack.length - 1 || stack[indent].listElement.name != listStyle.type) {\r\n // Check if there is some start index to set from a previous list.\r\n if (indent == 0 && listStyle.type == 'ol' && itemLikeElement.id !== undefined && encounteredLists[originalListId]) {\r\n listStyle.startIndex = encounteredLists[originalListId];\r\n }\r\n\r\n const listElement = createNewEmptyList(listStyle, writer, hasMultiLevelListPlugin);\r\n\r\n // Insert the new OL/UL.\r\n if (stack.length == 0) {\r\n const parent = itemLikeElement.element.parent!;\r\n const index = parent.getChildIndex(itemLikeElement.element) + 1;\r\n\r\n writer.insertChild(index, listElement, parent);\r\n } else {\r\n const parentListItems = stack[indent - 1].listItemElements;\r\n\r\n writer.appendChild(listElement, parentListItems[parentListItems.length - 1]);\r\n }\r\n\r\n // Update the list stack for other items to reference.\r\n stack[indent] = {\r\n ...itemLikeElement,\r\n listElement,\r\n listItemElements: [],\r\n };\r\n\r\n // Prepare list counter for start index.\r\n if (indent == 0 && itemLikeElement.id !== undefined) {\r\n encounteredLists[originalListId] = listStyle.startIndex || 1;\r\n }\r\n }\r\n }\r\n\r\n // Use LI if it is already it or create a new LI element.\r\n // https://github.com/ckeditor/ckeditor5/issues/15964\r\n const listItem = itemLikeElement.element.name == 'li' ? itemLikeElement.element : writer.createElement('li');\r\n\r\n applyListItemMarginLeftAndUpdateTopLevelInfo(writer, stack, topLevelListInfo, itemLikeElement, listItem, indent);\r\n\r\n // Append the LI to OL/UL.\r\n writer.appendChild(listItem, stack[indent].listElement);\r\n stack[indent].listItemElements.push(listItem);\r\n\r\n // Increment list counter.\r\n if (indent == 0 && itemLikeElement.id !== undefined) {\r\n encounteredLists[originalListId]++;\r\n }\r\n\r\n // Append list block to LI.\r\n if (itemLikeElement.element != listItem) {\r\n writer.appendChild(itemLikeElement.element, listItem);\r\n }\r\n\r\n // Clean list block.\r\n removeBulletElement(itemLikeElement.element, writer);\r\n writer.removeStyle('text-indent', itemLikeElement.element); // #12361\r\n writer.removeStyle('margin-left', itemLikeElement.element);\r\n } else {\r\n // Other blocks in a list item.\r\n const stackItem = stack.find(stackItem => stackItem.marginLeft == itemLikeElement.marginLeft);\r\n\r\n // This might be a paragraph that has known margin, but it is not a real list block.\r\n if (stackItem) {\r\n const listItems = stackItem.listItemElements;\r\n\r\n // Append block to LI.\r\n writer.appendChild(itemLikeElement.element, listItems[listItems.length - 1]);\r\n writer.removeStyle('margin-left', itemLikeElement.element);\r\n } else {\r\n stack.length = 0;\r\n }\r\n }\r\n }\r\n\r\n applyIndentationToTopLevelList(writer, stack, topLevelListInfo);\r\n}\r\n\r\nfunction applyListItemMarginLeftAndUpdateTopLevelInfo(\r\n writer: ViewUpcastWriter,\r\n stack: ListStack,\r\n topLevelListInfo: TopLevelListInfo,\r\n itemLikeElement: ListLikeElement,\r\n listItem: ViewElement,\r\n indent: number\r\n) {\r\n if (itemLikeElement.marginLeft === undefined) {\r\n // If at least one of the list items at indent = 0 does not have margin-left style, we cannot set margin-left on the list.\r\n if (indent == 0) {\r\n topLevelListInfo.canApplyMarginOnList = false;\r\n }\r\n\r\n return;\r\n }\r\n\r\n const listItemBlockMarginLeft = parseFloat(itemLikeElement.marginLeft);\r\n\r\n let currentListBlockIndent = 0;\r\n\r\n if (stack.length > 1) {\r\n const prevStackLevelItems = stack[stack.length - 2].listItemElements;\r\n\r\n if (prevStackLevelItems.length > 0) {\r\n // The margin-left style of the previous indent level last item is already a relative value applied in the previous iteration.\r\n const lastItemMargin = prevStackLevelItems[prevStackLevelItems.length - 1].getStyle('margin-left');\r\n\r\n if (lastItemMargin !== undefined) {\r\n currentListBlockIndent += parseFloat(lastItemMargin);\r\n }\r\n }\r\n }\r\n\r\n // Add 40px for each indent level because by default HTML lists have 40px indentation (padding-inline-start: 40px).\r\n // So every nested list is indented by another 40px.\r\n // Additionally, the nested list itself may be placed in a list item with margin-left style.\r\n currentListBlockIndent += stack.length * 40;\r\n\r\n // Calculate relative list item indentation to the list it is in.\r\n const adjustedListItemIndent = listItemBlockMarginLeft - currentListBlockIndent;\r\n const listItemBlockMarginLeftPx = adjustedListItemIndent !== 0 ? toPx(adjustedListItemIndent) : undefined;\r\n\r\n if (listItemBlockMarginLeftPx) {\r\n writer.setStyle('margin-left', listItemBlockMarginLeftPx, listItem);\r\n\r\n if (indent == 0 && topLevelListInfo.canApplyMarginOnList) {\r\n if (topLevelListInfo.marginLeft === undefined) {\r\n topLevelListInfo.marginLeft = listItemBlockMarginLeftPx;\r\n }\r\n\r\n if (listItemBlockMarginLeftPx !== topLevelListInfo.marginLeft) {\r\n topLevelListInfo.canApplyMarginOnList = false;\r\n }\r\n\r\n topLevelListInfo.topLevelListItemElements.push(listItem);\r\n }\r\n }\r\n}\r\n\r\nfunction createTopLevelListInfo(): TopLevelListInfo {\r\n return {\r\n marginLeft: undefined,\r\n canApplyMarginOnList: true,\r\n topLevelListItemElements: [],\r\n };\r\n}\r\n\r\n/**\r\n * Sets margin-left style to the top-level list if all its items have the same margin-left.\r\n * If margin-left is set on the list, it is removed from all its items to avoid doubling of margins.\r\n */\r\nfunction applyIndentationToTopLevelList(writer: ViewUpcastWriter, stack: ListStack, topLevelListInfo: TopLevelListInfo) {\r\n if (topLevelListInfo.canApplyMarginOnList && topLevelListInfo.marginLeft && topLevelListInfo.topLevelListItemElements.length > 0) {\r\n // Apply margin-left to the top-level list if all its items have the same margin-left.\r\n writer.setStyle('margin-left', topLevelListInfo.marginLeft, stack[0].listElement);\r\n\r\n // Remove margin-left from all top-level list items.\r\n for (const topLevelListItem of topLevelListInfo.topLevelListItemElements) {\r\n writer.removeStyle('margin-left', topLevelListItem);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Removes paragraph wrapping content inside a list item.\r\n *\r\n * @internal\r\n */\r\nexport function unwrapParagraphInListItem(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): void {\r\n for (const value of writer.createRangeIn(documentFragment)) {\r\n const element = value.item;\r\n\r\n if (element.is('element', 'li')) {\r\n // Google Docs allows for single paragraph inside LI.\r\n const firstChild = element.getChild(0);\r\n\r\n if (firstChild && firstChild.is('element', 'p')) {\r\n writer.unwrapElement(firstChild);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Finds all list-like elements in a given document fragment.\r\n *\r\n * @param documentFragment Document fragment in which to look for list-like nodes.\r\n * @returns Array of found list-like items. Each item is an object containing\r\n * @internal\r\n */\r\nfunction findAllItemLikeElements(documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter): Array<ListLikeElement> {\r\n const range = writer.createRangeIn(documentFragment);\r\n const itemLikeElements: Array<ListLikeElement> = [];\r\n const foundMargins = new Set<string>();\r\n\r\n for (const item of range.getItems()) {\r\n // https://github.com/ckeditor/ckeditor5/issues/15964\r\n if (!item.is('element') || !item.name.match(/^(p|h\\d+|li|div)$/)) {\r\n continue;\r\n }\r\n\r\n // Try to rely on margin-left style to find paragraphs visually aligned with previously encountered list item.\r\n let marginLeft = getMarginLeftNormalized(item);\r\n\r\n // Ignore margin-left 0 style if there is no MsoList... class.\r\n if (\r\n marginLeft !== undefined &&\r\n parseFloat(marginLeft) == 0 &&\r\n !Array.from(item.getClassNames()).find(className => className.startsWith('MsoList'))\r\n ) {\r\n marginLeft = undefined;\r\n }\r\n\r\n // List item or a following list item block.\r\n if ((item.hasStyle('mso-list') && item.getStyle('mso-list') !== 'none') || (marginLeft !== undefined && foundMargins.has(marginLeft))) {\r\n const itemData = getListItemData(item);\r\n\r\n itemLikeElements.push({\r\n element: item,\r\n id: itemData.id,\r\n order: itemData.order,\r\n indent: itemData.indent,\r\n marginLeft,\r\n });\r\n\r\n if (marginLeft !== undefined) {\r\n foundMargins.add(marginLeft);\r\n }\r\n }\r\n // Clear found margins as we found block after a list.\r\n else {\r\n foundMargins.clear();\r\n }\r\n }\r\n\r\n return itemLikeElements;\r\n}\r\n\r\n/**\r\n * Whether the given element is possibly a list continuation. Previous element was wrapped into a list\r\n * or the current element already is inside a list.\r\n */\r\nfunction isListContinuation(currentItem: ListLikeElement) {\r\n const previousSibling = currentItem.element.previousSibling;\r\n\r\n if (!previousSibling) {\r\n const parent = currentItem.element.parent as ViewElement;\r\n\r\n // If it's a li inside ul or ol like in here: https://github.com/ckeditor/ckeditor5/issues/15964.\r\n // If the parent has previous sibling, which is not a list, then it is not a continuation.\r\n return isList(parent) && (!parent.previousSibling || isList(parent.previousSibling));\r\n }\r\n\r\n // Even with the same id the list does not have to be continuous (#43).\r\n return isList(previousSibling);\r\n}\r\n\r\nfunction isList(element: ViewNode) {\r\n return element.is('element', 'ol') || element.is('element', 'ul');\r\n}\r\n\r\n/**\r\n * Extracts list item style from the provided CSS.\r\n *\r\n * List item style is extracted from the CSS stylesheet. Each list with its specific style attribute\r\n * value (`mso-list:l1 level1 lfo1`) has its dedicated properties in a CSS stylesheet defined with a selector like:\r\n *\r\n * ```css\r\n * @list l1:level1 { ... }\r\n * ```\r\n *\r\n * It contains `mso-level-number-format` property which defines list numbering/bullet style. If this property\r\n * is not defined it means default `decimal` numbering.\r\n *\r\n * Here CSS string representation is used as `mso-level-number-format` property is an invalid CSS property\r\n * and will be removed during CSS parsing.\r\n *\r\n * @param listLikeItem List-like item for which list style will be searched for. Usually\r\n * a result of `findAllItemLikeElements()` function.\r\n * @param stylesString CSS stylesheet.\r\n * @returns An object with properties:\r\n *\r\n * * type - List type, could be `ul` or `ol`.\r\n * * startIndex - List start index, valid only for ordered lists.\r\n * * style - List style, for example: `decimal`, `lower-roman`, etc. It is extracted\r\n * directly from Word stylesheet and adjusted to represent proper values for the CSS `list-style-type` property.\r\n * If it cannot be adjusted, the `null` value is returned.\r\n */\r\nfunction detectListStyle(listLikeItem: ListLikeElement, stylesString: string) {\r\n const listStyleRegexp = new RegExp(`@list l${listLikeItem.id}:level${listLikeItem.indent}\\\\s*({[^}]*)`, 'gi');\r\n const listStyleTypeRegex = /mso-level-number-format:([^;]{0,100});/gi;\r\n const listStartIndexRegex = /mso-level-start-at:\\s{0,100}([0-9]{0,10})\\s{0,100};/gi;\r\n const legalStyleListRegex = new RegExp(`@list\\\\s+l${listLikeItem.id}:level\\\\d\\\\s*{[^{]*mso-level-text:\"%\\\\d\\\\\\\\.`, 'gi');\r\n const multiLevelNumberFormatTypeRegex = new RegExp(`@list l${listLikeItem.id}:level\\\\d\\\\s*{[^{]*mso-level-number-format:`, 'gi');\r\n\r\n const legalStyleListMatch = legalStyleListRegex.exec(stylesString);\r\n const multiLevelNumberFormatMatch = multiLevelNumberFormatTypeRegex.exec(stylesString);\r\n\r\n // Multi level lists in Word have mso-level-number-format attribute except legal lists,\r\n // so we used that. If list has legal list match and doesn't has mso-level-number-format\r\n // then this is legal-list.\r\n const islegalStyleList = legalStyleListMatch && !multiLevelNumberFormatMatch;\r\n\r\n const listStyleMatch = listStyleRegexp.exec(stylesString);\r\n\r\n let listStyleType = 'decimal'; // Decimal is default one.\r\n let type = 'ol'; // <ol> is default list.\r\n let startIndex = null;\r\n\r\n if (listStyleMatch && listStyleMatch[1]) {\r\n const listStyleTypeMatch = listStyleTypeRegex.exec(listStyleMatch[1]);\r\n\r\n if (listStyleTypeMatch && listStyleTypeMatch[1]) {\r\n listStyleType = listStyleTypeMatch[1].trim();\r\n type = listStyleType !== 'bullet' && listStyleType !== 'image' ? 'ol' : 'ul';\r\n }\r\n\r\n // Styles for the numbered lists are always defined in the Word CSS stylesheet.\r\n // Unordered lists MAY contain a value for the Word CSS definition `mso-level-text` but sometimes\r\n // this tag is missing. And because of that, we cannot depend on that. We need to predict the list style value\r\n // based on the list style marker element.\r\n if (listStyleType === 'bullet') {\r\n const bulletedStyle = findBulletedListStyle(listLikeItem.element);\r\n\r\n if (bulletedStyle) {\r\n listStyleType = bulletedStyle;\r\n }\r\n } else {\r\n const listStartIndexMatch = listStartIndexRegex.exec(listStyleMatch[1]);\r\n\r\n if (listStartIndexMatch && listStartIndexMatch[1]) {\r\n startIndex = parseInt(listStartIndexMatch[1]);\r\n }\r\n }\r\n\r\n if (islegalStyleList) {\r\n type = 'ol';\r\n }\r\n }\r\n\r\n return {\r\n type,\r\n startIndex,\r\n style: mapListStyleDefinition(listStyleType),\r\n isLegalStyleList: islegalStyleList,\r\n };\r\n}\r\n\r\n/**\r\n * Tries to extract the `list-style-type` value based on the marker element for bulleted list.\r\n */\r\nfunction findBulletedListStyle(element: ViewElement) {\r\n // https://github.com/ckeditor/ckeditor5/issues/15964\r\n if (element.name == 'li' && element.parent!.name == 'ul' && element.parent!.hasAttribute('type')) {\r\n return element.parent!.getAttribute('type');\r\n }\r\n\r\n const listMarkerElement = findListMarkerNode(element);\r\n\r\n if (!listMarkerElement) {\r\n return null;\r\n }\r\n\r\n const listMarker = listMarkerElement._data;\r\n\r\n if (listMarker === 'o') {\r\n return 'circle';\r\n } else if (listMarker === '·') {\r\n return 'disc';\r\n }\r\n // Word returns '§' instead of '■' for the square list style.\r\n else if (listMarker === '§') {\r\n return 'square';\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Tries to find a text node that represents the marker element (list-style-type).\r\n */\r\nfunction findListMarkerNode(element: ViewElement): ViewText | null {\r\n // If the first child is a text node, it is the data for the element.\r\n // The list-style marker is not present here.\r\n if (element.getChild(0)!.is('$text')) {\r\n return null;\r\n }\r\n\r\n for (const childNode of element.getChildren()) {\r\n // The list-style marker will be inside the `<span>` element. Let's ignore all non-span elements.\r\n // It may happen that the `<a>` element is added as the first child. Most probably, it's an anchor element.\r\n if (!childNode.is('element', 'span')) {\r\n continue;\r\n }\r\n\r\n const textNodeOrElement = childNode.getChild(0);\r\n\r\n if (!textNodeOrElement) {\r\n continue;\r\n }\r\n\r\n // If already found the marker element, use it.\r\n if (textNodeOrElement.is('$text')) {\r\n return textNodeOrElement;\r\n }\r\n\r\n return (textNodeOrElement as any).getChild(0);\r\n }\r\n\r\n /* istanbul ignore next -- @preserve */\r\n return null;\r\n}\r\n\r\n/**\r\n * Parses the `list-style-type` value extracted directly from the Word CSS stylesheet and returns proper CSS definition.\r\n */\r\nfunction mapListStyleDefinition(value: string) {\r\n if (value.startsWith('arabic-leading-zero')) {\r\n return 'decimal-leading-zero';\r\n }\r\n\r\n switch (value) {\r\n case 'alpha-upper':\r\n return 'upper-alpha';\r\n case 'alpha-lower':\r\n return 'lower-alpha';\r\n case 'roman-upper':\r\n return 'upper-roman';\r\n case 'roman-lower':\r\n return 'lower-roman';\r\n case 'circle':\r\n case 'disc':\r\n case 'square':\r\n return value;\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Creates a new list OL/UL element.\r\n */\r\nfunction createNewEmptyList(listStyle: ReturnType<typeof detectListStyle>, writer: ViewUpcastWriter, hasMultiLevelListPlugin: boolean) {\r\n const list = writer.createElement(listStyle.type);\r\n\r\n // We do not support modifying the marker for a particular list item.\r\n // Set the value for the `list-style-type` property directly to the list container.\r\n if (listStyle.style) {\r\n writer.setStyle('list-style-type', listStyle.style, list);\r\n }\r\n\r\n if (listStyle.startIndex && listStyle.startIndex > 1) {\r\n writer.setAttribute('start', listStyle.startIndex, list);\r\n }\r\n\r\n if (listStyle.isLegalStyleList && hasMultiLevelListPlugin) {\r\n writer.addClass('legal-list', list);\r\n }\r\n\r\n return list;\r\n}\r\n\r\n/**\r\n * Extracts list item information from Word specific list-like element style:\r\n *\r\n * ```\r\n * `style=\"mso-list:l1 level1 lfo1\"`\r\n * ```\r\n *\r\n * where:\r\n *\r\n * ```\r\n * * `l1` is a list id (however it does not mean this is a continuous list - see #43),\r\n * * `level1` is a list item indentation level,\r\n * * `lfo1` is a list insertion order in a document.\r\n * ```\r\n *\r\n * @param element Element from which style data is extracted.\r\n */\r\nfunction getListItemData(element: ViewElement): ListItemData {\r\n const listStyle = element.getStyle('mso-list');\r\n\r\n if (listStyle === undefined) {\r\n return {};\r\n }\r\n\r\n const idMatch = listStyle.match(/(^|\\s{1,100})l(\\d+)/i);\r\n const orderMatch = listStyle.match(/\\s{0,100}lfo(\\d+)/i);\r\n const indentMatch = listStyle.match(/\\s{0,100}level(\\d+)/i);\r\n\r\n if (idMatch && orderMatch && indentMatch) {\r\n return {\r\n id: idMatch[2],\r\n order: orderMatch[1],\r\n indent: parseInt(indentMatch[1]),\r\n };\r\n }\r\n\r\n return {\r\n indent: 1, // Handle empty mso-list style as a marked for default list item.\r\n };\r\n}\r\n\r\n/**\r\n * Removes span with a numbering/bullet from a given element.\r\n */\r\nfunction removeBulletElement(element: ViewElement, writer: ViewUpcastWriter) {\r\n // Matcher for finding `span` elements holding lists numbering/bullets.\r\n const bulletMatcher = new Matcher({\r\n name: 'span',\r\n styles: {\r\n 'mso-list': 'Ignore',\r\n },\r\n });\r\n\r\n const range = writer.createRangeIn(element);\r\n\r\n for (const value of range) {\r\n if (value.type === 'elementStart' && bulletMatcher.match(value.item as ViewElement)) {\r\n writer.remove(value.item as ViewElement);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Returns element left margin normalized to 'px' if possible.\r\n */\r\nfunction getMarginLeftNormalized(element: ViewElement): string | undefined {\r\n const value = element.getStyle('margin-left');\r\n\r\n if (value === undefined || value.endsWith('px')) {\r\n return value;\r\n }\r\n\r\n return convertCssLengthToPx(value);\r\n}\r\n\r\ninterface ListItemData {\r\n /**\r\n * Parent list id.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * List item creation order.\r\n */\r\n order?: string;\r\n\r\n /**\r\n * List item indentation level.\r\n */\r\n indent?: number;\r\n}\r\n\r\ninterface ListLikeElement extends ListItemData {\r\n /**\r\n * List-like element.\r\n */\r\n element: ViewElement;\r\n\r\n /**\r\n * The margin-left normalized to 'px' if possible.\r\n */\r\n marginLeft?: string;\r\n}\r\n\r\ntype ListStack = Array<\r\n ListLikeElement & {\r\n listElement: ViewElement;\r\n listItemElements: Array<ViewElement>;\r\n }\r\n>;\r\n\r\ntype TopLevelListInfo = {\r\n marginLeft: string | undefined;\r\n canApplyMarginOnList: boolean;\r\n topLevelListItemElements: Array<ViewElement>;\r\n};\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/normalizers/googledocsnormalizer\r\n */\r\n\r\nimport { ViewUpcastWriter, type ViewDocument } from 'ckeditor5';\r\n\r\nimport { removeBoldWrapper } from '../filters/removeboldwrapper';\r\nimport { transformBlockBrsToParagraphs } from '../filters/br';\r\nimport { unwrapParagraphInListItem } from '../filters/list';\r\nimport { replaceTabsWithinPreWithSpaces } from '../filters/replacetabswithinprewithspaces';\r\nimport type { PasteFromOfficeNormalizer, PasteFromOfficeNormalizerData } from '../types';\r\n\r\nconst googleDocsMatch = /id=(\"|')docs-internal-guid-[-0-9a-f]+(\"|')/i;\r\n\r\n/**\r\n * Normalizer for the content pasted from Google Docs.\r\n *\r\n * @internal\r\n */\r\nexport class GoogleDocsNormalizer implements PasteFromOfficeNormalizer {\r\n public readonly document: ViewDocument;\r\n\r\n /**\r\n * Creates a new `GoogleDocsNormalizer` instance.\r\n *\r\n * @param document View document.\r\n */\r\n constructor(document: ViewDocument) {\r\n this.document = document;\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public isActive(htmlString: string): boolean {\r\n return googleDocsMatch.test(htmlString);\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public execute(data: PasteFromOfficeNormalizerData): void {\r\n const writer = new ViewUpcastWriter(this.document);\r\n const { body: documentFragment } = data._parsedData;\r\n\r\n removeBoldWrapper(documentFragment, writer);\r\n unwrapParagraphInListItem(documentFragment, writer);\r\n transformBlockBrsToParagraphs(documentFragment, writer);\r\n // replaceTabsWithinPreWithSpaces( documentFragment, writer, 8 );\r\n\r\n data.content = documentFragment;\r\n }\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/removexmlns\r\n */\r\n\r\nimport type { ViewUpcastWriter, ViewDocumentFragment } from 'ckeditor5';\r\n\r\n/**\r\n * Removes the `xmlns` attribute from table pasted from Google Sheets.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard\r\n * @internal\r\n */\r\nexport function removeXmlns( documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter ): void {\r\n\tfor ( const child of documentFragment.getChildren() ) {\r\n\t\tif ( child.is( 'element', 'table' ) && child.hasAttribute( 'xmlns' ) ) {\r\n\t\t\twriter.removeAttribute( 'xmlns', child );\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/removegooglesheetstag\r\n */\r\n\r\nimport type { ViewUpcastWriter, ViewDocumentFragment } from 'ckeditor5';\r\n\r\n/**\r\n * Removes the `<google-sheets-html-origin>` tag wrapper added by Google Sheets to a copied content.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard\r\n * @internal\r\n */\r\nexport function removeGoogleSheetsTag( documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter ): void {\r\n\tfor ( const child of documentFragment.getChildren() ) {\r\n\t\tif ( child.is( 'element', 'google-sheets-html-origin' ) ) {\r\n\t\t\tconst childIndex = documentFragment.getChildIndex( child );\r\n\r\n\t\t\twriter.remove( child );\r\n\t\t\twriter.insertChild( childIndex, child.getChildren(), documentFragment );\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/removestyleblock\r\n */\r\n\r\nimport type { ViewUpcastWriter, ViewDocumentFragment } from 'ckeditor5';\r\n\r\n/**\r\n * Removes `<style>` block added by Google Sheets to a copied content.\r\n *\r\n * @param documentFragment element `data.content` obtained from clipboard\r\n * @internal\r\n */\r\nexport function removeStyleBlock( documentFragment: ViewDocumentFragment, writer: ViewUpcastWriter ): void {\r\n\tfor ( const child of Array.from( documentFragment.getChildren() ) ) {\r\n\t\tif ( child.is( 'element', 'style' ) ) {\r\n\t\t\twriter.remove( child );\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/normalizers/googlesheetsnormalizer\r\n */\r\n\r\nimport { ViewUpcastWriter, type ViewDocument } from 'ckeditor5';\r\n\r\nimport { removeXmlns } from '../filters/removexmlns';\r\nimport { removeGoogleSheetsTag } from '../filters/removegooglesheetstag';\r\nimport { removeInvalidTableWidth } from '../filters/removeinvalidtablewidth';\r\nimport { removeStyleBlock } from '../filters/removestyleblock';\r\nimport type { PasteFromOfficeNormalizer, PasteFromOfficeNormalizerData } from '../types';\r\n\r\nconst googleSheetsMatch = /<google-sheets-html-origin/i;\r\n\r\n/**\r\n * Normalizer for the content pasted from Google Sheets.\r\n *\r\n * @internal\r\n */\r\nexport class GoogleSheetsNormalizer implements PasteFromOfficeNormalizer {\r\n\tpublic readonly document: ViewDocument;\r\n\r\n\t/**\r\n\t * Creates a new `GoogleSheetsNormalizer` instance.\r\n\t *\r\n\t * @param document View document.\r\n\t */\r\n\tconstructor( document: ViewDocument ) {\r\n\t\tthis.document = document;\r\n\t}\r\n\r\n\t/**\r\n\t * @inheritDoc\r\n\t */\r\n\tpublic isActive( htmlString: string ): boolean {\r\n\t\treturn googleSheetsMatch.test( htmlString );\r\n\t}\r\n\r\n\t/**\r\n\t * @inheritDoc\r\n\t */\r\n\tpublic execute( data: PasteFromOfficeNormalizerData ): void {\r\n\t\tconst writer = new ViewUpcastWriter( this.document );\r\n\t\tconst { body: documentFragment } = data._parsedData;\r\n\r\n\t\tremoveGoogleSheetsTag( documentFragment, writer );\r\n\t\tremoveXmlns( documentFragment, writer );\r\n\t\tremoveInvalidTableWidth( documentFragment, writer );\r\n\t\tremoveStyleBlock( documentFragment, writer );\r\n\r\n\t\tdata.content = documentFragment;\r\n\t}\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/space\r\n */\r\n\r\n/**\r\n * Replaces last space preceding elements closing tag with ` `. Such operation prevents spaces from being removed\r\n * during further DOM/View processing (see especially {@link module:engine/view/domconverter~ViewDomConverter#_processDomInlineNodes}).\r\n * This method also takes into account Word specific `<o:p></o:p>` empty tags.\r\n * Additionally multiline sequences of spaces and new lines between tags are removed (see #39 and #40).\r\n *\r\n * @param htmlString HTML string in which spacing should be normalized.\r\n * @returns Input HTML with spaces normalized.\r\n * @internal\r\n */\r\nexport function normalizeSpacing(htmlString: string): string {\r\n // Run normalizeSafariSpaceSpans() two times to cover nested spans.\r\n return (\r\n normalizeSafariSpaceSpans(normalizeSafariSpaceSpans(htmlString))\r\n // Remove all \\r\\n from \"spacerun spans\" so the last replace line doesn't strip all whitespaces.\r\n .replace(/(<span\\s+style=['\"]mso-spacerun:yes['\"]>[^\\S\\r\\n]*?)[\\r\\n]+([^\\S\\r\\n]*<\\/span>)/g, '$1$2')\r\n .replace(/<span\\s+style=['\"]mso-spacerun:yes['\"]><\\/span>/g, '')\r\n .replace(/(<span\\s+style=['\"]letter-spacing:[^'\"]+?['\"]>)[\\r\\n]+(<\\/span>)/g, '$1 $2')\r\n .replace(/ <\\//g, '\\u00A0</')\r\n .replace(/ <o:p><\\/o:p>/g, '\\u00A0<o:p></o:p>')\r\n // Remove <o:p> block filler from empty paragraph. Safari uses \\u00A0 instead of .\r\n .replace(/<o:p>( |\\u00A0)<\\/o:p>/g, '')\r\n // Remove all whitespaces when they contain any \\r or \\n.\r\n .replace(/>([^\\S\\r\\n]*[\\r\\n]\\s*)</g, '><')\r\n );\r\n}\r\n\r\n/**\r\n * Normalizes spacing in special Word `spacerun spans` (`<span style='mso-spacerun:yes'>\\s+</span>`) by replacing\r\n * all spaces with ` ` pairs. This prevents spaces from being removed during further DOM/View processing\r\n * (see especially {@link module:engine/view/domconverter~ViewDomConverter#_processDomInlineNodes}).\r\n *\r\n * @param htmlDocument Native `Document` object in which spacing should be normalized.\r\n * @internal\r\n */\r\nexport function normalizeSpacerunSpans(htmlDocument: Document): void {\r\n htmlDocument.querySelectorAll('span[style*=spacerun]').forEach(el => {\r\n const htmlElement = el as HTMLElement;\r\n const innerTextLength = htmlElement.innerText.length || 0;\r\n\r\n htmlElement.innerText = Array(innerTextLength + 1)\r\n .join('\\u00A0 ')\r\n .substr(0, innerTextLength);\r\n });\r\n}\r\n\r\n/**\r\n * Normalizes specific spacing generated by Safari when content pasted from Word (`<span class=\"Apple-converted-space\"> </span>`)\r\n * by replacing all spaces sequences longer than 1 space with ` ` pairs. This prevents spaces from being removed during\r\n * further DOM/View processing (see especially {@link module:engine/view/domconverter~ViewDomConverter#_processDataFromDomText}).\r\n *\r\n * This function is similar to {@link module:clipboard/utils/normalizeclipboarddata normalizeClipboardData util} but uses\r\n * regular spaces / sequence for replacement.\r\n *\r\n * @param htmlString HTML string in which spacing should be normalized\r\n * @returns Input HTML with spaces normalized.\r\n * @internal\r\n */\r\nfunction normalizeSafariSpaceSpans(htmlString: string) {\r\n return htmlString.replace(/<span(?: class=\"Apple-converted-space\"|)>(\\s+)<\\/span>/g, (fullMatch, spaces) => {\r\n return spaces.length === 1\r\n ? ' '\r\n : Array(spaces.length + 1)\r\n .join('\\u00A0 ')\r\n .substr(0, spaces.length);\r\n });\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/filters/parse\r\n */\r\n\r\nimport { ViewDomConverter, ViewDocument, type StylesProcessor, type ViewDocumentFragment } from 'ckeditor5';\r\n\r\nimport { normalizeSpacing, normalizeSpacerunSpans } from './space';\r\n\r\n/**\r\n * Parses the provided HTML extracting contents of `<body>` and `<style>` tags.\r\n *\r\n * @param htmlString HTML string to be parsed.\r\n */\r\nexport function parsePasteOfficeHtml(htmlString: string, stylesProcessor: StylesProcessor): PasteOfficeHtmlParseResult {\r\n const domParser = new DOMParser();\r\n\r\n // Remove Word specific \"if comments\" so content inside is not omitted by the parser.\r\n htmlString = htmlString.replace(/<!--\\[if gte vml 1]>/g, '');\r\n\r\n // Clean the <head> section of MS Windows specific tags. See https://github.com/ckeditor/ckeditor5/issues/15333.\r\n // The regular expression matches the <o:SmartTagType> tag with optional attributes (with or without values).\r\n htmlString = htmlString.replace(/<o:SmartTagType(?:\\s+[^\\s>=]+(?:=\"[^\"]*\")?)*\\s*\\/?>/gi, '');\r\n\r\n const normalizedHtml = normalizeSpacing(cleanContentAfterBody(htmlString));\r\n\r\n // Parse htmlString as native Document object.\r\n const htmlDocument = domParser.parseFromString(normalizedHtml, 'text/html');\r\n\r\n normalizeSpacerunSpans(htmlDocument);\r\n\r\n // Get `innerHTML` first as transforming to View modifies the source document.\r\n const bodyString = htmlDocument.body.innerHTML;\r\n\r\n // Transform document.body to View.\r\n const bodyView = documentToView(htmlDocument, stylesProcessor);\r\n\r\n // Extract stylesheets.\r\n const stylesObject = extractStyles(htmlDocument);\r\n\r\n return {\r\n body: bodyView,\r\n bodyString,\r\n styles: stylesObject.styles,\r\n stylesString: stylesObject.stylesString,\r\n };\r\n}\r\n\r\n/**\r\n * The result of {@link ~parsePasteOfficeHtml}.\r\n */\r\nexport interface PasteOfficeHtmlParseResult {\r\n /**\r\n * Parsed body content as a traversable structure.\r\n */\r\n body: ViewDocumentFragment;\r\n\r\n /**\r\n * Entire body content as a string.\r\n */\r\n bodyString: string;\r\n\r\n /**\r\n * Array of native `CSSStyleSheet` objects, each representing separate `style` tag from the source HTML.\r\n */\r\n styles: Array<CSSStyleSheet>;\r\n\r\n /**\r\n * All `style` tags contents combined in the order of occurrence into one string.\r\n */\r\n stylesString: string;\r\n}\r\n\r\n/**\r\n * Transforms native `Document` object into {@link module:engine/view/documentfragment~ViewDocumentFragment}. Comments are skipped.\r\n *\r\n * @param htmlDocument Native `Document` object to be transformed.\r\n */\r\nfunction documentToView(htmlDocument: Document, stylesProcessor: StylesProcessor) {\r\n const viewDocument = new ViewDocument(stylesProcessor);\r\n const domConverter = new ViewDomConverter(viewDocument, { renderingMode: 'data' });\r\n const fragment = htmlDocument.createDocumentFragment();\r\n const nodes = htmlDocument.body.childNodes;\r\n\r\n while (nodes.length > 0) {\r\n fragment.appendChild(nodes[0]);\r\n }\r\n\r\n return domConverter.domToView(fragment, { skipComments: true }) as ViewDocumentFragment;\r\n}\r\n\r\n/**\r\n * Extracts both `CSSStyleSheet` and string representation from all `style` elements available in a provided `htmlDocument`.\r\n *\r\n * @param htmlDocument Native `Document` object from which styles will be extracted.\r\n */\r\nfunction extractStyles(htmlDocument: Document): { styles: Array<CSSStyleSheet>; stylesString: string } {\r\n const styles = [];\r\n const stylesString = [];\r\n const styleTags = Array.from(htmlDocument.getElementsByTagName('style'));\r\n\r\n for (const style of styleTags) {\r\n if (style.sheet && style.sheet.cssRules && style.sheet.cssRules.length) {\r\n styles.push(style.sheet);\r\n stylesString.push(style.innerHTML);\r\n }\r\n }\r\n\r\n return {\r\n styles,\r\n stylesString: stylesString.join(' '),\r\n };\r\n}\r\n\r\n/**\r\n * Removes leftover content from between closing </body> and closing </html> tag:\r\n *\r\n * ```html\r\n * <html><body><p>Foo Bar</p></body><span>Fo</span></html> -> <html><body><p>Foo Bar</p></body></html>\r\n * ```\r\n *\r\n * This function is used as specific browsers (Edge) add some random content after `body` tag when pasting from Word.\r\n * @param htmlString The HTML string to be cleaned.\r\n * @returns The HTML string with leftover content removed.\r\n */\r\nfunction cleanContentAfterBody(htmlString: string) {\r\n const bodyCloseTag = '</body>';\r\n const htmlCloseTag = '</html>';\r\n\r\n const bodyCloseIndex = htmlString.indexOf(bodyCloseTag);\r\n\r\n if (bodyCloseIndex < 0) {\r\n return htmlString;\r\n }\r\n\r\n const htmlCloseIndex = htmlString.indexOf(htmlCloseTag, bodyCloseIndex + bodyCloseTag.length);\r\n\r\n return htmlString.substring(0, bodyCloseIndex + bodyCloseTag.length) + (htmlCloseIndex >= 0 ? htmlString.substring(htmlCloseIndex) : '');\r\n}\r\n","/**\r\n * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.\r\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options\r\n */\r\n\r\n/**\r\n * @module paste-from-office/pastefromoffice\r\n */\r\n\r\nimport { Plugin, ClipboardPipeline } from 'ckeditor5';\r\n\r\nimport { PasteFromOfficeMSWordNormalizer } from './normalizers/mswordnormalizer';\r\nimport { GoogleDocsNormalizer } from './normalizers/googledocsnormalizer';\r\nimport { GoogleSheetsNormalizer } from './normalizers/googlesheetsnormalizer';\r\n\r\nimport { parsePasteOfficeHtml } from './filters/parse';\r\nimport type { PasteFromOfficeNormalizer, PasteFromOfficeNormalizerData } from './types';\r\n\r\n/**\r\n * The Paste from Office plugin.\r\n *\r\n * This plugin handles content pasted from Office apps and transforms it (if necessary)\r\n * to a valid structure which can then be understood by the editor features.\r\n *\r\n * Transformation is made by a set of predefined {@link module:paste-from-office/normalizer~PasteFromOfficeNormalizer normalizers}.\r\n * This plugin includes following normalizers:\r\n * * {@link module:paste-from-office/normalizers/mswordnormalizer~PasteFromOfficeMSWordNormalizer Microsoft Word normalizer}\r\n * * {@link module:paste-from-office/normalizers/googledocsnormalizer~GoogleDocsNormalizer Google Docs normalizer}\r\n *\r\n * For more information about this feature check the {@glink api/paste-from-office package page}.\r\n */\r\nexport class PasteHandler extends Plugin {\r\n /**\r\n * @inheritDoc\r\n */\r\n public static get pluginName() {\r\n return 'PasteHandler' as const;\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public static get requires() {\r\n return [ClipboardPipeline] as const;\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public init(): void {\r\n const editor = this.editor;\r\n const clipboardPipeline: ClipboardPipeline = editor.plugins.get('ClipboardPipeline');\r\n const viewDocument = editor.editing.view.document;\r\n const normalizers: Array<PasteFromOfficeNormalizer> = [];\r\n const hasMultiLevelListPlugin = this.editor.plugins.has('MultiLevelListEditing');\r\n const hasTablePropertiesPlugin = this.editor.plugins.has('TablePropertiesEditing');\r\n const hasExtendedTableBlockAlignment = !!this.editor.config.get('experimentalFlags.useExtendedTableBlockAlignment');\r\n\r\n normalizers.push(\r\n new PasteFromOfficeMSWordNormalizer(viewDocument, hasMultiLevelListPlugin, hasTablePropertiesPlugin, hasExtendedTableBlockAlignment)\r\n );\r\n normalizers.push(new GoogleDocsNormalizer(viewDocument));\r\n normalizers.push(new GoogleSheetsNormalizer(viewDocument));\r\n\r\n clipboardPipeline.on(\r\n 'inputTransformation',\r\n (evt, data: PasteFromOfficeNormalizerData) => {\r\n if (data._isTransformedWithPasteFromOffice) {\r\n return;\r\n }\r\n\r\n const codeBlock = editor.model.document.selection.getFirstPosition()!.parent;\r\n\r\n if (codeBlock.is('element', 'codeBlock')) {\r\n return;\r\n }\r\n\r\n const htmlString = data.dataTransfer.getData('text/html');\r\n const activeNormalizer = normalizers.find(normalizer => normalizer.isActive(htmlString));\r\n\r\n if (activeNormalizer) {\r\n if (!data._parsedData) {\r\n data._parsedData = parsePasteOfficeHtml(htmlString, viewDocument.stylesProcessor);\r\n }\r\n\r\n activeNormalizer.execute(data);\r\n\r\n data._isTransformedWithPasteFromOffice = true;\r\n }\r\n },\r\n { priority: 'high' }\r\n );\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class HighlightRangePlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n editor.conversion.for('editingDowncast').markerToHighlight({\r\n model: 'highlightRange',\r\n view: {\r\n classes: 'highlight-range',\r\n },\r\n });\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\n/**\r\n * Plugin để thêm margin-bottom: 4px cho các block elements\r\n * (paragraph, heading, list, table) thông qua downcast conversion\r\n */\r\nexport class BlockSpace extends Plugin {\r\n static get pluginName() {\r\n return 'BlockSpace';\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n const conversion = editor.conversion;\r\n\r\n // Handler factory để áp dụng margin-bottom: 4px\r\n const makeHandler = (elementType: string) => {\r\n return (evt: any, data: any, conversionApi: any) => {\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n if (viewElement) {\r\n conversionApi.writer.setStyle('margin-top', '0', viewElement);\r\n conversionApi.writer.setStyle('margin-bottom', '6pt', viewElement);\r\n conversionApi.writer.setStyle('padding-top', '0', viewElement);\r\n conversionApi.writer.setStyle('padding-bottom', '0', viewElement);\r\n conversionApi.writer.setStyle('line-height', '1.15', viewElement);\r\n }\r\n };\r\n };\r\n\r\n // Áp dụng margin-bottom cho tất cả block elements\r\n conversion.for('downcast').add(dispatcher => {\r\n // Paragraph\r\n dispatcher.on('insert:paragraph', makeHandler('paragraph'), { priority: 'low' });\r\n\r\n // Heading (h1-h6)\r\n ['heading1', 'heading2', 'heading3', 'heading4', 'heading5', 'heading6'].forEach(heading => {\r\n dispatcher.on(`insert:${heading}`, makeHandler(heading), { priority: 'low' });\r\n });\r\n\r\n // Table\r\n dispatcher.on('insert:table', makeHandler('table'), { priority: 'low' });\r\n\r\n // PageBreak - add page-break-before style\r\n dispatcher.on(\r\n 'insert:pageBreak',\r\n (evt: any, data: any, conversionApi: any) => {\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n if (viewElement) {\r\n conversionApi.writer.setStyle('page-break-before', 'always', viewElement);\r\n }\r\n },\r\n { priority: 'low' }\r\n );\r\n });\r\n }\r\n}\r\n","import { Plugin, ContextualBalloon, ButtonView, ModelRange, View } from 'ckeditor5';\r\nimport { CkComment, CkCommentConfig, CkCommentColors, CkCommentSelection } from './ck-comment.plugin.model';\r\n\r\nexport class CkCommentPlugin extends Plugin {\r\n static get pluginName() {\r\n return 'CkComment';\r\n }\r\n\r\n static get requires() {\r\n return [ContextualBalloon];\r\n }\r\n\r\n #comments: Map<string | number, CkComment> = new Map();\r\n #selectedId: string | number | null = null;\r\n #pendingId: string | null = null; // ID cho pending highlight\r\n #isCreatingPending: boolean = false; // Flag để prevent clearing pending khi đang tạo\r\n #balloon!: ContextualBalloon;\r\n #config: CkCommentConfig = {};\r\n\r\n // Hằng số ID cho pending marker\r\n static readonly PENDING_MARKER_ID = '__pending_comment__';\r\n\r\n // Số node tìm kiếm mặc định khi path không chính xác\r\n static readonly DEFAULT_SEARCH_RANGE = 5;\r\n\r\n // Màu sắc mặc định cho markers\r\n static readonly DEFAULT_COLORS: CkCommentColors = {\r\n marker: 'rgba(59, 130, 246, 0.2)',\r\n markerSelected: 'rgba(59, 130, 246, 0.5)',\r\n markerPending: 'rgba(245, 158, 11, 0.4)',\r\n markerModified: 'rgba(255, 193, 7, 0.4)',\r\n markerBroken: 'rgba(220, 53, 69, 0.3)',\r\n };\r\n\r\n /**\r\n * Debug log - chỉ log khi debug config là true\r\n */\r\n #log(...args: any[]): void {\r\n if (this.#config.debug) {\r\n console.log('[CkCommentPlugin]', ...args);\r\n }\r\n }\r\n\r\n /**\r\n * Debug warn - chỉ warn khi debug config là true\r\n */\r\n #warn(...args: any[]): void {\r\n if (this.#config.debug) {\r\n console.warn('[CkCommentPlugin]', ...args);\r\n }\r\n }\r\n\r\n /**\r\n * Lấy màu sắc đã merge với default\r\n */\r\n #getColors(): CkCommentColors {\r\n return { ...CkCommentPlugin.DEFAULT_COLORS, ...this.#config.colors };\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n this.#balloon = editor.plugins.get(ContextualBalloon);\r\n\r\n this.#log('init() called');\r\n\r\n // Thiết lập marker to highlight conversion\r\n this.#setupMarkerConversion();\r\n\r\n // Thiết lập click handler cho markers\r\n this.#setupMarkerClickHandler();\r\n\r\n // Thiết lập toolbar button\r\n this.#setupToolbarButton();\r\n\r\n // Thiết lập ContextualBalloon cho text selection (tùy chọn)\r\n this.#setupContextualBalloon();\r\n\r\n // Theo dõi thay đổi nội dung để cập nhật trạng thái comment\r\n this.#setupChangeTracking();\r\n }\r\n\r\n // ========================================================================\r\n // TOOLBAR BUTTON\r\n // ========================================================================\r\n\r\n #setupToolbarButton() {\r\n const editor = this.editor;\r\n\r\n editor.ui.componentFactory.add('ckCommentBtn', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n view.set({\r\n label: 'Bình luận',\r\n icon: '<svg width=\"16px\" height=\"16px\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 13v6l-4-4H4a2 2 0 01-2-2V4a2 2 0 012-2h14a2 2 0 012 2v9zM5 7h10v2H5V7zm0 4h10v2H5v-2z\"/></svg>',\r\n tooltip: true,\r\n isEnabled: false,\r\n });\r\n\r\n // Enable khi có selection và không phải chỉ khoảng trắng\r\n const selection = editor.model.document.selection;\r\n this.listenTo(selection, 'change', () => {\r\n const isCollapsed = selection.isCollapsed;\r\n const range = selection.getFirstRange();\r\n\r\n // Kiểm tra xem selection có content không phải khoảng trắng không\r\n let hasValidContent = false;\r\n if (range && !isCollapsed) {\r\n const text = this.#getTextFromRange(range);\r\n hasValidContent = text.trim().length > 0;\r\n }\r\n\r\n view.isEnabled = hasValidContent;\r\n });\r\n\r\n // Xử lý khi click button\r\n this.listenTo(view, 'execute', () => {\r\n this.#log('Toolbar button clicked');\r\n const selectionData = this.#getSelectionData();\r\n if (selectionData) {\r\n // Set flag để prevent clearing pending khi selection change\r\n this.#isCreatingPending = true;\r\n\r\n this.#log('Calling onPendingComment callback');\r\n this.#config.onPendingComment?.({\r\n id: '',\r\n startPath: selectionData.startPath,\r\n endPath: selectionData.endPath,\r\n originalText: selectionData.text,\r\n currentText: selectionData.text,\r\n status: 'normal',\r\n });\r\n\r\n // Reset flag sau một khoảng ngắn để cho phép clear nếu selection thực sự thay đổi\r\n setTimeout(() => {\r\n this.#isCreatingPending = false;\r\n }, 100);\r\n }\r\n });\r\n\r\n return view;\r\n });\r\n }\r\n\r\n // ========================================================================\r\n // MARKER CONVERSION\r\n // ========================================================================\r\n\r\n #setupMarkerConversion() {\r\n const self = this;\r\n\r\n this.editor.conversion.for('editingDowncast').markerToHighlight({\r\n model: 'comment',\r\n view: (data: { markerRange: ModelRange; markerName: string }) => {\r\n const markerName = data.markerName;\r\n const commentId = markerName.replace('comment:', '');\r\n const classes = ['ck-comment-marker'];\r\n const colors = self.#getColors();\r\n\r\n // Kiểm tra xem có phải pending marker không\r\n if (commentId === CkCommentPlugin.PENDING_MARKER_ID) {\r\n classes.push('ck-comment-pending');\r\n return {\r\n classes: classes,\r\n attributes: {\r\n 'data-comment-id': commentId,\r\n style: `--comment-pending-bg: ${colors.markerPending}`,\r\n },\r\n };\r\n }\r\n\r\n const comment = self.#comments.get(commentId);\r\n\r\n // Build CSS variables based on status\r\n const cssVars: string[] = [`--comment-bg: ${colors.marker}`];\r\n\r\n if (comment) {\r\n classes.push(`ck-comment-${comment.status}`);\r\n if (commentId === self.#selectedId) {\r\n classes.push('ck-comment-selected');\r\n cssVars.push(`--comment-selected-bg: ${colors.markerSelected}`);\r\n }\r\n // Add status-specific colors\r\n if (comment.status === 'modified') {\r\n cssVars.push(`--comment-modified-bg: ${colors.markerModified}`);\r\n } else if (comment.status === 'broken') {\r\n cssVars.push(`--comment-broken-bg: ${colors.markerBroken}`);\r\n }\r\n }\r\n\r\n return {\r\n classes: classes,\r\n attributes: {\r\n 'data-comment-id': commentId,\r\n style: cssVars.join('; '),\r\n },\r\n };\r\n },\r\n });\r\n }\r\n\r\n // ========================================================================\r\n // CLICK HANDLER\r\n // ========================================================================\r\n\r\n #setupMarkerClickHandler() {\r\n const viewDocument = this.editor.editing.view.document;\r\n\r\n // Lắng nghe cả click và mousedown để đảm bảo bắt được event\r\n viewDocument.on('mousedown', (evt: any, data: any) => {\r\n this.#log('Mousedown event triggered, data:', data);\r\n this.#handleMarkerClick(evt, data);\r\n });\r\n\r\n viewDocument.on('click', (evt: any, data: any) => {\r\n this.#log('Click event triggered, data:', data);\r\n this.#handleMarkerClick(evt, data);\r\n });\r\n }\r\n\r\n #handleMarkerClick(evt: any, data: any) {\r\n const viewElement = data.target;\r\n let element: any = viewElement;\r\n\r\n this.#log('Target element:', element, 'hasClass:', typeof element?.hasClass);\r\n\r\n // Duyệt lên cây để tìm comment marker\r\n while (element) {\r\n const hasMarkerClass = element.hasClass?.('ck-comment-marker');\r\n this.#log('Checking element, hasMarkerClass:', hasMarkerClass);\r\n\r\n if (hasMarkerClass) {\r\n const commentId = element.getAttribute('data-comment-id');\r\n this.#log('Found marker with commentId:', commentId);\r\n this.selectComment(commentId, false);\r\n evt.stop();\r\n return;\r\n }\r\n element = element.parent;\r\n }\r\n\r\n // Click ngoài markers - xóa selection\r\n if (this.#selectedId) {\r\n this.#log('Click outside markers, clearing selection');\r\n this.#selectedId = null;\r\n this.#refreshView();\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // CONTEXTUAL BALLOON\r\n // ========================================================================\r\n\r\n #setupContextualBalloon() {\r\n const editor = this.editor;\r\n const selection = editor.model.document.selection;\r\n\r\n this.#log('#setupContextualBalloon initialized');\r\n\r\n // Lắng nghe selection changes\r\n this.listenTo(selection, 'change:range', () => {\r\n this.#log('Selection change:range, isCollapsed:', selection.isCollapsed);\r\n\r\n // Xóa pending nếu selection thay đổi sang text khác\r\n // NHƯNG không xóa nếu đang trong quá trình tạo pending\r\n if (this.#pendingId && !this.#isCreatingPending) {\r\n this.#log('Selection changed, clearing pending');\r\n this.clearPendingSelection();\r\n } else if (this.#isCreatingPending) {\r\n this.#log('Skipping clear pending - isCreatingPending flag is set');\r\n }\r\n\r\n if (!selection.isCollapsed) {\r\n const range = selection.getFirstRange();\r\n if (range) {\r\n // Chỉ hiện balloon khi selection có content không phải khoảng trắng\r\n const text = this.#getTextFromRange(range);\r\n if (text.trim().length > 0) {\r\n this.#showBalloon(range);\r\n } else {\r\n this.#hideBalloon();\r\n }\r\n }\r\n } else {\r\n this.#hideBalloon();\r\n }\r\n });\r\n\r\n // Ẩn balloon khi focus thay đổi\r\n this.listenTo(editor.ui, 'update', () => {\r\n if (selection.isCollapsed) {\r\n this.#hideBalloon();\r\n }\r\n });\r\n }\r\n\r\n #showBalloon(range: ModelRange) {\r\n this.#log('#showBalloon called, range:', range);\r\n const editor = this.editor;\r\n\r\n // Ẩn balloon hiện tại trước\r\n this.#hideBalloon();\r\n\r\n // Tạo balloon button\r\n const buttonView = new ButtonView(editor.locale);\r\n buttonView.set({\r\n label: 'Bình luận',\r\n icon: '<svg width=\"16px\" height=\"16px\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 13v6l-4-4H4a2 2 0 01-2-2V4a2 2 0 012-2h14a2 2 0 012 2v9zM5 7h10v2H5V7zm0 4h10v2H5v-2z\"/></svg>',\r\n tooltip: true,\r\n withText: true,\r\n });\r\n\r\n // Xử lý khi click button\r\n this.listenTo(buttonView, 'execute', () => {\r\n this.#log('Balloon button clicked');\r\n const selection = this.#getSelectionData();\r\n this.#log('Selection data:', selection);\r\n if (selection) {\r\n // Set flag để prevent clearing pending khi selection change\r\n this.#isCreatingPending = true;\r\n\r\n this.#log('Calling onPendingComment callback');\r\n this.#config.onPendingComment?.({\r\n id: '',\r\n startPath: selection.startPath,\r\n endPath: selection.endPath,\r\n originalText: selection.text,\r\n currentText: selection.text,\r\n status: 'normal',\r\n });\r\n\r\n // Reset flag sau một khoảng ngắn\r\n setTimeout(() => {\r\n this.#isCreatingPending = false;\r\n }, 100);\r\n }\r\n this.#hideBalloon();\r\n });\r\n\r\n // Thêm vào balloon\r\n try {\r\n this.#balloon.add({\r\n view: buttonView,\r\n position: {\r\n target: () => {\r\n const viewRange = editor.editing.mapper.toViewRange(range);\r\n return editor.editing.view.domConverter.viewRangeToDom(viewRange);\r\n },\r\n },\r\n });\r\n this.#balloonView = buttonView;\r\n this.#log('Balloon added successfully');\r\n } catch (e) {\r\n this.#warn('Error adding balloon:', e);\r\n }\r\n }\r\n\r\n #balloonView: View<HTMLElement> | null = null;\r\n\r\n #hideBalloon() {\r\n if (this.#balloonView) {\r\n this.#balloon.remove(this.#balloonView);\r\n this.#balloonView = null;\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // CHANGE TRACKING\r\n // ========================================================================\r\n\r\n #setupChangeTracking() {\r\n const editor = this.editor;\r\n\r\n // Lắng nghe thay đổi dữ liệu\r\n editor.model.document.on('change:data', () => {\r\n this.#updateCommentStatuses();\r\n });\r\n\r\n // Lắng nghe thay đổi marker\r\n editor.model.document.on('change:markers', () => {\r\n this.#updateCommentStatuses();\r\n });\r\n }\r\n\r\n #updateCommentStatuses() {\r\n let hasChanges = false;\r\n\r\n this.#comments.forEach((comment, id) => {\r\n const marker = this.editor.model.markers.get(`comment:${id}`);\r\n\r\n if (marker) {\r\n const range = marker.getRange();\r\n const currentText = this.#getTextFromRange(range);\r\n\r\n // Tự động cập nhật paths (CKEditor duy trì chúng)\r\n const newStartPath = Array.from(range.start.path);\r\n const newEndPath = Array.from(range.end.path);\r\n\r\n const pathChanged =\r\n JSON.stringify(comment.startPath) !== JSON.stringify(newStartPath) ||\r\n JSON.stringify(comment.endPath) !== JSON.stringify(newEndPath);\r\n\r\n const textChanged = currentText !== comment.currentText;\r\n\r\n if (pathChanged || textChanged) {\r\n hasChanges = true;\r\n comment.startPath = newStartPath;\r\n comment.endPath = newEndPath;\r\n comment.currentText = currentText;\r\n\r\n // Cập nhật trạng thái\r\n if (currentText === comment.originalText) {\r\n comment.status = 'normal';\r\n } else if (currentText.length === 0) {\r\n comment.status = 'broken';\r\n } else {\r\n comment.status = 'modified';\r\n }\r\n }\r\n } else {\r\n // Không tìm thấy marker - bị hỏng\r\n if (comment.status !== 'broken') {\r\n hasChanges = true;\r\n comment.status = 'broken';\r\n }\r\n }\r\n });\r\n\r\n if (hasChanges) {\r\n this.#refreshView();\r\n this.#fireOnChange();\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // PUBLIC API\r\n // ========================================================================\r\n\r\n /**\r\n * Thiết lập config với callbacks\r\n */\r\n setConfig(config: CkCommentConfig) {\r\n this.#config = config;\r\n }\r\n\r\n /**\r\n * Thêm comment và tạo marker\r\n */\r\n addComment(comment: CkComment): boolean {\r\n if (this.#comments.has(comment.id)) {\r\n this.#warn(`Comment with id ${comment.id} already exists`);\r\n return false;\r\n }\r\n\r\n // Tạo marker\r\n const success = this.#createMarker(comment);\r\n\r\n // Lưu comment (với trạng thái broken nếu marker thất bại)\r\n const storedComment = success ? { ...comment } : { ...comment, status: 'broken' as const };\r\n this.#comments.set(comment.id, storedComment);\r\n\r\n this.#refreshView();\r\n this.#fireOnChange();\r\n\r\n // Chỉ fire onAddComment callback KHI thêm thành công (không phải broken)\r\n if (success) {\r\n this.#config.onAddComment?.(storedComment);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Xóa comment theo id\r\n */\r\n removeComment(id: string | number): boolean {\r\n const comment = this.#comments.get(id);\r\n if (!comment) {\r\n return false;\r\n }\r\n\r\n // Xóa marker\r\n this.editor.model.change(writer => {\r\n writer.removeMarker(`comment:${id}`);\r\n });\r\n\r\n // Xóa khỏi map\r\n this.#comments.delete(id);\r\n\r\n // Xóa selection nếu bị xóa\r\n if (this.#selectedId === id) {\r\n this.#selectedId = null;\r\n }\r\n\r\n this.#refreshView();\r\n this.#fireOnChange();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Chọn comment theo id - chỉ thêm class highlight, không bôi đen text\r\n */\r\n selectComment(id: string | number, scrollIntoView: boolean = true): void {\r\n this.#log('selectComment called with id:', id, 'hasComment:', this.#comments.has(id));\r\n\r\n if (!this.#comments.has(id)) {\r\n this.#warn('Comment not found:', id);\r\n return;\r\n }\r\n\r\n this.#selectedId = id;\r\n this.#refreshView();\r\n if (scrollIntoView) {\r\n this.#scrollToComment(id);\r\n }\r\n\r\n this.#log('Firing onSelectComment callback for id:', id);\r\n this.#config.onSelectComment?.(id);\r\n }\r\n\r\n /**\r\n * Thiết lập tất cả comments (khôi phục từ dữ liệu)\r\n */\r\n setComments(comments: CkComment[]): void {\r\n this.#log('setComments called with', comments.length, 'comments');\r\n\r\n // Xóa comments hiện tại\r\n this.#log('Clearing existing comments, count:', this.#comments.size);\r\n this.#comments.forEach((_, id) => {\r\n const markerName = `comment:${id}`;\r\n if (this.editor.model.markers.has(markerName)) {\r\n this.#log('Removing marker:', markerName);\r\n this.editor.model.change(writer => {\r\n writer.removeMarker(markerName);\r\n });\r\n } else {\r\n this.#warn('Marker not found, skipping:', markerName);\r\n }\r\n });\r\n this.#comments.clear();\r\n this.#selectedId = null;\r\n\r\n // Thêm comments mới - status sẽ được tính toán động từ editor\r\n comments.forEach(comment => {\r\n const success = this.#createMarker(comment);\r\n // Lưu comment với status mặc định, sẽ được cập nhật bởi #updateCommentStatuses\r\n const storedComment = {\r\n ...comment,\r\n status: success ? ('normal' as const) : ('broken' as const),\r\n currentText: success ? comment.originalText : '',\r\n };\r\n this.#comments.set(comment.id, storedComment);\r\n });\r\n\r\n this.#refreshView();\r\n this.#fireOnChange();\r\n }\r\n\r\n /**\r\n * Lấy tất cả comments\r\n */\r\n get comments(): CkComment[] {\r\n return Array.from(this.#comments.values());\r\n }\r\n\r\n /**\r\n * Thiết lập pending highlight cho selection (khi user đang nhập nội dung comment)\r\n */\r\n setPendingSelection(startPath: number[], endPath: number[]): boolean {\r\n // Xóa pending marker hiện tại MÀ KHÔNG fire callback\r\n this.#clearPendingMarker();\r\n\r\n const model = this.editor.model;\r\n\r\n try {\r\n model.change(writer => {\r\n const root = model.document.getRoot();\r\n if (!root) {\r\n throw new Error('Document root not found');\r\n }\r\n const startPos = writer.createPositionFromPath(root, startPath);\r\n const endPos = writer.createPositionFromPath(root, endPath);\r\n const range = writer.createRange(startPos, endPos);\r\n\r\n writer.addMarker(`comment:${CkCommentPlugin.PENDING_MARKER_ID}`, {\r\n range,\r\n usingOperation: false,\r\n affectsData: false,\r\n });\r\n });\r\n\r\n this.#pendingId = CkCommentPlugin.PENDING_MARKER_ID;\r\n this.#refreshView();\r\n return true;\r\n } catch (e) {\r\n this.#warn('Failed to set pending selection:', e);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Xóa pending marker mà không fire callback (dùng nội bộ)\r\n */\r\n #clearPendingMarker(): void {\r\n if (!this.#pendingId) return;\r\n\r\n this.editor.model.change(writer => {\r\n writer.removeMarker(`comment:${CkCommentPlugin.PENDING_MARKER_ID}`);\r\n });\r\n\r\n this.#pendingId = null;\r\n this.#refreshView();\r\n }\r\n\r\n /**\r\n * Xóa pending highlight và fire onCancelPending callback\r\n */\r\n clearPendingSelection(): void {\r\n if (!this.#pendingId) return;\r\n\r\n this.#clearPendingMarker();\r\n\r\n // Fire callback để thông báo UI\r\n this.#config.onCancelPending?.();\r\n }\r\n\r\n /**\r\n * Lấy dữ liệu selection hiện tại để tạo comment\r\n * Trim khoảng trắng để tránh sai vị trí khi lưu\r\n */\r\n #getSelectionData(): CkCommentSelection | null {\r\n const selection = this.editor.model.document.selection;\r\n const range = selection.getFirstRange();\r\n\r\n if (!range || range.isCollapsed) {\r\n return null;\r\n }\r\n\r\n const text = this.#getTextFromRange(range);\r\n const trimmedText = text.trim();\r\n\r\n if (!trimmedText) {\r\n return null;\r\n }\r\n\r\n // Tính toán số ký tự cần trim ở đầu và cuối\r\n const leadingWhitespace = text.length - text.trimStart().length;\r\n const trailingWhitespace = text.length - text.trimEnd().length;\r\n\r\n // Điều chỉnh range để loại bỏ khoảng trắng\r\n let adjustedRange = range;\r\n if (leadingWhitespace > 0 || trailingWhitespace > 0) {\r\n adjustedRange = this.#adjustRangeForTrim(range, leadingWhitespace, trailingWhitespace);\r\n }\r\n\r\n return {\r\n range: adjustedRange,\r\n startPath: Array.from(adjustedRange.start.path),\r\n endPath: Array.from(adjustedRange.end.path),\r\n text: trimmedText,\r\n };\r\n }\r\n\r\n /**\r\n * Điều chỉnh range để loại bỏ khoảng trắng đầu/cuối\r\n */\r\n #adjustRangeForTrim(range: ModelRange, leadingTrim: number, trailingTrim: number): ModelRange {\r\n const model = this.editor.model;\r\n\r\n return model.change(writer => {\r\n let startPos = range.start;\r\n let endPos = range.end;\r\n\r\n // Dịch start position forward để bỏ khoảng trắng đầu\r\n if (leadingTrim > 0) {\r\n for (let i = 0; i < leadingTrim && startPos; i++) {\r\n const nextPos = startPos.getShiftedBy(1);\r\n if (nextPos) {\r\n startPos = nextPos;\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Dịch end position backward để bỏ khoảng trắng cuối\r\n if (trailingTrim > 0) {\r\n for (let i = 0; i < trailingTrim && endPos; i++) {\r\n const prevPos = endPos.getShiftedBy(-1);\r\n if (prevPos && prevPos.isAfter(startPos)) {\r\n endPos = prevPos;\r\n } else {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return writer.createRange(startPos, endPos);\r\n });\r\n }\r\n\r\n // ========================================================================\r\n // INTERNAL HELPERS\r\n // ========================================================================\r\n\r\n #createMarker(comment: CkComment): boolean {\r\n const model = this.editor.model;\r\n\r\n try {\r\n model.change(writer => {\r\n const root = model.document.getRoot();\r\n if (!root) {\r\n throw new Error('Document root not found');\r\n }\r\n const startPos = writer.createPositionFromPath(root, comment.startPath);\r\n const endPos = writer.createPositionFromPath(root, comment.endPath);\r\n const range = writer.createRange(startPos, endPos);\r\n\r\n // Validate: kiểm tra text tại range có khớp với originalText không\r\n const rangeText = this.#getTextFromRange(range);\r\n this.#log('Range text:', rangeText, 'range:', range);\r\n\r\n if (rangeText !== comment.originalText) {\r\n this.#warn(\r\n `Marker text mismatch for comment ${comment.id}:`,\r\n `\\n Expected: \"${comment.originalText}\"`,\r\n `\\n Got: \"${rangeText}\"`,\r\n `\\n Trying to find text near original path...`\r\n );\r\n\r\n // Thử tìm text gần path gốc\r\n const searchRange = this.#config.searchRange ?? CkCommentPlugin.DEFAULT_SEARCH_RANGE;\r\n const foundRange = this.#findTextNearPath(comment.originalText, comment.startPath, comment.endPath, searchRange);\r\n\r\n if (foundRange) {\r\n this.#log('Found text at new position, updating paths');\r\n // Cập nhật paths cho comment\r\n comment.startPath = Array.from(foundRange.start.path);\r\n comment.endPath = Array.from(foundRange.end.path);\r\n\r\n writer.addMarker(`comment:${comment.id}`, {\r\n range: foundRange,\r\n usingOperation: true,\r\n affectsData: false,\r\n });\r\n return;\r\n }\r\n\r\n throw new Error(`Failed to find text \"${comment.originalText}\" near original path`);\r\n }\r\n\r\n writer.addMarker(`comment:${comment.id}`, {\r\n range,\r\n usingOperation: true, // CKEditor tự động cập nhật vị trí\r\n affectsData: false,\r\n });\r\n });\r\n\r\n return true;\r\n } catch (e) {\r\n this.#warn(`Failed to create marker for comment ${comment.id}:`, e);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Tìm text trong document trong phạm vi ±searchRange nodes từ path gốc\r\n */\r\n #findTextNearPath(searchText: string, startPath: number[], endPath: number[], searchRange: number): ModelRange | null {\r\n if (!searchText) return null;\r\n\r\n const model = this.editor.model;\r\n const root = model.document.getRoot();\r\n if (!root) return null;\r\n\r\n // TODO: Implement text search logic here\r\n // 1. Lấy vị trí start và end từ các path gốc\r\n // 2. Tìm kiếm trong phạm vi ±searchRange nodes từ các vị trí đó\r\n // 3. Trả về range nếu tìm thấy text, null nếu không tìm thấy\r\n\r\n return null;\r\n }\r\n\r\n #getTextFromRange(range: ModelRange): string {\r\n let text = '';\r\n for (const item of range.getItems()) {\r\n if (item.is('$textProxy') || item.is('$text')) {\r\n text += (item as any).data;\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n #scrollToComment(id: string | number): void {\r\n const marker = this.editor.model.markers.get(`comment:${id}`);\r\n if (!marker) return;\r\n\r\n const editor = this.editor;\r\n\r\n // Scroll đến marker range (không set selection - không bôi đen)\r\n const viewRange = editor.editing.mapper.toViewRange(marker.getRange());\r\n const domRange = editor.editing.view.domConverter.viewRangeToDom(viewRange);\r\n\r\n // Scroll element into view\r\n const domElement = domRange.startContainer.parentElement;\r\n if (domElement) {\r\n domElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n\r\n #refreshView(): void {\r\n // Force view refresh để cập nhật marker classes\r\n // Reconvert tất cả comment markers để cập nhật classes của chúng\r\n const markers = this.editor.model.markers;\r\n for (const marker of markers) {\r\n if (marker.name.startsWith('comment:')) {\r\n this.editor.editing.reconvertMarker(marker.name);\r\n }\r\n }\r\n }\r\n\r\n #fireOnChange(): void {\r\n this.#config.onChange?.(this.comments);\r\n }\r\n}\r\n","/**\r\n * Document Builder Utilities\r\n * Các hàm tiện ích cho document builder\r\n */\r\n\r\nimport { hslToHex, rgbToHex } from '@sd-angular/core/utilities';\r\n\r\n/**\r\n * Chuẩn hóa nội dung bằng cách chuyển đổi tất cả màu HSL và RGB sang hex\r\n * @param content - Nội dung HTML cần chuẩn hóa\r\n * @returns Nội dung đã được chuẩn hóa với màu hex\r\n */\r\nexport function normalize(content: string): string {\r\n let normalized = content;\r\n\r\n // Chuyển đổi HSL sang hex\r\n const hslRegex = /hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*\\)/gi;\r\n normalized = normalized.replace(hslRegex, (match, h, s, l) => {\r\n try {\r\n const hue = parseInt(h, 10);\r\n const saturation = parseInt(s, 10);\r\n const lightness = parseInt(l, 10);\r\n\r\n // Kiểm tra giá trị hợp lệ\r\n if (hue >= 0 && hue <= 360 && saturation >= 0 && saturation <= 100 && lightness >= 0 && lightness <= 100) {\r\n return hslToHex(hue, saturation, lightness);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to convert HSL to hex:', error, match);\r\n }\r\n\r\n return match; // Giữ nguyên nếu không thể chuyển đổi\r\n });\r\n\r\n // Chuyển đổi RGB sang hex\r\n const rgbRegex = /rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/gi;\r\n normalized = normalized.replace(rgbRegex, (match, r, g, b) => {\r\n try {\r\n const red = parseInt(r, 10);\r\n const green = parseInt(g, 10);\r\n const blue = parseInt(b, 10);\r\n\r\n if (red >= 0 && red <= 255 && green >= 0 && green <= 255 && blue >= 0 && blue <= 255) {\r\n return rgbToHex(red, green, blue);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to convert RGB to hex:', error, match);\r\n }\r\n\r\n return match;\r\n });\r\n\r\n return normalized;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\nimport {\r\n Alignment,\r\n Bold,\r\n ClassicEditor,\r\n Essentials,\r\n FontBackgroundColor,\r\n FontColor,\r\n FontFamily,\r\n FontSize,\r\n // GeneralHtmlSupport,\r\n Heading,\r\n Image,\r\n ImageBlock,\r\n ImageCaption,\r\n ImageResize,\r\n ImageStyle,\r\n ImageToolbar,\r\n ImageUpload,\r\n Indent,\r\n IndentBlock,\r\n Italic,\r\n List,\r\n ModelElement,\r\n ModelRange,\r\n PageBreak,\r\n Paragraph,\r\n Subscript,\r\n Superscript,\r\n Table,\r\n TableCellProperties,\r\n TableColumnResize,\r\n TableProperties,\r\n TableToolbar,\r\n Underline,\r\n Undo,\r\n} from 'ckeditor5';\r\nimport { throttleTime, Subject, Subscription } from 'rxjs';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\nimport {\r\n PageOrientation,\r\n TableCustom,\r\n VariablePlugin,\r\n ImageUploadPlugin,\r\n HeadingPlugin,\r\n ImageCustomPlugin,\r\n PasteHandler,\r\n HighlightRangePlugin,\r\n BlockSpace,\r\n CkCommentPlugin,\r\n} from './plugins';\r\nimport { getPresetColors, getColorPickerConfig, getFontSizeOptions, getHeadingOptions } from './document-builder.config';\r\nimport { SdDocumentBuilderHeading, SdDocumentBuilderOption, SdDocumentBuilderVariable, SdEditorConfig } from './document-builder.model';\r\nimport { CkComment } from './plugins/ck-comment/ck-comment.plugin.model';\r\nimport { normalize } from './document-builder.utils';\r\n\r\n@Component({\r\n selector: 'sd-document-builder',\r\n standalone: true,\r\n imports: [CommonModule, CKEditorModule],\r\n templateUrl: './document-builder.component.html',\r\n styleUrls: [\r\n './document-builder.component.scss',\r\n './plugins/heading/heading.plugin.scss',\r\n './plugins/variable/variable.plugin.scss',\r\n './plugins/highlight-range/highlight-range.plugin.scss',\r\n './plugins/ck-comment/ck-comment.plugin.scss',\r\n ],\r\n})\r\nexport class SdDocumentBuilder {\r\n @Input({ required: true }) option!: SdDocumentBuilderOption;\r\n disabled = false;\r\n @Input('disabled') set _disabled(val: boolean | '' | undefined | null) {\r\n this.disabled = val === '' || !!val;\r\n this.#updateState();\r\n }\r\n @Output() contentChange = new EventEmitter<string>(); // Emit HTML content\r\n\r\n Editor = ClassicEditor;\r\n #editor!: ClassicEditor;\r\n\r\n #id = '55b0afb0-288d-423c-98b3-5f9db286e16d';\r\n #subscription = new Subscription();\r\n #sharedColors = getPresetColors();\r\n #headingOptions = getHeadingOptions();\r\n #fontSizeOptions = getFontSizeOptions();\r\n #colorPickerConfig = getColorPickerConfig();\r\n #contentChangeSubject = new Subject<string>();\r\n #idTimeOutScrollHeading: ReturnType<typeof setTimeout> | null = null;\r\n #headingElementsMap = new Map<string, ModelElement>(); // Hash lưu trữ các heading\r\n\r\n // Config\r\n config: SdEditorConfig = {\r\n getOption: () => this.option,\r\n licenseKey: 'GPL', // Hoặc key thương mại nếu có\r\n plugins: [\r\n // GeneralHtmlSupport,\r\n FontSize,\r\n FontColor,\r\n FontFamily,\r\n FontBackgroundColor,\r\n Bold,\r\n Italic,\r\n Underline,\r\n Essentials,\r\n Paragraph,\r\n Heading,\r\n List,\r\n Table,\r\n TableToolbar,\r\n TableProperties,\r\n TableCellProperties,\r\n TableColumnResize,\r\n PageBreak,\r\n Undo,\r\n Alignment, // Canh lề\r\n Subscript, // Mũ dưới (H₂O)\r\n Superscript, // Mũ trên (x²)\r\n // Image\r\n Image,\r\n ImageUpload,\r\n ImageToolbar,\r\n ImageCaption,\r\n ImageResize,\r\n ImageStyle,\r\n ImageBlock,\r\n // Indent\r\n Indent,\r\n IndentBlock,\r\n // Custom Plugin\r\n HeadingPlugin,\r\n VariablePlugin,\r\n TableCustom,\r\n PageOrientation,\r\n ImageUploadPlugin,\r\n ImageCustomPlugin,\r\n HighlightRangePlugin,\r\n PasteHandler,\r\n BlockSpace,\r\n CkCommentPlugin,\r\n ],\r\n toolbar: {\r\n items: [\r\n 'pageOrientation',\r\n '|',\r\n 'heading',\r\n 'fontFamily',\r\n '|',\r\n 'fontSize',\r\n 'fontColor',\r\n 'fontBackgroundColor',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'subscript',\r\n 'superscript',\r\n '|',\r\n 'alignment',\r\n 'bulletedList',\r\n 'numberedList',\r\n '|',\r\n 'insertTable',\r\n 'imageUpload',\r\n 'pageBreak',\r\n '|',\r\n 'undo',\r\n 'redo',\r\n ],\r\n shouldNotGroupWhenFull: true,\r\n },\r\n\r\n image: {\r\n styles: {\r\n options: ['inline', 'alignLeft', 'alignRight', 'alignCenter'],\r\n },\r\n toolbar: [\r\n 'imageStyle:inline',\r\n 'imageStyle:alignCenter',\r\n {\r\n name: 'imageStyle:alignDropdown',\r\n items: ['imageStyle:alignLeft', 'imageStyle:alignRight'],\r\n defaultItem: 'imageStyle:alignLeft',\r\n },\r\n ],\r\n },\r\n\r\n fontSize: {\r\n options: this.#fontSizeOptions,\r\n supportAllValues: true,\r\n },\r\n\r\n heading: {\r\n options: this.#headingOptions,\r\n },\r\n\r\n // 4. Cấu hình bảng màu (Tùy chọn)\r\n fontColor: {\r\n // columns: 5,\r\n documentColors: 10,\r\n colorPicker: this.#colorPickerConfig,\r\n colors: this.#sharedColors,\r\n },\r\n\r\n fontBackgroundColor: {\r\n // columns: 5,\r\n documentColors: 10,\r\n colorPicker: this.#colorPickerConfig,\r\n colors: this.#sharedColors,\r\n },\r\n\r\n table: {\r\n contentToolbar: ['tableColumn', 'tableRow', 'mergeTableCells', '|', 'tableProperties', 'tableCellProperties'],\r\n tableProperties: {\r\n borderColors: this.#sharedColors,\r\n backgroundColors: this.#sharedColors,\r\n colorPicker: this.#colorPickerConfig,\r\n defaultProperties: {\r\n borderStyle: 'solid',\r\n borderWidth: '1px',\r\n borderColor: '#ccc',\r\n },\r\n },\r\n tableCellProperties: {\r\n borderColors: this.#sharedColors,\r\n backgroundColors: this.#sharedColors,\r\n colorPicker: this.#colorPickerConfig,\r\n defaultProperties: {\r\n borderStyle: 'solid',\r\n borderWidth: '1px',\r\n borderColor: '#ccc',\r\n },\r\n },\r\n },\r\n\r\n indentBlock: {\r\n offset: 48, // Đơn vị px cho mỗi mức indent (tương đương 0.5 inch)\r\n unit: 'px',\r\n },\r\n\r\n // Quan trọng: Cho phép paste style từ Word nhưng bỏ qua margin/padding\r\n htmlSupport: {\r\n allow: [\r\n {\r\n name: /.*/, // Cho phép tất cả tên thẻ HTML\r\n attributes: true, // Cho phép tất cả attributes\r\n classes: true, // Cho phép tất cả classes\r\n styles: true, // Cho phép tất cả styles\r\n },\r\n ],\r\n },\r\n };\r\n\r\n ngOnInit() {\r\n // Debounce trong rxjs không hỗ trợ leading --> throttleTime\r\n this.#subscription.add(\r\n this.#contentChangeSubject.pipe(throttleTime(500, undefined, { leading: true, trailing: true })).subscribe(content => {\r\n this.contentChange.emit(normalize(content));\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n onReady(editor: ClassicEditor) {\r\n this.#editor = editor;\r\n\r\n // Setup orientation plugin callback\r\n try {\r\n const orientationPlugin = editor.plugins.get('PageOrientation') as PageOrientation;\r\n if (orientationPlugin && typeof orientationPlugin.onOrientationChange === 'function') {\r\n orientationPlugin.onOrientationChange(orientation => {\r\n this.option.onOrientation?.(orientation);\r\n });\r\n\r\n // Set initial orientation if provided\r\n if (this.option.orientation) {\r\n orientationPlugin.setOrientation(this.option.orientation);\r\n }\r\n }\r\n } catch (error) {\r\n console.warn('PageOrientation not available:', error);\r\n }\r\n\r\n // Lắng nghe selection\r\n editor.model.document.selection.on('change', $event => {\r\n this.option.onSelection?.(this.#editor.model.document.selection, $event);\r\n });\r\n\r\n // Lắng nghe sự kiện thay đổi nội dung\r\n editor.model.document.on('change:data', () => {\r\n const content = editor.getData();\r\n this.#contentChangeSubject.next(content);\r\n });\r\n\r\n try {\r\n // Manual keybinding cho Tab nếu cần\r\n editor.keystrokes.set('Tab', (evt, cancel) => {\r\n const command = editor.commands.get('indentBlock');\r\n if (command && command.isEnabled) {\r\n editor.execute('indentBlock');\r\n cancel();\r\n }\r\n });\r\n\r\n // Manual keybinding cho Shift+Tab\r\n editor.keystrokes.set('Shift+Tab', (evt, cancel) => {\r\n const command = editor.commands.get('outdentBlock');\r\n if (command && command.isEnabled) {\r\n editor.execute('outdentBlock');\r\n cancel();\r\n }\r\n });\r\n } catch (error) {\r\n console.warn('Error setting up indent keybindings:', error);\r\n }\r\n\r\n this.#updateState();\r\n\r\n // Setup CkCommentPlugin callbacks\r\n this.#setupCkCommentPlugin();\r\n }\r\n\r\n #setupCkCommentPlugin() {\r\n if (!this.#editor) return;\r\n\r\n try {\r\n const ckCommentPlugin = this.#editor.plugins.get('CkComment') as CkCommentPlugin;\r\n if (ckCommentPlugin && this.option.comment) {\r\n ckCommentPlugin.setConfig(this.option.comment);\r\n }\r\n } catch (error) {\r\n console.warn('CkCommentPlugin not available:', error);\r\n }\r\n }\r\n\r\n setContent = (html: string) => {\r\n this.#editor?.setData?.(html);\r\n };\r\n\r\n getContent = () => {\r\n if (this.#editor) {\r\n return this.#editor.getData();\r\n }\r\n return '';\r\n };\r\n\r\n setOrientation = (orientation: 'PORTRAIT' | 'LANDSCAPE'): void => {\r\n if (!this.#editor) return;\r\n\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientation') as PageOrientation;\r\n if (orientationPlugin && typeof orientationPlugin.setOrientation === 'function') {\r\n orientationPlugin.setOrientation(orientation);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to set orientation:', error);\r\n }\r\n };\r\n\r\n getOrientation = (): 'PORTRAIT' | 'LANDSCAPE' => {\r\n if (!this.#editor) return 'PORTRAIT';\r\n\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientation') as PageOrientation;\r\n if (orientationPlugin && typeof orientationPlugin.getOrientation === 'function') {\r\n return orientationPlugin.getOrientation();\r\n }\r\n } catch (error) {\r\n console.warn('Failed to get orientation:', error);\r\n }\r\n\r\n return 'PORTRAIT';\r\n };\r\n\r\n scrollToTop() {\r\n setTimeout(() => {\r\n if (this.#editor) {\r\n const editableElement = this.#editor.ui.view.editable.element;\r\n if (editableElement) {\r\n const scrollContainer = editableElement.closest('.builder-container');\r\n if (scrollContainer) {\r\n scrollContainer.scrollTo({\r\n top: 0,\r\n behavior: 'smooth',\r\n });\r\n } else {\r\n editableElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n }\r\n }\r\n }, 100);\r\n }\r\n\r\n #updateState(): void {\r\n if (!this.#editor) return;\r\n if (this.disabled) {\r\n // Bật chế độ chỉ đọc với ID khóa\r\n this.#editor.enableReadOnlyMode(this.#id);\r\n\r\n // Disable page orientation button\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientation') as PageOrientation;\r\n if (orientationPlugin && (orientationPlugin as any).buttonView) {\r\n (orientationPlugin as any).buttonView.isEnabled = false;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to disable orientation button:', error);\r\n }\r\n } else {\r\n // Tắt chế độ chỉ đọc với ID khóa tương ứng\r\n this.#editor.disableReadOnlyMode(this.#id);\r\n\r\n // Enable page orientation button\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientation') as PageOrientation;\r\n if (orientationPlugin && (orientationPlugin as any).buttonView) {\r\n (orientationPlugin as any).buttonView.isEnabled = true;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to enable orientation button:', error);\r\n }\r\n }\r\n }\r\n\r\n #getTextFromElement = (element: ModelElement): string => {\r\n let text = '';\r\n // Heading trong Model chứa các text node con\r\n for (const child of element.getChildren()) {\r\n if (child.is('$text') || child.is('$textProxy')) {\r\n text += (child as any).data;\r\n }\r\n }\r\n return text;\r\n };\r\n\r\n #getTextFromRange = (range: ModelRange): string => {\r\n let text = '';\r\n for (const item of range.getItems()) {\r\n // TextProxy là một phần của Text Node nằm trong Range\r\n if (item.is('$textProxy') || item.is('$text')) {\r\n text += (item as any).data;\r\n }\r\n }\r\n return text;\r\n };\r\n\r\n // ========================================================================\r\n // 1. QUẢN LÝ HEADING\r\n // ========================================================================\r\n heading = {\r\n /**\r\n * Lấy tất cả headings trong document\r\n * @returns Danh sách tất cả headings\r\n */\r\n all: (): SdDocumentBuilderHeading[] => {\r\n if (!this.#editor) return [];\r\n\r\n const root = this.#editor.model.document.getRoot();\r\n if (!root) return [];\r\n\r\n // Reset lại map mỗi lần quét\r\n this.#headingElementsMap.clear();\r\n\r\n const headings: SdDocumentBuilderHeading[] = [];\r\n const range = this.#editor.model.createRangeIn(root);\r\n\r\n // Biến đếm để tạo ID unique\r\n let index = 0;\r\n\r\n for (const item of range.getItems()) {\r\n // Kiểm tra xem item có phải là Element và tên bắt đầu bằng 'heading' không\r\n if (item.is('element') && item.name.startsWith('heading')) {\r\n // 1. Lấy text của heading\r\n const text = this.#getTextFromElement(item);\r\n // 2. Xác định Level (heading1 -> 1, heading2 -> 2)\r\n // item.name có dạng 'heading1', 'heading2'\r\n const level = parseInt(item.name.replace('heading', ''), 10) || 1;\r\n // 3. Tạo ID runtime (Dùng để map khi click scroll)\r\n // Bạn có thể generate slug từ text nếu muốn, ở đây mình dùng index cho đơn giản và unique\r\n const id = `heading_${index}_${Date.now()}`;\r\n // 4. Lưu tham chiếu Model Element vào Map\r\n this.#headingElementsMap.set(id, item as ModelElement);\r\n headings.push({\r\n id: id,\r\n text: text,\r\n level: level,\r\n type: item.name,\r\n });\r\n index++;\r\n }\r\n }\r\n\r\n return headings;\r\n },\r\n\r\n /**\r\n * Scroll tới vị trí của heading\r\n * @param id - ID của heading cần scroll tới\r\n */\r\n scroll: (id: string) => {\r\n if (!this.#editor) return;\r\n\r\n const modelElement = this.#headingElementsMap.get(id);\r\n\r\n if (modelElement) {\r\n this.#editor.model.change(writer => {\r\n // Xóa marker cũ\r\n if (this.#idTimeOutScrollHeading) {\r\n clearTimeout(this.#idTimeOutScrollHeading);\r\n }\r\n const currentMarker = this.#editor.model.markers.get('highlightMarker');\r\n if (currentMarker) {\r\n writer.removeMarker(currentMarker);\r\n }\r\n\r\n // Tạo Range bao trùm highlight\r\n const range = writer.createRangeOn(modelElement);\r\n\r\n // Thêm Marker mới\r\n writer.addMarker('highlightMarker', {\r\n range: range,\r\n usingOperation: false,\r\n });\r\n });\r\n\r\n // Scroll tới vị trí tìm được\r\n const viewElement = this.#editor.editing.mapper.toViewElement(modelElement);\r\n if (viewElement) {\r\n const domElement = this.#editor.editing.view.domConverter.viewToDom(viewElement);\r\n if (domElement) {\r\n domElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n\r\n // Tự động tắt marker sau 5 giây\r\n this.#idTimeOutScrollHeading = setTimeout(() => {\r\n if (this.#editor) {\r\n this.#editor.model.change(writer => {\r\n const marker = this.#editor.model.markers.get('highlightMarker');\r\n if (marker) writer.removeMarker(marker);\r\n });\r\n }\r\n }, 5000);\r\n } else {\r\n console.warn(`Heading with id ${id} not found.`);\r\n }\r\n },\r\n };\r\n\r\n // ========================================================================\r\n // 2. QUẢN LÝ COMMENT (Marker-based)\r\n // ========================================================================\r\n getCommentPluginAPI() {\r\n if (!this.#editor) return null;\r\n try {\r\n const plugin = this.#editor.plugins.get('CkComment') as CkCommentPlugin;\r\n return plugin;\r\n } catch (error) {\r\n console.warn('CkCommentPlugin not available:', error);\r\n return null;\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // 3. QUẢN LÝ VARIABLE\r\n // ========================================================================\r\n variable = {\r\n /**\r\n * Lấy tất cả variabes trong document\r\n * @returns Danh sách tất cả variables\r\n */\r\n all: <T = any>(): SdDocumentBuilderVariable<T>[] => {\r\n if (!this.#editor) return [];\r\n const model = this.#editor.model;\r\n const root = model.document.getRoot();\r\n if (!root) return [];\r\n\r\n const variables: SdDocumentBuilderVariable<T>[] = [];\r\n try {\r\n const range = model.createRangeIn(root);\r\n\r\n for (const item of range.getItems()) {\r\n // Sử dụng item.is('element', 'variable') là chính xác\r\n if (item.is('element', 'variable')) {\r\n variables.push({\r\n id: item.getAttribute('id') as string,\r\n uuid: item.getAttribute('uuid') as string,\r\n value: item.getAttribute('value') as string,\r\n display: item.getAttribute('display') as string,\r\n });\r\n }\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n return [];\r\n }\r\n\r\n return variables;\r\n },\r\n\r\n /**\r\n * Scroll tới vị trí của variable\r\n * @param uuid - uuid của variable FE sẽ tự sinh sau mỗi lần drop vào editor\r\n */\r\n scroll: (uuid: string) => {\r\n if (!this.#editor) return;\r\n\r\n const model = this.#editor.model;\r\n const root = model.document.getRoot();\r\n if (!root) return;\r\n\r\n let targetElement = null;\r\n const range = model.createRangeIn(root);\r\n for (const item of range.getItems()) {\r\n if (item.is('element', 'variable') && item.getAttribute('uuid') === uuid) {\r\n targetElement = item;\r\n break;\r\n }\r\n }\r\n\r\n if (targetElement) {\r\n const viewElement = this.#editor.editing.mapper.toViewElement(targetElement);\r\n if (viewElement) {\r\n const domElement = this.#editor.editing.view.domConverter.viewToDom(viewElement);\r\n if (domElement) {\r\n domElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n model.change(writer => {\r\n writer.setSelection(targetElement, 'on');\r\n });\r\n }\r\n }\r\n } else {\r\n console.warn(`Variable với id ${uuid} không tìm thấy trong tài liệu.`);\r\n }\r\n },\r\n };\r\n\r\n // ========================================================================\r\n // 4. HÀM EXPORT DOCX (FULL HEADER/FOOTER + PAGE NUMBER)\r\n // ========================================================================\r\n /**\r\n * Xuất file Word có Header/Footer\r\n * @param fileName Tên file\r\n * @param headerText Nội dung Header (hoặc HTML)\r\n * '<p style=\"text-align: center; font-weight: bold;\">CÔNG TY CỔ PHẦN CÔNG NGHỆ ABC</p>'\r\n * @param footerText Nội dung Footer (hoặc HTML)\r\n * '<p style=\"text-align: right; font-size: 10pt;\">Trang <span style=\"mso-field-code: PAGE\"></span> / <span style=\"mso-field-code: NUMPAGES\"></span></p>'\r\n */\r\n exportDocx(args: { fileName?: string; header?: string; footer?: string }): void {\r\n if (!this.#editor) return;\r\n const fileName = args?.fileName || `document_${Date.now()}.docx`;\r\n const header = args?.header || ``;\r\n const footer = args?.footer || ``;\r\n // 1. Kiểm tra xoay giấy\r\n const rootElement = this.#editor.editing.view.document.getRoot();\r\n const isLandscape = rootElement?.hasClass('landscape');\r\n const orientation = isLandscape ? 'landscape' : 'portrait';\r\n\r\n // Kích thước giấy cho Word (A4)\r\n // Portrait: 21cm x 29.7cm\r\n // Landscape: 29.7cm x 21cm\r\n // @page size trong CSS Word đôi khi cần set cứng width/height để header không bị lệch\r\n const pageCss = isLandscape\r\n ? 'size: 29.7cm 21cm; mso-page-orientation: landscape;'\r\n : 'size: 21cm 29.7cm; mso-page-orientation: portrait;';\r\n\r\n const contentHtml = this.#editor.getData();\r\n\r\n // 2. TẠO HTML CHUẨN MICROSOFT WORD XML\r\n // Phải có xmlns:o và xmlns:w thì Word mới hiểu được các lệnh mso-\r\n const fullHtml = `\r\n <html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'>\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <title>Export Document</title>\r\n \r\n <style>\r\n /* --- 1. SETUP TRANG GIẤY & HEADER/FOOTER --- */\r\n @page {\r\n ${pageCss}\r\n margin: 2.0cm; /* Lề chuẩn 2cm */\r\n \r\n /* Kỹ thuật map ID của Word */\r\n mso-header: header1;\r\n mso-footer: footer1;\r\n }\r\n\r\n /* Quan trọng: Ẩn các div header/footer khỏi luồng văn bản chính */\r\n /* Chúng sẽ chỉ hiện thị khi được @page gọi thông qua mso-header/footer */\r\n div#header1 { display: none; }\r\n div#footer1 { display: none; }\r\n\r\n /* --- 2. STYLE CƠ BẢN --- */\r\n body {\r\n font-family: 'Times New Roman', serif;\r\n font-size: 13pt;\r\n line-height: 1.5;\r\n tab-interval: 36pt;\r\n }\r\n \r\n /* Style Bảng */\r\n table { width: 100%; border-collapse: collapse; }\r\n td, th { border: 1px solid black; padding: 5px; }\r\n\r\n /* Style Biến (Giữ nguyên giao diện đẹp của bạn) */\r\n .variable-widget {\r\n color: #1565c0; font-weight: bold;\r\n background: #e3f2fd; padding: 0 4px; border-radius: 4px;\r\n border: 1px solid #90caf9;\r\n }\r\n \r\n /* Ẩn Comment khi in/xuất file */\r\n .ck-comment-marker { background-color: transparent; border: none; text-decoration: none; }\r\n </style>\r\n </head>\r\n <body>\r\n \r\n <div id=\"header1\">\r\n <div style=\"mso-element:header\">\r\n ${header}\r\n <div style='border-bottom: 1px solid #000; margin-top: 5px; margin-bottom: 20px;'></div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"footer1\">\r\n <div style=\"mso-element:footer\">\r\n <div style='border-top: 1px solid #000; margin-top: 20px; margin-bottom: 5px;'></div>\r\n ${footer}\r\n </div>\r\n </div>\r\n\r\n <div class=\"content\">\r\n ${contentHtml}\r\n </div>\r\n\r\n </body>\r\n </html>\r\n `;\r\n\r\n // 3. TẠO BLOB VÀ TẢI XUỐNG\r\n // Lưu ý: Dùng type 'application/msword' thay vì dùng thư viện html-docx-js\r\n // Thêm '\\ufeff' (BOM) để fix lỗi font tiếng Việt\r\n const blob = new Blob(['\\ufeff', fullHtml], { type: 'application/msword' });\r\n SdUtilities.downloadBlob(blob, fileName);\r\n }\r\n\r\n hightSelectRange = (range: ModelRange): void => {\r\n if (!range) return;\r\n const editor = this.#editor;\r\n\r\n editor.model.change(writer => {\r\n // Xóa marker cũ (nếu có)\r\n if (editor.model.markers.has('highlightRange')) {\r\n writer.removeMarker('highlightRange');\r\n }\r\n\r\n // Tạo marker mới\r\n writer.addMarker('highlightRange', {\r\n usingOperation: false, // Không lưu vào lịch sử Undo/Redo\r\n affectsData: false, // Không ảnh hưởng đến data lấy ra (getData)\r\n range: range,\r\n });\r\n });\r\n };\r\n\r\n removeHighlightSeclectRange = (): void => {\r\n const editor = this.#editor;\r\n editor.model.change(writer => {\r\n if (editor.model.markers.has('highlightRange')) {\r\n writer.removeMarker('highlightRange');\r\n }\r\n });\r\n };\r\n}\r\n","<div class=\"builder-container\">\n <ckeditor\n style=\"width: 100%\"\n [editor]=\"Editor\" \n [config]=\"config\" \n (ready)=\"onReady($event)\"\n [disabled]=\"disabled\">\n </ckeditor>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uuidv4"],"mappings":"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"}
|