typo3-typescript-sources 13.4.20
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/.github/workflows/sync-and-publish.yml +265 -0
- package/.last-synced-tag +1 -0
- package/LICENSE.txt +339 -0
- package/README-TYPO3.md +166 -0
- package/README.md +28 -0
- package/adminpanel/admin-panel.ts +375 -0
- package/adminpanel/modules/cache.ts +27 -0
- package/adminpanel/modules/preview.ts +75 -0
- package/backend/action-button/abstract-action.ts +22 -0
- package/backend/action-button/deferred-action.ts +41 -0
- package/backend/action-button/immediate-action.ts +31 -0
- package/backend/action-dispatcher.ts +104 -0
- package/backend/ajax-data-handler/message-interface.ts +18 -0
- package/backend/ajax-data-handler/response-interface.ts +20 -0
- package/backend/ajax-data-handler.ts +214 -0
- package/backend/backend-exception.ts +22 -0
- package/backend/broadcast-message.ts +50 -0
- package/backend/broadcast-service.ts +52 -0
- package/backend/browse-database.ts +38 -0
- package/backend/clear-cache.ts +88 -0
- package/backend/clipboard-panel.ts +240 -0
- package/backend/close-current-window.ts +2 -0
- package/backend/code-editor/autocomplete/completion-result.ts +105 -0
- package/backend/code-editor/autocomplete/ts-code-completion.ts +142 -0
- package/backend/code-editor/autocomplete/ts-parser.ts +485 -0
- package/backend/code-editor/autocomplete/ts-ref.ts +164 -0
- package/backend/code-editor/element/code-mirror-element.ts +282 -0
- package/backend/code-editor/language/typoscript.ts +181 -0
- package/backend/code-editor/stream-parser/typoscript.ts +1600 -0
- package/backend/color-picker.ts +158 -0
- package/backend/color-scheme-switch.ts +179 -0
- package/backend/column-selector-button.ts +302 -0
- package/backend/context-help.ts +68 -0
- package/backend/context-menu-actions.ts +322 -0
- package/backend/context-menu.ts +751 -0
- package/backend/copy-to-clipboard.ts +79 -0
- package/backend/date-time-picker.ts +270 -0
- package/backend/document-save-actions.ts +159 -0
- package/backend/drag-tooltip.ts +285 -0
- package/backend/drag-uploader.ts +914 -0
- package/backend/element/alert-element.ts +116 -0
- package/backend/element/dispatch-modal-button.ts +50 -0
- package/backend/element/draggable-resizable-element.ts +249 -0
- package/backend/element/editable-page-title.ts +306 -0
- package/backend/element/icon-element.ts +84 -0
- package/backend/element/immediate-action-element.ts +89 -0
- package/backend/element/pagination.ts +59 -0
- package/backend/element/progress-bar-element.ts +172 -0
- package/backend/element/progress-tracker-element.ts +119 -0
- package/backend/element/pseudo-button.ts +58 -0
- package/backend/element/spinner-element.ts +51 -0
- package/backend/element/thumbnail-element.ts +80 -0
- package/backend/element-browser.ts +182 -0
- package/backend/enum/data-transfer-types.ts +21 -0
- package/backend/enum/icon-types.ts +31 -0
- package/backend/enum/key-types.ts +27 -0
- package/backend/enum/severity.ts +20 -0
- package/backend/enum/viewport/scaffold-identifier.ts +24 -0
- package/backend/event/client-request.ts +25 -0
- package/backend/event/consumable.ts +18 -0
- package/backend/event/consumer-scope.ts +54 -0
- package/backend/event/event-dispatcher.ts +26 -0
- package/backend/event/interaction-request-assignment.ts +24 -0
- package/backend/event/interaction-request-map.ts +75 -0
- package/backend/event/interaction-request.ts +48 -0
- package/backend/event/trigger-request.ts +56 -0
- package/backend/form/submit-interceptor.ts +66 -0
- package/backend/form-engine/container/files-control-container.ts +716 -0
- package/backend/form-engine/container/flex-form-container-container.ts +166 -0
- package/backend/form-engine/container/flex-form-section-container.ts +210 -0
- package/backend/form-engine/container/inline-control-container.ts +1230 -0
- package/backend/form-engine/container/site-language-container.ts +616 -0
- package/backend/form-engine/element/abstract-sortable-select-items.ts +186 -0
- package/backend/form-engine/element/category-element.ts +160 -0
- package/backend/form-engine/element/color-element.ts +81 -0
- package/backend/form-engine/element/datetime-element.ts +66 -0
- package/backend/form-engine/element/extra/char-counter.ts +112 -0
- package/backend/form-engine/element/extra/select-box-filter.ts +85 -0
- package/backend/form-engine/element/folder-element.ts +66 -0
- package/backend/form-engine/element/group-element.ts +47 -0
- package/backend/form-engine/element/json-element.ts +52 -0
- package/backend/form-engine/element/link-element.ts +121 -0
- package/backend/form-engine/element/mfa-info-element.ts +169 -0
- package/backend/form-engine/element/modifier/resizable.ts +27 -0
- package/backend/form-engine/element/modifier/tabbable.ts +29 -0
- package/backend/form-engine/element/online-media-form-element.ts +65 -0
- package/backend/form-engine/element/password-element.ts +71 -0
- package/backend/form-engine/element/select-multiple-side-by-side-element.ts +83 -0
- package/backend/form-engine/element/select-single-element.ts +82 -0
- package/backend/form-engine/element/select-tree-element.ts +148 -0
- package/backend/form-engine/element/select-tree-toolbar.ts +118 -0
- package/backend/form-engine/element/select-tree.ts +210 -0
- package/backend/form-engine/element/slug-element.ts +243 -0
- package/backend/form-engine/element/suggest/result-container.ts +118 -0
- package/backend/form-engine/element/suggest/result-item.ts +90 -0
- package/backend/form-engine/element/table-permission-element.ts +101 -0
- package/backend/form-engine/element/table-wizard-element.ts +427 -0
- package/backend/form-engine/element/text-element.ts +52 -0
- package/backend/form-engine/element/text-table-element.ts +31 -0
- package/backend/form-engine/field-control/add-record.ts +40 -0
- package/backend/form-engine/field-control/edit-popup.ts +64 -0
- package/backend/form-engine/field-control/insert-clipboard.ts +50 -0
- package/backend/form-engine/field-control/link-popup.ts +53 -0
- package/backend/form-engine/field-control/list-module.ts +40 -0
- package/backend/form-engine/field-control/password-generator.ts +102 -0
- package/backend/form-engine/field-control/reset-selection.ts +48 -0
- package/backend/form-engine/field-wizard/localization-state-selector.ts +67 -0
- package/backend/form-engine/field-wizard/value-picker.ts +123 -0
- package/backend/form-engine/field-wizard/value-slider.ts +86 -0
- package/backend/form-engine/inline-relation/ajax-dispatcher.ts +124 -0
- package/backend/form-engine/inline-relation/inline-response-interface.ts +41 -0
- package/backend/form-engine-link-browser-adapter.ts +129 -0
- package/backend/form-engine-review.ts +155 -0
- package/backend/form-engine-suggest.ts +133 -0
- package/backend/form-engine-validation.ts +686 -0
- package/backend/form-engine.ts +1391 -0
- package/backend/global-event-handler.ts +252 -0
- package/backend/grid-editor.ts +1077 -0
- package/backend/hashing/md5.ts +252 -0
- package/backend/helper.ts +24 -0
- package/backend/hotkeys/hotkey-storage.ts +63 -0
- package/backend/hotkeys.ts +216 -0
- package/backend/icons.ts +236 -0
- package/backend/image-manipulation.ts +885 -0
- package/backend/info-window.ts +46 -0
- package/backend/input/clearable.ts +128 -0
- package/backend/input/index.d.ts +8 -0
- package/backend/java-script-module-import-event-handler.ts +19 -0
- package/backend/key-bindings.ts +42 -0
- package/backend/layout-module/drag-drop.ts +359 -0
- package/backend/layout-module/paste.ts +165 -0
- package/backend/link-browser.ts +89 -0
- package/backend/live-search/element/backend-search.ts +34 -0
- package/backend/live-search/element/hint.ts +33 -0
- package/backend/live-search/element/provider/default-result-item.ts +52 -0
- package/backend/live-search/element/provider/page-provider-result-item.ts +52 -0
- package/backend/live-search/element/result/item/action/action-container.ts +135 -0
- package/backend/live-search/element/result/item/action/action.ts +56 -0
- package/backend/live-search/element/result/item/item-container.ts +224 -0
- package/backend/live-search/element/result/item/item.ts +74 -0
- package/backend/live-search/element/result/result-container.ts +110 -0
- package/backend/live-search/element/result/result-detail-container.ts +50 -0
- package/backend/live-search/element/result/result-pagination.ts +122 -0
- package/backend/live-search/element/search-option-item.ts +70 -0
- package/backend/live-search/live-search-configurator.ts +54 -0
- package/backend/live-search/live-search-shortcut.ts +29 -0
- package/backend/live-search/result-types/backend-module-result-type.ts +8 -0
- package/backend/live-search/result-types/default-result-type.ts +21 -0
- package/backend/live-search/result-types/page-result-type.ts +23 -0
- package/backend/localization.ts +390 -0
- package/backend/login-refresh.ts +525 -0
- package/backend/login.ts +179 -0
- package/backend/mail-link-handler.ts +45 -0
- package/backend/modal-interface.ts +19 -0
- package/backend/modal.ts +685 -0
- package/backend/module/iframe.ts +125 -0
- package/backend/module/router.ts +275 -0
- package/backend/module-menu.ts +550 -0
- package/backend/module.ts +133 -0
- package/backend/multi-record-selection-action.ts +44 -0
- package/backend/multi-record-selection-delete-action.ts +108 -0
- package/backend/multi-record-selection-edit-action.ts +56 -0
- package/backend/multi-record-selection.ts +468 -0
- package/backend/multi-step-wizard.ts +568 -0
- package/backend/new-content-element-wizard-button.ts +51 -0
- package/backend/new-multiple-pages.ts +108 -0
- package/backend/new-record-wizard.ts +680 -0
- package/backend/notification.ts +366 -0
- package/backend/offset.ts +40 -0
- package/backend/online-media.ts +110 -0
- package/backend/page-actions.ts +91 -0
- package/backend/page-link-handler.ts +51 -0
- package/backend/pagetsconfig/pagetsconfig-includes.ts +77 -0
- package/backend/popover.ts +165 -0
- package/backend/record-download-button.ts +104 -0
- package/backend/record-link-handler.ts +31 -0
- package/backend/record-search.ts +44 -0
- package/backend/recordlist.ts +230 -0
- package/backend/resource/resource.ts +35 -0
- package/backend/security/element/csp-reports.ts +406 -0
- package/backend/security/element/sudo-mode.ts +249 -0
- package/backend/security/sudo-mode-interceptor.ts +19 -0
- package/backend/settings/editor/editable-setting.ts +231 -0
- package/backend/settings/editor.ts +451 -0
- package/backend/settings/enum/settings-mode.enum.ts +24 -0
- package/backend/settings/type/base.ts +200 -0
- package/backend/settings/type/bool.ts +56 -0
- package/backend/settings/type/color.ts +64 -0
- package/backend/settings/type/int.ts +85 -0
- package/backend/settings/type/number.ts +61 -0
- package/backend/settings/type/page.ts +100 -0
- package/backend/settings/type/string.ts +77 -0
- package/backend/settings/type/stringlist.ts +87 -0
- package/backend/severity.ts +88 -0
- package/backend/site-inline-actions.ts +32 -0
- package/backend/sortable-table.ts +208 -0
- package/backend/storage/abstract-client-storage.ts +76 -0
- package/backend/storage/browser-session.ts +28 -0
- package/backend/storage/client.ts +28 -0
- package/backend/storage/module-state-storage.ts +118 -0
- package/backend/storage/persistent.ts +204 -0
- package/backend/switch-user.ts +82 -0
- package/backend/tabs.ts +72 -0
- package/backend/telephone-link-handler.ts +40 -0
- package/backend/tests/backend/storage/browser-storage-test.ts +87 -0
- package/backend/tests/backend/storage/client-test.ts +87 -0
- package/backend/tests/backend/utility/dom-helper-test.ts +51 -0
- package/backend/tests/backend-exception-test.ts +28 -0
- package/backend/tests/element/immediate-action-element-test.ts +81 -0
- package/backend/tests/form-engine-validation-test.ts +304 -0
- package/backend/tests/grid-editor-test.ts +29 -0
- package/backend/tests/hashing/md5Test.ts +28 -0
- package/backend/tests/icons-test.ts +23 -0
- package/backend/tests/notification-test.ts +161 -0
- package/backend/tests/popover-test.ts +83 -0
- package/backend/toolbar/clear-cache-menu.ts +88 -0
- package/backend/toolbar/live-search.ts +284 -0
- package/backend/toolbar/shortcut-menu.ts +254 -0
- package/backend/toolbar/system-information-menu.ts +161 -0
- package/backend/toolbar.ts +41 -0
- package/backend/tree/file-storage-browser.ts +194 -0
- package/backend/tree/file-storage-tree-container.ts +465 -0
- package/backend/tree/file-storage-tree.ts +42 -0
- package/backend/tree/page-browser.ts +272 -0
- package/backend/tree/page-tree-element.ts +602 -0
- package/backend/tree/page-tree.ts +152 -0
- package/backend/tree/tree-module-state.ts +159 -0
- package/backend/tree/tree-node-toggle.ts +31 -0
- package/backend/tree/tree-node.ts +97 -0
- package/backend/tree/tree-toolbar.ts +117 -0
- package/backend/tree/tree.ts +1595 -0
- package/backend/url-link-handler.ts +36 -0
- package/backend/user-pass-login.ts +255 -0
- package/backend/user-settings-manager.ts +189 -0
- package/backend/utility/collapse-state-persister.ts +205 -0
- package/backend/utility/collapse-state-search.ts +183 -0
- package/backend/utility/dom-helper.ts +91 -0
- package/backend/utility/drag-drop-utility.ts +47 -0
- package/backend/utility/message-utility.ts +45 -0
- package/backend/utility/top-level-module-import.ts +32 -0
- package/backend/utility.ts +194 -0
- package/backend/viewport/abstract-container.ts +22 -0
- package/backend/viewport/content-container.ts +98 -0
- package/backend/viewport/loader.ts +28 -0
- package/backend/viewport/navigation-container.ts +119 -0
- package/backend/viewport/resizable-navigation.ts +176 -0
- package/backend/viewport/toolbar.ts +27 -0
- package/backend/viewport/topbar.ts +39 -0
- package/backend/viewport.ts +46 -0
- package/backend/window-manager.ts +84 -0
- package/backend/wizard/move-content-element.ts +107 -0
- package/backend/wizard/move-page.ts +74 -0
- package/backend/wizard.ts +331 -0
- package/belog/backend-log.ts +88 -0
- package/beuser/backend-user-listing.ts +40 -0
- package/beuser/permissions.ts +291 -0
- package/core/ajax/ajax-request-types.ts +15 -0
- package/core/ajax/ajax-request.ts +202 -0
- package/core/ajax/ajax-response.ts +57 -0
- package/core/ajax/input-transformer.ts +92 -0
- package/core/ajax/simple-response-interface.ts +5 -0
- package/core/authentication/mfa-provider/totp.ts +54 -0
- package/core/cache/dedupe-async-task.ts +95 -0
- package/core/directive/markdown.ts +82 -0
- package/core/directive/nl2br.ts +16 -0
- package/core/document-service.ts +35 -0
- package/core/event/debounce-event.ts +40 -0
- package/core/event/event-interface.ts +24 -0
- package/core/event/regular-event.ts +58 -0
- package/core/event/request-animation-frame-event.ts +42 -0
- package/core/event/throttle-event.ts +54 -0
- package/core/java-script-item-handler.ts +29 -0
- package/core/java-script-item-processor.ts +171 -0
- package/core/lit-helper.ts +126 -0
- package/core/literals.ts +17 -0
- package/core/referrer-refresh.ts +2 -0
- package/core/security-utility.ts +89 -0
- package/core/tests/ajax/ajax-request-test.ts +290 -0
- package/core/tests/ajax/input-transformer-test.ts +64 -0
- package/core/tests/cache/dedupe-async-task-test.ts +152 -0
- package/core/tests/event/throttle-event-test.ts +47 -0
- package/core/tests/literals-test.ts +24 -0
- package/core/tests/security-utility-test.ts +50 -0
- package/core/utility/types.ts +9 -0
- package/dashboard/chart-initializer.ts +136 -0
- package/dashboard/dashboard.ts +1487 -0
- package/extensionmanager/distribution-image.ts +55 -0
- package/extensionmanager/main.ts +291 -0
- package/extensionmanager/repository.ts +195 -0
- package/extensionmanager/update.ts +118 -0
- package/extensionmanager/upload-form.ts +42 -0
- package/filelist/browse-files.ts +148 -0
- package/filelist/browse-folders.ts +94 -0
- package/filelist/context-menu-actions.ts +335 -0
- package/filelist/create-folder.ts +69 -0
- package/filelist/file-delete.ts +69 -0
- package/filelist/file-list-actions.ts +132 -0
- package/filelist/file-list-dragdrop.ts +139 -0
- package/filelist/file-list-rename-handler.ts +128 -0
- package/filelist/file-list-transfer-handler.ts +138 -0
- package/filelist/file-list.ts +396 -0
- package/filelist/file-replace.ts +37 -0
- package/filelist/linkbrowser-file-handler.ts +94 -0
- package/filelist/linkbrowser-folder-handler.ts +74 -0
- package/filelist/rename-file.ts +109 -0
- package/form/backend/form-editor/component/property-grid-editor.ts +340 -0
- package/form/backend/form-editor/core.ts +2104 -0
- package/form/backend/form-editor/helper.ts +226 -0
- package/form/backend/form-editor/inspector-component.ts +2323 -0
- package/form/backend/form-editor/mediator.ts +941 -0
- package/form/backend/form-editor/modals-component.ts +433 -0
- package/form/backend/form-editor/stage-component.ts +908 -0
- package/form/backend/form-editor/tree-component.ts +548 -0
- package/form/backend/form-editor/view-model.ts +1343 -0
- package/form/backend/form-editor.ts +846 -0
- package/form/backend/form-manager/main.ts +39 -0
- package/form/backend/form-manager/view-model.ts +789 -0
- package/form/backend/form-manager.ts +180 -0
- package/form/backend/helper.ts +60 -0
- package/form/frontend/date-picker.ts +38 -0
- package/frontend/default_frontend.ts +82 -0
- package/impexp/context-menu-actions.ts +50 -0
- package/impexp/import-export.ts +62 -0
- package/indexed-search/pagination.ts +26 -0
- package/indexed-search/statistics.ts +50 -0
- package/info/translation-status.ts +48 -0
- package/install/ajax/ajax-queue.ts +83 -0
- package/install/init-install.ts +2 -0
- package/install/init-installer.ts +2 -0
- package/install/install.ts +25 -0
- package/install/installer.ts +458 -0
- package/install/message-interface.ts +18 -0
- package/install/module/abstract-inline-module.ts +27 -0
- package/install/module/abstract-interactable-module.ts +107 -0
- package/install/module/environment/environment-check.ts +92 -0
- package/install/module/environment/folder-structure.ts +145 -0
- package/install/module/environment/image-processing.ts +141 -0
- package/install/module/environment/mail-test.ts +127 -0
- package/install/module/environment/php-info.ts +50 -0
- package/install/module/environment/system-information.ts +50 -0
- package/install/module/maintenance/cache.ts +59 -0
- package/install/module/maintenance/clear-tables.ts +134 -0
- package/install/module/maintenance/clear-typo3temp-files.ts +137 -0
- package/install/module/maintenance/create-admin.ts +126 -0
- package/install/module/maintenance/database-analyzer.ts +266 -0
- package/install/module/maintenance/dump-autoload.ts +58 -0
- package/install/module/maintenance/language-packs.ts +338 -0
- package/install/module/maintenance/reset-backend-user-uc.ts +58 -0
- package/install/module/password-strength.ts +56 -0
- package/install/module/settings/change-install-tool-password.ts +101 -0
- package/install/module/settings/extension-configuration.ts +224 -0
- package/install/module/settings/features.ts +102 -0
- package/install/module/settings/local-configuration.ts +316 -0
- package/install/module/settings/presets.ts +147 -0
- package/install/module/settings/system-maintainer.ts +111 -0
- package/install/module/upgrade/core-update.ts +255 -0
- package/install/module/upgrade/extension-compat-tester.ts +195 -0
- package/install/module/upgrade/extension-scanner.ts +381 -0
- package/install/module/upgrade/tca-ext-tables-check.ts +93 -0
- package/install/module/upgrade/tca-migrations-check.ts +101 -0
- package/install/module/upgrade/upgrade-docs.ts +310 -0
- package/install/module/upgrade/upgrade-wizards.ts +612 -0
- package/install/renderable/clearable.ts +113 -0
- package/install/renderable/flash-message.ts +64 -0
- package/install/renderable/info-box.ts +66 -0
- package/install/renderable/language-packs.ts +304 -0
- package/install/renderable/offset-group.ts +38 -0
- package/install/renderable/severity.ts +49 -0
- package/install/renderable/wrap-group.ts +36 -0
- package/install/router.ts +468 -0
- package/linkvalidator/linkvalidator-modal.ts +45 -0
- package/linkvalidator/linkvalidator.ts +101 -0
- package/lowlevel/query-generator.ts +132 -0
- package/lowlevel/reference-index.ts +44 -0
- package/opendocs/toolbar/opendocs-menu.ts +117 -0
- package/package.json +34 -0
- package/recycler/recycler.ts +539 -0
- package/redirects/event-handler.ts +108 -0
- package/redirects/form-engine-evaluation.ts +34 -0
- package/redirects/redirects-module.ts +58 -0
- package/rte-ckeditor/ckeditor5.ts +402 -0
- package/rte-ckeditor/css-prefixer.ts +94 -0
- package/rte-ckeditor/legacy/ckeditor5-bundle.ts +17 -0
- package/rte-ckeditor/legacy/ckeditor5-inspector.ts +2 -0
- package/rte-ckeditor/plugin/typo3-link.ts +810 -0
- package/rte-ckeditor/plugin/whitespace.ts +114 -0
- package/rte-ckeditor/rte-link-browser.ts +112 -0
- package/rte-ckeditor/tests/css-prefixer-test.ts +314 -0
- package/scheduler/scheduler-add-group.ts +119 -0
- package/scheduler/scheduler-editable-group-name.ts +307 -0
- package/scheduler/scheduler-sortable-groups.ts +59 -0
- package/scheduler/scheduler.ts +466 -0
- package/setup/setup-module.ts +122 -0
- package/styleguide/checkbox-demo.ts +5 -0
- package/styleguide/element/theme-switcher-element.ts +101 -0
- package/styleguide/filter.ts +22 -0
- package/styleguide/find-icons.ts +78 -0
- package/styleguide/processing-indicator.ts +78 -0
- package/styleguide/render-notifications.ts +64 -0
- package/sys-note/element/delete-button.ts +78 -0
- package/tstemplate/constant-editor.ts +64 -0
- package/tstemplate/information-module.ts +31 -0
- package/tstemplate/template-analyzer.ts +77 -0
- package/viewpage/main.ts +253 -0
- package/workspaces/backend.ts +979 -0
- package/workspaces/preview.ts +232 -0
- package/workspaces/renderable/comment-view.ts +79 -0
- package/workspaces/renderable/diff-view.ts +58 -0
- package/workspaces/renderable/history-view.ts +97 -0
- package/workspaces/renderable/record-information.ts +118 -0
- package/workspaces/renderable/record-table.ts +355 -0
- package/workspaces/renderable/send-to-stage-form.ts +108 -0
- package/workspaces/toolbar/workspaces-menu.ts +190 -0
- package/workspaces/utility/icon-helper.ts +57 -0
- package/workspaces/workspaces.ts +136 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the TYPO3 CMS project.
|
|
3
|
+
*
|
|
4
|
+
* It is free software; you can redistribute it and/or modify it under
|
|
5
|
+
* the terms of the GNU General Public License, either version 2
|
|
6
|
+
* of the License, or any later version.
|
|
7
|
+
*
|
|
8
|
+
* For the full copyright and license information, please read the
|
|
9
|
+
* LICENSE.txt file that was distributed with this source code.
|
|
10
|
+
*
|
|
11
|
+
* The TYPO3 project - inspiring people to share!
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import RegularEvent from '@typo3/core/event/regular-event';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Module: @typo3/redirects/redirects-module
|
|
18
|
+
* @exports @typo3/redirects/redirects-module
|
|
19
|
+
*/
|
|
20
|
+
class RedirectsModule {
|
|
21
|
+
public constructor() {
|
|
22
|
+
const filterForm: HTMLFormElement = document.querySelector('form[data-on-submit="processNavigate"]');
|
|
23
|
+
if (filterForm !== null) {
|
|
24
|
+
new RegularEvent('change', this.executeSubmit.bind(this))
|
|
25
|
+
.delegateTo(document, '[data-on-change="submit"]');
|
|
26
|
+
new RegularEvent('submit', this.processNavigate.bind(this))
|
|
27
|
+
.bindTo(filterForm);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private executeSubmit(evt: Event): void {
|
|
32
|
+
const target = evt.target;
|
|
33
|
+
if (target instanceof HTMLSelectElement || (target instanceof HTMLInputElement && target.type === 'checkbox')) {
|
|
34
|
+
target.form.submit();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private processNavigate(evt: Event): void {
|
|
39
|
+
const target = evt.target;
|
|
40
|
+
if (!(target instanceof HTMLFormElement)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
evt.preventDefault();
|
|
44
|
+
const formField = target.elements.namedItem('paginator-target-page') as HTMLInputElement;
|
|
45
|
+
const numberOfPages = parseInt(formField.dataset.numberOfPages, 10);
|
|
46
|
+
let url = formField.dataset.url;
|
|
47
|
+
let page = parseInt(formField.value, 10);
|
|
48
|
+
if (page > numberOfPages) {
|
|
49
|
+
page = numberOfPages;
|
|
50
|
+
} else if (page < 1) {
|
|
51
|
+
page = 1;
|
|
52
|
+
}
|
|
53
|
+
url = url.replace('987654322', page.toString());
|
|
54
|
+
self.location.href = url;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export default new RedirectsModule();
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import { html, LitElement, type TemplateResult } from 'lit';
|
|
2
|
+
import { customElement, property, queryAssignedElements } from 'lit/decorators';
|
|
3
|
+
import AjaxRequest from '@typo3/core/ajax/ajax-request';
|
|
4
|
+
import DebounceEvent from '@typo3/core/event/debounce-event';
|
|
5
|
+
import { prefixAndRebaseCss } from '@typo3/rte-ckeditor/css-prefixer';
|
|
6
|
+
import { ClassicEditor } from '@ckeditor/ckeditor5-editor-classic';
|
|
7
|
+
import type { Editor, EditorConfig, PluginConstructor } from '@ckeditor/ckeditor5-core';
|
|
8
|
+
import type { WordCount, WordCountConfig } from '@ckeditor/ckeditor5-word-count';
|
|
9
|
+
import type { SourceEditing } from '@ckeditor/ckeditor5-source-editing';
|
|
10
|
+
import type { GeneralHtmlSupportConfig } from '@ckeditor/ckeditor5-html-support';
|
|
11
|
+
import type { TypingConfig } from '@ckeditor/ckeditor5-typing';
|
|
12
|
+
import type { EventInfo } from '@ckeditor/ckeditor5-utils';
|
|
13
|
+
import type { FullscreenConfig } from '@ckeditor/ckeditor5-fullscreen';
|
|
14
|
+
|
|
15
|
+
type PluginModuleDescriptor = {
|
|
16
|
+
module: string,
|
|
17
|
+
exports: string[],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
type CKEditor5Config = Omit<EditorConfig, 'toolbar'> & {
|
|
21
|
+
// in TYPO3 always `items` property is used, skipping `string[]`
|
|
22
|
+
toolbar?: { items: string[], shouldNotGroupWhenFull?: boolean };
|
|
23
|
+
importModules?: Array<string|PluginModuleDescriptor>;
|
|
24
|
+
removeImportModules?: Array<string|PluginModuleDescriptor>;
|
|
25
|
+
contentsCss?: string[];
|
|
26
|
+
width?: string|number;
|
|
27
|
+
height?: string|number;
|
|
28
|
+
readOnly?: boolean;
|
|
29
|
+
debug?: boolean;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type Typo3Plugin = PluginConstructor<Editor> & {overrides?: PluginConstructor<Editor>[]};
|
|
33
|
+
type PluginModule = Record<string, Typo3Plugin>;
|
|
34
|
+
|
|
35
|
+
const defaultPlugins: PluginModuleDescriptor[] = [
|
|
36
|
+
{ module: '@ckeditor/ckeditor5-block-quote', exports: ['BlockQuote'] },
|
|
37
|
+
{ module: '@ckeditor/ckeditor5-essentials', exports: ['Essentials'] },
|
|
38
|
+
{ module: '@ckeditor/ckeditor5-find-and-replace', exports: ['FindAndReplace'] },
|
|
39
|
+
{ module: '@ckeditor/ckeditor5-heading', exports: ['Heading'] },
|
|
40
|
+
{ module: '@ckeditor/ckeditor5-indent', exports: ['Indent', 'IndentBlock'] },
|
|
41
|
+
{ module: '@ckeditor/ckeditor5-link', exports: ['Link'] },
|
|
42
|
+
{ module: '@ckeditor/ckeditor5-list', exports: ['List'] },
|
|
43
|
+
{ module: '@ckeditor/ckeditor5-paragraph', exports: ['Paragraph'] },
|
|
44
|
+
{ module: '@ckeditor/ckeditor5-clipboard', exports: ['PastePlainText'] },
|
|
45
|
+
{ module: '@ckeditor/ckeditor5-paste-from-office', exports: ['PasteFromOffice'] },
|
|
46
|
+
{ module: '@ckeditor/ckeditor5-remove-format', exports: ['RemoveFormat'] },
|
|
47
|
+
{ module: '@ckeditor/ckeditor5-table', exports: ['Table', 'TableToolbar', 'TableProperties', 'TableCellProperties', 'TableCaption'] },
|
|
48
|
+
{ module: '@ckeditor/ckeditor5-typing', exports: ['TextTransformation'] },
|
|
49
|
+
{ module: '@ckeditor/ckeditor5-source-editing', exports: ['SourceEditing'] },
|
|
50
|
+
{ module: '@ckeditor/ckeditor5-alignment', exports: ['Alignment'] },
|
|
51
|
+
{ module: '@ckeditor/ckeditor5-style', exports: ['Style'] },
|
|
52
|
+
{ module: '@ckeditor/ckeditor5-html-support', exports: ['GeneralHtmlSupport'] },
|
|
53
|
+
{ module: '@ckeditor/ckeditor5-basic-styles', exports: ['Bold', 'Italic', 'Subscript', 'Superscript', 'Strikethrough', 'Underline'] },
|
|
54
|
+
{ module: '@ckeditor/ckeditor5-special-characters', exports: ['SpecialCharacters', 'SpecialCharactersEssentials'] },
|
|
55
|
+
{ module: '@ckeditor/ckeditor5-horizontal-line', exports: ['HorizontalLine'] },
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Module: @typo3/rte_ckeditor/ckeditor5
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* <typo3-rte-ckeditor-ckeditor5
|
|
63
|
+
* options="[JSON]"
|
|
64
|
+
* ></typo3-rte-ckeditor-ckeditor5>
|
|
65
|
+
*/
|
|
66
|
+
@customElement('typo3-rte-ckeditor-ckeditor5')
|
|
67
|
+
export class CKEditor5Element extends LitElement {
|
|
68
|
+
|
|
69
|
+
@property({ type: Object }) options?: CKEditor5Config = {};
|
|
70
|
+
|
|
71
|
+
@queryAssignedElements({ slot: 'textarea' }) target: HTMLElement[];
|
|
72
|
+
|
|
73
|
+
private readonly styleSheets: Map<CSSStyleSheet, true> = new Map();
|
|
74
|
+
|
|
75
|
+
public override connectedCallback(): void {
|
|
76
|
+
super.connectedCallback();
|
|
77
|
+
this.prefixAndLoadContentsCss();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public override disconnectedCallback(): void {
|
|
81
|
+
super.disconnectedCallback();
|
|
82
|
+
document.adoptedStyleSheets = document.adoptedStyleSheets.filter(styleSheet => !this.styleSheets.has(styleSheet));
|
|
83
|
+
this.styleSheets.clear();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
protected override firstUpdated(): void {
|
|
87
|
+
if (this.target[0] instanceof HTMLTextAreaElement) {
|
|
88
|
+
this.initCKEditor();
|
|
89
|
+
} else {
|
|
90
|
+
this.renderRoot.querySelector('slot[name="textarea"]').addEventListener('slotchange', () => this.initCKEditor(), { once: true });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
protected async initCKEditor(): Promise<void> {
|
|
95
|
+
if (!(this.target[0] instanceof HTMLTextAreaElement)) {
|
|
96
|
+
throw new Error('No rich-text <textarea> content target found.');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const {
|
|
100
|
+
// options handled by this wrapper
|
|
101
|
+
importModules,
|
|
102
|
+
removeImportModules,
|
|
103
|
+
width,
|
|
104
|
+
height,
|
|
105
|
+
readOnly,
|
|
106
|
+
debug,
|
|
107
|
+
|
|
108
|
+
// options forwarded to CKEditor 5
|
|
109
|
+
toolbar,
|
|
110
|
+
placeholder,
|
|
111
|
+
htmlSupport,
|
|
112
|
+
wordCount,
|
|
113
|
+
typo3link,
|
|
114
|
+
removePlugins,
|
|
115
|
+
...otherOptions
|
|
116
|
+
} = this.options;
|
|
117
|
+
|
|
118
|
+
if ('extraPlugins' in otherOptions) {
|
|
119
|
+
// Drop CKEditor 4 style extraPlugins which we do not support for CKEditor 5
|
|
120
|
+
// as this string-based list of plugin names works only for bundled plugins.
|
|
121
|
+
// `config.importModules` is used for CKEditor 5 instead
|
|
122
|
+
delete otherOptions.extraPlugins;
|
|
123
|
+
}
|
|
124
|
+
if ('contentsCss' in otherOptions) {
|
|
125
|
+
// Consumed in connectedCallback
|
|
126
|
+
delete otherOptions.contentsCss;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
let fullscreenConfiguration: FullscreenConfig = {};
|
|
130
|
+
if ('fullscreen' in otherOptions) {
|
|
131
|
+
fullscreenConfiguration = otherOptions.fullscreen;
|
|
132
|
+
delete otherOptions.fullscreen;
|
|
133
|
+
}
|
|
134
|
+
// Set `.module-body` as the parent container to let users reach controls, e.g. the "Save" button
|
|
135
|
+
fullscreenConfiguration.container = document.querySelector('.module-body');
|
|
136
|
+
|
|
137
|
+
const plugins = await this.resolvePlugins(defaultPlugins, importModules, removeImportModules);
|
|
138
|
+
|
|
139
|
+
const config: EditorConfig = {
|
|
140
|
+
licenseKey: 'GPL',
|
|
141
|
+
...otherOptions,
|
|
142
|
+
// link.defaultProtocol: 'https://'
|
|
143
|
+
toolbar,
|
|
144
|
+
plugins,
|
|
145
|
+
placeholder,
|
|
146
|
+
wordCount,
|
|
147
|
+
typo3link: typo3link || null,
|
|
148
|
+
removePlugins: removePlugins || [],
|
|
149
|
+
fullscreen: fullscreenConfiguration
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
if (htmlSupport !== undefined) {
|
|
153
|
+
config.htmlSupport = convertPseudoRegExp(htmlSupport) as GeneralHtmlSupportConfig;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (config?.typing?.transformations !== undefined) {
|
|
157
|
+
// Implement variant of CKEditor's native buildQuotesRegExp() method.
|
|
158
|
+
// This allows to convert a 'pattern' sub-object into the proper object.
|
|
159
|
+
config.typing.transformations = convertPseudoRegExp(config.typing.transformations) as TypingConfig['transformations'];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
ClassicEditor
|
|
163
|
+
.create(this.target[0], config)
|
|
164
|
+
.then((editor: ClassicEditor) => {
|
|
165
|
+
this.applyEditableElementStyles(editor, width, height);
|
|
166
|
+
this.handleWordCountPlugin(editor, wordCount);
|
|
167
|
+
this.applyReadOnly(editor, readOnly);
|
|
168
|
+
editor.model.document.on('change:data', (): void => {
|
|
169
|
+
editor.updateSourceElement();
|
|
170
|
+
this.target[0].dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
|
|
171
|
+
});
|
|
172
|
+
if (editor.plugins.has('SourceEditing')) {
|
|
173
|
+
const sourceEditingPlugin = editor.plugins.get('SourceEditing') as SourceEditing;
|
|
174
|
+
sourceEditingPlugin.on('change:isSourceEditingMode', (eventInfo: EventInfo, eventName: string, isEnabled: boolean): void => {
|
|
175
|
+
for (const [ rootName ] of editor.editing.view.domRoots) {
|
|
176
|
+
// Behold, CKEditor doesn't exposes events for the edit textarea that replaces the editor UI
|
|
177
|
+
// therefore we have to register an `input` event handler ourselves.
|
|
178
|
+
// The neat thing: if the user switches back to wysiwyg mode, the textarea is disposed,
|
|
179
|
+
// we don't have to remove the event handler by ourselves.
|
|
180
|
+
if (isEnabled) {
|
|
181
|
+
const sourceEditingTextarea = editor.ui.getEditableElement(`sourceEditing:${rootName}`);
|
|
182
|
+
if (sourceEditingTextarea instanceof HTMLTextAreaElement) {
|
|
183
|
+
new DebounceEvent('input', (): void => {
|
|
184
|
+
// Force editor model update on input, this will dispatch `change:data`
|
|
185
|
+
sourceEditingPlugin.updateEditorData();
|
|
186
|
+
}, 100).bindTo(sourceEditingTextarea);
|
|
187
|
+
} else {
|
|
188
|
+
throw new Error('Cannot find textarea related to source editing. Has CKEditor been upgraded?');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (debug) {
|
|
196
|
+
import('@ckeditor/ckeditor5-inspector').then(({ default: CKEditorInspector }) => CKEditorInspector.attach(editor, { isCollapsed: true }));
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
protected override render(): TemplateResult {
|
|
202
|
+
return html`
|
|
203
|
+
<slot name="textarea"></slot>
|
|
204
|
+
<slot></slot>
|
|
205
|
+
`;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private async resolvePlugins(
|
|
209
|
+
defaultPlugins: Array<PluginModuleDescriptor>,
|
|
210
|
+
importModulesOption: Array<string|PluginModuleDescriptor>|undefined,
|
|
211
|
+
removeImportModulesOption: Array<string|PluginModuleDescriptor>|undefined
|
|
212
|
+
): Promise<Array<PluginConstructor<Editor>>> {
|
|
213
|
+
const removeImportModules: Array<PluginModuleDescriptor> = normalizeImportModules(removeImportModulesOption || []);
|
|
214
|
+
const importModules: Array<PluginModuleDescriptor> = normalizeImportModules([
|
|
215
|
+
...defaultPlugins,
|
|
216
|
+
...(importModulesOption || []),
|
|
217
|
+
]).map((moduleDescriptor: PluginModuleDescriptor) => {
|
|
218
|
+
const { module } = moduleDescriptor;
|
|
219
|
+
let { exports } = moduleDescriptor;
|
|
220
|
+
for (const toRemove of removeImportModules) {
|
|
221
|
+
if (toRemove.module === module) {
|
|
222
|
+
exports = exports.filter(el => !toRemove.exports.includes(el));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return { module, exports };
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
const pluginModules: Array<{module: PluginModule, exports: string[]}> = await Promise.all(
|
|
229
|
+
importModules
|
|
230
|
+
.map(async (moduleDescriptor: PluginModuleDescriptor): Promise<{module: PluginModule, exports: string[]}> => {
|
|
231
|
+
try {
|
|
232
|
+
return {
|
|
233
|
+
module: await import(moduleDescriptor.module) as PluginModule,
|
|
234
|
+
exports: moduleDescriptor.exports,
|
|
235
|
+
};
|
|
236
|
+
} catch (e) {
|
|
237
|
+
console.error(`Failed to load CKEditor 5 module ${moduleDescriptor.module}`, e);
|
|
238
|
+
return {
|
|
239
|
+
module: null,
|
|
240
|
+
exports: []
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
})
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
const declaredPlugins: Array<Typo3Plugin> = [];
|
|
247
|
+
pluginModules.forEach(({ module, exports }) => {
|
|
248
|
+
for (const exportName of exports) {
|
|
249
|
+
if (exportName in module) {
|
|
250
|
+
declaredPlugins.push(module[exportName]);
|
|
251
|
+
} else {
|
|
252
|
+
console.error(`CKEditor 5 plugin export "${exportName}" not available in`, module);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
// plugins that were overridden by other custom plugin implementations
|
|
258
|
+
const overriddenPlugins = declaredPlugins
|
|
259
|
+
.filter(plugin => plugin.overrides?.length > 0)
|
|
260
|
+
.map(plugin => plugin.overrides)
|
|
261
|
+
.flat(1);
|
|
262
|
+
|
|
263
|
+
// plugins, without those that have been overridden
|
|
264
|
+
return declaredPlugins
|
|
265
|
+
.filter(plugin => !overriddenPlugins.includes(plugin as PluginConstructor<Editor>));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
private async prefixAndLoadContentsCss(): Promise<void> {
|
|
269
|
+
if (!Array.isArray(this.options.contentsCss)) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const styleSheetStates = await Promise.allSettled(
|
|
273
|
+
this.options.contentsCss.map(url => this.prefixContentsCss(url, this.getAttribute('id')))
|
|
274
|
+
);
|
|
275
|
+
const styleSheets = styleSheetStates
|
|
276
|
+
.map(state => state.status === 'fulfilled' ? state.value : null)
|
|
277
|
+
.filter(v => v !== null);
|
|
278
|
+
styleSheets.forEach(styleSheet => this.styleSheets.set(styleSheet, true));
|
|
279
|
+
document.adoptedStyleSheets = [...document.adoptedStyleSheets, ...styleSheets];
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
private async prefixContentsCss(url: string, fieldId: string): Promise<CSSStyleSheet> {
|
|
283
|
+
let content: string;
|
|
284
|
+
try {
|
|
285
|
+
const response = await new AjaxRequest(url).get();
|
|
286
|
+
content = await response.resolve();
|
|
287
|
+
} catch (e) {
|
|
288
|
+
console.error(`Failed to fetch CSS content for CKEditor 5 prefixing: "${url}"`, e);
|
|
289
|
+
throw new Error();
|
|
290
|
+
}
|
|
291
|
+
// see https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html
|
|
292
|
+
const newParents = [
|
|
293
|
+
// Prefix custom stylesheets with id of the container element and a required `.ck-content` selector
|
|
294
|
+
`#${fieldId} .ck-content`,
|
|
295
|
+
];
|
|
296
|
+
|
|
297
|
+
if (this.options.toolbar.items.includes('fullscreen')) {
|
|
298
|
+
// If the "fullscreen" action is available, prefix custom stylesheets with fullscreen class and a required `.ck-content` selector
|
|
299
|
+
newParents.push('.ck-fullscreen__editable .ck-content');
|
|
300
|
+
}
|
|
301
|
+
let prefixedCss = '';
|
|
302
|
+
for (const newParent of newParents) {
|
|
303
|
+
prefixedCss += prefixAndRebaseCss(content, url, newParent);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const styleSheet = new CSSStyleSheet();
|
|
307
|
+
await styleSheet.replace(
|
|
308
|
+
prefixedCss
|
|
309
|
+
);
|
|
310
|
+
return styleSheet;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
private applyEditableElementStyles(editor: Editor, width: string|number|undefined, height: string|number|undefined): void {
|
|
314
|
+
const view = editor.editing.view;
|
|
315
|
+
const styles: Record<string, string|number|undefined> = {
|
|
316
|
+
'min-height': height,
|
|
317
|
+
'min-width': width,
|
|
318
|
+
};
|
|
319
|
+
Object.keys(styles).forEach((key) => {
|
|
320
|
+
const _assignment: string|number = styles[key];
|
|
321
|
+
if (!_assignment) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
let assignment: string;
|
|
325
|
+
if (typeof _assignment === 'number' || !Number.isNaN(Number(assignment))) {
|
|
326
|
+
assignment = `${_assignment}px`;
|
|
327
|
+
} else {
|
|
328
|
+
assignment = _assignment;
|
|
329
|
+
}
|
|
330
|
+
view.change((writer) => {
|
|
331
|
+
writer.setStyle(key, assignment, view.document.getRoot());
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* see https://ckeditor.com/docs/ckeditor5/latest/features/word-count.html
|
|
338
|
+
*/
|
|
339
|
+
private handleWordCountPlugin(editor: Editor, wordCount: WordCountConfig|undefined): void {
|
|
340
|
+
if (editor.plugins.has('WordCount') && (wordCount?.displayWords || wordCount?.displayCharacters)) {
|
|
341
|
+
const wordCountPlugin = editor.plugins.get('WordCount') as WordCount;
|
|
342
|
+
this.appendChild(wordCountPlugin.wordCountContainer);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* see https://ckeditor.com/docs/ckeditor5/latest/features/read-only.html
|
|
348
|
+
*/
|
|
349
|
+
private applyReadOnly(editor: Editor, readOnly: boolean): void {
|
|
350
|
+
if (readOnly) {
|
|
351
|
+
editor.enableReadOnlyMode('typo3-lock');
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
type RecurseMapInput = Record<string, unknown>|Array<unknown>|unknown;
|
|
357
|
+
type PseudoRegExp = {
|
|
358
|
+
pattern: string,
|
|
359
|
+
flags?: string
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
function walkObj(data: RecurseMapInput, proc: (value: unknown) => unknown|null): RecurseMapInput {
|
|
363
|
+
if (typeof data === 'object') {
|
|
364
|
+
if (Array.isArray(data)) {
|
|
365
|
+
return data.map((element: RecurseMapInput) => proc(element) ?? walkObj(element, proc));
|
|
366
|
+
}
|
|
367
|
+
const newData: Record<string, unknown> = {};
|
|
368
|
+
for (const [key, value] of Object.entries(data)) {
|
|
369
|
+
newData[key] = proc(value) ?? walkObj(value, proc);
|
|
370
|
+
}
|
|
371
|
+
return newData;
|
|
372
|
+
}
|
|
373
|
+
return data;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function convertPseudoRegExp(data: RecurseMapInput): RecurseMapInput {
|
|
377
|
+
return walkObj(data, (entry: PseudoRegExp | unknown): RegExp | null => {
|
|
378
|
+
if (typeof entry === 'object' && 'pattern' in entry && typeof entry.pattern === 'string') {
|
|
379
|
+
const pseudoRegExp = entry as PseudoRegExp;
|
|
380
|
+
return new RegExp(pseudoRegExp.pattern, pseudoRegExp.flags || undefined);
|
|
381
|
+
}
|
|
382
|
+
return null;
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function normalizeImportModules(modules: Array<string|PluginModuleDescriptor>): Array<PluginModuleDescriptor> {
|
|
387
|
+
return modules.map(moduleDescriptor => {
|
|
388
|
+
if (typeof moduleDescriptor === 'string') {
|
|
389
|
+
return {
|
|
390
|
+
module: moduleDescriptor,
|
|
391
|
+
exports: [ 'default' ],
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
return moduleDescriptor;
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
declare global {
|
|
399
|
+
interface HTMLElementTagNameMap {
|
|
400
|
+
'typo3-rte-ckeditor-ckeditor5': CKEditor5Element;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as csstree from 'css-tree';
|
|
2
|
+
import type { CssNode, Selector, Url } from 'css-tree';
|
|
3
|
+
|
|
4
|
+
type NodeProcessor = (node: CssNode) => void;
|
|
5
|
+
|
|
6
|
+
export function prefixAndRebaseCss(contents: string, currentPath: string, prefix: string): string {
|
|
7
|
+
const ast = csstree.parse(contents);
|
|
8
|
+
const prefixer = cssPrefixer(prefix);
|
|
9
|
+
const relocator = cssRelocator(currentPath);
|
|
10
|
+
csstree.walk(ast, (node) => {
|
|
11
|
+
relocator(node);
|
|
12
|
+
return prefixer(node);
|
|
13
|
+
});
|
|
14
|
+
return csstree.generate(ast);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function cssRelocator(currentPath: string): NodeProcessor {
|
|
18
|
+
return (node: CssNode): void => {
|
|
19
|
+
if (node.type !== 'Url') {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const url: Url = node;
|
|
24
|
+
if (
|
|
25
|
+
url.value.startsWith('data:') ||
|
|
26
|
+
url.value.startsWith('/') ||
|
|
27
|
+
url.value.includes('://')
|
|
28
|
+
) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const absoluteUrl = new URL(currentPath.replace(/\?.+/, '') + '/../' + url.value, document.baseURI);
|
|
33
|
+
url.value = absoluteUrl.pathname + absoluteUrl.search + absoluteUrl.hash;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function cssPrefixer(prefix: string): NodeProcessor {
|
|
38
|
+
if (prefix === '') {
|
|
39
|
+
return (): void => {
|
|
40
|
+
return;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return (node: CssNode): void|typeof csstree.walk.skip => {
|
|
45
|
+
if (node.type !== 'Selector') {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const selector: Selector = node;
|
|
49
|
+
if (selector.children.isEmpty) {
|
|
50
|
+
return csstree.walk.skip;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const prefixAst = csstree.parse(prefix + '{}');
|
|
54
|
+
const prefixSelector = csstree.find(prefixAst, (node) => node.type === 'Selector') as Selector;
|
|
55
|
+
if (prefixSelector === null) {
|
|
56
|
+
throw new Error(`Failed to parse "${prefix}" as CSS prefix`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (
|
|
60
|
+
selector.children.first.type === 'PseudoClassSelector' &&
|
|
61
|
+
selector.children.first.name === 'root'
|
|
62
|
+
) {
|
|
63
|
+
/* Replace `:root foo bar {}` with `#prefix foo bar {}` */
|
|
64
|
+
selector.children.shift();
|
|
65
|
+
selector.children.prependList(prefixSelector.children);
|
|
66
|
+
return csstree.walk.skip;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* Replace `html foo bar {}` or `body foo bar {}` with `#prefix foo bar {}` */
|
|
70
|
+
let htmlBodyHasBeenReplaced = false;
|
|
71
|
+
selector.children.forEach((childNode, item) => {
|
|
72
|
+
if (
|
|
73
|
+
childNode.type === 'TypeSelector' &&
|
|
74
|
+
['html', 'body'].includes(childNode.name.toLowerCase())
|
|
75
|
+
) {
|
|
76
|
+
if (!htmlBodyHasBeenReplaced) {
|
|
77
|
+
selector.children.replace(item, prefixSelector.children);
|
|
78
|
+
htmlBodyHasBeenReplaced = true;
|
|
79
|
+
} else {
|
|
80
|
+
/* Ensure `html body` is replaced with `#prefix` instead of `#prefix #prefix` */
|
|
81
|
+
selector.children.remove(item);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
if (htmlBodyHasBeenReplaced) {
|
|
86
|
+
return csstree.walk.skip;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
selector.children.unshift({ type: 'Combinator', loc: null, name: ' ' });
|
|
90
|
+
selector.children.prependList(prefixSelector.children);
|
|
91
|
+
|
|
92
|
+
return csstree.walk.skip;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * as Core from '@ckeditor/ckeditor5-core';
|
|
2
|
+
export * as UI from '@ckeditor/ckeditor5-ui';
|
|
3
|
+
export * as Engine from '@ckeditor/ckeditor5-engine';
|
|
4
|
+
export * as Utils from '@ckeditor/ckeditor5-utils';
|
|
5
|
+
|
|
6
|
+
export * as Clipboard from '@ckeditor/ckeditor5-clipboard';
|
|
7
|
+
export * as Essentials from '@ckeditor/ckeditor5-essentials';
|
|
8
|
+
export * as Link from '@ckeditor/ckeditor5-link';
|
|
9
|
+
|
|
10
|
+
export * as Typing from '@ckeditor/ckeditor5-typing';
|
|
11
|
+
export * as Widget from '@ckeditor/ckeditor5-widget';
|
|
12
|
+
|
|
13
|
+
// single or prefixed exports
|
|
14
|
+
export { WordCount } from '@ckeditor/ckeditor5-word-count';
|
|
15
|
+
export { LinkUtils } from '@ckeditor/ckeditor5-link';
|
|
16
|
+
|
|
17
|
+
console.warn('The module "@typo3/ckeditor5-bundle.js" has been marked as deprecated. Please use "@ckeditor/ckeditor5-*" modules directly.');
|