@opentiny/fluent-editor 3.19.0 → 3.19.1-alpha.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/README.md +97 -96
- package/es/config/base64-image.es.js +9 -0
- package/es/config/base64-image.es.js.map +1 -0
- package/es/config/editor.config.es.js +86 -0
- package/es/config/editor.config.es.js.map +1 -0
- package/es/config/editor.utils.es.js +141 -0
- package/es/config/editor.utils.es.js.map +1 -0
- package/es/config/i18n/en-us.es.js +90 -0
- package/es/config/i18n/en-us.es.js.map +1 -0
- package/es/config/i18n/zh-cn.es.js +90 -0
- package/es/config/i18n/zh-cn.es.js.map +1 -0
- package/es/config/icons.config.es.js +301 -0
- package/es/config/icons.config.es.js.map +1 -0
- package/es/config/types/additional-toolbar-item.interface.es.js +2 -0
- package/es/config/types/additional-toolbar-item.interface.es.js.map +1 -0
- package/es/config/types/content-change.interface.es.js +2 -0
- package/es/config/types/content-change.interface.es.js.map +1 -0
- package/es/config/types/content-save.interface.es.js +2 -0
- package/es/config/types/content-save.interface.es.js.map +1 -0
- package/es/config/types/counter-option.interface.es.js +2 -0
- package/es/config/types/counter-option.interface.es.js.map +1 -0
- package/es/config/types/editor-config.interface.es.js +2 -0
- package/es/config/types/editor-config.interface.es.js.map +1 -0
- package/es/config/types/editor-modules.interface.es.js +2 -0
- package/es/config/types/editor-modules.interface.es.js.map +1 -0
- package/es/config/types/file-operation.interface.es.js +2 -0
- package/es/config/types/file-operation.interface.es.js.map +1 -0
- package/es/config/types/focus-change.interface.es.js +2 -0
- package/es/config/types/focus-change.interface.es.js.map +1 -0
- package/es/config/types/fullscreen-module.interface.es.js +2 -0
- package/es/config/types/fullscreen-module.interface.es.js.map +1 -0
- package/es/config/types/help-panel-item.interface.es.js +2 -0
- package/es/config/types/help-panel-item.interface.es.js.map +1 -0
- package/es/config/types/help-panel-option.interface.es.js +2 -0
- package/es/config/types/help-panel-option.interface.es.js.map +1 -0
- package/es/config/types/image-module.interface.es.js +2 -0
- package/es/config/types/image-module.interface.es.js.map +1 -0
- package/es/config/types/image-upload.interface.es.js +2 -0
- package/es/config/types/image-upload.interface.es.js.map +1 -0
- package/es/config/types/index.es.js +23 -0
- package/es/config/types/index.es.js.map +1 -0
- package/es/config/types/load-on-demand-module.interface.es.js +2 -0
- package/es/config/types/load-on-demand-module.interface.es.js.map +1 -0
- package/es/config/types/mention-module.interface.es.js +2 -0
- package/es/config/types/mention-module.interface.es.js.map +1 -0
- package/es/config/types/paste-change.interface.es.js +2 -0
- package/es/config/types/paste-change.interface.es.js.map +1 -0
- package/es/config/types/quick-menu-module.interface.es.js +2 -0
- package/es/config/types/quick-menu-module.interface.es.js.map +1 -0
- package/es/config/types/range.interface.es.js +2 -0
- package/es/config/types/range.interface.es.js.map +1 -0
- package/es/config/types/registry-options.interface.es.js +2 -0
- package/es/config/types/registry-options.interface.es.js.map +1 -0
- package/es/config/types/selection-change.interface.es.js +2 -0
- package/es/config/types/selection-change.interface.es.js.map +1 -0
- package/es/config/types/toolbar-item.interface.es.js +2 -0
- package/es/config/types/toolbar-item.interface.es.js.map +1 -0
- package/es/config/types/type.es.js +2 -0
- package/es/config/types/type.es.js.map +1 -0
- package/es/config/types/validate-error.interface.es.js +2 -0
- package/es/config/types/validate-error.interface.es.js.map +1 -0
- package/es/config.es.js +168 -0
- package/es/config.es.js.map +1 -0
- package/es/counter/index.es.js +60 -0
- package/es/counter/index.es.js.map +1 -0
- package/es/custom-clipboard.es.js +469 -0
- package/es/custom-clipboard.es.js.map +1 -0
- package/es/custom-image/BlotFormatter.es.js +136 -0
- package/es/custom-image/BlotFormatter.es.js.map +1 -0
- package/es/custom-image/Options.es.js +95 -0
- package/es/custom-image/Options.es.js.map +1 -0
- package/es/custom-image/actions/Action.es.js +15 -0
- package/es/custom-image/actions/Action.es.js.map +1 -0
- package/es/custom-image/actions/CustomResizeAction.es.js +158 -0
- package/es/custom-image/actions/CustomResizeAction.es.js.map +1 -0
- package/es/custom-image/actions/DeleteAction.es.js +31 -0
- package/es/custom-image/actions/DeleteAction.es.js.map +1 -0
- package/es/custom-image/image.es.js +95 -0
- package/es/custom-image/image.es.js.map +1 -0
- package/es/custom-image/specs/BlotSpec.es.js +27 -0
- package/es/custom-image/specs/BlotSpec.es.js.map +1 -0
- package/es/custom-image/specs/CustomImageSpec.es.js +117 -0
- package/es/custom-image/specs/CustomImageSpec.es.js.map +1 -0
- package/es/custom-image/specs/ImageSpec.es.js +29 -0
- package/es/custom-image/specs/ImageSpec.es.js.map +1 -0
- package/es/custom-uploader.es.js +161 -0
- package/es/custom-uploader.es.js.map +1 -0
- package/es/emoji/emoji-list/index.es.js +5 -0
- package/es/emoji/emoji-list/index.es.js.map +1 -0
- package/es/emoji/emoji-list/people.es.js +114 -0
- package/es/emoji/emoji-list/people.es.js.map +1 -0
- package/es/emoji/emoji-list.es.js +9 -0
- package/es/emoji/emoji-list.es.js.map +1 -0
- package/es/emoji/emoji-map.es.js +9 -0
- package/es/emoji/emoji-map.es.js.map +1 -0
- package/es/emoji/formats/emoji-blot.es.js +41 -0
- package/es/emoji/formats/emoji-blot.es.js.map +1 -0
- package/es/emoji/index.es.js +8 -0
- package/es/emoji/index.es.js.map +1 -0
- package/es/emoji/modules/emoji.es.js +248 -0
- package/es/emoji/modules/emoji.es.js.map +1 -0
- package/es/emoji/modules/toolbar-emoji.es.js +153 -0
- package/es/emoji/modules/toolbar-emoji.es.js.map +1 -0
- package/es/emoji/utils.es.js +19 -0
- package/es/emoji/utils.es.js.map +1 -0
- package/es/file/formats/file.es.js +56 -0
- package/es/file/formats/file.es.js.map +1 -0
- package/es/file/index.es.js +32 -0
- package/es/file/index.es.js.map +1 -0
- package/es/file/modules/file-bar.es.js +123 -0
- package/es/file/modules/file-bar.es.js.map +1 -0
- package/es/fluent-editor.es.js +163 -0
- package/es/fluent-editor.es.js.map +1 -0
- package/es/format-painter/index.es.js +66 -0
- package/es/format-painter/index.es.js.map +1 -0
- package/es/global-link/constants.es.js +9 -0
- package/es/global-link/constants.es.js.map +1 -0
- package/es/global-link/formats/customer-widget-link.es.js +28 -0
- package/es/global-link/formats/customer-widget-link.es.js.map +1 -0
- package/es/global-link/formats/doc-link.es.js +42 -0
- package/es/global-link/formats/doc-link.es.js.map +1 -0
- package/es/global-link/formats/wiki-link.es.js +34 -0
- package/es/global-link/formats/wiki-link.es.js.map +1 -0
- package/es/global-link/formats/work-item-link.es.js +36 -0
- package/es/global-link/formats/work-item-link.es.js.map +1 -0
- package/es/global-link/global-link-panel.es.js +2 -0
- package/es/global-link/global-link-panel.es.js.map +1 -0
- package/es/global-link/index.es.js +139 -0
- package/es/global-link/index.es.js.map +1 -0
- package/es/global-link/utils/createTable.es.js +50 -0
- package/es/global-link/utils/createTable.es.js.map +1 -0
- package/es/index.es.js +5 -0
- package/es/index.es.js.map +1 -0
- package/es/lineheight.es.js +11 -0
- package/es/lineheight.es.js.map +1 -0
- package/es/link/formats/link.es.js +34 -0
- package/es/link/formats/link.es.js.map +1 -0
- package/es/link/index.es.js +32 -0
- package/es/link/index.es.js.map +1 -0
- package/es/link/modules/tooltip.es.js +275 -0
- package/es/link/modules/tooltip.es.js.map +1 -0
- package/es/mention/Mention.es.js +329 -0
- package/es/mention/Mention.es.js.map +1 -0
- package/es/mention/MentionLink.es.js +37 -0
- package/es/mention/MentionLink.es.js.map +1 -0
- package/es/mention/constants.es.js +9 -0
- package/es/mention/constants.es.js.map +1 -0
- package/es/quick-menu/index.es.js +82 -0
- package/es/quick-menu/index.es.js.map +1 -0
- package/es/screenshot/index.es.js +147 -0
- package/es/screenshot/index.es.js.map +1 -0
- package/es/soft-break/index.es.js +23 -0
- package/es/soft-break/index.es.js.map +1 -0
- package/es/strike/index.es.js +12 -0
- package/es/strike/index.es.js.map +1 -0
- package/es/syntax/index.es.js +30 -0
- package/es/syntax/index.es.js.map +1 -0
- package/es/table/better-table.es.js +434 -0
- package/es/table/better-table.es.js.map +1 -0
- package/es/table/formats/header.es.js +94 -0
- package/es/table/formats/header.es.js.map +1 -0
- package/es/table/formats/list.es.js +163 -0
- package/es/table/formats/list.es.js.map +1 -0
- package/es/table/formats/table.es.js +970 -0
- package/es/table/formats/table.es.js.map +1 -0
- package/es/table/modules/table-column-tool.es.js +400 -0
- package/es/table/modules/table-column-tool.es.js.map +1 -0
- package/es/table/modules/table-operation-menu.es.js +457 -0
- package/es/table/modules/table-operation-menu.es.js.map +1 -0
- package/es/table/modules/table-scroll-bar.es.js +190 -0
- package/es/table/modules/table-scroll-bar.es.js.map +1 -0
- package/es/table/modules/table-selection.es.js +306 -0
- package/es/table/modules/table-selection.es.js.map +1 -0
- package/es/table/table-config.es.js +74 -0
- package/es/table/table-config.es.js.map +1 -0
- package/es/table/utils/index.es.js +54 -0
- package/es/table/utils/index.es.js.map +1 -0
- package/es/table/utils/node-matchers.es.js +292 -0
- package/es/table/utils/node-matchers.es.js.map +1 -0
- package/es/toolbar/better-picker.es.js +307 -0
- package/es/toolbar/better-picker.es.js.map +1 -0
- package/es/toolbar/index.es.js +139 -0
- package/es/toolbar/index.es.js.map +1 -0
- package/es/types/vue.d.es.js +2 -0
- package/es/types/vue.d.es.js.map +1 -0
- package/es/utils/debounce.es.js +112 -0
- package/es/utils/debounce.es.js.map +1 -0
- package/es/utils/method.es.js +68 -0
- package/es/utils/method.es.js.map +1 -0
- package/es/video/index.es.js +49 -0
- package/es/video/index.es.js.map +1 -0
- package/lib/config/base64-image.cjs.js +9 -0
- package/lib/config/base64-image.cjs.js.map +1 -0
- package/lib/config/editor.config.cjs.js +86 -0
- package/lib/config/editor.config.cjs.js.map +1 -0
- package/lib/config/editor.utils.cjs.js +141 -0
- package/lib/config/editor.utils.cjs.js.map +1 -0
- package/lib/config/i18n/en-us.cjs.js +90 -0
- package/lib/config/i18n/en-us.cjs.js.map +1 -0
- package/lib/config/i18n/zh-cn.cjs.js +90 -0
- package/lib/config/i18n/zh-cn.cjs.js.map +1 -0
- package/lib/config/icons.config.cjs.js +301 -0
- package/lib/config/icons.config.cjs.js.map +1 -0
- package/lib/config/types/additional-toolbar-item.interface.cjs.js +2 -0
- package/lib/config/types/additional-toolbar-item.interface.cjs.js.map +1 -0
- package/lib/config/types/content-change.interface.cjs.js +2 -0
- package/lib/config/types/content-change.interface.cjs.js.map +1 -0
- package/lib/config/types/content-save.interface.cjs.js +2 -0
- package/lib/config/types/content-save.interface.cjs.js.map +1 -0
- package/lib/config/types/counter-option.interface.cjs.js +2 -0
- package/lib/config/types/counter-option.interface.cjs.js.map +1 -0
- package/lib/config/types/editor-config.interface.cjs.js +2 -0
- package/lib/config/types/editor-config.interface.cjs.js.map +1 -0
- package/lib/config/types/editor-modules.interface.cjs.js +2 -0
- package/lib/config/types/editor-modules.interface.cjs.js.map +1 -0
- package/lib/config/types/file-operation.interface.cjs.js +2 -0
- package/lib/config/types/file-operation.interface.cjs.js.map +1 -0
- package/lib/config/types/focus-change.interface.cjs.js +2 -0
- package/lib/config/types/focus-change.interface.cjs.js.map +1 -0
- package/lib/config/types/fullscreen-module.interface.cjs.js +2 -0
- package/lib/config/types/fullscreen-module.interface.cjs.js.map +1 -0
- package/lib/config/types/help-panel-item.interface.cjs.js +2 -0
- package/lib/config/types/help-panel-item.interface.cjs.js.map +1 -0
- package/lib/config/types/help-panel-option.interface.cjs.js +2 -0
- package/lib/config/types/help-panel-option.interface.cjs.js.map +1 -0
- package/lib/config/types/image-module.interface.cjs.js +2 -0
- package/lib/config/types/image-module.interface.cjs.js.map +1 -0
- package/lib/config/types/image-upload.interface.cjs.js +2 -0
- package/lib/config/types/image-upload.interface.cjs.js.map +1 -0
- package/lib/config/types/index.cjs.js +24 -0
- package/lib/config/types/index.cjs.js.map +1 -0
- package/lib/config/types/load-on-demand-module.interface.cjs.js +2 -0
- package/lib/config/types/load-on-demand-module.interface.cjs.js.map +1 -0
- package/lib/config/types/mention-module.interface.cjs.js +2 -0
- package/lib/config/types/mention-module.interface.cjs.js.map +1 -0
- package/lib/config/types/paste-change.interface.cjs.js +2 -0
- package/lib/config/types/paste-change.interface.cjs.js.map +1 -0
- package/lib/config/types/quick-menu-module.interface.cjs.js +2 -0
- package/lib/config/types/quick-menu-module.interface.cjs.js.map +1 -0
- package/lib/config/types/range.interface.cjs.js +2 -0
- package/lib/config/types/range.interface.cjs.js.map +1 -0
- package/lib/config/types/registry-options.interface.cjs.js +2 -0
- package/lib/config/types/registry-options.interface.cjs.js.map +1 -0
- package/lib/config/types/selection-change.interface.cjs.js +2 -0
- package/lib/config/types/selection-change.interface.cjs.js.map +1 -0
- package/lib/config/types/toolbar-item.interface.cjs.js +2 -0
- package/lib/config/types/toolbar-item.interface.cjs.js.map +1 -0
- package/lib/config/types/type.cjs.js +2 -0
- package/lib/config/types/type.cjs.js.map +1 -0
- package/lib/config/types/validate-error.interface.cjs.js +2 -0
- package/lib/config/types/validate-error.interface.cjs.js.map +1 -0
- package/lib/config.cjs.js +168 -0
- package/lib/config.cjs.js.map +1 -0
- package/lib/counter/index.cjs.js +60 -0
- package/lib/counter/index.cjs.js.map +1 -0
- package/lib/custom-clipboard.cjs.js +469 -0
- package/lib/custom-clipboard.cjs.js.map +1 -0
- package/lib/custom-image/BlotFormatter.cjs.js +136 -0
- package/lib/custom-image/BlotFormatter.cjs.js.map +1 -0
- package/lib/custom-image/Options.cjs.js +95 -0
- package/lib/custom-image/Options.cjs.js.map +1 -0
- package/lib/custom-image/actions/Action.cjs.js +15 -0
- package/lib/custom-image/actions/Action.cjs.js.map +1 -0
- package/lib/custom-image/actions/CustomResizeAction.cjs.js +158 -0
- package/lib/custom-image/actions/CustomResizeAction.cjs.js.map +1 -0
- package/lib/custom-image/actions/DeleteAction.cjs.js +31 -0
- package/lib/custom-image/actions/DeleteAction.cjs.js.map +1 -0
- package/lib/custom-image/image.cjs.js +95 -0
- package/lib/custom-image/image.cjs.js.map +1 -0
- package/lib/custom-image/specs/BlotSpec.cjs.js +27 -0
- package/lib/custom-image/specs/BlotSpec.cjs.js.map +1 -0
- package/lib/custom-image/specs/CustomImageSpec.cjs.js +117 -0
- package/lib/custom-image/specs/CustomImageSpec.cjs.js.map +1 -0
- package/lib/custom-image/specs/ImageSpec.cjs.js +29 -0
- package/lib/custom-image/specs/ImageSpec.cjs.js.map +1 -0
- package/lib/custom-uploader.cjs.js +161 -0
- package/lib/custom-uploader.cjs.js.map +1 -0
- package/lib/emoji/emoji-list/index.cjs.js +5 -0
- package/lib/emoji/emoji-list/index.cjs.js.map +1 -0
- package/lib/emoji/emoji-list/people.cjs.js +114 -0
- package/lib/emoji/emoji-list/people.cjs.js.map +1 -0
- package/lib/emoji/emoji-list.cjs.js +9 -0
- package/lib/emoji/emoji-list.cjs.js.map +1 -0
- package/lib/emoji/emoji-map.cjs.js +9 -0
- package/lib/emoji/emoji-map.cjs.js.map +1 -0
- package/lib/emoji/formats/emoji-blot.cjs.js +41 -0
- package/lib/emoji/formats/emoji-blot.cjs.js.map +1 -0
- package/lib/emoji/index.cjs.js +8 -0
- package/lib/emoji/index.cjs.js.map +1 -0
- package/lib/emoji/modules/emoji.cjs.js +248 -0
- package/lib/emoji/modules/emoji.cjs.js.map +1 -0
- package/lib/emoji/modules/toolbar-emoji.cjs.js +153 -0
- package/lib/emoji/modules/toolbar-emoji.cjs.js.map +1 -0
- package/lib/emoji/utils.cjs.js +19 -0
- package/lib/emoji/utils.cjs.js.map +1 -0
- package/lib/file/formats/file.cjs.js +56 -0
- package/lib/file/formats/file.cjs.js.map +1 -0
- package/lib/file/index.cjs.js +32 -0
- package/lib/file/index.cjs.js.map +1 -0
- package/lib/file/modules/file-bar.cjs.js +123 -0
- package/lib/file/modules/file-bar.cjs.js.map +1 -0
- package/lib/fluent-editor.cjs.js +163 -0
- package/lib/fluent-editor.cjs.js.map +1 -0
- package/lib/format-painter/index.cjs.js +66 -0
- package/lib/format-painter/index.cjs.js.map +1 -0
- package/lib/global-link/constants.cjs.js +9 -0
- package/lib/global-link/constants.cjs.js.map +1 -0
- package/lib/global-link/formats/customer-widget-link.cjs.js +28 -0
- package/lib/global-link/formats/customer-widget-link.cjs.js.map +1 -0
- package/lib/global-link/formats/doc-link.cjs.js +42 -0
- package/lib/global-link/formats/doc-link.cjs.js.map +1 -0
- package/lib/global-link/formats/wiki-link.cjs.js +34 -0
- package/lib/global-link/formats/wiki-link.cjs.js.map +1 -0
- package/lib/global-link/formats/work-item-link.cjs.js +36 -0
- package/lib/global-link/formats/work-item-link.cjs.js.map +1 -0
- package/lib/global-link/global-link-panel.cjs.js +2 -0
- package/lib/global-link/global-link-panel.cjs.js.map +1 -0
- package/lib/global-link/index.cjs.js +139 -0
- package/lib/global-link/index.cjs.js.map +1 -0
- package/lib/global-link/utils/createTable.cjs.js +50 -0
- package/lib/global-link/utils/createTable.cjs.js.map +1 -0
- package/lib/index.cjs.js +5 -0
- package/lib/index.cjs.js.map +1 -0
- package/lib/lineheight.cjs.js +11 -0
- package/lib/lineheight.cjs.js.map +1 -0
- package/lib/link/formats/link.cjs.js +34 -0
- package/lib/link/formats/link.cjs.js.map +1 -0
- package/lib/link/index.cjs.js +32 -0
- package/lib/link/index.cjs.js.map +1 -0
- package/lib/link/modules/tooltip.cjs.js +275 -0
- package/lib/link/modules/tooltip.cjs.js.map +1 -0
- package/lib/mention/Mention.cjs.js +329 -0
- package/lib/mention/Mention.cjs.js.map +1 -0
- package/lib/mention/MentionLink.cjs.js +37 -0
- package/lib/mention/MentionLink.cjs.js.map +1 -0
- package/lib/mention/constants.cjs.js +9 -0
- package/lib/mention/constants.cjs.js.map +1 -0
- package/lib/quick-menu/index.cjs.js +82 -0
- package/lib/quick-menu/index.cjs.js.map +1 -0
- package/lib/screenshot/index.cjs.js +147 -0
- package/lib/screenshot/index.cjs.js.map +1 -0
- package/lib/soft-break/index.cjs.js +23 -0
- package/lib/soft-break/index.cjs.js.map +1 -0
- package/lib/strike/index.cjs.js +12 -0
- package/lib/strike/index.cjs.js.map +1 -0
- package/lib/syntax/index.cjs.js +30 -0
- package/lib/syntax/index.cjs.js.map +1 -0
- package/lib/table/better-table.cjs.js +434 -0
- package/lib/table/better-table.cjs.js.map +1 -0
- package/lib/table/formats/header.cjs.js +94 -0
- package/lib/table/formats/header.cjs.js.map +1 -0
- package/lib/table/formats/list.cjs.js +163 -0
- package/lib/table/formats/list.cjs.js.map +1 -0
- package/lib/table/formats/table.cjs.js +970 -0
- package/lib/table/formats/table.cjs.js.map +1 -0
- package/lib/table/modules/table-column-tool.cjs.js +400 -0
- package/lib/table/modules/table-column-tool.cjs.js.map +1 -0
- package/lib/table/modules/table-operation-menu.cjs.js +457 -0
- package/lib/table/modules/table-operation-menu.cjs.js.map +1 -0
- package/lib/table/modules/table-scroll-bar.cjs.js +190 -0
- package/lib/table/modules/table-scroll-bar.cjs.js.map +1 -0
- package/lib/table/modules/table-selection.cjs.js +306 -0
- package/lib/table/modules/table-selection.cjs.js.map +1 -0
- package/lib/table/table-config.cjs.js +74 -0
- package/lib/table/table-config.cjs.js.map +1 -0
- package/lib/table/utils/index.cjs.js +54 -0
- package/lib/table/utils/index.cjs.js.map +1 -0
- package/lib/table/utils/node-matchers.cjs.js +292 -0
- package/lib/table/utils/node-matchers.cjs.js.map +1 -0
- package/lib/toolbar/better-picker.cjs.js +308 -0
- package/lib/toolbar/better-picker.cjs.js.map +1 -0
- package/lib/toolbar/index.cjs.js +139 -0
- package/lib/toolbar/index.cjs.js.map +1 -0
- package/lib/types/vue.d.cjs.js +2 -0
- package/lib/types/vue.d.cjs.js.map +1 -0
- package/lib/utils/debounce.cjs.js +112 -0
- package/lib/utils/debounce.cjs.js.map +1 -0
- package/lib/utils/method.cjs.js +68 -0
- package/lib/utils/method.cjs.js.map +1 -0
- package/lib/video/index.cjs.js +49 -0
- package/lib/video/index.cjs.js.map +1 -0
- package/package.json +63 -65
- package/theme/style.css +4742 -0
- package/index.cjs.js +0 -374
- package/index.cjs.js.map +0 -1
- package/index.es.js +0 -51095
- package/index.es.js.map +0 -1
- package/style.css +0 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlotFormatter.es.js","sources":["../../../src/custom-image/BlotFormatter.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport Action from './actions/Action'\r\nimport ImageBlot, { ImageContainerBlot } from './image'\r\nimport DefaultOptions, { Options } from './Options'\r\nimport BlotSpec from './specs/BlotSpec'\r\nimport { CustomImageSpec } from './specs/CustomImageSpec'\r\nimport { merge as deepmerge } from 'lodash-es'\r\n\r\nconst dontMerge = (_destination: Array<any>, source: Array<any>) => source\r\n\r\n// @dynamic\r\nexport default class BlotFormatter {\r\n quill: any\r\n options: Options\r\n currentSpec: BlotSpec\r\n specs: BlotSpec[]\r\n overlay: HTMLElement\r\n actions: Action[]\r\n observer: any\r\n\r\n static register() {\r\n Quill.register('formats/image', ImageBlot, true)\r\n Quill.register('formats/image-container', ImageContainerBlot, true)\r\n Quill.register('modules/image-spec', CustomImageSpec, true)\r\n }\r\n\r\n constructor(quill: any, options: any = {}) {\r\n this.quill = quill\r\n this.options = deepmerge(DefaultOptions, options, { arrayMerge: dontMerge })\r\n this.currentSpec = null\r\n this.actions = []\r\n this.overlay = document.createElement('div')\r\n this.overlay.classList.add(this.options.overlay.className)\r\n if (this.options.overlay.style) {\r\n Object.assign(this.overlay.style, this.options.overlay.style)\r\n }\r\n\r\n // disable native image resizing on firefox\r\n document.execCommand('enableObjectResizing', false, 'false') // eslint-disable-next-line-line no-undef\r\n this.quill.root.parentNode.style.position = this.quill.root.parentNode.style.position || 'relative'\r\n this.quill.root.addEventListener('click', this.onClick)\r\n this.specs = this.options.specs.map((SpecClass: any) => new SpecClass(this))\r\n this.specs.forEach(spec => spec.init())\r\n }\r\n\r\n show(spec: BlotSpec) {\r\n this.currentSpec = spec\r\n this.currentSpec.setSelection()\r\n this.setUserSelect('none')\r\n this.quill.root.parentNode.appendChild(this.overlay)\r\n this.repositionOverlay()\r\n this.createActions(spec)\r\n\r\n // fix: 图片对齐之后,虚线外框应该跟随移动\r\n const imageDom = spec.getTargetElement()\r\n const win: any = window\r\n const MutationObserver = win.MutationObserver || win.WebKitMutationObserver || win.MozMutationObserver\r\n const element = imageDom.parentNode\r\n this.observer = new MutationObserver((mutationList) => {\r\n for (const mutation of mutationList) {\r\n const target = mutation.target\r\n const image = target.querySelector('img')\r\n if (image) {\r\n this.repositionOverlay()\r\n }\r\n }\r\n })\r\n this.observer.observe(element, {\r\n attributes: true,\r\n attributeFilter: ['class'],\r\n attributeOldValue: true,\r\n subtree: true,\r\n })\r\n document.body.addEventListener('click', this.hideImageOverlay, true)\r\n }\r\n\r\n hide() {\r\n if (!this.currentSpec) {\r\n return\r\n }\r\n\r\n const imgDom = this.currentSpec.getTargetElement()\r\n if (imgDom) {\r\n imgDom.classList.remove('current-select-img')\r\n }\r\n\r\n this.currentSpec.onHide()\r\n this.currentSpec = null\r\n this.quill.root.parentNode.removeChild(this.overlay)\r\n this.overlay.style.setProperty('display', 'none')\r\n this.setUserSelect('')\r\n this.destroyActions()\r\n }\r\n\r\n update() {\r\n this.repositionOverlay()\r\n this.actions.forEach(action => action.onUpdate())\r\n }\r\n\r\n createActions(spec: BlotSpec) {\r\n this.actions = spec.getActions().map((ActionClass: any) => {\r\n const action: Action = new ActionClass(this)\r\n action.onCreate()\r\n return action\r\n })\r\n }\r\n\r\n destroyActions() {\r\n this.actions.forEach((action: Action) => action.onDestroy())\r\n this.actions = []\r\n }\r\n\r\n repositionOverlay() {\r\n if (!this.currentSpec) {\r\n return\r\n }\r\n\r\n const overlayTarget = this.currentSpec.getOverlayElement()\r\n if (!overlayTarget) {\r\n return\r\n }\r\n\r\n const parent: HTMLElement = this.quill.root.parentNode\r\n const specRect = overlayTarget.getBoundingClientRect()\r\n const parentRect = parent.getBoundingClientRect()\r\n\r\n Object.assign(this.overlay.style, {\r\n display: 'block',\r\n left: `${specRect.left - parentRect.left - 1 + parent.scrollLeft}px`,\r\n top: `${specRect.top - parentRect.top + parent.scrollTop}px`,\r\n width: `${specRect.width}px`,\r\n height: `${specRect.height}px`,\r\n })\r\n }\r\n\r\n setUserSelect(value: string) {\r\n const props: string[] = [\r\n 'userSelect',\r\n 'mozUserSelect',\r\n 'webkitUserSelect',\r\n 'msUserSelect',\r\n ]\r\n\r\n props.forEach((prop: string) => {\r\n // set on contenteditable element and <html>\r\n this.quill.root.style.setProperty(prop, value)\r\n if (document.documentElement) {\r\n document.documentElement.style.setProperty(prop, value)\r\n }\r\n })\r\n }\r\n\r\n onClick = () => {\r\n this.hide()\r\n }\r\n\r\n hideImageOverlay = (event) => {\r\n const target = event.target\r\n const isBlotFormatter = target?.classList?.contains('blot-formatter__overlay')\r\n // 点击图片操作框之外应该将其销毁\r\n if (!isBlotFormatter) {\r\n this.hide()\r\n }\r\n document.body.removeEventListener('click', this.hideImageOverlay)\r\n }\r\n}\r\n"],"names":["deepmerge","ImageBlot","ImageContainerBlot"],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import ImageSpec from "./specs/ImageSpec.es.js";
|
|
2
|
+
const DefaultOptions = {
|
|
3
|
+
specs: [
|
|
4
|
+
ImageSpec
|
|
5
|
+
],
|
|
6
|
+
overlay: {
|
|
7
|
+
className: "blot-formatter__overlay",
|
|
8
|
+
style: {
|
|
9
|
+
position: "absolute",
|
|
10
|
+
boxSizing: "border-box",
|
|
11
|
+
border: "1px dashed #444"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
align: {
|
|
15
|
+
attribute: "data-align",
|
|
16
|
+
aligner: {
|
|
17
|
+
applyStyle: true
|
|
18
|
+
},
|
|
19
|
+
icons: {
|
|
20
|
+
left: `
|
|
21
|
+
<svg viewbox="0 0 18 18">
|
|
22
|
+
<line class="ql-stroke" x1="3" x2="15" y1="9" y2="9"></line>
|
|
23
|
+
<line class="ql-stroke" x1="3" x2="13" y1="14" y2="14"></line>
|
|
24
|
+
<line class="ql-stroke" x1="3" x2="9" y1="4" y2="4"></line>
|
|
25
|
+
</svg>
|
|
26
|
+
`,
|
|
27
|
+
center: `
|
|
28
|
+
<svg viewbox="0 0 18 18">
|
|
29
|
+
<line class="ql-stroke" x1="15" x2="3" y1="9" y2="9"></line>
|
|
30
|
+
<line class="ql-stroke" x1="14" x2="4" y1="14" y2="14"></line>
|
|
31
|
+
<line class="ql-stroke" x1="12" x2="6" y1="4" y2="4"></line>
|
|
32
|
+
</svg>
|
|
33
|
+
`,
|
|
34
|
+
right: `
|
|
35
|
+
<svg viewbox="0 0 18 18">
|
|
36
|
+
<line class="ql-stroke" x1="15" x2="3" y1="9" y2="9"></line>
|
|
37
|
+
<line class="ql-stroke" x1="15" x2="5" y1="14" y2="14"></line>
|
|
38
|
+
<line class="ql-stroke" x1="15" x2="9" y1="4" y2="4"></line>
|
|
39
|
+
</svg>
|
|
40
|
+
`
|
|
41
|
+
},
|
|
42
|
+
toolbar: {
|
|
43
|
+
allowDeselect: true,
|
|
44
|
+
mainClassName: "blot-formatter__toolbar",
|
|
45
|
+
mainStyle: {
|
|
46
|
+
position: "absolute",
|
|
47
|
+
top: "-12px",
|
|
48
|
+
right: "0",
|
|
49
|
+
left: "0",
|
|
50
|
+
height: "0",
|
|
51
|
+
minWidth: "100px",
|
|
52
|
+
font: "12px/1.0 Arial, Helvetica, sans-serif",
|
|
53
|
+
textAlign: "center",
|
|
54
|
+
color: "#333",
|
|
55
|
+
boxSizing: "border-box",
|
|
56
|
+
cursor: "default",
|
|
57
|
+
zIndex: "1"
|
|
58
|
+
},
|
|
59
|
+
buttonClassName: "blot-formatter__toolbar-button",
|
|
60
|
+
addButtonSelectStyle: true,
|
|
61
|
+
buttonStyle: {
|
|
62
|
+
display: "inline-block",
|
|
63
|
+
width: "24px",
|
|
64
|
+
height: "24px",
|
|
65
|
+
background: "white",
|
|
66
|
+
border: "1px solid #999",
|
|
67
|
+
verticalAlign: "middle"
|
|
68
|
+
},
|
|
69
|
+
svgStyle: {
|
|
70
|
+
display: "inline-block",
|
|
71
|
+
width: "24px",
|
|
72
|
+
height: "24px",
|
|
73
|
+
background: "white",
|
|
74
|
+
border: "1px solid #999",
|
|
75
|
+
verticalAlign: "middle"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
resize: {
|
|
80
|
+
handleClassName: "blot-formatter__resize-handle",
|
|
81
|
+
handleStyle: {
|
|
82
|
+
position: "absolute",
|
|
83
|
+
height: "12px",
|
|
84
|
+
width: "12px",
|
|
85
|
+
backgroundColor: "white",
|
|
86
|
+
border: "1px solid #777",
|
|
87
|
+
boxSizing: "border-box",
|
|
88
|
+
opacity: "0.80"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
export {
|
|
93
|
+
DefaultOptions as default
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=Options.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Options.es.js","sources":["../../../src/custom-image/Options.ts"],"sourcesContent":["import ImageSpec from './specs/ImageSpec'\r\n\r\nexport interface OverlayOptions {\r\n // classname applied to the overlay element\r\n className: string\r\n // style applied to overlay element, or null to prevent styles\r\n style: Record<string, string>\r\n}\r\n\r\nexport interface ResizeOptions {\r\n // class name applied to the resize handles\r\n handleClassName: string\r\n // style applied to resize handles, or null to prevent styles\r\n handleStyle: Record<string, string>\r\n}\r\n\r\nexport interface AlignOptions {\r\n // the name of the attribute for an element that has its alignment changed\r\n attribute: string\r\n // the aligner does the actual alignment switch\r\n aligner: {\r\n // whether or not the aligner should handle the actual alignment properties\r\n applyStyle: boolean\r\n }\r\n // icons used for alignment\r\n icons: {\r\n left: string\r\n center: string\r\n right: string\r\n }\r\n // the toolbar so users can change alignments\r\n toolbar: {\r\n // whether or not users can deselect an alignment. it's up to you to set the initial alignment\r\n allowDeselect: boolean\r\n // class name applied to the root toolbar element\r\n mainClassName: string\r\n // style applied to root toolbar element, or null to prevent styles\r\n mainStyle\r\n // class name applied to each button in the toolbar\r\n buttonClassName: string\r\n /* whether or not to add the selected style to the buttons.\r\n they'll always get the is-selected class */\r\n addButtonSelectStyle: boolean\r\n // style applied to buttons, or null to prevent styles\r\n buttonStyle\r\n // style applied to the svgs in the buttons\r\n svgStyle\r\n }\r\n}\r\n\r\nexport interface Options {\r\n // the BlotSpecs supported\r\n specs: any\r\n overlay: OverlayOptions\r\n align: AlignOptions\r\n resize: ResizeOptions\r\n}\r\n\r\nconst DefaultOptions: Options = {\r\n specs: [\r\n ImageSpec,\r\n ],\r\n overlay: {\r\n className: 'blot-formatter__overlay',\r\n style: {\r\n position: 'absolute',\r\n boxSizing: 'border-box',\r\n border: '1px dashed #444',\r\n },\r\n },\r\n align: {\r\n attribute: 'data-align',\r\n aligner: {\r\n applyStyle: true,\r\n },\r\n icons: {\r\n left: `\r\n <svg viewbox=\"0 0 18 18\">\r\n <line class=\"ql-stroke\" x1=\"3\" x2=\"15\" y1=\"9\" y2=\"9\"></line>\r\n <line class=\"ql-stroke\" x1=\"3\" x2=\"13\" y1=\"14\" y2=\"14\"></line>\r\n <line class=\"ql-stroke\" x1=\"3\" x2=\"9\" y1=\"4\" y2=\"4\"></line>\r\n </svg>\r\n `,\r\n center: `\r\n <svg viewbox=\"0 0 18 18\">\r\n <line class=\"ql-stroke\" x1=\"15\" x2=\"3\" y1=\"9\" y2=\"9\"></line>\r\n <line class=\"ql-stroke\" x1=\"14\" x2=\"4\" y1=\"14\" y2=\"14\"></line>\r\n <line class=\"ql-stroke\" x1=\"12\" x2=\"6\" y1=\"4\" y2=\"4\"></line>\r\n </svg>\r\n `,\r\n right: `\r\n <svg viewbox=\"0 0 18 18\">\r\n <line class=\"ql-stroke\" x1=\"15\" x2=\"3\" y1=\"9\" y2=\"9\"></line>\r\n <line class=\"ql-stroke\" x1=\"15\" x2=\"5\" y1=\"14\" y2=\"14\"></line>\r\n <line class=\"ql-stroke\" x1=\"15\" x2=\"9\" y1=\"4\" y2=\"4\"></line>\r\n </svg>\r\n `,\r\n },\r\n toolbar: {\r\n allowDeselect: true,\r\n mainClassName: 'blot-formatter__toolbar',\r\n mainStyle: {\r\n position: 'absolute',\r\n top: '-12px',\r\n right: '0',\r\n left: '0',\r\n height: '0',\r\n minWidth: '100px',\r\n font: '12px/1.0 Arial, Helvetica, sans-serif',\r\n textAlign: 'center',\r\n color: '#333',\r\n boxSizing: 'border-box',\r\n cursor: 'default',\r\n zIndex: '1',\r\n },\r\n buttonClassName: 'blot-formatter__toolbar-button',\r\n addButtonSelectStyle: true,\r\n buttonStyle: {\r\n display: 'inline-block',\r\n width: '24px',\r\n height: '24px',\r\n background: 'white',\r\n border: '1px solid #999',\r\n verticalAlign: 'middle',\r\n },\r\n svgStyle: {\r\n display: 'inline-block',\r\n width: '24px',\r\n height: '24px',\r\n background: 'white',\r\n border: '1px solid #999',\r\n verticalAlign: 'middle',\r\n },\r\n },\r\n },\r\n resize: {\r\n handleClassName: 'blot-formatter__resize-handle',\r\n handleStyle: {\r\n position: 'absolute',\r\n height: '12px',\r\n width: '12px',\r\n backgroundColor: 'white',\r\n border: '1px solid #777',\r\n boxSizing: 'border-box',\r\n opacity: '0.80',\r\n },\r\n },\r\n}\r\n\r\nexport default DefaultOptions\r\n"],"names":[],"mappings":";AA0DA,MAAM,iBAA0B;AAAA,EAC9B,OAAO;AAAA,IACL;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,OAAO;AAAA,MACL,UAAU;AAAA,MACV,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,SAAS;AAAA,MACP,YAAY;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAON,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOR,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOT;AAAA,IACA,SAAS;AAAA,MACP,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,QACT,UAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,QACX,OAAO;AAAA,QACP,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,aAAa;AAAA,QACX,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,eAAe;AAAA,MACjB;AAAA,MACA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,iBAAiB;AAAA,IACjB,aAAa;AAAA,MACX,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AAAA,EACF;AACF;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Action.es.js","sources":["../../../../src/custom-image/actions/Action.ts"],"sourcesContent":["export default class Action {\r\n formatter\r\n\r\n constructor(formatter) {\r\n this.formatter = formatter\r\n }\r\n\r\n onCreate() {}\r\n\r\n onDestroy() {}\r\n\r\n onUpdate() {}\r\n}\r\n"],"names":[],"mappings":"AAAA,MAAqB,OAAO;AAAA,EAG1B,YAAY,WAAW;AACrB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,WAAW;AAAA,EAAC;AAAA,EAEZ,YAAY;AAAA,EAAC;AAAA,EAEb,WAAW;AAAA,EAAC;AACd;"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import Action from "./Action.es.js";
|
|
2
|
+
const MIN_WIDTH = 40;
|
|
3
|
+
const getElementStyle = (element) => element.currentStyle ? element.currentStyle : window.getComputedStyle(element, null);
|
|
4
|
+
class CustomResizeAction extends Action {
|
|
5
|
+
constructor(formatter) {
|
|
6
|
+
super(formatter);
|
|
7
|
+
this.onMouseDown = (event) => {
|
|
8
|
+
if (!(event.target instanceof HTMLElement)) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
this.dragHandle = event.target;
|
|
12
|
+
this.setCursor(this.dragHandle.style.cursor);
|
|
13
|
+
if (!this.formatter.currentSpec) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const target = this.formatter.currentSpec.getTargetElement();
|
|
17
|
+
if (!target) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
const rect = target.getBoundingClientRect();
|
|
22
|
+
this.dragStartX = event.clientX;
|
|
23
|
+
this.preDragWidth = rect.width;
|
|
24
|
+
this.targetRatio = rect.height / rect.width;
|
|
25
|
+
let root;
|
|
26
|
+
let rootStyle;
|
|
27
|
+
const tdWrap = this.findTd(target, 0);
|
|
28
|
+
if (tdWrap) {
|
|
29
|
+
root = tdWrap;
|
|
30
|
+
rootStyle = getElementStyle(tdWrap);
|
|
31
|
+
} else {
|
|
32
|
+
root = this.formatter.quill.root;
|
|
33
|
+
rootStyle = getElementStyle(root);
|
|
34
|
+
}
|
|
35
|
+
this.maxWidth = root.clientWidth - parseFloat(rootStyle.paddingRight) - parseFloat(rootStyle.paddingLeft);
|
|
36
|
+
document.addEventListener("mousemove", this.onDrag);
|
|
37
|
+
document.addEventListener("mouseup", this.onMouseUp);
|
|
38
|
+
};
|
|
39
|
+
this.findTd = (node, level) => {
|
|
40
|
+
if (level > 3) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const tagName = node.tagName.toUpperCase();
|
|
44
|
+
if (tagName === "TD") {
|
|
45
|
+
return node;
|
|
46
|
+
} else {
|
|
47
|
+
const parentNode = node.parentElement;
|
|
48
|
+
if (parentNode) {
|
|
49
|
+
return this.findTd(parentNode, level += 1);
|
|
50
|
+
} else {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
this.onDrag = (event) => {
|
|
56
|
+
if (!this.formatter.currentSpec) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const target = this.formatter.currentSpec.getTargetElement();
|
|
60
|
+
if (!target) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const deltaX = event.clientX - this.dragStartX;
|
|
64
|
+
let newWidth = 0;
|
|
65
|
+
if (this.dragHandle === this.topLeftHandle || this.dragHandle === this.bottomLeftHandle) {
|
|
66
|
+
newWidth = Math.round(this.preDragWidth - deltaX);
|
|
67
|
+
} else {
|
|
68
|
+
newWidth = Math.round(this.preDragWidth + deltaX);
|
|
69
|
+
}
|
|
70
|
+
let minWidth = this.minWidth;
|
|
71
|
+
if (this.maxWidth < minWidth) {
|
|
72
|
+
minWidth = this.maxWidth;
|
|
73
|
+
}
|
|
74
|
+
if (newWidth > this.maxWidth) {
|
|
75
|
+
newWidth = this.maxWidth;
|
|
76
|
+
} else if (newWidth < minWidth) {
|
|
77
|
+
newWidth = minWidth;
|
|
78
|
+
}
|
|
79
|
+
const newHeight = this.targetRatio * newWidth;
|
|
80
|
+
target.setAttribute("width", `${newWidth}`);
|
|
81
|
+
target.setAttribute("height", `${newHeight}`);
|
|
82
|
+
this.formatter.update();
|
|
83
|
+
};
|
|
84
|
+
this.onMouseUp = () => {
|
|
85
|
+
this.setCursor("");
|
|
86
|
+
document.removeEventListener("mousemove", this.onDrag);
|
|
87
|
+
document.removeEventListener("mouseup", this.onMouseUp);
|
|
88
|
+
};
|
|
89
|
+
this.topLeftHandle = this.createHandle("top-left", "nwse-resize");
|
|
90
|
+
this.topRightHandle = this.createHandle("top-right", "nesw-resize");
|
|
91
|
+
this.bottomRightHandle = this.createHandle("bottom-right", "nwse-resize");
|
|
92
|
+
this.bottomLeftHandle = this.createHandle("bottom-left", "nesw-resize");
|
|
93
|
+
this.dragHandle = null;
|
|
94
|
+
this.dragStartX = 0;
|
|
95
|
+
this.preDragWidth = 0;
|
|
96
|
+
this.targetRatio = 0;
|
|
97
|
+
this.maxWidth = 0;
|
|
98
|
+
this.minWidth = MIN_WIDTH;
|
|
99
|
+
}
|
|
100
|
+
onCreate() {
|
|
101
|
+
const target = this.formatter.currentSpec.getTargetElement();
|
|
102
|
+
this.formatter.overlay.setAttribute("data-image", target.src);
|
|
103
|
+
this.formatter.overlay.appendChild(this.topLeftHandle);
|
|
104
|
+
this.formatter.overlay.appendChild(this.topRightHandle);
|
|
105
|
+
this.formatter.overlay.appendChild(this.bottomRightHandle);
|
|
106
|
+
this.formatter.overlay.appendChild(this.bottomLeftHandle);
|
|
107
|
+
this.repositionHandles(this.formatter.options.resize.handleStyle);
|
|
108
|
+
}
|
|
109
|
+
onDestroy() {
|
|
110
|
+
this.setCursor("");
|
|
111
|
+
this.formatter.overlay.removeChild(this.topLeftHandle);
|
|
112
|
+
this.formatter.overlay.removeChild(this.topRightHandle);
|
|
113
|
+
this.formatter.overlay.removeChild(this.bottomRightHandle);
|
|
114
|
+
this.formatter.overlay.removeChild(this.bottomLeftHandle);
|
|
115
|
+
}
|
|
116
|
+
createHandle(position, cursor) {
|
|
117
|
+
const box = document.createElement("div");
|
|
118
|
+
box.classList.add(this.formatter.options.resize.handleClassName);
|
|
119
|
+
box.setAttribute("data-position", position);
|
|
120
|
+
box.style.cursor = cursor;
|
|
121
|
+
if (this.formatter.options.resize.handleStyle) {
|
|
122
|
+
Object.assign(box.style, this.formatter.options.resize.handleStyle);
|
|
123
|
+
}
|
|
124
|
+
box.addEventListener("mousedown", this.onMouseDown);
|
|
125
|
+
return box;
|
|
126
|
+
}
|
|
127
|
+
repositionHandles(handleStyle) {
|
|
128
|
+
let handleXOffset = "0px";
|
|
129
|
+
let handleYOffset = "0px";
|
|
130
|
+
if (handleStyle) {
|
|
131
|
+
if (handleStyle.width) {
|
|
132
|
+
handleXOffset = `${-parseFloat(handleStyle.width) / 2}px`;
|
|
133
|
+
}
|
|
134
|
+
if (handleStyle.height) {
|
|
135
|
+
handleYOffset = `${-parseFloat(handleStyle.height) / 2}px`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
Object.assign(this.topLeftHandle.style, { left: handleXOffset, top: handleYOffset });
|
|
139
|
+
Object.assign(this.topRightHandle.style, { right: handleXOffset, top: handleYOffset });
|
|
140
|
+
Object.assign(this.bottomRightHandle.style, { right: handleXOffset, bottom: handleYOffset });
|
|
141
|
+
Object.assign(this.bottomLeftHandle.style, { left: handleXOffset, bottom: handleYOffset });
|
|
142
|
+
}
|
|
143
|
+
setCursor(value) {
|
|
144
|
+
if (document.body) {
|
|
145
|
+
document.body.style.cursor = value;
|
|
146
|
+
}
|
|
147
|
+
if (this.formatter.currentSpec) {
|
|
148
|
+
const target = this.formatter.currentSpec.getOverlayElement();
|
|
149
|
+
if (target) {
|
|
150
|
+
target.style.cursor = value;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export {
|
|
156
|
+
CustomResizeAction as default
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=CustomResizeAction.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomResizeAction.es.js","sources":["../../../../src/custom-image/actions/CustomResizeAction.ts"],"sourcesContent":["import Action from './Action'\r\nconst MIN_WIDTH = 40\r\n\r\nconst getElementStyle = element => element.currentStyle\r\n ? element.currentStyle\r\n : window.getComputedStyle(element, null)\r\nexport default class CustomResizeAction extends Action {\r\n topLeftHandle: HTMLElement\r\n topRightHandle: HTMLElement\r\n bottomRightHandle: HTMLElement\r\n bottomLeftHandle: HTMLElement\r\n dragHandle: HTMLElement\r\n dragStartX: number\r\n preDragWidth: number\r\n targetRatio: number\r\n maxWidth: number\r\n minWidth: number\r\n\r\n constructor(formatter) {\r\n super(formatter)\r\n this.topLeftHandle = this.createHandle('top-left', 'nwse-resize')\r\n this.topRightHandle = this.createHandle('top-right', 'nesw-resize')\r\n this.bottomRightHandle = this.createHandle('bottom-right', 'nwse-resize')\r\n this.bottomLeftHandle = this.createHandle('bottom-left', 'nesw-resize')\r\n this.dragHandle = null\r\n this.dragStartX = 0\r\n this.preDragWidth = 0\r\n this.targetRatio = 0\r\n this.maxWidth = 0\r\n this.minWidth = MIN_WIDTH\r\n }\r\n\r\n onCreate() {\r\n const target: any = this.formatter.currentSpec.getTargetElement()\r\n this.formatter.overlay.setAttribute('data-image', target.src)\r\n this.formatter.overlay.appendChild(this.topLeftHandle)\r\n this.formatter.overlay.appendChild(this.topRightHandle)\r\n this.formatter.overlay.appendChild(this.bottomRightHandle)\r\n this.formatter.overlay.appendChild(this.bottomLeftHandle)\r\n this.repositionHandles(this.formatter.options.resize.handleStyle)\r\n }\r\n\r\n onDestroy() {\r\n this.setCursor('')\r\n this.formatter.overlay.removeChild(this.topLeftHandle)\r\n this.formatter.overlay.removeChild(this.topRightHandle)\r\n this.formatter.overlay.removeChild(this.bottomRightHandle)\r\n this.formatter.overlay.removeChild(this.bottomLeftHandle)\r\n }\r\n\r\n createHandle(position: string, cursor: string): HTMLElement {\r\n const box = document.createElement('div')\r\n box.classList.add(this.formatter.options.resize.handleClassName)\r\n box.setAttribute('data-position', position)\r\n box.style.cursor = cursor\r\n\r\n if (this.formatter.options.resize.handleStyle) {\r\n Object.assign(box.style, this.formatter.options.resize.handleStyle)\r\n }\r\n\r\n box.addEventListener('mousedown', this.onMouseDown)\r\n return box\r\n }\r\n\r\n repositionHandles(handleStyle: any) {\r\n let handleXOffset = '0px'\r\n let handleYOffset = '0px'\r\n if (handleStyle) {\r\n if (handleStyle.width) {\r\n handleXOffset = `${-parseFloat(handleStyle.width) / 2}px`\r\n }\r\n if (handleStyle.height) {\r\n handleYOffset = `${-parseFloat(handleStyle.height) / 2}px`\r\n }\r\n }\r\n\r\n Object.assign(this.topLeftHandle.style, { left: handleXOffset, top: handleYOffset })\r\n Object.assign(this.topRightHandle.style, { right: handleXOffset, top: handleYOffset })\r\n Object.assign(this.bottomRightHandle.style, { right: handleXOffset, bottom: handleYOffset })\r\n Object.assign(this.bottomLeftHandle.style, { left: handleXOffset, bottom: handleYOffset })\r\n }\r\n\r\n setCursor(value: string) {\r\n if (document.body) {\r\n document.body.style.cursor = value\r\n }\r\n\r\n if (this.formatter.currentSpec) {\r\n const target = this.formatter.currentSpec.getOverlayElement()\r\n if (target) {\r\n target.style.cursor = value\r\n }\r\n }\r\n }\r\n\r\n onMouseDown = (event: MouseEvent) => {\r\n if (!(event.target instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n this.dragHandle = event.target\r\n this.setCursor(this.dragHandle.style.cursor)\r\n\r\n if (!this.formatter.currentSpec) {\r\n return\r\n }\r\n\r\n const target = this.formatter.currentSpec.getTargetElement()\r\n if (!target) {\r\n return\r\n }\r\n event.preventDefault()\r\n const rect = target.getBoundingClientRect()\r\n\r\n this.dragStartX = event.clientX\r\n this.preDragWidth = rect.width\r\n this.targetRatio = rect.height / rect.width\r\n\r\n let root: HTMLElement\r\n let rootStyle: any\r\n const tdWrap = this.findTd(target, 0)\r\n if (tdWrap) {\r\n root = tdWrap\r\n rootStyle = getElementStyle(tdWrap)\r\n }\r\n else {\r\n root = this.formatter.quill.root\r\n rootStyle = getElementStyle(root)\r\n }\r\n this.maxWidth = root.clientWidth\r\n - parseFloat(rootStyle.paddingRight)\r\n - parseFloat(rootStyle.paddingLeft)\r\n\r\n document.addEventListener('mousemove', this.onDrag)\r\n document.addEventListener('mouseup', this.onMouseUp)\r\n }\r\n\r\n findTd = (node: HTMLElement, level: number) => {\r\n if (level > 3) {\r\n return null\r\n }\r\n\r\n const tagName = node.tagName.toUpperCase()\r\n if (tagName === 'TD') {\r\n return node\r\n }\r\n else {\r\n const parentNode = node.parentElement\r\n if (parentNode) {\r\n // eslint-disable-next-line no-return-assign\r\n return (this.findTd(parentNode, level += 1))\r\n }\r\n else {\r\n return null\r\n }\r\n }\r\n }\r\n\r\n onDrag = (event: MouseEvent) => {\r\n if (!this.formatter.currentSpec) {\r\n return\r\n }\r\n\r\n const target = this.formatter.currentSpec.getTargetElement()\r\n if (!target) {\r\n return\r\n }\r\n\r\n const deltaX = event.clientX - this.dragStartX\r\n let newWidth = 0\r\n\r\n if (this.dragHandle === this.topLeftHandle || this.dragHandle === this.bottomLeftHandle) {\r\n newWidth = Math.round(this.preDragWidth - deltaX)\r\n }\r\n else {\r\n newWidth = Math.round(this.preDragWidth + deltaX)\r\n }\r\n\r\n let minWidth = this.minWidth\r\n\r\n if (this.maxWidth < minWidth) {\r\n minWidth = this.maxWidth\r\n }\r\n\r\n if (newWidth > this.maxWidth) {\r\n newWidth = this.maxWidth\r\n }\r\n else if (newWidth < minWidth) {\r\n newWidth = minWidth\r\n }\r\n\r\n const newHeight = this.targetRatio * newWidth\r\n\r\n target.setAttribute('width', `${newWidth}`)\r\n target.setAttribute('height', `${newHeight}`)\r\n\r\n this.formatter.update()\r\n }\r\n\r\n onMouseUp = () => {\r\n this.setCursor('')\r\n document.removeEventListener('mousemove', this.onDrag)\r\n document.removeEventListener('mouseup', this.onMouseUp)\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Quill from "quill";
|
|
2
|
+
import Action from "./Action.es.js";
|
|
3
|
+
class DeleteAction extends Action {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
this.onKeyUp = (event) => {
|
|
7
|
+
if (!this.formatter.currentSpec) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (event.keyCode === 46 || event.keyCode === 8) {
|
|
11
|
+
const blot = Quill.find(this.formatter.currentSpec.getTargetElement());
|
|
12
|
+
if (blot) {
|
|
13
|
+
blot.deleteAt(0);
|
|
14
|
+
}
|
|
15
|
+
this.formatter.hide();
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
onCreate() {
|
|
20
|
+
document.addEventListener("keyup", this.onKeyUp, true);
|
|
21
|
+
this.formatter.quill.root.addEventListener("input", this.onKeyUp, true);
|
|
22
|
+
}
|
|
23
|
+
onDestroy() {
|
|
24
|
+
document.removeEventListener("keyup", this.onKeyUp);
|
|
25
|
+
this.formatter.quill.root.removeEventListener("input", this.onKeyUp);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
DeleteAction as default
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=DeleteAction.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteAction.es.js","sources":["../../../../src/custom-image/actions/DeleteAction.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport Action from './Action'\r\n\r\nexport default class DeleteAction extends Action {\r\n onCreate() {\r\n document.addEventListener('keyup', this.onKeyUp, true)\r\n this.formatter.quill.root.addEventListener('input', this.onKeyUp, true)\r\n }\r\n\r\n onDestroy() {\r\n document.removeEventListener('keyup', this.onKeyUp)\r\n this.formatter.quill.root.removeEventListener('input', this.onKeyUp)\r\n }\r\n\r\n onKeyUp = (event: any) => {\r\n if (!this.formatter.currentSpec) {\r\n return\r\n }\r\n\r\n // delete or backspace\r\n if (event.keyCode === 46 || event.keyCode === 8) {\r\n const blot = Quill.find(this.formatter.currentSpec.getTargetElement())\r\n if (blot) {\r\n blot.deleteAt(0)\r\n }\r\n this.formatter.hide()\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAGA,MAAqB,qBAAqB,OAAO;AAAA,EAAjD,cAAA;AAAA,UAAA,GAAA,SAAA;AAWE,SAAA,UAAU,CAAC,UAAe;AACpB,UAAA,CAAC,KAAK,UAAU,aAAa;AAC/B;AAAA,MACF;AAGA,UAAI,MAAM,YAAY,MAAM,MAAM,YAAY,GAAG;AAC/C,cAAM,OAAO,MAAM,KAAK,KAAK,UAAU,YAAY,kBAAkB;AACrE,YAAI,MAAM;AACR,eAAK,SAAS,CAAC;AAAA,QACjB;AACA,aAAK,UAAU;MACjB;AAAA,IAAA;AAAA,EACF;AAAA,EAvBA,WAAW;AACT,aAAS,iBAAiB,SAAS,KAAK,SAAS,IAAI;AACrD,SAAK,UAAU,MAAM,KAAK,iBAAiB,SAAS,KAAK,SAAS,IAAI;AAAA,EACxE;AAAA,EAEA,YAAY;AACD,aAAA,oBAAoB,SAAS,KAAK,OAAO;AAClD,SAAK,UAAU,MAAM,KAAK,oBAAoB,SAAS,KAAK,OAAO;AAAA,EACrE;AAgBF;"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import Quill from "quill";
|
|
2
|
+
import { sanitize, isNullOrUndefined } from "../config/editor.utils.es.js";
|
|
3
|
+
const Embed = Quill.imports["blots/embed"];
|
|
4
|
+
const Inline = Quill.imports["blots/inline"];
|
|
5
|
+
const ATTRIBUTES = ["alt", "height", "width", "image-id"];
|
|
6
|
+
const _CustomImage = class _CustomImage extends Embed {
|
|
7
|
+
static create(value) {
|
|
8
|
+
const node = super.create(value);
|
|
9
|
+
const url = typeof value === "string" ? value : value.src;
|
|
10
|
+
if (url) {
|
|
11
|
+
const imgURL = this.sanitize(url);
|
|
12
|
+
if (!(imgURL == null ? void 0 : imgURL.startsWith("data:image"))) {
|
|
13
|
+
node.dataset.src = imgURL;
|
|
14
|
+
}
|
|
15
|
+
node.setAttribute("src", imgURL);
|
|
16
|
+
}
|
|
17
|
+
node.setAttribute("data-image-id", "img" + _CustomImage.ID_SEED++);
|
|
18
|
+
node.setAttribute("devui-editorx-image", true);
|
|
19
|
+
node.style.verticalAlign = "baseline";
|
|
20
|
+
return node;
|
|
21
|
+
}
|
|
22
|
+
static formats(domNode) {
|
|
23
|
+
return ATTRIBUTES.reduce((formats, attribute) => {
|
|
24
|
+
if (domNode.hasAttribute(attribute)) {
|
|
25
|
+
formats[attribute] = domNode.getAttribute(attribute);
|
|
26
|
+
}
|
|
27
|
+
return formats;
|
|
28
|
+
}, {});
|
|
29
|
+
}
|
|
30
|
+
static match(url) {
|
|
31
|
+
return /\.(jpe?g|gif|png)$/.test(url) || /^data:image\/.+;base64/.test(url);
|
|
32
|
+
}
|
|
33
|
+
static register() {
|
|
34
|
+
if (/Firefox/i.test(navigator.userAgent)) {
|
|
35
|
+
setTimeout(() => {
|
|
36
|
+
document.execCommand("enableObjectResizing", false, null);
|
|
37
|
+
}, 1);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
static sanitize(url) {
|
|
41
|
+
return sanitize(url, ["http", "https", "data"]) ? url : "//:0";
|
|
42
|
+
}
|
|
43
|
+
static value(domNode) {
|
|
44
|
+
const formats = {};
|
|
45
|
+
const imageSrc = domNode.getAttribute("src");
|
|
46
|
+
formats.src = this.sanitize(imageSrc);
|
|
47
|
+
formats.hasExisted = domNode.getAttribute("devui-editorx-image");
|
|
48
|
+
formats.imageId = domNode.dataset.imageId;
|
|
49
|
+
return formats;
|
|
50
|
+
}
|
|
51
|
+
format(name, value) {
|
|
52
|
+
if (ATTRIBUTES.indexOf(name) > -1) {
|
|
53
|
+
if (value) {
|
|
54
|
+
this.domNode.setAttribute(name, value);
|
|
55
|
+
} else {
|
|
56
|
+
this.domNode.removeAttribute(name);
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
super.format(name, value);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
unWrap() {
|
|
63
|
+
this.parent.replaceWith(this);
|
|
64
|
+
}
|
|
65
|
+
wrap(name, value) {
|
|
66
|
+
const wrapper = typeof name === "string" ? this.scroll.create(name, value) : name;
|
|
67
|
+
if (!isNullOrUndefined(this.parent)) {
|
|
68
|
+
this.parent.insertBefore(wrapper, this.next || void 0);
|
|
69
|
+
}
|
|
70
|
+
if (typeof wrapper.appendChild !== "function") {
|
|
71
|
+
throw new Error(`Cannot wrap ${name}`);
|
|
72
|
+
}
|
|
73
|
+
wrapper.appendChild(this);
|
|
74
|
+
return wrapper;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
_CustomImage.ID_SEED = 0;
|
|
78
|
+
let CustomImage = _CustomImage;
|
|
79
|
+
CustomImage.blotName = "image";
|
|
80
|
+
CustomImage.tagName = "IMG";
|
|
81
|
+
class CustomImageContainer extends Inline {
|
|
82
|
+
constructor(scroll, domNode) {
|
|
83
|
+
super(scroll, domNode);
|
|
84
|
+
domNode.setAttribute("contenteditable", false);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
CustomImageContainer.blotName = "image-container";
|
|
88
|
+
CustomImageContainer.className = "ql-image-container";
|
|
89
|
+
CustomImageContainer.tagName = "DIV";
|
|
90
|
+
CustomImageContainer.allowedChildren = [CustomImage];
|
|
91
|
+
export {
|
|
92
|
+
CustomImageContainer as ImageContainerBlot,
|
|
93
|
+
CustomImage as default
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=image.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.es.js","sources":["../../../src/custom-image/image.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { isNullOrUndefined, sanitize } from '../config/editor.utils'\r\nconst Embed = Quill.imports['blots/embed']\r\nconst Inline = Quill.imports['blots/inline']\r\n\r\nconst ATTRIBUTES = ['alt', 'height', 'width', 'image-id']\r\n\r\n// @dynamic\r\nclass CustomImage extends Embed {\r\n static ID_SEED = 0\r\n static blotName: string\r\n static tagName: string\r\n domNode: any\r\n parent: any\r\n scroll: any\r\n next: any\r\n static create(value) {\r\n const node = super.create(value)\r\n const url = typeof value === 'string' ? value : value.src\r\n if (url) {\r\n const imgURL = this.sanitize(url)\r\n if (!imgURL?.startsWith('data:image')) {\r\n node.dataset.src = imgURL\r\n }\r\n node.setAttribute('src', imgURL)\r\n }\r\n node.setAttribute('data-image-id', 'img' + CustomImage.ID_SEED++)\r\n node.setAttribute('devui-editorx-image', true)\r\n node.style.verticalAlign = 'baseline'\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n return ATTRIBUTES.reduce((formats, attribute) => {\r\n if (domNode.hasAttribute(attribute)) {\r\n formats[attribute] = domNode.getAttribute(attribute)\r\n }\r\n return formats\r\n }, {})\r\n }\r\n\r\n static match(url) {\r\n return /\\.(jpe?g|gif|png)$/.test(url) || /^data:image\\/.+;base64/.test(url)\r\n }\r\n\r\n static register() {\r\n if (/Firefox/i.test(navigator.userAgent)) {\r\n setTimeout(() => {\r\n // Disable image resizing in Firefox\r\n document.execCommand('enableObjectResizing', false, null)\r\n }, 1)\r\n }\r\n }\r\n\r\n static sanitize(url) {\r\n return sanitize(url, ['http', 'https', 'data']) ? url : '//:0'\r\n }\r\n\r\n static value(domNode) {\r\n const formats: any = {}\r\n const imageSrc = domNode.getAttribute('src')\r\n formats.src = this.sanitize(imageSrc)\r\n formats.hasExisted = domNode.getAttribute('devui-editorx-image')\r\n formats.imageId = domNode.dataset.imageId\r\n return formats\r\n }\r\n\r\n format(name, value) {\r\n if (ATTRIBUTES.indexOf(name) > -1) {\r\n if (value) {\r\n this.domNode.setAttribute(name, value)\r\n }\r\n else {\r\n this.domNode.removeAttribute(name)\r\n }\r\n }\r\n else {\r\n super.format(name, value)\r\n }\r\n }\r\n\r\n unWrap() {\r\n this.parent.replaceWith(this)\r\n }\r\n\r\n wrap(name, value) {\r\n const wrapper = typeof name === 'string' ? this.scroll.create(name, value) : name\r\n if (!isNullOrUndefined(this.parent)) {\r\n this.parent.insertBefore(wrapper, this.next || undefined)\r\n }\r\n if (typeof wrapper.appendChild !== 'function') {\r\n throw new Error(`Cannot wrap ${name}`)\r\n }\r\n wrapper.appendChild(this)\r\n return wrapper\r\n }\r\n}\r\nCustomImage.blotName = 'image'\r\nCustomImage.tagName = 'IMG'\r\n\r\n// @dynamic\r\nclass CustomImageContainer extends Inline {\r\n static tagName: string\r\n static className: string\r\n static blotName: string\r\n static allowedChildren: typeof CustomImage[]\r\n constructor(scroll, domNode) {\r\n super(scroll, domNode)\r\n domNode.setAttribute('contenteditable', false)\r\n }\r\n}\r\nCustomImageContainer.blotName = 'image-container'\r\nCustomImageContainer.className = 'ql-image-container'\r\nCustomImageContainer.tagName = 'DIV'\r\n\r\nCustomImageContainer.allowedChildren = [CustomImage]\r\nexport { CustomImageContainer as ImageContainerBlot, CustomImage as default }\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import CustomResizeAction from "../actions/CustomResizeAction.es.js";
|
|
2
|
+
import DeleteAction from "../actions/DeleteAction.es.js";
|
|
3
|
+
class BlotSpec {
|
|
4
|
+
constructor(formatter) {
|
|
5
|
+
this.formatter = formatter;
|
|
6
|
+
}
|
|
7
|
+
init() {
|
|
8
|
+
}
|
|
9
|
+
getActions() {
|
|
10
|
+
return [CustomResizeAction, DeleteAction];
|
|
11
|
+
}
|
|
12
|
+
getTargetElement() {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
getOverlayElement() {
|
|
16
|
+
return this.getTargetElement();
|
|
17
|
+
}
|
|
18
|
+
setSelection() {
|
|
19
|
+
this.formatter.quill.setSelection(null);
|
|
20
|
+
}
|
|
21
|
+
onHide() {
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
BlotSpec as default
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=BlotSpec.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlotSpec.es.js","sources":["../../../../src/custom-image/specs/BlotSpec.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-empty-function */\r\n\r\nimport ResizeAction from '../actions/CustomResizeAction'\r\nimport DeleteAction from '../actions/DeleteAction'\r\n\r\nexport default class BlotSpec {\r\n formatter\r\n\r\n constructor(formatter) {\r\n this.formatter = formatter\r\n }\r\n\r\n init(): void {}\r\n\r\n getActions() {\r\n return [ResizeAction, DeleteAction]\r\n }\r\n\r\n getTargetElement() {\r\n return null\r\n }\r\n\r\n getOverlayElement() {\r\n return this.getTargetElement()\r\n }\r\n\r\n setSelection(): void {\r\n this.formatter.quill.setSelection(null)\r\n }\r\n\r\n onHide() {}\r\n}\r\n"],"names":["ResizeAction"],"mappings":";;AAKA,MAAqB,SAAS;AAAA,EAG5B,YAAY,WAAW;AACrB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,OAAa;AAAA,EAAC;AAAA,EAEd,aAAa;AACJ,WAAA,CAACA,oBAAc,YAAY;AAAA,EACpC;AAAA,EAEA,mBAAmB;AACV,WAAA;AAAA,EACT;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK;EACd;AAAA,EAEA,eAAqB;AACd,SAAA,UAAU,MAAM,aAAa,IAAI;AAAA,EACxC;AAAA,EAEA,SAAS;AAAA,EAAC;AACZ;"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { isInside } from "../../config/editor.utils.es.js";
|
|
2
|
+
import CustomResizeAction from "../actions/CustomResizeAction.es.js";
|
|
3
|
+
import DeleteAction from "../actions/DeleteAction.es.js";
|
|
4
|
+
import ImageSpec from "./ImageSpec.es.js";
|
|
5
|
+
class CustomImageSpec extends ImageSpec {
|
|
6
|
+
constructor(formatter) {
|
|
7
|
+
super(formatter);
|
|
8
|
+
this.imageMouseout = (event) => {
|
|
9
|
+
if (event.target.nodeName === "IMG" || event.target.classList.contains("blot-formatter__overlay")) {
|
|
10
|
+
const imgDom = event.target;
|
|
11
|
+
if (!isInside(event, imgDom)) {
|
|
12
|
+
this.removeImagePreviewOverlay();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
this.onClick = (event) => {
|
|
17
|
+
var _a;
|
|
18
|
+
const el = event.target;
|
|
19
|
+
const isReadonly = this.formatter.quill.options.readOnly;
|
|
20
|
+
if (!(el instanceof HTMLElement) || el.tagName !== "IMG" || isReadonly) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
this.img = el;
|
|
24
|
+
this.oldRootScrollTop = this.formatter.quill.root.scrollTop;
|
|
25
|
+
this.resetOverlayMarginTop();
|
|
26
|
+
this.formatter.show(this);
|
|
27
|
+
const imageDom = (_a = this.formatter.currentSpec) == null ? void 0 : _a.getTargetElement();
|
|
28
|
+
if (imageDom) {
|
|
29
|
+
imageDom.classList.add("current-select-img");
|
|
30
|
+
const quill = this.formatter.quill;
|
|
31
|
+
const imgBlot = quill.scroll.find(this.img);
|
|
32
|
+
const index = quill.getIndex(imgBlot);
|
|
33
|
+
const len = imgBlot.length();
|
|
34
|
+
quill.setSelection(index, len);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
this.formatter = formatter;
|
|
38
|
+
this.oldRootScrollTop = this.formatter.quill.root.scrollTop;
|
|
39
|
+
this.editorElem = this.formatter.quill.container;
|
|
40
|
+
if (this.formatter.quill.root === this.formatter.quill.scrollingContainer) {
|
|
41
|
+
this.formatter.quill.root.addEventListener("scroll", this.handleQuillRootScroll.bind(this));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
handleQuillRootScroll() {
|
|
45
|
+
if (this.formatter.overlay) {
|
|
46
|
+
this.formatter.overlay.style.marginTop = `${this.oldRootScrollTop - this.formatter.quill.root.scrollTop}px`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
init() {
|
|
50
|
+
this.editorElem.addEventListener("mouseover", this.imageMouseOver.bind(this));
|
|
51
|
+
this.editorElem.addEventListener("mouseout", this.imageMouseout);
|
|
52
|
+
super.init();
|
|
53
|
+
}
|
|
54
|
+
getActions() {
|
|
55
|
+
return [DeleteAction, CustomResizeAction];
|
|
56
|
+
}
|
|
57
|
+
imageMouseOver(event) {
|
|
58
|
+
var _a;
|
|
59
|
+
const target = event.target;
|
|
60
|
+
const isBlotFormatter = (_a = target == null ? void 0 : target.classList) == null ? void 0 : _a.contains("blot-formatter__overlay");
|
|
61
|
+
if (target.nodeName === "IMG" || isBlotFormatter) {
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
addImagePreviewOverlay(event) {
|
|
65
|
+
const target = event.target;
|
|
66
|
+
const {
|
|
67
|
+
left: imgLeft,
|
|
68
|
+
width: imgWidth
|
|
69
|
+
} = target.getBoundingClientRect();
|
|
70
|
+
const imgTop = target.getBoundingClientRect().top + this.formatter.quill.container.scrollTop;
|
|
71
|
+
const {
|
|
72
|
+
left: editorLeft,
|
|
73
|
+
top: editorTop
|
|
74
|
+
} = event.currentTarget.getBoundingClientRect();
|
|
75
|
+
const imgRelativeLeft = imgLeft - editorLeft;
|
|
76
|
+
const imgRelativeTop = imgTop - editorTop;
|
|
77
|
+
const maxmizeWidth = 24;
|
|
78
|
+
const maxmizePadding = 15;
|
|
79
|
+
const previewLeft = imgRelativeLeft + imgWidth - maxmizeWidth - maxmizePadding;
|
|
80
|
+
const previewTop = imgRelativeTop + maxmizePadding;
|
|
81
|
+
const previewStyle = `
|
|
82
|
+
left: ${previewLeft}px;
|
|
83
|
+
top: ${previewTop}px;
|
|
84
|
+
width: ${maxmizeWidth}px;
|
|
85
|
+
`;
|
|
86
|
+
const imageSrc = target.src || target.getAttribute("data-image");
|
|
87
|
+
const imageId = target.getAttribute("data-image-id");
|
|
88
|
+
const previewDom = event.currentTarget.querySelector(".image-preview__overlay");
|
|
89
|
+
if (!previewDom) {
|
|
90
|
+
event.currentTarget.insertAdjacentHTML("beforeend", `
|
|
91
|
+
<div class="image-preview__overlay" style="${previewStyle}">
|
|
92
|
+
<i class="icon-maxmize" id="btn-image-preview" data-image-id="${imageId}"
|
|
93
|
+
data-image="${imageSrc}"></i>
|
|
94
|
+
</div>
|
|
95
|
+
`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
removeImagePreviewOverlay() {
|
|
99
|
+
const previewDom = this.editorElem.querySelector(".image-preview__overlay");
|
|
100
|
+
if (previewDom) {
|
|
101
|
+
previewDom.parentNode.removeChild(previewDom);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
onHide() {
|
|
105
|
+
this.removeImagePreviewOverlay();
|
|
106
|
+
super.onHide();
|
|
107
|
+
}
|
|
108
|
+
resetOverlayMarginTop() {
|
|
109
|
+
if (this.formatter.overlay) {
|
|
110
|
+
this.formatter.overlay.style.marginTop = "0px";
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export {
|
|
115
|
+
CustomImageSpec
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=CustomImageSpec.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomImageSpec.es.js","sources":["../../../../src/custom-image/specs/CustomImageSpec.ts"],"sourcesContent":["import { isInside } from '../../config/editor.utils'\r\nimport CustomResizeAction from '../actions/CustomResizeAction'\r\nimport DeleteAction from '../actions/DeleteAction'\r\nimport ImageSpec from './ImageSpec'\r\n\r\nexport class CustomImageSpec extends ImageSpec {\r\n formatter\r\n editorElem: HTMLElement | undefined\r\n observer: any\r\n oldRootScrollTop: any\r\n\r\n constructor(formatter) {\r\n super(formatter)\r\n this.formatter = formatter\r\n this.oldRootScrollTop = this.formatter.quill.root.scrollTop\r\n this.editorElem = this.formatter.quill.container\r\n if (this.formatter.quill.root === this.formatter.quill.scrollingContainer) {\r\n this.formatter.quill.root.addEventListener('scroll', this.handleQuillRootScroll.bind(this))\r\n }\r\n }\r\n\r\n handleQuillRootScroll() {\r\n if (this.formatter.overlay) {\r\n this.formatter.overlay.style.marginTop = `${this.oldRootScrollTop - this.formatter.quill.root.scrollTop}px`\r\n }\r\n }\r\n\r\n init(): void {\r\n this.editorElem.addEventListener('mouseover', this.imageMouseOver.bind(this))\r\n this.editorElem.addEventListener('mouseout', this.imageMouseout)\r\n\r\n super.init()\r\n }\r\n\r\n getActions() {\r\n return [DeleteAction, CustomResizeAction]\r\n }\r\n\r\n imageMouseOver(event) {\r\n const target = event.target\r\n const isBlotFormatter = target?.classList?.contains('blot-formatter__overlay')\r\n if (target.nodeName === 'IMG' || isBlotFormatter) {\r\n // this.addImagePreviewOverlay(event);\r\n }\r\n }\r\n\r\n imageMouseout = (event) => {\r\n if (event.target.nodeName === 'IMG'\r\n || event.target.classList.contains('blot-formatter__overlay')) {\r\n const imgDom = event.target\r\n if (!isInside(event, imgDom)) {\r\n this.removeImagePreviewOverlay()\r\n }\r\n }\r\n }\r\n\r\n addImagePreviewOverlay(event) {\r\n const target = event.target\r\n const {\r\n left: imgLeft,\r\n width: imgWidth,\r\n } = target.getBoundingClientRect()\r\n // fix: 解决 ql-container 容器设置 calc(100vh - 180px) 这样的视窗相对单位时,滚动视窗导致图片相对视窗的 top 相应改变,从而导致图片预览按钮的位置显示错误\r\n const imgTop = target.getBoundingClientRect().top + this.formatter.quill.container.scrollTop\r\n\r\n const {\r\n left: editorLeft,\r\n top: editorTop,\r\n } = event.currentTarget.getBoundingClientRect()\r\n\r\n const imgRelativeLeft = imgLeft - editorLeft\r\n const imgRelativeTop = imgTop - editorTop\r\n\r\n const maxmizeWidth = 24\r\n const maxmizePadding = 15\r\n const previewLeft = imgRelativeLeft + imgWidth - maxmizeWidth - maxmizePadding\r\n const previewTop = imgRelativeTop + maxmizePadding\r\n\r\n const previewStyle = `\r\n left: ${previewLeft}px;\r\n top: ${previewTop}px;\r\n width: ${maxmizeWidth}px;\r\n `\r\n const imageSrc = target.src || target.getAttribute('data-image')\r\n const imageId = target.getAttribute('data-image-id')\r\n\r\n const previewDom = event.currentTarget.querySelector('.image-preview__overlay')\r\n if (!previewDom) {\r\n event.currentTarget.insertAdjacentHTML('beforeend', `\r\n <div class=\"image-preview__overlay\" style=\"${previewStyle}\">\r\n <i class=\"icon-maxmize\" id=\"btn-image-preview\" data-image-id=\"${imageId}\"\r\n data-image=\"${imageSrc}\"></i>\r\n </div>\r\n `)\r\n }\r\n }\r\n\r\n removeImagePreviewOverlay() {\r\n const previewDom = this.editorElem.querySelector('.image-preview__overlay')\r\n if (previewDom) {\r\n previewDom.parentNode.removeChild(previewDom)\r\n }\r\n }\r\n\r\n onHide() {\r\n this.removeImagePreviewOverlay()\r\n super.onHide()\r\n }\r\n\r\n resetOverlayMarginTop() {\r\n if (this.formatter.overlay) {\r\n this.formatter.overlay.style.marginTop = '0px'\r\n }\r\n }\r\n\r\n onClick = (event: MouseEvent) => {\r\n const el = event.target\r\n const isReadonly = this.formatter.quill.options.readOnly\r\n if (!(el instanceof HTMLElement) || el.tagName !== 'IMG' || isReadonly) {\r\n return\r\n }\r\n\r\n this.img = el\r\n this.oldRootScrollTop = this.formatter.quill.root.scrollTop\r\n this.resetOverlayMarginTop()\r\n this.formatter.show(this)\r\n\r\n // 通过图片dom获取图片选区用以复制,设置 current-select-img::selection 取消选区背景\r\n const imageDom = this.formatter.currentSpec?.getTargetElement()\r\n if (imageDom) {\r\n imageDom.classList.add('current-select-img')\r\n const quill = this.formatter.quill\r\n const imgBlot = quill.scroll.find(this.img)\r\n const index = quill.getIndex(imgBlot)\r\n const len = imgBlot.length()\r\n quill.setSelection(index, len)\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|