@globalpayments/vega 2.73.0 → 2.75.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/{app-globals-cc162173.js → app-globals-35614ce8.js} +8 -8
- package/dist/cjs/{child-nodes-event-prevent-slimmer-536d29fc.js → child-nodes-event-prevent-slimmer-aca87dac.js} +1 -1
- package/dist/cjs/click-outside-only-to-dismiss-strategy-407f6d1e.js +32 -0
- package/dist/cjs/{code-block-823cd481.js → code-block-c1d2e6a8.js} +3 -3
- package/dist/cjs/{component-value-history-controller-slimmer.abstract-e2e0c6f3.js → component-value-history-controller-slimmer.abstract-787c67dc.js} +4 -4
- package/dist/cjs/{date-required-rule-99cca681.js → date-required-rule-30ee62d0.js} +1 -1
- package/dist/cjs/{design-token-11656685.js → design-token-bb39e07e.js} +2 -2
- package/dist/cjs/{dom-node-subject-observer-factory-1c8f7880.js → dom-node-subject-observer-factory-b5e71bf6.js} +4 -0
- package/dist/cjs/{dto-renderer-manager-bd2bd447.js → dto-renderer-manager-03e1a038.js} +218 -27
- package/dist/cjs/{element-appender-slimmer-12f40b8b.js → element-appender-slimmer-daa8b9f5.js} +160 -36
- package/dist/cjs/{event-emit-slimmer-6a591353.js → event-emit-slimmer-2dacabbd.js} +2 -2
- package/dist/cjs/{form-field-controller-slimmer-6e3e14fd.js → form-field-controller-slimmer-aef2fb1e.js} +2 -2
- package/dist/cjs/{function-extension-78ec27e0.js → function-extension-cfbbc57e.js} +5 -5
- package/dist/cjs/{image-annotation-action-7408a4b3.js → image-annotation-action-3fa501b7.js} +3 -3
- package/dist/cjs/{index-638a0f0d.js → index-95fca64f.js} +1 -1
- package/dist/cjs/index.cjs.js +15 -15
- package/dist/cjs/{inject-keyboard-manager-a6101379.js → inject-keyboard-manager-d21b4387.js} +1 -1
- package/dist/cjs/{internal-vega-event-manager-d587a33c.js → internal-vega-event-manager-6befeb34.js} +13 -2
- package/dist/cjs/{keyboard-manager-d8adb0ed.js → keyboard-manager-3dea6b28.js} +1 -1
- package/dist/cjs/{keyboard-manager-slimmer-15e65357.js → keyboard-manager-slimmer-0d45f944.js} +1 -1
- package/dist/cjs/{language-extension-716015a5.js → language-extension-8c4a56ff.js} +2 -2
- package/dist/cjs/loader.cjs.js +11 -11
- package/dist/cjs/{month-view-generator-706c5477.js → month-view-generator-49cc5fc2.js} +1 -1
- package/dist/cjs/{public-rules-2950f1fc.js → public-rules-dc2a8d62.js} +7 -7
- package/dist/cjs/{range-c3c48132.js → range-79b668e7.js} +1 -1
- package/dist/cjs/{responsive-format-facade-96c5f598.js → responsive-format-facade-d5dba942.js} +4 -4
- package/dist/cjs/{rich-text-editor-required-rule-4aab05a3.js → rich-text-editor-required-rule-ba312af9.js} +1 -1
- package/dist/cjs/sanitize-fb222510.js +131 -0
- package/dist/cjs/{string-format-strategy.abstract-a8264fca.js → string-format-strategy.abstract-63514c60.js} +1 -1
- package/dist/cjs/{string-input-formatter-slimmer-338bbd73.js → string-input-formatter-slimmer-f3e0bbc7.js} +3 -3
- package/dist/cjs/{string-mask-strategy-4e7d3780.js → string-mask-strategy-d23ac21a.js} +2 -2
- package/dist/cjs/{style-formatter-9c42d41b.js → style-formatter-49693da7.js} +2 -2
- package/dist/cjs/{sub-state-notify-slimmer-1efa69c4.js → sub-state-notify-slimmer-468e19aa.js} +1 -1
- package/dist/cjs/{sub-state-observer-slimmer-6afa62f5.js → sub-state-observer-slimmer-5d0b8ac3.js} +1 -1
- package/dist/cjs/{time-required-rule-9d39a620.js → time-required-rule-c96ecdc9.js} +1 -1
- package/dist/cjs/{type-guard-69d2cf01.js → type-guard-a0f026d8.js} +12 -0
- package/dist/cjs/{valid-credit-card-number-rule-9f40d1d9.js → valid-credit-card-number-rule-c854bed9.js} +1 -1
- package/dist/cjs/vega-accordion.cjs.entry.js +9 -9
- package/dist/cjs/vega-app-header-button.cjs.entry.js +10 -10
- package/dist/cjs/vega-banner.cjs.entry.js +3 -3
- package/dist/cjs/vega-box.cjs.entry.js +9 -9
- package/dist/cjs/vega-breadcrumb.cjs.entry.js +4 -4
- package/dist/cjs/vega-button-circle.cjs.entry.js +10 -10
- package/dist/cjs/vega-button-group_2.cjs.entry.js +6 -6
- package/dist/cjs/vega-button-link.cjs.entry.js +4 -4
- package/dist/cjs/vega-button.cjs.entry.js +9 -9
- package/dist/cjs/vega-calendar_4.cjs.entry.js +8 -8
- package/dist/cjs/vega-card.cjs.entry.js +8 -8
- package/dist/cjs/vega-carousel.cjs.entry.js +8 -8
- package/dist/cjs/vega-checkbox_2.cjs.entry.js +6 -6
- package/dist/cjs/vega-chip.cjs.entry.js +10 -10
- package/dist/cjs/vega-code-block.cjs.entry.js +10 -10
- package/dist/cjs/vega-color-picker.cjs.entry.js +5 -5
- package/dist/cjs/vega-combo-box.cjs.entry.js +11 -10
- package/dist/cjs/vega-date-picker_2.cjs.entry.js +389 -342
- package/dist/cjs/vega-dialog_2.cjs.entry.js +10 -10
- package/dist/cjs/vega-divider.cjs.entry.js +8 -8
- package/dist/cjs/vega-dropdown_5.cjs.entry.js +49 -21
- package/dist/cjs/vega-env-manager-23b8b23c.js +2 -2
- package/dist/cjs/vega-field-label.cjs.entry.js +3 -3
- package/dist/cjs/vega-file-uploader.cjs.entry.js +5 -5
- package/dist/cjs/vega-flag-icon.cjs.entry.js +8 -8
- package/dist/cjs/vega-flex.cjs.entry.js +9 -9
- package/dist/cjs/vega-font.cjs.entry.js +8 -8
- package/dist/cjs/vega-form.cjs.entry.js +8 -8
- package/dist/cjs/vega-grid.cjs.entry.js +8 -8
- package/dist/cjs/vega-icon.cjs.entry.js +8 -8
- package/dist/cjs/vega-image-uploader.cjs.entry.js +11 -11
- package/dist/cjs/vega-input-credit-card.cjs.entry.js +10 -10
- package/dist/cjs/vega-input-numeric.cjs.entry.js +10 -10
- package/dist/cjs/vega-input-passcode.cjs.entry.js +9 -9
- package/dist/cjs/vega-input-phone-number.cjs.entry.js +11 -11
- package/dist/cjs/vega-input-range.cjs.entry.js +6 -6
- package/dist/cjs/vega-input-select.cjs.entry.js +187 -54
- package/dist/cjs/vega-input.cjs.entry.js +339 -98
- package/dist/cjs/vega-item-toggle.cjs.entry.js +3 -3
- package/dist/cjs/vega-left-nav_5.cjs.entry.js +11 -11
- package/dist/cjs/vega-loader-wrapper_2.cjs.entry.js +7 -7
- package/dist/cjs/vega-page-notification_2.cjs.entry.js +1 -1
- package/dist/cjs/vega-pagination-page-selector-mobile.cjs.entry.js +3 -3
- package/dist/cjs/vega-pagination-page-size-selector-mobile.cjs.entry.js +1 -1
- package/dist/cjs/vega-pagination.cjs.entry.js +9 -9
- package/dist/cjs/vega-popover_2.cjs.entry.js +12 -12
- package/dist/cjs/vega-progress-tracker_2.cjs.entry.js +10 -10
- package/dist/cjs/vega-radio_2.cjs.entry.js +9 -9
- package/dist/cjs/vega-rich-text-content.cjs.entry.js +7 -7
- package/dist/cjs/vega-rich-text-editor_4.cjs.entry.js +87 -27
- package/dist/cjs/vega-segment-control.cjs.entry.js +3 -3
- package/dist/cjs/vega-selection-chip_2.cjs.entry.js +12 -12
- package/dist/cjs/vega-selection-tile_2.cjs.entry.js +7 -7
- package/dist/cjs/vega-sidenav_3.cjs.entry.js +10 -10
- package/dist/cjs/vega-signature-capture.cjs.entry.js +11 -11
- package/dist/cjs/vega-stepper.cjs.entry.js +6 -6
- package/dist/cjs/vega-tab-group_2.cjs.entry.js +4 -4
- package/dist/cjs/vega-table_11.cjs.entry.js +11 -11
- package/dist/cjs/vega-textarea.cjs.entry.js +6 -6
- package/dist/cjs/vega-time-picker_2.cjs.entry.js +18 -17
- package/dist/cjs/vega-toggle-switch.cjs.entry.js +5 -5
- package/dist/cjs/vega-tooltip_2.cjs.entry.js +10 -10
- package/dist/cjs/vega.cjs.js +11 -11
- package/dist/collection/components/vega-app-header-button/vega-app-header-button.js +1 -1
- package/dist/collection/components/vega-button-group/vega-button-group-item/vega-button-group-item.js +1 -1
- package/dist/collection/components/vega-calendar/vega-calendar.js +1 -1
- package/dist/collection/components/vega-combo-box/slimmers/renderers/vega-combo-box-dropdown-renderer.js +2 -1
- package/dist/collection/components/vega-date-picker/assets/icons.js +4 -1
- package/dist/collection/components/vega-date-picker/slimmers/controllers/vega-date-picker-calendar-open-state-controller.js +2 -1
- package/dist/collection/components/vega-date-picker/slimmers/renderers/vega-date-picker-calendar-renderer.js +2 -2
- package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-header-render.js +109 -0
- package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-renderer.js +4 -0
- package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-year-month-switcher-renderer.js +42 -70
- package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-month-item-renderer.js +12 -56
- package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/vega-date-picker-calendar.css +435 -108
- package/dist/collection/components/vega-date-picker/vega-date-picker-calendar/vega-date-picker-calendar.js +5 -0
- package/dist/collection/components/vega-dropdown/slimmers/controllers/vega-dropdown-search-controller.js +5 -1
- package/dist/collection/components/vega-dropdown/slimmers/controllers/vega-dropdown-source-controller.js +7 -0
- package/dist/collection/components/vega-dropdown/slimmers/renderers/vega-dropdown-list-renderer.js +6 -3
- package/dist/collection/components/vega-dropdown/vega-dropdown-item/slimmers/renderers/vega-dropdown-item-renderer.js +3 -2
- package/dist/collection/components/vega-dropdown/vega-dropdown.js +50 -4
- package/dist/collection/components/vega-field-label/vega-field-label.js +1 -1
- package/dist/collection/components/vega-input/slimmers/controllers/vega-input-render-mode-controller.js +51 -0
- package/dist/collection/components/vega-input/slimmers/renderers/vega-input-input-renderer.js +6 -0
- package/dist/collection/components/vega-input/slimmers/renderers/vega-input-input-suggestions-renderer.js +142 -0
- package/dist/collection/components/vega-input/slimmers/renderers/vega-input-renderer.js +12 -1
- package/dist/collection/components/vega-input/vega-input.js +200 -3
- package/dist/collection/components/vega-input-select/slimmers/controllers/vega-input-select-item-controller.js +89 -0
- package/dist/collection/components/vega-input-select/slimmers/controllers/vega-input-select-source-controller.js +4 -0
- package/dist/collection/components/vega-input-select/slimmers/controllers/vega-input-select-value-controller.js +4 -0
- package/dist/collection/components/vega-input-select/slimmers/renderers/vega-input-select-dropdown-renderer.js +38 -13
- package/dist/collection/components/vega-input-select/vega-input-select.js +27 -7
- package/dist/collection/components/vega-rich-text-editor/dto/annotations/plain-text-annotation.js +1 -1
- package/dist/collection/components/vega-rich-text-editor/dto/blocks/html-block.js +16 -0
- package/dist/collection/components/vega-rich-text-editor/dto/content-state.js +21 -24
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/extension-controller.js +1 -1
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/html-content-cleaner-processor.interface.js +1 -0
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/html-content-cleaner.js +59 -0
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/index.js +4 -0
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-after-opening-tag-processor.js +21 -0
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-before-closing-tag-processor.js +21 -0
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-between-tags-processor.js +77 -0
- package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/value-controller.js +6 -2
- package/dist/collection/components/vega-rich-text-editor/slimmers/renderers/tools/source-edit-toolbar-button-slimmer.js +6 -0
- package/dist/collection/components/vega-rich-text-editor/test/dto/blocks/html-block.test.js +39 -0
- package/dist/collection/components/vega-rich-text-editor/test/dto/content-state.test.js +171 -1
- package/dist/collection/components/vega-rich-text-editor/test/html-cleaner/html-content-cleaner.test.js +186 -0
- package/dist/collection/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-after-opening-tag-processor.test.js +22 -0
- package/dist/collection/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-before-closing-tag-processor.test.js +22 -0
- package/dist/collection/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-between-tags-processor.test.js +26 -0
- package/dist/collection/components/vega-selection-chip/vega-selection-chip.js +1 -1
- package/dist/collection/components/vega-time-picker/slimmers/controllers/vega-time-picker-range-dropdown-controller.js +2 -1
- package/dist/collection/components/vega-time-picker/slimmers/controllers/vega-time-picker-single-dropdown-controller.js +2 -1
- package/dist/collection/constants/ui.js +2 -0
- package/dist/collection/helpers/code-format/code-formatter.js +57 -7
- package/dist/collection/helpers/code-format/test/code-formatter.test.js +48 -0
- package/dist/collection/helpers/event-manager/event-id/component-event-id-map.js +13 -2
- package/dist/collection/helpers/event-manager/event-id/vega-event-id.js +2 -0
- package/dist/collection/helpers/event-manager/test/component-event-id-map.test.js +3 -1
- package/dist/collection/helpers/event-manager/test/vega-event-manager.test.js +3 -1
- package/dist/collection/helpers/slimmers/element-appender/element-appender-slimmer.js +60 -32
- package/dist/collection/helpers/slimmers/element-appender/test/element-appender-slimmer.test.js +3 -2
- package/dist/collection/helpers/slimmers/element-appender/trigger-strategies/click-outside-only-to-dismiss-strategy.js +28 -0
- package/dist/collection/helpers/slimmers/element-appender/trigger-strategies/click-trigger-strategy.js +33 -0
- package/dist/collection/helpers/slimmers/element-appender/trigger-strategies/hover-trigger-strategy.js +42 -0
- package/dist/collection/helpers/slimmers/element-appender/trigger-strategies/none-trigger-strategy.js +22 -0
- package/dist/collection/helpers/slimmers/element-appender/trigger-strategies/trigger-strategy.interface.js +1 -0
- package/dist/collection/types/test/type-guard.test.js +8 -1
- package/dist/collection/types/type-guard.js +11 -0
- package/dist/collection/utils/sanitize.js +126 -0
- package/dist/collection/utils/test/sanitize.test.js +65 -0
- package/dist/esm/{app-globals-949d2e18.js → app-globals-2ac60ff5.js} +8 -8
- package/dist/esm/{child-nodes-event-prevent-slimmer-e6f98de5.js → child-nodes-event-prevent-slimmer-e662bee2.js} +1 -1
- package/dist/esm/click-outside-only-to-dismiss-strategy-3d286c1b.js +30 -0
- package/dist/esm/{code-block-666674d7.js → code-block-8ee34ab6.js} +3 -3
- package/dist/esm/{component-value-history-controller-slimmer.abstract-171dda08.js → component-value-history-controller-slimmer.abstract-a61bf821.js} +4 -4
- package/dist/esm/{date-required-rule-a9980386.js → date-required-rule-47ecc28f.js} +1 -1
- package/dist/esm/{design-token-9b510e59.js → design-token-007efbaa.js} +2 -2
- package/dist/esm/{dom-node-subject-observer-factory-1aaa1159.js → dom-node-subject-observer-factory-064ee2b2.js} +3 -1
- package/dist/esm/{dto-renderer-manager-49ae5d56.js → dto-renderer-manager-ee1a5864.js} +218 -27
- package/dist/esm/{element-appender-slimmer-b9890dcb.js → element-appender-slimmer-35e26b5a.js} +160 -36
- package/dist/esm/{event-emit-slimmer-2d791d0e.js → event-emit-slimmer-09827cec.js} +2 -2
- package/dist/esm/{form-field-controller-slimmer-257928c1.js → form-field-controller-slimmer-5d9dc384.js} +2 -2
- package/dist/esm/{function-extension-8b06c6f8.js → function-extension-e8c0e43e.js} +5 -5
- package/dist/esm/{image-annotation-action-b3eea6a2.js → image-annotation-action-285d432e.js} +3 -3
- package/dist/esm/{index-0d487fae.js → index-51a7da7f.js} +1 -1
- package/dist/esm/index.js +15 -15
- package/dist/esm/{inject-keyboard-manager-9241968c.js → inject-keyboard-manager-83d76ff5.js} +1 -1
- package/dist/esm/{internal-vega-event-manager-fdee2a0a.js → internal-vega-event-manager-efb6786e.js} +13 -2
- package/dist/esm/{keyboard-manager-89acac79.js → keyboard-manager-c92808d8.js} +1 -1
- package/dist/esm/{keyboard-manager-slimmer-e303cb7d.js → keyboard-manager-slimmer-79c78ce8.js} +1 -1
- package/dist/esm/{language-extension-b3f836d4.js → language-extension-29bf8acd.js} +2 -2
- package/dist/esm/loader.js +11 -11
- package/dist/esm/{month-view-generator-4bec99fd.js → month-view-generator-16192182.js} +1 -1
- package/dist/esm/{public-rules-b164e40e.js → public-rules-724873f5.js} +7 -7
- package/dist/esm/{range-9cc1422b.js → range-5257c062.js} +1 -1
- package/dist/esm/{responsive-format-facade-94897ae8.js → responsive-format-facade-28ee2dbd.js} +4 -4
- package/dist/esm/{rich-text-editor-required-rule-2131f21c.js → rich-text-editor-required-rule-873e2e67.js} +1 -1
- package/dist/esm/sanitize-fd0cb40d.js +129 -0
- package/dist/esm/{string-format-strategy.abstract-75540c16.js → string-format-strategy.abstract-fc60db79.js} +1 -1
- package/dist/esm/{string-input-formatter-slimmer-3a42d9b8.js → string-input-formatter-slimmer-ee32b1fd.js} +3 -3
- package/dist/esm/{string-mask-strategy-4a18ed1a.js → string-mask-strategy-0b0accaa.js} +2 -2
- package/dist/esm/{style-formatter-bb5aec96.js → style-formatter-314b37f3.js} +2 -2
- package/dist/esm/{sub-state-notify-slimmer-71b9bbd5.js → sub-state-notify-slimmer-4453047a.js} +1 -1
- package/dist/esm/{sub-state-observer-slimmer-41a1b380.js → sub-state-observer-slimmer-202ec7dc.js} +1 -1
- package/dist/esm/{time-required-rule-8ec1faf5.js → time-required-rule-5fa43804.js} +1 -1
- package/dist/esm/{type-guard-b48aec98.js → type-guard-c65a227d.js} +12 -1
- package/dist/esm/{valid-credit-card-number-rule-96eaf9b1.js → valid-credit-card-number-rule-666c415d.js} +1 -1
- package/dist/esm/vega-accordion.entry.js +9 -9
- package/dist/esm/vega-app-header-button.entry.js +10 -10
- package/dist/esm/vega-banner.entry.js +3 -3
- package/dist/esm/vega-box.entry.js +9 -9
- package/dist/esm/vega-breadcrumb.entry.js +4 -4
- package/dist/esm/vega-button-circle.entry.js +10 -10
- package/dist/esm/vega-button-group_2.entry.js +6 -6
- package/dist/esm/vega-button-link.entry.js +4 -4
- package/dist/esm/vega-button.entry.js +9 -9
- package/dist/esm/vega-calendar_4.entry.js +8 -8
- package/dist/esm/vega-card.entry.js +8 -8
- package/dist/esm/vega-carousel.entry.js +8 -8
- package/dist/esm/vega-checkbox_2.entry.js +6 -6
- package/dist/esm/vega-chip.entry.js +10 -10
- package/dist/esm/vega-code-block.entry.js +10 -10
- package/dist/esm/vega-color-picker.entry.js +5 -5
- package/dist/esm/vega-combo-box.entry.js +11 -10
- package/dist/esm/vega-date-picker_2.entry.js +389 -342
- package/dist/esm/vega-dialog_2.entry.js +10 -10
- package/dist/esm/vega-divider.entry.js +8 -8
- package/dist/esm/vega-dropdown_5.entry.js +49 -21
- package/dist/esm/vega-env-manager-8f8dc473.js +2 -2
- package/dist/esm/vega-field-label.entry.js +3 -3
- package/dist/esm/vega-file-uploader.entry.js +5 -5
- package/dist/esm/vega-flag-icon.entry.js +8 -8
- package/dist/esm/vega-flex.entry.js +9 -9
- package/dist/esm/vega-font.entry.js +8 -8
- package/dist/esm/vega-form.entry.js +8 -8
- package/dist/esm/vega-grid.entry.js +8 -8
- package/dist/esm/vega-icon.entry.js +8 -8
- package/dist/esm/vega-image-uploader.entry.js +11 -11
- package/dist/esm/vega-input-credit-card.entry.js +10 -10
- package/dist/esm/vega-input-numeric.entry.js +10 -10
- package/dist/esm/vega-input-passcode.entry.js +9 -9
- package/dist/esm/vega-input-phone-number.entry.js +11 -11
- package/dist/esm/vega-input-range.entry.js +6 -6
- package/dist/esm/vega-input-select.entry.js +187 -54
- package/dist/esm/vega-input.entry.js +340 -99
- package/dist/esm/vega-item-toggle.entry.js +3 -3
- package/dist/esm/vega-left-nav_5.entry.js +11 -11
- package/dist/esm/vega-loader-wrapper_2.entry.js +7 -7
- package/dist/esm/vega-page-notification_2.entry.js +1 -1
- package/dist/esm/vega-pagination-page-selector-mobile.entry.js +3 -3
- package/dist/esm/vega-pagination-page-size-selector-mobile.entry.js +1 -1
- package/dist/esm/vega-pagination.entry.js +9 -9
- package/dist/esm/vega-popover_2.entry.js +12 -12
- package/dist/esm/vega-progress-tracker_2.entry.js +10 -10
- package/dist/esm/vega-radio_2.entry.js +9 -9
- package/dist/esm/vega-rich-text-content.entry.js +7 -7
- package/dist/esm/vega-rich-text-editor_4.entry.js +87 -27
- package/dist/esm/vega-segment-control.entry.js +3 -3
- package/dist/esm/vega-selection-chip_2.entry.js +12 -12
- package/dist/esm/vega-selection-tile_2.entry.js +7 -7
- package/dist/esm/vega-sidenav_3.entry.js +10 -10
- package/dist/esm/vega-signature-capture.entry.js +11 -11
- package/dist/esm/vega-stepper.entry.js +6 -6
- package/dist/esm/vega-tab-group_2.entry.js +4 -4
- package/dist/esm/vega-table_11.entry.js +11 -11
- package/dist/esm/vega-textarea.entry.js +6 -6
- package/dist/esm/vega-time-picker_2.entry.js +18 -17
- package/dist/esm/vega-toggle-switch.entry.js +5 -5
- package/dist/esm/vega-tooltip_2.entry.js +10 -10
- package/dist/esm/vega.js +11 -11
- package/dist/sri/vega-sri-manifest.json +326 -318
- package/dist/types/components/vega-date-picker/assets/icons.d.ts +1 -1
- package/dist/types/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-header-render.d.ts +20 -0
- package/dist/types/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-renderer.d.ts +1 -0
- package/dist/types/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-calendar-year-month-switcher-renderer.d.ts +4 -11
- package/dist/types/components/vega-date-picker/vega-date-picker-calendar/slimmers/renderers/vega-date-picker-month-item-renderer.d.ts +4 -9
- package/dist/types/components/vega-date-picker/vega-date-picker-calendar/vega-date-picker-calendar.d.ts +2 -0
- package/dist/types/components/vega-dropdown/slimmers/controllers/vega-dropdown-source-controller.d.ts +2 -0
- package/dist/types/components/vega-dropdown/slimmers/renderers/vega-dropdown-list-renderer.d.ts +1 -0
- package/dist/types/components/vega-dropdown/vega-dropdown.d.ts +14 -2
- package/dist/types/components/vega-input/slimmers/controllers/vega-input-render-mode-controller.d.ts +27 -0
- package/dist/types/components/vega-input/slimmers/renderers/vega-input-input-renderer.d.ts +1 -0
- package/dist/types/components/vega-input/slimmers/renderers/vega-input-input-suggestions-renderer.d.ts +40 -0
- package/dist/types/components/vega-input/slimmers/renderers/vega-input-renderer.d.ts +3 -0
- package/dist/types/components/vega-input/types.d.ts +4 -0
- package/dist/types/components/vega-input/vega-input.d.ts +55 -1
- package/dist/types/components/vega-input-select/slimmers/controllers/vega-input-select-item-controller.d.ts +29 -0
- package/dist/types/components/vega-input-select/slimmers/controllers/vega-input-select-source-controller.d.ts +1 -0
- package/dist/types/components/vega-input-select/slimmers/controllers/vega-input-select-value-controller.d.ts +1 -0
- package/dist/types/components/vega-input-select/slimmers/renderers/vega-input-select-dropdown-renderer.d.ts +1 -1
- package/dist/types/components/vega-input-select/types.d.ts +5 -0
- package/dist/types/components/vega-input-select/vega-input-select.d.ts +12 -4
- package/dist/types/components/vega-rich-text-editor/dto/blocks/html-block.d.ts +10 -0
- package/dist/types/components/vega-rich-text-editor/dto/content-state.d.ts +8 -1
- package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/html-content-cleaner-processor.interface.d.ts +13 -0
- package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/html-content-cleaner.d.ts +35 -0
- package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/index.d.ts +4 -0
- package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-after-opening-tag-processor.d.ts +19 -0
- package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-before-closing-tag-processor.d.ts +19 -0
- package/dist/types/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/processors/remove-whitespace-between-tags-processor.d.ts +59 -0
- package/dist/types/components/vega-rich-text-editor/slimmers/controllers/value-controller.d.ts +1 -0
- package/dist/types/components/vega-rich-text-editor/slimmers/renderers/tools/source-edit-toolbar-button-slimmer.d.ts +1 -0
- package/dist/types/components/vega-rich-text-editor/test/html-cleaner/html-content-cleaner.test.d.ts +1 -0
- package/dist/types/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-after-opening-tag-processor.test.d.ts +1 -0
- package/dist/types/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-before-closing-tag-processor.test.d.ts +1 -0
- package/dist/types/components/vega-rich-text-editor/test/html-cleaner/remove-whitespace-between-tags-processor.test.d.ts +1 -0
- package/dist/types/components.d.ts +65 -11
- package/dist/types/constants/ui.d.ts +1 -1
- package/dist/types/helpers/code-format/code-formatter.d.ts +14 -0
- package/dist/types/helpers/event-manager/event-id/vega-event-id.d.ts +2 -0
- package/dist/types/helpers/slimmers/element-appender/element-appender-slimmer.d.ts +4 -9
- package/dist/types/helpers/slimmers/element-appender/trigger-strategies/click-outside-only-to-dismiss-strategy.d.ts +21 -0
- package/dist/types/helpers/slimmers/element-appender/trigger-strategies/click-trigger-strategy.d.ts +21 -0
- package/dist/types/helpers/slimmers/element-appender/trigger-strategies/hover-trigger-strategy.d.ts +22 -0
- package/dist/types/helpers/slimmers/element-appender/trigger-strategies/none-trigger-strategy.d.ts +18 -0
- package/dist/types/helpers/slimmers/element-appender/trigger-strategies/trigger-strategy.interface.d.ts +37 -0
- package/dist/types/types/components.type.d.ts +3 -0
- package/dist/types/types/type-guard.d.ts +8 -0
- package/dist/types/types/ui.type.d.ts +9 -0
- package/dist/types/utils/sanitize.d.ts +71 -0
- package/dist/types/utils/test/sanitize.test.d.ts +1 -0
- package/dist/vega/index.esm.js +1 -1
- package/dist/vega/{p-44bc9ea9.entry.js → p-011b94b1.entry.js} +1 -1
- package/dist/vega/{p-6e701542.entry.js → p-012753b5.entry.js} +1 -1
- package/dist/vega/{p-db62b038.entry.js → p-024331ce.entry.js} +1 -1
- package/dist/vega/{p-74a77cad.js → p-0575d22e.js} +1 -1
- package/dist/vega/{p-42a283b5.entry.js → p-08a90cc6.entry.js} +1 -1
- package/dist/vega/{p-d01fe83d.entry.js → p-0ede1fea.entry.js} +1 -1
- package/dist/vega/{p-8fba7f9a.js → p-1298b126.js} +1 -1
- package/dist/vega/{p-9b673fd4.entry.js → p-17c55205.entry.js} +1 -1
- package/dist/vega/{p-161b9c5b.js → p-1f83cebf.js} +1 -1
- package/dist/vega/p-3353b3d7.js +1 -0
- package/dist/vega/p-365b1b35.entry.js +1 -0
- package/dist/vega/{p-f3831dc9.entry.js → p-3ae9ee3d.entry.js} +1 -1
- package/dist/vega/p-3af92370.entry.js +1 -0
- package/dist/vega/{p-59fa3f68.js → p-3bf66be2.js} +1 -1
- package/dist/vega/{p-6e84e451.entry.js → p-3c5a28e4.entry.js} +1 -1
- package/dist/vega/p-3e5f362f.js +1 -0
- package/dist/vega/{p-c0036e71.js → p-430be941.js} +1 -1
- package/dist/vega/p-43f585f7.entry.js +1 -0
- package/dist/vega/{p-75d91ee9.entry.js → p-45296fd4.entry.js} +1 -1
- package/dist/vega/p-476a173a.js +1 -0
- package/dist/vega/p-491618a6.entry.js +1 -0
- package/dist/vega/p-4a537391.entry.js +1 -0
- package/dist/vega/p-4aa893ef.entry.js +1 -0
- package/dist/vega/{p-2b20a215.entry.js → p-4c47e8bb.entry.js} +1 -1
- package/dist/vega/{p-7f86b3c8.js → p-4da75f2b.js} +1 -1
- package/dist/vega/{p-82dbff54.entry.js → p-509eb52e.entry.js} +1 -1
- package/dist/vega/{p-adc615a4.entry.js → p-5110ba73.entry.js} +1 -1
- package/dist/vega/{p-38ed3d59.entry.js → p-556f9a21.entry.js} +1 -1
- package/dist/vega/{p-70b2906a.entry.js → p-55b54ba0.entry.js} +1 -1
- package/dist/vega/{p-94cf46ca.entry.js → p-5ea2e43c.entry.js} +1 -1
- package/dist/vega/{p-5f09868d.entry.js → p-5efc6fe1.entry.js} +1 -1
- package/dist/vega/p-5f377954.js +1 -1
- package/dist/vega/{p-de70aac1.js → p-60851f9d.js} +1 -1
- package/dist/vega/{p-03e16a05.entry.js → p-64cd1931.entry.js} +1 -1
- package/dist/vega/{p-f2c8c363.js → p-66fa700b.js} +1 -1
- package/dist/vega/{p-623c3911.entry.js → p-67fcf6f2.entry.js} +1 -1
- package/dist/vega/{p-e88f2dc3.js → p-68df4288.js} +1 -1
- package/dist/vega/{p-2971b17a.js → p-691ba1ae.js} +1 -1
- package/dist/vega/{p-676eaf3f.entry.js → p-6a2205a1.entry.js} +1 -1
- package/dist/vega/{p-b007d0d5.entry.js → p-6a4277df.entry.js} +1 -1
- package/dist/vega/{p-30e7544c.js → p-6e136980.js} +1 -1
- package/dist/vega/{p-bf61d136.js → p-6f8be8ea.js} +1 -1
- package/dist/vega/{p-f427d88c.entry.js → p-6fa8e231.entry.js} +1 -1
- package/dist/vega/p-7045e84c.entry.js +1 -0
- package/dist/vega/{p-3566ad76.js → p-7288f8c4.js} +1 -1
- package/dist/vega/{p-9dfe2bbc.js → p-749f96a4.js} +1 -1
- package/dist/vega/{p-5be29f14.js → p-77edf50c.js} +1 -1
- package/dist/vega/{p-114c6df8.entry.js → p-7aaece55.entry.js} +1 -1
- package/dist/vega/{p-40561fa0.entry.js → p-7ec6a104.entry.js} +1 -1
- package/dist/vega/{p-9fb71d8c.entry.js → p-81134e9e.entry.js} +1 -1
- package/dist/vega/p-8187878e.js +1 -0
- package/dist/vega/p-89d685a8.js +1 -0
- package/dist/vega/{p-2ae5ad30.entry.js → p-8c0eb12f.entry.js} +1 -1
- package/dist/vega/p-8d0ca805.js +1 -0
- package/dist/vega/{p-0ba0f83d.entry.js → p-8d701832.entry.js} +1 -1
- package/dist/vega/{p-f6cd7a08.entry.js → p-8e42a14c.entry.js} +1 -1
- package/dist/vega/{p-a3c4fa30.entry.js → p-8ed0faa2.entry.js} +1 -1
- package/dist/vega/{p-a8dad05d.js → p-920719ad.js} +1 -1
- package/dist/vega/{p-a58bdbad.entry.js → p-94394df7.entry.js} +1 -1
- package/dist/vega/p-99aa554b.entry.js +1 -0
- package/dist/vega/{p-7be3aefc.entry.js → p-9a2446f1.entry.js} +1 -1
- package/dist/vega/{p-a4ec6575.js → p-a2aeb646.js} +1 -1
- package/dist/vega/{p-a125cfec.entry.js → p-a475d525.entry.js} +1 -1
- package/dist/vega/{p-2409a475.entry.js → p-a530797f.entry.js} +1 -1
- package/dist/vega/{p-be0b67b8.entry.js → p-a85ad369.entry.js} +1 -1
- package/dist/vega/p-ac5e9955.entry.js +1 -0
- package/dist/vega/{p-ce2ffff7.js → p-aedf7146.js} +1 -1
- package/dist/vega/p-b1f869fb.js +1 -0
- package/dist/vega/p-b4ea3fad.js +1 -0
- package/dist/vega/{p-d991fb11.js → p-badad9ed.js} +1 -1
- package/dist/vega/{p-c7194674.entry.js → p-bb4a558d.entry.js} +1 -1
- package/dist/vega/{p-4957f07a.entry.js → p-bb8339ed.entry.js} +1 -1
- package/dist/vega/{p-6b9d2996.entry.js → p-be930e85.entry.js} +1 -1
- package/dist/vega/{p-398220f5.entry.js → p-bf2bd6d0.entry.js} +1 -1
- package/dist/vega/{p-dd72ad9e.js → p-c2488ed6.js} +1 -1
- package/dist/vega/{p-ead1da57.entry.js → p-c379a5a5.entry.js} +1 -1
- package/dist/vega/{p-184d8443.js → p-c9b6b5a9.js} +1 -1
- package/dist/vega/{p-9d8e2939.entry.js → p-ca3472c1.entry.js} +1 -1
- package/dist/vega/{p-2e0deef6.js → p-cc43bffb.js} +1 -1
- package/dist/vega/{p-721b2981.entry.js → p-cf5b80f9.entry.js} +1 -1
- package/dist/vega/{p-d1d0f08a.js → p-d0e31633.js} +1 -1
- package/dist/vega/{p-21e7808a.entry.js → p-db60a38e.entry.js} +1 -1
- package/dist/vega/{p-6c1ef2ed.js → p-dd11f735.js} +1 -1
- package/dist/vega/{p-3d85411d.js → p-e16b3adf.js} +1 -1
- package/dist/vega/{p-1e019406.js → p-e93545fd.js} +1 -1
- package/dist/vega/{p-a5d4d168.entry.js → p-e9c4fd24.entry.js} +1 -1
- package/dist/vega/{p-7a8c4cf8.entry.js → p-eb60cfe1.entry.js} +1 -1
- package/dist/vega/{p-7b337fd4.entry.js → p-ec192283.entry.js} +1 -1
- package/dist/vega/{p-3938880f.entry.js → p-f2a3a1ec.entry.js} +1 -1
- package/dist/vega/{p-c2ac6b47.entry.js → p-f2cdd212.entry.js} +1 -1
- package/dist/vega/{p-c7f292dd.entry.js → p-f3c3ff26.entry.js} +1 -1
- package/dist/vega/{p-2bc4f7d9.entry.js → p-f4c05b4a.entry.js} +1 -1
- package/dist/vega/{p-7f9acdf7.entry.js → p-f52a0155.entry.js} +1 -1
- package/dist/vega/{p-e39aa2ea.entry.js → p-f8641214.entry.js} +1 -1
- package/dist/vega/{p-0ad59141.entry.js → p-f89443aa.entry.js} +1 -1
- package/dist/vega/{p-96797fee.entry.js → p-f8f7cf48.entry.js} +1 -1
- package/dist/vega/p-fe12eff6.js +1 -0
- package/dist/vega/vega.esm.js +1 -1
- package/package.json +1 -1
- package/dist/vega/p-1faef917.entry.js +0 -1
- package/dist/vega/p-207cfa6a.js +0 -1
- package/dist/vega/p-21cba83b.entry.js +0 -1
- package/dist/vega/p-2f592078.entry.js +0 -1
- package/dist/vega/p-3162a7fd.entry.js +0 -1
- package/dist/vega/p-524ffc12.entry.js +0 -1
- package/dist/vega/p-697eb0e1.js +0 -1
- package/dist/vega/p-76e6c13a.js +0 -1
- package/dist/vega/p-79a544d6.js +0 -1
- package/dist/vega/p-8bd496b4.js +0 -1
- package/dist/vega/p-9a83a6b0.js +0 -1
- package/dist/vega/p-aab0deab.js +0 -1
- package/dist/vega/p-b406a846.entry.js +0 -1
- package/dist/vega/p-bd60c72e.entry.js +0 -1
- package/dist/vega/p-c4700277.entry.js +0 -1
- package/dist/vega/p-f38a4be2.entry.js +0 -1
|
@@ -21,6 +21,7 @@ import { VegaInternalRichTextEditorFlushChanges } from '../../../helpers/event-m
|
|
|
21
21
|
import './setup';
|
|
22
22
|
import { StylePreservator } from '../../../helpers/csp/styles-preservator';
|
|
23
23
|
import { LogUtility } from '../../../utils/log';
|
|
24
|
+
import { HTMLContentCleaner } from '../slimmers/controllers/html-cleaner';
|
|
24
25
|
/**
|
|
25
26
|
* Class representing the content state of the rich text editor.
|
|
26
27
|
*/
|
|
@@ -53,22 +54,27 @@ export class VegaRTEContent {
|
|
|
53
54
|
/**
|
|
54
55
|
* Create an empty content state
|
|
55
56
|
*
|
|
57
|
+
* @param {VegaRTETransformOptions} options - Optional transformation options.
|
|
56
58
|
* @returns {VegaRTEContent} An empty content state
|
|
57
59
|
*/
|
|
58
|
-
static createEmptyContent() {
|
|
60
|
+
static createEmptyContent(options = { autoMatchFormat: true }) {
|
|
59
61
|
return VegaRTEContent.fromJSON([
|
|
60
62
|
{
|
|
61
63
|
id: generateUUID(),
|
|
62
64
|
type: 'paragraph',
|
|
65
|
+
annotations: {
|
|
66
|
+
internalWrapper: !options.autoMatchFormat,
|
|
67
|
+
},
|
|
63
68
|
nodes: [
|
|
64
69
|
{
|
|
65
70
|
id: generateUUID(),
|
|
71
|
+
annotations: { plainText: !options.autoMatchFormat },
|
|
66
72
|
type: 'text',
|
|
67
73
|
text: '',
|
|
68
74
|
},
|
|
69
75
|
],
|
|
70
76
|
},
|
|
71
|
-
]);
|
|
77
|
+
], options);
|
|
72
78
|
}
|
|
73
79
|
/**
|
|
74
80
|
* Converts HTML content to a VegaRTEContent instance.
|
|
@@ -78,28 +84,8 @@ export class VegaRTEContent {
|
|
|
78
84
|
* @returns {VegaRTEContent} The converted content state.
|
|
79
85
|
*/
|
|
80
86
|
static fromHtml(html, options = { autoMatchFormat: true, skipCustomAnnotations: false }) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
* case1:
|
|
84
|
-
* '<p>\n\t <span>test</span>\n\t </p>' will be formatted into '<p><span>test</span></p>'
|
|
85
|
-
* '<p>
|
|
86
|
-
* test
|
|
87
|
-
* </p>' will be formatted into '<p>test</p>'
|
|
88
|
-
*
|
|
89
|
-
* case2:
|
|
90
|
-
* <h1>
|
|
91
|
-
* _test&*....
|
|
92
|
-
* </h1> will be formatted into <h1>_test&*....</h1>
|
|
93
|
-
*
|
|
94
|
-
* The blank space between individual tags should be preserved:
|
|
95
|
-
* <span> </span>
|
|
96
|
-
*/
|
|
97
|
-
const formattedHtml = html
|
|
98
|
-
.replace(/>\s+<\/?/g, (match) => {
|
|
99
|
-
return match.endsWith('</') ? match : '><';
|
|
100
|
-
})
|
|
101
|
-
.replace(/(>)[\n\t]+(?=[a-zA-Z0-9_\W])/g, '$1')
|
|
102
|
-
.replace(/([a-zA-Z0-9_\W])[\n\t]+(?=<)/g, '$1');
|
|
87
|
+
const cleaner = new HTMLContentCleaner();
|
|
88
|
+
const formattedHtml = cleaner.clean(html);
|
|
103
89
|
const context = StylePreservator.preserve(formattedHtml);
|
|
104
90
|
const safeHtml = context.getProcessedHtml();
|
|
105
91
|
const body = new DOMParser().parseFromString(safeHtml, 'text/html').body;
|
|
@@ -141,8 +127,19 @@ export class VegaRTEContent {
|
|
|
141
127
|
if (options) {
|
|
142
128
|
LogUtility.warn(`The 'options' parameter in toHtml method is deprecated and will be removed in the future.`);
|
|
143
129
|
}
|
|
130
|
+
if (this.isEmpty()) {
|
|
131
|
+
return '';
|
|
132
|
+
}
|
|
144
133
|
return this.children.map((block) => block.toHtml()).join('');
|
|
145
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Checks if the content state is empty.
|
|
137
|
+
*
|
|
138
|
+
* @returns {boolean} True if the content state is empty, false otherwise.
|
|
139
|
+
*/
|
|
140
|
+
isEmpty() {
|
|
141
|
+
return this.children.length === 0 || (this.children.length === 1 && !this.children[0].isNotEmpty());
|
|
142
|
+
}
|
|
146
143
|
/**
|
|
147
144
|
* Internal method to add the block item, remove the block item
|
|
148
145
|
*
|
|
@@ -90,7 +90,7 @@ __decorate([
|
|
|
90
90
|
MapToComponentField()
|
|
91
91
|
], RTEExtensionController.prototype, "selectionController", void 0);
|
|
92
92
|
__decorate([
|
|
93
|
-
MapToComponentMethod('
|
|
93
|
+
MapToComponentMethod('componentDidLoad')
|
|
94
94
|
], RTEExtensionController.prototype, "initialExtensionContext", null);
|
|
95
95
|
__decorate([
|
|
96
96
|
MapToComponentMethod('watchExtensions')
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { RemoveWhitespaceBetweenTagsProcessor } from './processors/remove-whitespace-between-tags-processor';
|
|
2
|
+
import { RemoveWhitespaceAfterOpeningTagProcessor } from './processors/remove-whitespace-after-opening-tag-processor';
|
|
3
|
+
import { RemoveWhitespaceBeforeClosingTagProcessor } from './processors/remove-whitespace-before-closing-tag-processor';
|
|
4
|
+
/**
|
|
5
|
+
* Main HTML content cleaner that orchestrates multiple cleaning processors.
|
|
6
|
+
*
|
|
7
|
+
* This class implements a chain of responsibility pattern where each processor
|
|
8
|
+
* handles a specific aspect of HTML cleaning. The processors are applied in sequence
|
|
9
|
+
* and the entire chain is repeated until no more changes occur.
|
|
10
|
+
*
|
|
11
|
+
* Processors (in order):
|
|
12
|
+
* 1. RemoveWhitespaceBetweenTagsProcessor - Removes whitespace between non-matching tags
|
|
13
|
+
* 2. RemoveWhitespaceAfterOpeningTagProcessor - Removes \n and \t after opening tags
|
|
14
|
+
* 3. RemoveWhitespaceBeforeClosingTagProcessor - Removes \n and \t before closing tags
|
|
15
|
+
*/
|
|
16
|
+
export class HTMLContentCleaner {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.processors = [
|
|
19
|
+
new RemoveWhitespaceBetweenTagsProcessor(),
|
|
20
|
+
new RemoveWhitespaceAfterOpeningTagProcessor(),
|
|
21
|
+
new RemoveWhitespaceBeforeClosingTagProcessor(),
|
|
22
|
+
];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Cleans HTML by applying all processors in the chain repeatedly until no changes occur.
|
|
26
|
+
*
|
|
27
|
+
* The cleaning process:
|
|
28
|
+
* 1. Applies each processor in sequence
|
|
29
|
+
* 2. Compares the result with the input
|
|
30
|
+
* 3. If changes were made, repeats the process
|
|
31
|
+
* 4. Returns the final cleaned HTML
|
|
32
|
+
*
|
|
33
|
+
* Examples of transformations:
|
|
34
|
+
* - `<p>\n\t <span>test</span>\n\t </p>` → `<p><span>test</span></p>`
|
|
35
|
+
* - `<p>\n\tHello</p>` → `<p>Hello</p>`
|
|
36
|
+
* - `<p>Hello\n\t</p>` → `<p>Hello</p>`
|
|
37
|
+
* - `<span> </span>` → `<span> </span>` (preserved - matching tags)
|
|
38
|
+
* - `<p>Hello World</p>` → `<p>Hello World</p>` (preserved - regular spaces)
|
|
39
|
+
*
|
|
40
|
+
* @param {string} html - The HTML string to clean.
|
|
41
|
+
* @returns {string} The cleaned HTML string.
|
|
42
|
+
*/
|
|
43
|
+
clean(html) {
|
|
44
|
+
if (!html || html.trim().length === 0) {
|
|
45
|
+
return html;
|
|
46
|
+
}
|
|
47
|
+
let result = html;
|
|
48
|
+
let previousResult;
|
|
49
|
+
// Keep processing until no more changes occur
|
|
50
|
+
do {
|
|
51
|
+
previousResult = result;
|
|
52
|
+
// Apply each processor in the chain
|
|
53
|
+
for (const processor of this.processors) {
|
|
54
|
+
result = processor.process(result);
|
|
55
|
+
}
|
|
56
|
+
} while (result !== previousResult);
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
}
|
package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/html-cleaner/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { HTMLContentCleaner } from './html-content-cleaner';
|
|
2
|
+
export { RemoveWhitespaceBetweenTagsProcessor } from './processors/remove-whitespace-between-tags-processor';
|
|
3
|
+
export { RemoveWhitespaceAfterOpeningTagProcessor } from './processors/remove-whitespace-after-opening-tag-processor';
|
|
4
|
+
export { RemoveWhitespaceBeforeClosingTagProcessor } from './processors/remove-whitespace-before-closing-tag-processor';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Removes `\n` and `\t` characters after opening tags (before text content).
|
|
3
|
+
*
|
|
4
|
+
* Transforms patterns like `>[\n\t]+(text)` to `>(text)`.
|
|
5
|
+
*
|
|
6
|
+
* Examples:
|
|
7
|
+
* - `<p>\n\tHello` → `<p>Hello`
|
|
8
|
+
* - `<div>\n\n\tWorld` → `<div>World`
|
|
9
|
+
*/
|
|
10
|
+
export class RemoveWhitespaceAfterOpeningTagProcessor {
|
|
11
|
+
/**
|
|
12
|
+
* Process the HTML string to remove `\n` and `\t` after opening tags.
|
|
13
|
+
*
|
|
14
|
+
* @param {string} html - The HTML string to process.
|
|
15
|
+
* @returns {string} The processed HTML string.
|
|
16
|
+
*/
|
|
17
|
+
process(html) {
|
|
18
|
+
// Pattern: `>[\n\t]+(text)` → `>(text)`
|
|
19
|
+
return html.replace(/(>)[\n\t]+(?=.)/g, '$1');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Removes `\n` and `\t` characters before closing tags (after text content).
|
|
3
|
+
*
|
|
4
|
+
* Transforms patterns like `(text)[\n\t]+<` to `(text)<`.
|
|
5
|
+
*
|
|
6
|
+
* Examples:
|
|
7
|
+
* - `World\n\t</p>` → `World</p>`
|
|
8
|
+
* - `Hello\n</div>` → `Hello</div>`
|
|
9
|
+
*/
|
|
10
|
+
export class RemoveWhitespaceBeforeClosingTagProcessor {
|
|
11
|
+
/**
|
|
12
|
+
* Process the HTML string to remove `\n` and `\t` before closing tags.
|
|
13
|
+
*
|
|
14
|
+
* @param {string} html - The HTML string to process.
|
|
15
|
+
* @returns {string} The processed HTML string.
|
|
16
|
+
*/
|
|
17
|
+
process(html) {
|
|
18
|
+
// Pattern: `(text)[\n\t]+<` → `(text)<`
|
|
19
|
+
return html.replace(/(.?)[\n\t]+(?=<)/g, '$1');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Removes whitespace between tags, except preserves ALL whitespace between matching opening/closing tag pairs.
|
|
3
|
+
*
|
|
4
|
+
* This processor scans for patterns of `<tag>(whitespace)<tag>` and:
|
|
5
|
+
* - If the first tag is an opening tag and the second tag is its matching closing tag (e.g., `<span> </span>`),
|
|
6
|
+
* preserves ALL the whitespace between them (including spaces, tabs, newlines)
|
|
7
|
+
* - Otherwise, removes all the whitespace between the tags
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* - `</p>\n\t<div>` → `</p><div>` (different tags: closing p, opening div - whitespace removed)
|
|
11
|
+
* - `<div>\n\t<span>` → `<div><span>` (different tags: opening div, opening span - whitespace removed)
|
|
12
|
+
* - `<span> </span>` → `<span> </span>` (matching tags: opening span, closing span - space preserved)
|
|
13
|
+
* - `<span> </span>` → `<span> </span>` (matching tags - multiple spaces preserved)
|
|
14
|
+
* - `<span>\n\t</span>` → `<span>\n\t</span>` (matching tags - \n\t preserved)
|
|
15
|
+
* - `<code> </code>` → `<code> </code>` (matching tags - space preserved)
|
|
16
|
+
* - `</div> <p>` → `</div><p>` (different tags: closing div, opening p - whitespace removed)
|
|
17
|
+
*/
|
|
18
|
+
export class RemoveWhitespaceBetweenTagsProcessor {
|
|
19
|
+
/**
|
|
20
|
+
* Process the HTML string to remove whitespace between non-matching tags.
|
|
21
|
+
*
|
|
22
|
+
* @param {string} html - The HTML string to process.
|
|
23
|
+
* @returns {string} The processed HTML string.
|
|
24
|
+
*/
|
|
25
|
+
process(html) {
|
|
26
|
+
return html.replace(/(<[^>]+>)(\s+)(<[^>]+>)/g, (_match, tag1, whitespace, tag2) => {
|
|
27
|
+
const openingTagName = this.extractOpeningTagName(tag1);
|
|
28
|
+
const closingTagName = this.extractClosingTagName(tag2);
|
|
29
|
+
// Preserve all whitespace if tags match (e.g., <span> </span>)
|
|
30
|
+
if (openingTagName && closingTagName && openingTagName === closingTagName) {
|
|
31
|
+
return `${tag1}${whitespace}${tag2}`;
|
|
32
|
+
}
|
|
33
|
+
// Remove whitespace for non-matching tags
|
|
34
|
+
return `${tag1}${tag2}`;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Extracts the tag name from an opening HTML tag.
|
|
39
|
+
*
|
|
40
|
+
* Supports standard HTML tags (div, span, h1, etc.) and custom elements with hyphens (my-component).
|
|
41
|
+
*
|
|
42
|
+
* Examples:
|
|
43
|
+
* - `<span>` → `span`
|
|
44
|
+
* - `<div class="test">` → `div`
|
|
45
|
+
* - `<my-component id="123">` → `my-component`
|
|
46
|
+
* - `</span>` → `null` (not an opening tag)
|
|
47
|
+
*
|
|
48
|
+
* @param {string} tag - The tag string to extract from (e.g., '<span>', '<div class="test">').
|
|
49
|
+
* @returns {string | null} The tag name or null if not an opening tag.
|
|
50
|
+
* @private
|
|
51
|
+
*/
|
|
52
|
+
extractOpeningTagName(tag) {
|
|
53
|
+
// Pattern: <(tag name) where tag name starts with letter, followed by letters/numbers/hyphens
|
|
54
|
+
const match = tag.match(/<(\w[\w-]*)/);
|
|
55
|
+
return match ? match[1] : null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Extracts the tag name from a closing HTML tag.
|
|
59
|
+
*
|
|
60
|
+
* Supports standard HTML tags (div, span, h1, etc.) and custom elements with hyphens (my-component).
|
|
61
|
+
*
|
|
62
|
+
* Examples:
|
|
63
|
+
* - `</span>` → `span`
|
|
64
|
+
* - `</div>` → `div`
|
|
65
|
+
* - `</my-component>` → `my-component`
|
|
66
|
+
* - `<span>` → `null` (not a closing tag)
|
|
67
|
+
*
|
|
68
|
+
* @param {string} tag - The tag string to extract from (e.g., '</span>', '</div>').
|
|
69
|
+
* @returns {string | null} The tag name or null if not a closing tag.
|
|
70
|
+
* @private
|
|
71
|
+
*/
|
|
72
|
+
extractClosingTagName(tag) {
|
|
73
|
+
// Pattern: </(tag name) where tag name starts with letter, followed by letters/numbers/hyphens
|
|
74
|
+
const match = tag.match(/<\/(\w[\w-]*)/);
|
|
75
|
+
return match ? match[1] : null;
|
|
76
|
+
}
|
|
77
|
+
}
|
package/dist/collection/components/vega-rich-text-editor/slimmers/controllers/value-controller.js
CHANGED
|
@@ -50,11 +50,12 @@ export class ValueController extends VegaSlimmer {
|
|
|
50
50
|
* Watches the value of the editor and updates the internal value.
|
|
51
51
|
*/
|
|
52
52
|
watchValueUpdate() {
|
|
53
|
+
const autoMatchFormat = this.sourceEditConfig.autoMatchFormat;
|
|
53
54
|
if (this.value && !(this.value instanceof VegaRTEContent)) {
|
|
54
|
-
this.value = VegaRTEContent.fromJSON(this.value);
|
|
55
|
+
this.value = VegaRTEContent.fromJSON(this.value, { autoMatchFormat });
|
|
55
56
|
}
|
|
56
57
|
else if (!this.value || this.value.children.length === 0) {
|
|
57
|
-
this.value = VegaRTEContent.createEmptyContent();
|
|
58
|
+
this.value = VegaRTEContent.createEmptyContent({ autoMatchFormat });
|
|
58
59
|
}
|
|
59
60
|
else {
|
|
60
61
|
this.changeEventEmitter.emit(this.value);
|
|
@@ -114,6 +115,9 @@ __decorate([
|
|
|
114
115
|
__decorate([
|
|
115
116
|
MapToComponentField()
|
|
116
117
|
], ValueController.prototype, "selectionController", void 0);
|
|
118
|
+
__decorate([
|
|
119
|
+
MapToComponentField()
|
|
120
|
+
], ValueController.prototype, "sourceEditConfig", void 0);
|
|
117
121
|
__decorate([
|
|
118
122
|
MapToComponentMethod('connectedCallback')
|
|
119
123
|
], ValueController.prototype, "connectedCallback", null);
|
|
@@ -37,6 +37,9 @@ export class SourceEditToolbarButtonSlimmer extends ToolbarButtonSlimmer {
|
|
|
37
37
|
}
|
|
38
38
|
async saveSourceCode() {
|
|
39
39
|
const sourceViewValue = this.vegaRichTextEditorRenderer.getSourceCode();
|
|
40
|
+
if (!sourceViewValue && this.value.isEmpty()) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
40
43
|
if (typeof sourceViewValue === 'string') {
|
|
41
44
|
await this.valueController.flushChanges(VegaRTEContent.fromHtml(sourceViewValue, {
|
|
42
45
|
autoMatchFormat: this.sourceEditConfig.autoMatchFormat,
|
|
@@ -62,3 +65,6 @@ __decorate([
|
|
|
62
65
|
__decorate([
|
|
63
66
|
MapToComponentField()
|
|
64
67
|
], SourceEditToolbarButtonSlimmer.prototype, "sourceEditConfig", void 0);
|
|
68
|
+
__decorate([
|
|
69
|
+
MapToComponentField()
|
|
70
|
+
], SourceEditToolbarButtonSlimmer.prototype, "value", void 0);
|
|
@@ -39,6 +39,45 @@ describe('HTMLBlock', () => {
|
|
|
39
39
|
],
|
|
40
40
|
}, { autoMatchFormat: false }).toHtml()).toMatchSnapshot();
|
|
41
41
|
});
|
|
42
|
+
it('toHtml should handle self-closing hr tag correctly', () => {
|
|
43
|
+
const hrBlock = RTEHtmlBlock.from({
|
|
44
|
+
id: 'hr-1',
|
|
45
|
+
type: 'html-block',
|
|
46
|
+
htmlTag: 'hr',
|
|
47
|
+
children: [],
|
|
48
|
+
}, { autoMatchFormat: false });
|
|
49
|
+
expect(hrBlock.toHtml()).toBe('<hr>');
|
|
50
|
+
});
|
|
51
|
+
it('toHtml should handle self-closing hr tag with attributes correctly', () => {
|
|
52
|
+
const hrBlock = RTEHtmlBlock.from({
|
|
53
|
+
id: 'hr-1',
|
|
54
|
+
type: 'html-block',
|
|
55
|
+
htmlTag: 'hr',
|
|
56
|
+
annotations: { customClass: ['divider'] },
|
|
57
|
+
children: [],
|
|
58
|
+
}, { autoMatchFormat: false });
|
|
59
|
+
expect(hrBlock.toHtml()).toBe('<hr class="divider">');
|
|
60
|
+
});
|
|
61
|
+
it('toHtml should handle self-closing input tag correctly', () => {
|
|
62
|
+
const inputBlock = RTEHtmlBlock.from({
|
|
63
|
+
id: 'input-1',
|
|
64
|
+
type: 'html-block',
|
|
65
|
+
htmlTag: 'input',
|
|
66
|
+
annotations: { customAttribute: { type: 'text', placeholder: 'Enter text' } },
|
|
67
|
+
children: [],
|
|
68
|
+
}, { autoMatchFormat: false });
|
|
69
|
+
expect(inputBlock.toHtml()).toBe('<input type="text" placeholder="Enter text">');
|
|
70
|
+
});
|
|
71
|
+
it('toHtml should handle self-closing col tag correctly', () => {
|
|
72
|
+
const colBlock = RTEHtmlBlock.from({
|
|
73
|
+
id: 'col-1',
|
|
74
|
+
type: 'html-block',
|
|
75
|
+
htmlTag: 'col',
|
|
76
|
+
annotations: { customAttribute: { span: '2' } },
|
|
77
|
+
children: [],
|
|
78
|
+
}, { autoMatchFormat: false });
|
|
79
|
+
expect(colBlock.toHtml()).toBe('<col span="2">');
|
|
80
|
+
});
|
|
42
81
|
});
|
|
43
82
|
describe('public methods', () => {
|
|
44
83
|
let htmlBlock;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { VegaRTEContent } from '../../dto/content-state';
|
|
2
|
+
import { HTMLContentCleaner } from '../../slimmers/controllers/html-cleaner';
|
|
2
3
|
import { RTETextBlock } from '../../dto/blocks/text-block';
|
|
3
4
|
import { RTEImageBlock } from '../../dto/blocks/image-block';
|
|
4
5
|
import { RTEListBlock } from '../../dto/blocks/list-block';
|
|
@@ -2613,7 +2614,7 @@ describe('content state', () => {
|
|
|
2613
2614
|
</footer>
|
|
2614
2615
|
</article>
|
|
2615
2616
|
<address>ADDRESS: 123 Main St, City, Country</address>
|
|
2616
|
-
<blockquote cite="https://example.com">BLOCKQUOTE: “This is a quoted text
|
|
2617
|
+
<blockquote cite="https://example.com">BLOCKQUOTE: “This is a quoted text.”</blockquote>
|
|
2617
2618
|
<details>
|
|
2618
2619
|
<summary>DETAILS / SUMMARY Example</summary>
|
|
2619
2620
|
<p>Extra information shown when expanded.</p>
|
|
@@ -2797,6 +2798,11 @@ Line 1
|
|
|
2797
2798
|
const paragraph = content.children[0];
|
|
2798
2799
|
expect(paragraph.children[1].text).toEqual(' ');
|
|
2799
2800
|
});
|
|
2801
|
+
it('should convert empty value as expect', async () => {
|
|
2802
|
+
const emptyContent = VegaRTEContent.fromHtml('', { autoMatchFormat: false });
|
|
2803
|
+
expect(emptyContent.toHtml()).toEqual('');
|
|
2804
|
+
expect(emptyContent.toJSON()).toEqual([]);
|
|
2805
|
+
});
|
|
2800
2806
|
});
|
|
2801
2807
|
describe('fromJSON', () => {
|
|
2802
2808
|
it('should translate the paragraph as expect JSON', () => {
|
|
@@ -2950,4 +2956,168 @@ Line 1
|
|
|
2950
2956
|
});
|
|
2951
2957
|
});
|
|
2952
2958
|
});
|
|
2959
|
+
describe('cleanHtmlWhitespace', () => {
|
|
2960
|
+
const cleaner = new HTMLContentCleaner();
|
|
2961
|
+
const cleanHtmlWhitespace = (html) => {
|
|
2962
|
+
return cleaner.clean(html);
|
|
2963
|
+
};
|
|
2964
|
+
it('should inline a table by removing all whitespace between tags', () => {
|
|
2965
|
+
const input = `<table style="width: 400px; border-collapse: collapse;"> <thead> <tr> ` +
|
|
2966
|
+
`<th style="padding: 12px; text-align: left; font-weight: bold;">Header 1</th> ` +
|
|
2967
|
+
`<th style="padding: 12px; text-align: left; font-weight: bold;">Header 2</th> ` +
|
|
2968
|
+
`<th style="padding: 12px; text-align: left; font-weight: bold;">Header 3</th> ` +
|
|
2969
|
+
`</tr> </thead> <tbody> <tr> <td style="padding: 12px;">Cell 1-1</td> ` +
|
|
2970
|
+
`<td style="padding: 12px;">Cell 1-2</td> <td style="padding: 12px;">Cell 1-3</td> ` +
|
|
2971
|
+
`</tr> <tr> <td style="padding: 12px;">Cell 2-1</td> <td style="padding: 12px;">Cell 2-2</td> ` +
|
|
2972
|
+
`<td style="padding: 12px;">Cell 2-3</td> </tr> <tr> <td style="padding: 12px;">Cell 3-1</td> ` +
|
|
2973
|
+
`<td style="padding: 12px;">Cell 3-2</td> <td style="padding: 12px;">Cell 3-3</td> ` +
|
|
2974
|
+
`</tr> </tbody> </table>`;
|
|
2975
|
+
const expected = `<table style="width: 400px; border-collapse: collapse;"><thead><tr>` +
|
|
2976
|
+
`<th style="padding: 12px; text-align: left; font-weight: bold;">Header 1</th>` +
|
|
2977
|
+
`<th style="padding: 12px; text-align: left; font-weight: bold;">Header 2</th>` +
|
|
2978
|
+
`<th style="padding: 12px; text-align: left; font-weight: bold;">Header 3</th>` +
|
|
2979
|
+
`</tr></thead><tbody><tr>` +
|
|
2980
|
+
`<td style="padding: 12px;">Cell 1-1</td>` +
|
|
2981
|
+
`<td style="padding: 12px;">Cell 1-2</td>` +
|
|
2982
|
+
`<td style="padding: 12px;">Cell 1-3</td>` +
|
|
2983
|
+
`</tr><tr>` +
|
|
2984
|
+
`<td style="padding: 12px;">Cell 2-1</td>` +
|
|
2985
|
+
`<td style="padding: 12px;">Cell 2-2</td>` +
|
|
2986
|
+
`<td style="padding: 12px;">Cell 2-3</td>` +
|
|
2987
|
+
`</tr><tr>` +
|
|
2988
|
+
`<td style="padding: 12px;">Cell 3-1</td>` +
|
|
2989
|
+
`<td style="padding: 12px;">Cell 3-2</td>` +
|
|
2990
|
+
`<td style="padding: 12px;">Cell 3-3</td>` +
|
|
2991
|
+
`</tr></tbody></table>`;
|
|
2992
|
+
expect(cleanHtmlWhitespace(input)).toBe(expected);
|
|
2993
|
+
});
|
|
2994
|
+
it('should remove \\n\\t after opening tag and before closing tag', () => {
|
|
2995
|
+
const input = '<p>\n\t <span>test</span>\n\t </p>';
|
|
2996
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p><span>test</span></p>');
|
|
2997
|
+
});
|
|
2998
|
+
it('should remove all \\n and \\t characters', () => {
|
|
2999
|
+
const input = '<p>\n\ttest\n</p>';
|
|
3000
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p>test</p>');
|
|
3001
|
+
});
|
|
3002
|
+
it('should preserve space between matching tags', () => {
|
|
3003
|
+
const input = '<span> </span>';
|
|
3004
|
+
expect(cleanHtmlWhitespace(input)).toBe('<span> </span>');
|
|
3005
|
+
});
|
|
3006
|
+
it('should preserve space with text between matching tags', () => {
|
|
3007
|
+
const input = '<span> test </span>';
|
|
3008
|
+
expect(cleanHtmlWhitespace(input)).toBe('<span> test </span>');
|
|
3009
|
+
});
|
|
3010
|
+
it('should preserve multiple spaces between matching tags', () => {
|
|
3011
|
+
const input = '<span> </span>';
|
|
3012
|
+
expect(cleanHtmlWhitespace(input)).toBe('<span> </span>');
|
|
3013
|
+
});
|
|
3014
|
+
it('should remove whitespace between opening tags', () => {
|
|
3015
|
+
const input = '<div>\n\t<p></p></div>';
|
|
3016
|
+
expect(cleanHtmlWhitespace(input)).toBe('<div><p></p></div>');
|
|
3017
|
+
});
|
|
3018
|
+
it('should remove \\n\\t after opening tag but preserve regular spaces', () => {
|
|
3019
|
+
const input = '<p>\n\t Hello</p>';
|
|
3020
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p> Hello</p>');
|
|
3021
|
+
});
|
|
3022
|
+
it('should remove whitespace between multiple closing tags', () => {
|
|
3023
|
+
const input = '<table><tbody><tr></tr> </tbody> </table>';
|
|
3024
|
+
expect(cleanHtmlWhitespace(input)).toBe('<table><tbody><tr></tr></tbody></table>');
|
|
3025
|
+
});
|
|
3026
|
+
it('should remove whitespace between multiple opening tags', () => {
|
|
3027
|
+
const input = '<div> <span></span></div>';
|
|
3028
|
+
expect(cleanHtmlWhitespace(input)).toBe('<div><span></span></div>');
|
|
3029
|
+
});
|
|
3030
|
+
it('should handle complex nested structure', () => {
|
|
3031
|
+
const input = '<div>\n\t<p>\n\t\t<span>Hello</span>\n\t</p>\n</div>';
|
|
3032
|
+
expect(cleanHtmlWhitespace(input)).toBe('<div><p><span>Hello</span></p></div>');
|
|
3033
|
+
});
|
|
3034
|
+
it('should preserve regular spaces within text content', () => {
|
|
3035
|
+
const input = '<p>Hello World</p>';
|
|
3036
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p>Hello World</p>');
|
|
3037
|
+
});
|
|
3038
|
+
it('should preserve multiple spaces in text content', () => {
|
|
3039
|
+
const input = '<p>Hello World</p>';
|
|
3040
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p>Hello World</p>');
|
|
3041
|
+
});
|
|
3042
|
+
it('should not remove \\n between words in text content', () => {
|
|
3043
|
+
const input = '<p>Hello\nWorld</p>';
|
|
3044
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p>Hello\nWorld</p>');
|
|
3045
|
+
});
|
|
3046
|
+
it('should not remove \\n between words with space in text content', () => {
|
|
3047
|
+
const input = '<p>Hello\n World</p>';
|
|
3048
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p>Hello\n World</p>');
|
|
3049
|
+
});
|
|
3050
|
+
it('should remove newline after img tag', () => {
|
|
3051
|
+
const input = '<div><img id="image-id" class="img-class" style="vertical-align: bottom; width: 25%; padding: 20px" alt="test alt" src="data:image/svg+xml;base64,xxx=" data-size="sm">\n</div>';
|
|
3052
|
+
const expected = '<div><img id="image-id" class="img-class" style="vertical-align: bottom; width: 25%; padding: 20px" alt="test alt" src="data:image/svg+xml;base64,xxx=" data-size="sm"></div>';
|
|
3053
|
+
expect(cleanHtmlWhitespace(input)).toBe(expected);
|
|
3054
|
+
});
|
|
3055
|
+
it('should handle 4-level deep nesting', () => {
|
|
3056
|
+
const input = '<div>\n\t<section>\n\t\t<article>\n\t\t\t<p>Text</p>\n\t\t</article>\n\t</section>\n</div>';
|
|
3057
|
+
expect(cleanHtmlWhitespace(input)).toBe('<div><section><article><p>Text</p></article></section></div>');
|
|
3058
|
+
});
|
|
3059
|
+
it('should handle 5-level deep nesting', () => {
|
|
3060
|
+
const input = '<div>\n\t<section>\n\t\t<article>\n\t\t\t<main>\n\t\t\t\t<p>Text</p>\n\t\t\t</main>\n\t\t</article>\n\t</section>\n</div>';
|
|
3061
|
+
expect(cleanHtmlWhitespace(input)).toBe('<div><section><article><main><p>Text</p></main></article></section></div>');
|
|
3062
|
+
});
|
|
3063
|
+
it('should handle 6-level deep nesting', () => {
|
|
3064
|
+
const input = '<div>\n\t<section>\n\t\t<article>\n\t\t\t<main>\n\t\t\t\t<aside>\n\t\t\t\t\t<p>Text</p>\n\t\t\t\t</aside>\n\t\t\t</main>\n\t\t</article>\n\t</section>\n</div>';
|
|
3065
|
+
expect(cleanHtmlWhitespace(input)).toBe('<div><section><article><main><aside><p>Text</p></aside></main></article></section></div>');
|
|
3066
|
+
});
|
|
3067
|
+
it('should remove whitespace after br and hr tags', () => {
|
|
3068
|
+
const input1 = '<div><br>\n</div>';
|
|
3069
|
+
expect(cleanHtmlWhitespace(input1)).toBe('<div><br></div>');
|
|
3070
|
+
const input2 = '<div><hr>\n\t</div>';
|
|
3071
|
+
expect(cleanHtmlWhitespace(input2)).toBe('<div><hr></div>');
|
|
3072
|
+
const input3 = '<div><input type="text">\n</div>';
|
|
3073
|
+
expect(cleanHtmlWhitespace(input3)).toBe('<div><input type="text"></div>');
|
|
3074
|
+
});
|
|
3075
|
+
it('should remove multiple consecutive \\n characters', () => {
|
|
3076
|
+
const input = '<p>\n\n\n\nHello</p>';
|
|
3077
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p>Hello</p>');
|
|
3078
|
+
});
|
|
3079
|
+
it('should remove multiple consecutive \\t characters', () => {
|
|
3080
|
+
const input = '<p>\t\t\tHello</p>';
|
|
3081
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p>Hello</p>');
|
|
3082
|
+
});
|
|
3083
|
+
it('should preserve empty matching tags', () => {
|
|
3084
|
+
const input = '<span></span>';
|
|
3085
|
+
expect(cleanHtmlWhitespace(input)).toBe('<span></span>');
|
|
3086
|
+
});
|
|
3087
|
+
it('should handle mixed spaces, tabs, and newlines', () => {
|
|
3088
|
+
const input = '<div> \n\t <p>Text</p> \n\t </div>';
|
|
3089
|
+
expect(cleanHtmlWhitespace(input)).toBe('<div><p>Text</p></div>');
|
|
3090
|
+
});
|
|
3091
|
+
it('should preserve spaces in attribute values', () => {
|
|
3092
|
+
const input = '<p class="my custom class">Text</p>';
|
|
3093
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p class="my custom class">Text</p>');
|
|
3094
|
+
});
|
|
3095
|
+
it('should remove newlines after br tags', () => {
|
|
3096
|
+
const input = '<p>Line 1<br>\nLine 2</p>';
|
|
3097
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p>Line 1<br>Line 2</p>');
|
|
3098
|
+
});
|
|
3099
|
+
it('should preserve spaces in code blocks between matching tags', () => {
|
|
3100
|
+
const input = '<code> const x = 1; </code>';
|
|
3101
|
+
expect(cleanHtmlWhitespace(input)).toBe('<code> const x = 1; </code>');
|
|
3102
|
+
});
|
|
3103
|
+
it('should handle empty string', () => {
|
|
3104
|
+
expect(cleanHtmlWhitespace('')).toBe('');
|
|
3105
|
+
});
|
|
3106
|
+
it('should preserve plain text without tags', () => {
|
|
3107
|
+
const input = 'Hello World';
|
|
3108
|
+
expect(cleanHtmlWhitespace(input)).toBe('Hello World');
|
|
3109
|
+
});
|
|
3110
|
+
it('should remove whitespace between different inline elements', () => {
|
|
3111
|
+
const input = '<span>text</span>\n\t<strong>bold</strong>';
|
|
3112
|
+
expect(cleanHtmlWhitespace(input)).toBe('<span>text</span><strong>bold</strong>');
|
|
3113
|
+
});
|
|
3114
|
+
it('should remove \\t\\n combination', () => {
|
|
3115
|
+
const input = '<p>\t\nHello</p>';
|
|
3116
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p>Hello</p>');
|
|
3117
|
+
});
|
|
3118
|
+
it('should remove complex \\n\\t\\n patterns', () => {
|
|
3119
|
+
const input = '<p>\n\t\n\t\nHello</p>';
|
|
3120
|
+
expect(cleanHtmlWhitespace(input)).toBe('<p>Hello</p>');
|
|
3121
|
+
});
|
|
3122
|
+
});
|
|
2953
3123
|
});
|