@aquera/nile-elements 1.9.5 → 1.9.7
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 +9 -0
- package/dist/index-178e1e57.cjs.js +2 -0
- package/dist/index-178e1e57.cjs.js.map +1 -0
- package/dist/index-1faa963c.esm.js +1 -0
- package/dist/index-249de90a.esm.js +1 -0
- package/dist/index-353172ed.esm.js +1 -0
- package/dist/index-6f3fa4ab.esm.js +1 -0
- package/dist/index-89c520e9.cjs.js +5 -0
- package/dist/index-89c520e9.cjs.js.map +1 -0
- package/dist/index-920675c4.esm.js +1 -0
- package/dist/index-b387a9f4.cjs.js +2 -0
- package/dist/index-b387a9f4.cjs.js.map +1 -0
- package/dist/index-cc1385e0.cjs.js +2 -0
- package/dist/index-cc1385e0.cjs.js.map +1 -0
- package/dist/index-dedc38a6.esm.js +1 -0
- package/dist/index-df196058.cjs.js +2 -0
- package/dist/index-df196058.cjs.js.map +1 -0
- package/dist/index-f956f56d.cjs.js +7 -0
- package/dist/index-f956f56d.cjs.js.map +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +3802 -664
- package/dist/internal/glyph.cjs.js +2 -0
- package/dist/internal/glyph.cjs.js.map +1 -0
- package/dist/internal/glyph.esm.js +5 -0
- package/dist/nile-auto-complete/index.cjs.js +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.cjs.js +1 -1
- package/dist/nile-auto-complete/portal-manager.cjs.js +1 -1
- package/dist/nile-auto-complete/portal-utils.cjs.js +1 -1
- package/dist/nile-chip/nile-chip.css.cjs.js +1 -1
- package/dist/nile-chip/nile-chip.css.cjs.js.map +1 -1
- package/dist/nile-chip/nile-chip.css.esm.js +8 -1
- package/dist/nile-code-editor/extensionSetup.cjs.js +7 -7
- package/dist/nile-code-editor/extensionSetup.cjs.js.map +1 -1
- package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
- package/dist/nile-code-editor/index.cjs.js +1 -1
- package/dist/nile-code-editor/index.esm.js +1 -1
- package/dist/nile-code-editor/nile-code-editor.cjs.js +2 -2
- package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
- package/dist/nile-code-editor/nile-code-editor.esm.js +4 -4
- package/dist/nile-color-picker/index.cjs.js +1 -1
- package/dist/nile-color-picker/nile-color-picker.cjs.js +1 -1
- package/dist/nile-combobox/index.cjs.js +1 -1
- package/dist/nile-combobox/index.esm.js +1 -1
- package/dist/nile-combobox/nile-combobox.cjs.js +1 -1
- package/dist/nile-combobox/nile-combobox.esm.js +1 -1
- package/dist/nile-combobox/portal-manager.cjs.js +1 -1
- package/dist/nile-context-menu/index.cjs.js +1 -1
- package/dist/nile-context-menu/nile-context-menu.cjs.js +1 -1
- package/dist/nile-context-submenu/index.cjs.js +1 -1
- package/dist/nile-context-submenu/nile-context-submenu.cjs.js +1 -1
- package/dist/nile-detail/index.cjs.js +1 -1
- package/dist/nile-detail/index.esm.js +1 -1
- package/dist/nile-detail/nile-detail.cjs.js +1 -1
- package/dist/nile-detail/nile-detail.esm.js +1 -1
- package/dist/nile-dropdown/index.cjs.js +1 -1
- package/dist/nile-dropdown/nile-dropdown.cjs.js +1 -1
- package/dist/nile-dropdown/portal-manager.cjs.js +1 -1
- package/dist/nile-file-upload/index.cjs.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.cjs.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.template.cjs.js +1 -1
- package/dist/nile-floating-panel/index.cjs.js +1 -1
- package/dist/nile-floating-panel/nile-floating-panel.cjs.js +1 -1
- package/dist/nile-hero/nile-hero.cjs.js +1 -1
- package/dist/nile-hero/nile-hero.cjs.js.map +1 -1
- package/dist/nile-hero/nile-hero.css.cjs.js +1 -1
- package/dist/nile-hero/nile-hero.css.cjs.js.map +1 -1
- package/dist/nile-hero/nile-hero.css.esm.js +14 -14
- package/dist/nile-hero/nile-hero.esm.js +1 -1
- package/dist/nile-hero-header/nile-hero-header.cjs.js +1 -1
- package/dist/nile-hero-header/nile-hero-header.cjs.js.map +1 -1
- package/dist/nile-hero-header/nile-hero-header.css.cjs.js +1 -1
- package/dist/nile-hero-header/nile-hero-header.css.cjs.js.map +1 -1
- package/dist/nile-hero-header/nile-hero-header.css.esm.js +11 -11
- package/dist/nile-hero-header/nile-hero-header.esm.js +3 -3
- package/dist/nile-lite-tooltip/index.cjs.js +1 -1
- package/dist/nile-lite-tooltip/nile-lite-tooltip.cjs.js +1 -1
- package/dist/nile-markdown-editor/index.cjs.js +1 -1
- package/dist/nile-markdown-editor/nile-markdown-editor.cjs.js +1 -1
- package/dist/nile-popover/index.cjs.js +1 -1
- package/dist/nile-popover/nile-popover.cjs.js +1 -1
- package/dist/nile-popover/portal-manager.cjs.js +1 -1
- package/dist/nile-popup/index.cjs.js +1 -1
- package/dist/nile-popup/nile-popup.cjs.js +1 -1
- package/dist/nile-rich-text-editor/index.cjs.js +1 -1
- package/dist/nile-rich-text-editor/index.esm.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.esm.js +70 -0
- package/dist/nile-rich-text-editor/nile-rich-text-editor.esm.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-image.cjs.js +3 -0
- package/dist/nile-rich-text-editor/nile-rte-image.cjs.js.map +1 -0
- package/dist/nile-rich-text-editor/nile-rte-image.esm.js +96 -0
- package/dist/nile-select/index.cjs.js +1 -1
- package/dist/nile-select/nile-select.cjs.js +1 -1
- package/dist/nile-select/portal-manager.cjs.js +1 -1
- package/dist/nile-side-bar-action/index.cjs.js +1 -1
- package/dist/nile-side-bar-action/nile-side-bar-action.cjs.js +1 -1
- package/dist/nile-side-bar-action/portal-manager.cjs.js +1 -1
- package/dist/nile-tooltip/index.cjs.js +1 -1
- package/dist/nile-tooltip/nile-tooltip.cjs.js +1 -1
- package/dist/nile-virtual-select/index.cjs.js +1 -1
- package/dist/nile-virtual-select/nile-virtual-select.cjs.js +1 -1
- package/dist/nile-virtual-select/portal-manager.cjs.js +1 -1
- package/dist/nile-virtual-select/renderer.cjs.js +1 -1
- package/dist/nile-wysiwyg-editor/emoji.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/emoji.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/emoji.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/commands.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/commands.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/commands.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/create-state.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/export.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/export.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/export.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/index.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/index.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/index.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/inputrules.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/inputrules.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/inputrules.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/keymap.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/keymap.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/keymap.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/markdown-parse.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/markdown-parse.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/markdown-parse.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/markdown.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/markdown.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/markdown.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/office-paste.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/office-paste.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/office-paste.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/embeds.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/image-view.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/image-view.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/image-view.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/image.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/image.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/image.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/link.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/link.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/link.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/math-view.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/math-view.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/math-view.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/max-length.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/max-length.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/max-length.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/paste.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/paste.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/paste.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/single-line.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/single-line.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/single-line.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/tables.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/task-list.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/task-list.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/plugins/task-list.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/sanitize.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/schema.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/schema.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/schema.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/selection-state.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/engine/serializer.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/engine/serializer.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/engine/serializer.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/index.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/index.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/index.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.esm.js +780 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.esm.js +97 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.esm.js +244 -0
- package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.esm.js +137 -0
- package/dist/nile-wysiwyg-editor/types.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/types.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/types.esm.js +1 -0
- package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/bookmark-panel.esm.js +97 -0
- package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/bubble-menu.esm.js +67 -0
- package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/code-block-menu.esm.js +65 -0
- package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/embed-menu.esm.js +64 -0
- package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/embed-panel.esm.js +68 -0
- package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/emoji-picker.esm.js +96 -0
- package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/find-replace.esm.js +112 -0
- package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/image-menu.esm.js +64 -0
- package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/image-panel.esm.js +171 -0
- package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/insert-menu.esm.js +90 -0
- package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/link-editor.esm.js +114 -0
- package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/markdown-panel.esm.js +80 -0
- package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/math-panel.esm.js +92 -0
- package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/shortcut-help.esm.js +147 -0
- package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/source-view.esm.js +79 -0
- package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/special-chars.esm.js +96 -0
- package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/suggest-list.esm.js +67 -0
- package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/table-grid-picker.esm.js +100 -0
- package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js +2 -0
- package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js.map +1 -0
- package/dist/nile-wysiwyg-editor/ui/table-menu.esm.js +58 -0
- package/dist/src/index.d.ts +24 -0
- package/dist/src/index.js +19 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/internal/glyph.d.ts +6 -0
- package/dist/src/internal/glyph.js +13 -0
- package/dist/src/internal/glyph.js.map +1 -0
- package/dist/src/nile-chip/nile-chip.css.js +8 -1
- package/dist/src/nile-chip/nile-chip.css.js.map +1 -1
- package/dist/src/nile-code-editor/nile-code-editor.js +3 -3
- package/dist/src/nile-code-editor/nile-code-editor.js.map +1 -1
- package/dist/src/nile-hero/nile-hero.css.js +12 -12
- package/dist/src/nile-hero/nile-hero.css.js.map +1 -1
- package/dist/src/nile-hero/nile-hero.js +1 -1
- package/dist/src/nile-hero/nile-hero.js.map +1 -1
- package/dist/src/nile-hero-header/nile-hero-header.css.js +9 -9
- package/dist/src/nile-hero-header/nile-hero-header.css.js.map +1 -1
- package/dist/src/nile-hero-header/nile-hero-header.js +1 -1
- package/dist/src/nile-hero-header/nile-hero-header.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js +70 -0
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.d.ts +3 -0
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js +81 -3
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rte-image.d.ts +87 -0
- package/dist/src/nile-rich-text-editor/nile-rte-image.js +1073 -0
- package/dist/src/nile-rich-text-editor/nile-rte-image.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/emoji.d.ts +5 -0
- package/dist/src/nile-wysiwyg-editor/emoji.js +138 -0
- package/dist/src/nile-wysiwyg-editor/emoji.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/commands.d.ts +69 -0
- package/dist/src/nile-wysiwyg-editor/engine/commands.js +863 -0
- package/dist/src/nile-wysiwyg-editor/engine/commands.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/create-state.d.ts +35 -0
- package/dist/src/nile-wysiwyg-editor/engine/create-state.js +67 -0
- package/dist/src/nile-wysiwyg-editor/engine/create-state.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/export.d.ts +38 -0
- package/dist/src/nile-wysiwyg-editor/engine/export.js +208 -0
- package/dist/src/nile-wysiwyg-editor/engine/export.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/export.test.d.ts +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/export.test.js +96 -0
- package/dist/src/nile-wysiwyg-editor/engine/export.test.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/index.d.ts +37 -0
- package/dist/src/nile-wysiwyg-editor/engine/index.js +29 -0
- package/dist/src/nile-wysiwyg-editor/engine/index.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/inputrules.d.ts +12 -0
- package/dist/src/nile-wysiwyg-editor/engine/inputrules.js +144 -0
- package/dist/src/nile-wysiwyg-editor/engine/inputrules.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/keymap.d.ts +15 -0
- package/dist/src/nile-wysiwyg-editor/engine/keymap.js +94 -0
- package/dist/src/nile-wysiwyg-editor/engine/keymap.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.d.ts +22 -0
- package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.js +287 -0
- package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.test.d.ts +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.test.js +106 -0
- package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.test.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/markdown.d.ts +10 -0
- package/dist/src/nile-wysiwyg-editor/engine/markdown.js +162 -0
- package/dist/src/nile-wysiwyg-editor/engine/markdown.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/office-paste.d.ts +13 -0
- package/dist/src/nile-wysiwyg-editor/engine/office-paste.js +182 -0
- package/dist/src/nile-wysiwyg-editor/engine/office-paste.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/code-highlight.d.ts +10 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/code-highlight.js +165 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/code-highlight.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.d.ts +17 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.js +69 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.d.ts +17 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.js +96 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/find-replace.d.ts +26 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/find-replace.js +123 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/find-replace.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/format-painter.d.ts +28 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/format-painter.js +72 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/format-painter.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.d.ts +41 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.js +176 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/image.d.ts +15 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/image.js +64 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/image.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/link.d.ts +11 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/link.js +42 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/link.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.d.ts +18 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.js +46 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/max-length.d.ts +7 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/max-length.js +26 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/max-length.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.d.ts +31 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.js +55 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/placeholder.d.ts +7 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/placeholder.js +25 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/placeholder.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/single-line.d.ts +10 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/single-line.js +48 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/single-line.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/suggestions.d.ts +29 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/suggestions.js +87 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/suggestions.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.d.ts +8 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js +11 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/task-list.d.ts +16 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/task-list.js +49 -0
- package/dist/src/nile-wysiwyg-editor/engine/plugins/task-list.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/pm.test.d.ts +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/pm.test.js +883 -0
- package/dist/src/nile-wysiwyg-editor/engine/pm.test.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/productivity.test.d.ts +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/productivity.test.js +129 -0
- package/dist/src/nile-wysiwyg-editor/engine/productivity.test.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/sanitize.d.ts +13 -0
- package/dist/src/nile-wysiwyg-editor/engine/sanitize.js +155 -0
- package/dist/src/nile-wysiwyg-editor/engine/sanitize.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/schema.d.ts +20 -0
- package/dist/src/nile-wysiwyg-editor/engine/schema.js +823 -0
- package/dist/src/nile-wysiwyg-editor/engine/schema.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/selection-state.d.ts +70 -0
- package/dist/src/nile-wysiwyg-editor/engine/selection-state.js +138 -0
- package/dist/src/nile-wysiwyg-editor/engine/selection-state.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/engine/serializer.d.ts +18 -0
- package/dist/src/nile-wysiwyg-editor/engine/serializer.js +63 -0
- package/dist/src/nile-wysiwyg-editor/engine/serializer.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/index.d.ts +3 -0
- package/dist/src/nile-wysiwyg-editor/index.js +3 -0
- package/dist/src/nile-wysiwyg-editor/index.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.d.ts +1 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js +782 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.d.ts +364 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js +2038 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.d.ts +1 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js +636 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.d.ts +1 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.js +2 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.d.ts +6 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js +251 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.d.ts +41 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.js +700 -0
- package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/types.d.ts +49 -0
- package/dist/src/nile-wysiwyg-editor/types.js +8 -0
- package/dist/src/nile-wysiwyg-editor/types.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.d.ts +20 -0
- package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js +159 -0
- package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.d.ts +21 -0
- package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js +125 -0
- package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.d.ts +18 -0
- package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.js +107 -0
- package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/embed-menu.d.ts +19 -0
- package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js +123 -0
- package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/embed-panel.d.ts +27 -0
- package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js +146 -0
- package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.d.ts +21 -0
- package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js +154 -0
- package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/find-replace.d.ts +26 -0
- package/dist/src/nile-wysiwyg-editor/ui/find-replace.js +178 -0
- package/dist/src/nile-wysiwyg-editor/ui/find-replace.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/image-menu.d.ts +18 -0
- package/dist/src/nile-wysiwyg-editor/ui/image-menu.js +129 -0
- package/dist/src/nile-wysiwyg-editor/ui/image-menu.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/image-panel.d.ts +56 -0
- package/dist/src/nile-wysiwyg-editor/ui/image-panel.js +349 -0
- package/dist/src/nile-wysiwyg-editor/ui/image-panel.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/insert-menu.d.ts +25 -0
- package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js +142 -0
- package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/link-editor.d.ts +30 -0
- package/dist/src/nile-wysiwyg-editor/ui/link-editor.js +189 -0
- package/dist/src/nile-wysiwyg-editor/ui/link-editor.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.d.ts +24 -0
- package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js +144 -0
- package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/math-panel.d.ts +31 -0
- package/dist/src/nile-wysiwyg-editor/ui/math-panel.js +172 -0
- package/dist/src/nile-wysiwyg-editor/ui/math-panel.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.d.ts +30 -0
- package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js +296 -0
- package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/source-view.d.ts +19 -0
- package/dist/src/nile-wysiwyg-editor/ui/source-view.js +120 -0
- package/dist/src/nile-wysiwyg-editor/ui/source-view.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/special-chars.d.ts +20 -0
- package/dist/src/nile-wysiwyg-editor/ui/special-chars.js +199 -0
- package/dist/src/nile-wysiwyg-editor/ui/special-chars.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/suggest-list.d.ts +31 -0
- package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js +133 -0
- package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.d.ts +23 -0
- package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js +177 -0
- package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js.map +1 -0
- package/dist/src/nile-wysiwyg-editor/ui/table-menu.d.ts +16 -0
- package/dist/src/nile-wysiwyg-editor/ui/table-menu.js +101 -0
- package/dist/src/nile-wysiwyg-editor/ui/table-menu.js.map +1 -0
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -2
- package/src/index.ts +57 -1
- package/src/internal/glyph.ts +13 -0
- package/src/nile-chip/nile-chip.css.ts +8 -1
- package/src/nile-code-editor/nile-code-editor.ts +3 -3
- package/src/nile-hero/nile-hero.css.ts +12 -12
- package/src/nile-hero/nile-hero.ts +1 -1
- package/src/nile-hero-header/nile-hero-header.css.ts +9 -9
- package/src/nile-hero-header/nile-hero-header.ts +1 -1
- package/src/nile-rich-text-editor/nile-rich-text-editor.css.ts +70 -0
- package/src/nile-rich-text-editor/nile-rich-text-editor.ts +89 -3
- package/src/nile-rich-text-editor/nile-rte-image.ts +1132 -0
- package/src/nile-wysiwyg-editor/emoji.ts +137 -0
- package/src/nile-wysiwyg-editor/engine/commands.ts +1035 -0
- package/src/nile-wysiwyg-editor/engine/create-state.ts +117 -0
- package/src/nile-wysiwyg-editor/engine/export.test.ts +113 -0
- package/src/nile-wysiwyg-editor/engine/export.ts +242 -0
- package/src/nile-wysiwyg-editor/engine/index.ts +69 -0
- package/src/nile-wysiwyg-editor/engine/inputrules.ts +169 -0
- package/src/nile-wysiwyg-editor/engine/keymap.ts +146 -0
- package/src/nile-wysiwyg-editor/engine/markdown-parse.test.ts +148 -0
- package/src/nile-wysiwyg-editor/engine/markdown-parse.ts +337 -0
- package/src/nile-wysiwyg-editor/engine/markdown.ts +165 -0
- package/src/nile-wysiwyg-editor/engine/office-paste.ts +199 -0
- package/src/nile-wysiwyg-editor/engine/plugins/code-highlight.ts +173 -0
- package/src/nile-wysiwyg-editor/engine/plugins/embed-view.ts +85 -0
- package/src/nile-wysiwyg-editor/engine/plugins/embeds.ts +99 -0
- package/src/nile-wysiwyg-editor/engine/plugins/find-replace.ts +155 -0
- package/src/nile-wysiwyg-editor/engine/plugins/format-painter.ts +80 -0
- package/src/nile-wysiwyg-editor/engine/plugins/image-view.ts +220 -0
- package/src/nile-wysiwyg-editor/engine/plugins/image.ts +80 -0
- package/src/nile-wysiwyg-editor/engine/plugins/link.ts +42 -0
- package/src/nile-wysiwyg-editor/engine/plugins/math-view.ts +56 -0
- package/src/nile-wysiwyg-editor/engine/plugins/max-length.ts +24 -0
- package/src/nile-wysiwyg-editor/engine/plugins/paste.ts +74 -0
- package/src/nile-wysiwyg-editor/engine/plugins/placeholder.ts +24 -0
- package/src/nile-wysiwyg-editor/engine/plugins/single-line.ts +47 -0
- package/src/nile-wysiwyg-editor/engine/plugins/suggestions.ts +110 -0
- package/src/nile-wysiwyg-editor/engine/plugins/tables.ts +12 -0
- package/src/nile-wysiwyg-editor/engine/plugins/task-list.ts +65 -0
- package/src/nile-wysiwyg-editor/engine/pm.test.ts +1088 -0
- package/src/nile-wysiwyg-editor/engine/productivity.test.ts +163 -0
- package/src/nile-wysiwyg-editor/engine/sanitize.ts +156 -0
- package/src/nile-wysiwyg-editor/engine/schema.ts +859 -0
- package/src/nile-wysiwyg-editor/engine/selection-state.ts +210 -0
- package/src/nile-wysiwyg-editor/engine/serializer.ts +78 -0
- package/src/nile-wysiwyg-editor/index.ts +3 -0
- package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.ts +782 -0
- package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.ts +750 -0
- package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.ts +2155 -0
- package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.ts +1 -0
- package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.ts +251 -0
- package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.ts +772 -0
- package/src/nile-wysiwyg-editor/types.ts +83 -0
- package/src/nile-wysiwyg-editor/ui/bookmark-panel.ts +155 -0
- package/src/nile-wysiwyg-editor/ui/bubble-menu.ts +135 -0
- package/src/nile-wysiwyg-editor/ui/code-block-menu.ts +105 -0
- package/src/nile-wysiwyg-editor/ui/embed-menu.ts +133 -0
- package/src/nile-wysiwyg-editor/ui/embed-panel.ts +143 -0
- package/src/nile-wysiwyg-editor/ui/emoji-picker.ts +152 -0
- package/src/nile-wysiwyg-editor/ui/find-replace.ts +174 -0
- package/src/nile-wysiwyg-editor/ui/image-menu.ts +140 -0
- package/src/nile-wysiwyg-editor/ui/image-panel.ts +337 -0
- package/src/nile-wysiwyg-editor/ui/insert-menu.ts +142 -0
- package/src/nile-wysiwyg-editor/ui/link-editor.ts +180 -0
- package/src/nile-wysiwyg-editor/ui/markdown-panel.ts +143 -0
- package/src/nile-wysiwyg-editor/ui/math-panel.ts +169 -0
- package/src/nile-wysiwyg-editor/ui/shortcut-help.ts +311 -0
- package/src/nile-wysiwyg-editor/ui/source-view.ts +119 -0
- package/src/nile-wysiwyg-editor/ui/special-chars.ts +209 -0
- package/src/nile-wysiwyg-editor/ui/suggest-list.ts +138 -0
- package/src/nile-wysiwyg-editor/ui/table-grid-picker.ts +173 -0
- package/src/nile-wysiwyg-editor/ui/table-menu.ts +109 -0
- package/vscode-html-custom-data.json +491 -1
- package/web-dev-server.config.mjs +6 -2
- package/dist/index-5fef1a0d.esm.js +0 -1
- package/dist/index-8f38fae3.cjs.js +0 -2
- package/dist/index-8f38fae3.cjs.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm.test.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/pm.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { TextSelection, NodeSelection, AllSelection } from 'prosemirror-state';\nimport {\n defaultSchema,\n htmlToDoc,\n htmlToSlice,\n docToHtml,\n isOfficeHtml,\n cleanOfficeHtml,\n docToMarkdown,\n sanitizeHtml,\n createEditorState,\n getCommand,\n computeToolbarState,\n isDocEmpty,\n countWords,\n getFindState,\n searchTr,\n findStepTr,\n replaceActiveTr,\n replaceAllTr,\n plainTextSlice,\n stripSliceFormatting,\n} from './index';\nimport type { SuggestionMatch } from './plugins/suggestions';\nimport { toEmbedUrl, isAllowedEmbedSrc } from './plugins/embeds';\nimport { codeHighlightKey } from './plugins/code-highlight';\n\n/** Builds an editor state with the whole document selected. */\nfunction stateWithAllSelected(html: string) {\n const doc = htmlToDoc(defaultSchema, html);\n const state = createEditorState({ doc });\n const selection = TextSelection.create(state.doc, 1, state.doc.content.size - 1);\n return state.apply(state.tr.setSelection(selection));\n}\n\ndescribe('sanitizeHtml', () => {\n it('removes script elements entirely', () => {\n expect(sanitizeHtml('<p>hi</p><script>alert(1)</script>')).to.equal('<p>hi</p>');\n });\n\n it('removes inline event handlers', () => {\n const out = sanitizeHtml('<p onclick=\"alert(1)\" onmouseover=\"x()\">hi</p>');\n expect(out).to.not.include('onclick').and.to.not.include('onmouseover');\n });\n\n it('drops javascript: URLs', () => {\n const out = sanitizeHtml('<a href=\"javascript:alert(1)\">x</a>');\n expect(out).to.not.include('javascript:');\n });\n\n it('keeps safe links and forces noopener on _blank', () => {\n const out = sanitizeHtml('<a href=\"https://example.com\" target=\"_blank\">x</a>');\n expect(out).to.include('https://example.com');\n expect(out).to.include('noopener');\n });\n\n it('filters style declarations to the allowed set', () => {\n const out = sanitizeHtml(\n '<span style=\"color: red; position: fixed; background-image: url(x)\">x</span>'\n );\n expect(out).to.include('color: red');\n expect(out).to.not.include('position');\n expect(out).to.not.include('url(');\n });\n\n it('unwraps unknown elements but keeps their content', () => {\n expect(sanitizeHtml('<article><p>kept</p></article>')).to.equal('<p>kept</p>');\n });\n\n it('drops iframes, styles and forms with content', () => {\n const out = sanitizeHtml(\n '<iframe src=\"x\"></iframe><style>p{}</style><form><input></form><p>ok</p>'\n );\n expect(out).to.equal('<p>ok</p>');\n });\n});\n\ndescribe('serializer round-trip', () => {\n const cases = [\n '<p>plain text</p>',\n '<h2>heading</h2><p>body</p>',\n '<p><strong>bold</strong> and <em>italic</em> and <u>underlined</u></p>',\n '<ul><li><p>one</p></li><li><p>two</p></li></ul>',\n '<ol><li><p>first</p></li></ol>',\n '<blockquote><p>quoted</p></blockquote>',\n '<p><a href=\"https://example.com\">link</a></p>',\n '<p style=\"text-align: center\">centered</p>',\n '<p><span style=\"color: rgb(255, 0, 0)\">red</span></p>',\n '<p>line<br>break</p>',\n '<hr>',\n ];\n\n for (const html of cases) {\n it(`round-trips ${html.slice(0, 40)}`, () => {\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n const reparsed = htmlToDoc(defaultSchema, out);\n expect(reparsed.eq(doc), `stable parse for ${html}`).to.equal(true);\n });\n }\n\n it('parses Word-style font-weight styles as bold', () => {\n const doc = htmlToDoc(defaultSchema, '<p><span style=\"font-weight: 700\">x</span></p>');\n expect(docToHtml(doc)).to.include('<strong>');\n });\n\n it('detects empty documents', () => {\n expect(isDocEmpty(htmlToDoc(defaultSchema, ''))).to.equal(true);\n expect(isDocEmpty(htmlToDoc(defaultSchema, '<p></p>'))).to.equal(true);\n expect(isDocEmpty(htmlToDoc(defaultSchema, '<p>x</p>'))).to.equal(false);\n });\n});\n\ndescribe('commands', () => {\n it('toggles bold over a selection', () => {\n let state = stateWithAllSelected('<p>hello</p>');\n const bold = getCommand(state, 'bold')!;\n bold(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><strong>hello</strong></p>');\n });\n\n it('sets and clears headings', () => {\n let state = stateWithAllSelected('<p>title</p>');\n getCommand(state, 'heading', { level: 2 })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<h2>title</h2>');\n getCommand(state, 'paragraph')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>title</p>');\n });\n\n it('wraps and lifts bullet lists', () => {\n let state = stateWithAllSelected('<p>item</p>');\n getCommand(state, 'bulletList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<ul>');\n getCommand(state, 'bulletList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>item</p>');\n });\n\n it('converts between list types in place', () => {\n let state = stateWithAllSelected('<ul><li><p>item</p></li></ul>');\n getCommand(state, 'orderedList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<ol>');\n expect(docToHtml(state.doc)).to.not.include('<ul>');\n });\n\n it('sets alignment on textblocks', () => {\n let state = stateWithAllSelected('<p>text</p>');\n getCommand(state, 'align', { align: 'right' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('text-align: right');\n });\n\n it('applies and removes links', () => {\n let state = stateWithAllSelected('<p>click</p>');\n getCommand(state, 'link', { href: 'https://example.com' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('href=\"https://example.com\"');\n getCommand(state, 'unlink')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>click</p>');\n });\n\n it('applies text color and clears formatting', () => {\n let state = stateWithAllSelected('<p>color</p>');\n getCommand(state, 'textColor', { color: '#ff0000' })!(state, tr => {\n state = state.apply(tr);\n });\n // Browsers normalize hex colors to rgb() in style attributes.\n expect(docToHtml(state.doc)).to.match(/color: (#ff0000|rgb\\(255, 0, 0\\))/);\n getCommand(state, 'clearFormatting')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>color</p>');\n });\n});\n\ndescribe('phase 2: rich content', () => {\n it('round-trips tables', () => {\n const html =\n '<table><tbody><tr><th><p>h1</p></th><th><p>h2</p></th></tr>' +\n '<tr><td><p>a</p></td><td><p>b</p></td></tr></tbody></table>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('<table');\n expect(out).to.include('<th');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('keeps colspan/rowspan through sanitization', () => {\n const out = sanitizeHtml('<table><tr><td colspan=\"2\" rowspan=\"3\">x</td></tr></table>');\n expect(out).to.include('colspan=\"2\"');\n expect(out).to.include('rowspan=\"3\"');\n });\n\n it('round-trips inline images', () => {\n const html = '<p>look: <img src=\"https://x.dev/a.png\" alt=\"A\"></p>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('src=\"https://x.dev/a.png\"');\n expect(out).to.include('alt=\"A\"');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('parses bare pasted images', () => {\n const doc = htmlToDoc(defaultSchema, '<p>before</p><img src=\"https://x.dev/a.png\">');\n expect(docToHtml(doc)).to.include('<img src=\"https://x.dev/a.png\"');\n });\n\n it('drops images with unsafe URLs but allows raster data URLs', () => {\n expect(sanitizeHtml('<img src=\"javascript:alert(1)\">')).to.not.include('src');\n expect(\n sanitizeHtml('<img src=\"data:image/png;base64,iVBORw0KGgo=\">')\n ).to.include('data:image/png');\n expect(\n sanitizeHtml('<img src=\"data:image/svg+xml,<svg onload=alert(1)>\">')\n ).to.not.include('svg');\n });\n\n it('round-trips code blocks preserving whitespace', () => {\n const doc = htmlToDoc(\n defaultSchema,\n '<pre data-language=\"js\"><code>const a = 1;\\n indent();</code></pre>'\n );\n const out = docToHtml(doc);\n expect(out).to.include('data-language=\"js\"');\n expect(out).to.include('const a = 1;\\n indent();');\n });\n\n it('toggles code blocks via the codeBlock command', () => {\n let state = stateWithAllSelected('<p>snippet</p>');\n getCommand(state, 'codeBlock')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<pre');\n getCommand(state, 'codeBlock')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>snippet</p>');\n });\n\n it('inserts tables and edits rows/columns', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertTable', { rows: 2, cols: 2 })!(state, tr => {\n state = state.apply(tr);\n });\n let table = state.doc.firstChild!;\n expect(table.type.name).to.equal('table');\n expect(table.childCount).to.equal(2);\n\n // Put the cursor inside the first cell, then add a row.\n const inside = TextSelection.near(state.doc.resolve(4));\n state = state.apply(state.tr.setSelection(inside));\n getCommand(state, 'addRowAfter')!(state, tr => {\n state = state.apply(tr);\n });\n table = state.doc.firstChild!;\n expect(table.childCount).to.equal(3);\n\n getCommand(state, 'deleteTable')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('<table');\n });\n\n it('inserts inline images via the insertImage command', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertImage', { src: 'https://x.dev/i.png', alt: 'pic' })!(\n state,\n tr => {\n state = state.apply(tr);\n }\n );\n const out = docToHtml(state.doc);\n expect(out).to.include('<img');\n expect(out).to.include('alt=\"pic\"');\n });\n\n it('reports inTable and inCodeBlock in toolbar state', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertTable', { rows: 2, cols: 2 })!(state, tr => {\n state = state.apply(tr);\n });\n state = state.apply(state.tr.setSelection(TextSelection.near(state.doc.resolve(4))));\n expect(computeToolbarState(state).inTable).to.equal(true);\n\n const codeState = stateWithAllSelected('<pre><code>x</code></pre>');\n expect(computeToolbarState(codeState).inCodeBlock).to.equal(true);\n });\n});\n\ndescribe('phase 3: productivity', () => {\n it('round-trips mention nodes', () => {\n const html =\n '<p>ping <span data-mention-trigger=\"@\" data-mention-key=\"u1\" data-mention-label=\"Ada\">@Ada</span> now</p>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('data-mention-key=\"u1\"');\n expect(out).to.include('data-mention-label=\"Ada\"');\n expect(out).to.include('@Ada');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('keeps mention data attributes through sanitization', () => {\n const out = sanitizeHtml(\n '<span data-mention-key=\"u1\" data-mention-trigger=\"@\" data-mention-label=\"Ada\" onclick=\"x()\">@Ada</span>'\n );\n expect(out).to.include('data-mention-key=\"u1\"');\n expect(out).to.not.include('onclick');\n });\n\n it('tracks trigger queries through the suggestion plugin', () => {\n const seen: SuggestionMatch[] = [];\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p></p>'),\n mentions: {\n getTriggers: () => ['@'],\n onChange: match => seen.push(match),\n },\n });\n state = state.apply(state.tr.insertText('hello @ad', 1));\n const last = seen[seen.length - 1];\n expect(last.active).to.equal(true);\n expect(last.trigger).to.equal('@');\n expect(last.query).to.equal('ad');\n\n // A space ends the suggestion.\n state = state.apply(state.tr.insertText(' '));\n expect(seen[seen.length - 1].active).to.equal(false);\n });\n\n it('does not trigger suggestions mid-word', () => {\n const seen: SuggestionMatch[] = [];\n const state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p></p>'),\n mentions: { getTriggers: () => ['@'], onChange: m => seen.push(m) },\n });\n state.apply(state.tr.insertText('email@example', 1));\n expect(seen.every(m => !m.active)).to.equal(true);\n });\n\n it('finds, steps through, and replaces matches', () => {\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p>cat dog cat</p><p>Cat nap</p>'),\n });\n state = state.apply(searchTr(state, 'cat'));\n expect(getFindState(state).matches.length).to.equal(3);\n expect(getFindState(state).activeIndex).to.equal(0);\n\n state = state.apply(findStepTr(state, 'next'));\n expect(getFindState(state).activeIndex).to.equal(1);\n state = state.apply(findStepTr(state, 'prev'));\n expect(getFindState(state).activeIndex).to.equal(0);\n\n state = state.apply(replaceActiveTr(state, 'ferret')!);\n expect(docToHtml(state.doc)).to.include('ferret dog cat');\n // Matches recompute after the doc change.\n expect(getFindState(state).matches.length).to.equal(2);\n\n state = state.apply(replaceAllTr(state, 'newt')!);\n expect(getFindState(state).matches.length).to.equal(0);\n expect(docToHtml(state.doc)).to.equal('<p>ferret dog newt</p><p>newt nap</p>');\n });\n\n it('respects case sensitivity in find', () => {\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p>Cat cat CAT</p>'),\n });\n state = state.apply(searchTr(state, 'cat', true));\n expect(getFindState(state).matches.length).to.equal(1);\n });\n\n it('counts words and characters', () => {\n const doc = htmlToDoc(defaultSchema, '<p>one two</p><p>three</p>');\n expect(countWords(doc)).to.deep.equal({ words: 3, characters: 12 });\n expect(countWords(htmlToDoc(defaultSchema, ''))).to.deep.equal({\n words: 0,\n characters: 0,\n });\n });\n});\n\ndescribe('small features', () => {\n it('round-trips checklists', () => {\n const html =\n '<ul data-task-list=\"true\"><li data-task-item=\"true\" data-checked=\"true\"><p>done</p></li>' +\n '<li data-task-item=\"true\" data-checked=\"false\"><p>todo</p></li></ul>';\n const doc = htmlToDoc(defaultSchema, html);\n expect(doc.firstChild!.type.name).to.equal('task_list');\n expect(doc.firstChild!.firstChild!.attrs.checked).to.equal(true);\n const out = docToHtml(doc);\n expect(out).to.include('data-checked=\"true\"');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('plain lists still parse as bullet lists', () => {\n const doc = htmlToDoc(defaultSchema, '<ul><li><p>plain</p></li></ul>');\n expect(doc.firstChild!.type.name).to.equal('bullet_list');\n });\n\n it('toggles checklists and converts bullet lists in place', () => {\n let state = stateWithAllSelected('<p>task</p>');\n getCommand(state, 'taskList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.type.name).to.equal('task_list');\n\n // Convert to bullet list: items must be remapped too.\n getCommand(state, 'bulletList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.type.name).to.equal('bullet_list');\n expect(state.doc.firstChild!.firstChild!.type.name).to.equal('list_item');\n\n // And back to a checklist.\n getCommand(state, 'taskList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.firstChild!.type.name).to.equal('task_item');\n });\n\n it('enforces maxLength but always allows shrinking', () => {\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p>12345678</p>'),\n getMaxLength: () => 10,\n });\n state = state.apply(state.tr.insertText('90', 9));\n expect(state.doc.textContent).to.equal('1234567890');\n\n // Growing past the limit is rejected: the state stays unchanged.\n const attempted = state.apply(state.tr.insertText('x', 11));\n expect(attempted.doc.textContent).to.equal('1234567890');\n\n // Deleting is always allowed.\n state = state.apply(state.tr.delete(1, 6));\n expect(state.doc.textContent).to.equal('67890');\n });\n\n it('suggestion minQueryLength keeps short queries inactive', () => {\n const seen: SuggestionMatch[] = [];\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p></p>'),\n emoji: { onChange: m => seen.push(m) },\n });\n state = state.apply(state.tr.insertText(':s', 1));\n expect(seen.filter(m => m.active)).to.have.length(0);\n state = state.apply(state.tr.insertText('mi'));\n const last = seen[seen.length - 1];\n expect(last.active).to.equal(true);\n expect(last.query).to.equal('smi');\n });\n});\n\ndescribe('embeds', () => {\n it('converts provider share URLs to embed URLs', () => {\n expect(toEmbedUrl('https://www.youtube.com/watch?v=dQw4w9WgXcQ')).to.deep.equal({\n src: 'https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ',\n provider: 'youtube',\n });\n expect(toEmbedUrl('https://youtu.be/dQw4w9WgXcQ')!.src).to.include('/embed/dQw4w9WgXcQ');\n expect(toEmbedUrl('https://www.youtube.com/shorts/dQw4w9WgXcQ')!.provider).to.equal('youtube');\n expect(toEmbedUrl('https://vimeo.com/123456789')).to.deep.equal({\n src: 'https://player.vimeo.com/video/123456789',\n provider: 'vimeo',\n });\n expect(\n toEmbedUrl('https://www.loom.com/share/abcdef0123456789abcdef0123456789')!.provider\n ).to.equal('loom');\n });\n\n it('rejects non-provider and non-https URLs', () => {\n expect(toEmbedUrl('https://evil.example.com/embed/x')).to.equal(null);\n expect(toEmbedUrl('http://www.youtube.com/watch?v=dQw4w9WgXcQ')).to.equal(null);\n expect(toEmbedUrl('javascript:alert(1)')).to.equal(null);\n expect(toEmbedUrl('https://youtube.com.evil.com/watch?v=x')).to.equal(null);\n expect(isAllowedEmbedSrc('https://evil.com/embed/x')).to.equal(false);\n });\n\n it('keeps allowlisted iframes through sanitization, drops the rest', () => {\n const good = sanitizeHtml(\n '<div data-embed-provider=\"youtube\"><iframe src=\"https://www.youtube-nocookie.com/embed/abc123xyz\"></iframe></div>'\n );\n expect(good).to.include('youtube-nocookie.com/embed');\n const evil = sanitizeHtml('<iframe src=\"https://evil.example.com/steal\"></iframe><p>ok</p>');\n expect(evil).to.equal('<p>ok</p>');\n });\n\n it('round-trips embed nodes', () => {\n const html =\n '<div data-embed-provider=\"youtube\"><iframe src=\"https://www.youtube-nocookie.com/embed/abc123xyz\" title=\"Demo\"></iframe></div>';\n const doc = htmlToDoc(defaultSchema, html);\n expect(doc.firstChild!.type.name).to.equal('embed');\n const out = docToHtml(doc);\n expect(out).to.include('data-embed-provider=\"youtube\"');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('inserts embeds via the insertEmbed command', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertEmbed', {\n src: 'https://player.vimeo.com/video/123456789',\n provider: 'vimeo',\n })!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.type.name).to.equal('embed');\n });\n});\n\ndescribe('code highlighting', () => {\n it('produces token decorations for code blocks', () => {\n const state = createEditorState({\n doc: htmlToDoc(\n defaultSchema,\n '<pre data-language=\"javascript\"><code>const answer = 42; // why</code></pre>'\n ),\n });\n const set = codeHighlightKey.getState(state)!;\n const decos = set.find();\n expect(decos.length).to.be.greaterThan(2);\n });\n\n it('skips plaintext blocks and updates the language attr', () => {\n let state = createEditorState({\n doc: htmlToDoc(\n defaultSchema,\n '<pre data-language=\"plaintext\"><code>const answer = 42;</code></pre>'\n ),\n });\n expect(codeHighlightKey.getState(state)!.find().length).to.equal(0);\n\n state = state.apply(state.tr.setSelection(TextSelection.near(state.doc.resolve(1))));\n getCommand(state, 'setCodeBlockLanguage', { language: 'javascript' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.attrs.language).to.equal('javascript');\n expect(codeHighlightKey.getState(state)!.find().length).to.be.greaterThan(1);\n });\n});\n\ndescribe('phase 4: subscript & superscript', () => {\n it('round-trips sub and sup marks', () => {\n for (const html of ['<p>H<sub>2</sub>O</p>', '<p>x<sup>2</sup></p>']) {\n const doc = htmlToDoc(defaultSchema, html);\n expect(docToHtml(doc)).to.equal(html);\n expect(htmlToDoc(defaultSchema, docToHtml(doc)).eq(doc)).to.equal(true);\n }\n });\n\n it('parses vertical-align styles pasted from Word/Docs', () => {\n expect(\n docToHtml(htmlToDoc(defaultSchema, '<p><span style=\"vertical-align: sub\">2</span></p>'))\n ).to.include('<sub>');\n expect(\n docToHtml(htmlToDoc(defaultSchema, '<p><span style=\"vertical-align: super\">2</span></p>'))\n ).to.include('<sup>');\n });\n\n it('toggles sub/sup and keeps them mutually exclusive', () => {\n let state = stateWithAllSelected('<p>x</p>');\n getCommand(state, 'subscript')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><sub>x</sub></p>');\n // Applying superscript over a subscript replaces it (excludes).\n getCommand(state, 'superscript')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><sup>x</sup></p>');\n });\n\n it('reports sub/sup in toolbar state', () => {\n expect(computeToolbarState(stateWithAllSelected('<p><sub>x</sub></p>')).subscript).to.equal(\n true\n );\n expect(\n computeToolbarState(stateWithAllSelected('<p><sup>x</sup></p>')).superscript\n ).to.equal(true);\n });\n});\n\ndescribe('phase 4: paste as plain text', () => {\n it('builds a plain-text slice splitting on newlines', () => {\n const slice = plainTextSlice(defaultSchema, 'line1\\nline2');\n expect(slice.content.childCount).to.equal(2);\n expect(slice.content.firstChild!.textContent).to.equal('line1');\n expect(slice.content.lastChild!.textContent).to.equal('line2');\n });\n\n it('strips marks and block structure from a rich slice', () => {\n const rich = htmlToSlice(defaultSchema, '<h2><strong>bold</strong> head</h2>');\n const plain = stripSliceFormatting(defaultSchema, rich);\n const para = plain.content.firstChild!;\n expect(para.type.name).to.equal('paragraph');\n expect(para.textContent).to.equal('bold head');\n expect(para.firstChild!.marks.length).to.equal(0);\n });\n\n it('only strips when the toggle reads true', () => {\n let force = false;\n const state = createEditorState({ getForcePlainText: () => force });\n const paste = state.plugins\n .map(p => p.props?.transformPasted)\n .find(Boolean) as unknown as (slice: unknown, ...rest: unknown[]) => any;\n const rich = htmlToSlice(defaultSchema, '<p><strong>bold</strong></p>');\n // Off: slice passes through unchanged.\n expect(paste(rich).eq(rich)).to.equal(true);\n // On: formatting is dropped.\n force = true;\n const out = paste(rich);\n expect(out.content.firstChild.firstChild.marks.length).to.equal(0);\n });\n});\n\ndescribe('phase 4: more code languages', () => {\n it('highlights newly registered languages', () => {\n for (const language of ['go', 'rust', 'ruby', 'csharp']) {\n const state = createEditorState({\n doc: htmlToDoc(\n defaultSchema,\n `<pre data-language=\"${language}\"><code>fn main() { let x = 1; }</code></pre>`\n ),\n });\n expect(codeHighlightKey.getState(state)!.find().length, language).to.be.greaterThan(0);\n }\n });\n});\n\ndescribe('phase 4: markdown export', () => {\n const cases: [string, string][] = [\n ['<h2>Title</h2><p>Hello <strong>bold</strong> and <em>it</em></p>', '## Title\\n\\nHello **bold** and *it*\\n'],\n ['<ul><li><p>one</p></li><li><p>two</p></li></ul>', '- one\\n- two\\n'],\n ['<ol><li><p>a</p></li><li><p>b</p></li></ol>', '1. a\\n2. b\\n'],\n ['<blockquote><p>quoted</p></blockquote>', '> quoted\\n'],\n ['<p><a href=\"https://x.dev\">link</a></p>', '[link](https://x.dev)\\n'],\n ['<p><code>x()</code></p>', '`x()`\\n'],\n ['<pre data-language=\"js\"><code>const a = 1;</code></pre>', '```js\\nconst a = 1;\\n```\\n'],\n ['<p><img src=\"https://x.dev/a.png\" alt=\"A\"></p>', '\\n'],\n ['<hr>', '---\\n'],\n ['<p>H<sub>2</sub>O and x<sup>2</sup></p>', 'H<sub>2</sub>O and x<sup>2</sup>\\n'],\n ];\n\n for (const [input, expected] of cases) {\n it(`serializes ${input.slice(0, 36)}`, () => {\n expect(docToMarkdown(htmlToDoc(defaultSchema, input))).to.equal(expected);\n });\n }\n\n it('serializes checklists with checked state', () => {\n const html =\n '<ul data-task-list=\"true\"><li data-task-item=\"true\" data-checked=\"true\"><p>done</p></li>' +\n '<li data-task-item=\"true\" data-checked=\"false\"><p>todo</p></li></ul>';\n expect(docToMarkdown(htmlToDoc(defaultSchema, html))).to.equal('- [x] done\\n- [ ] todo\\n');\n });\n\n it('serializes a GitHub-flavored table', () => {\n const html =\n '<table><tbody><tr><th><p>h1</p></th><th><p>h2</p></th></tr>' +\n '<tr><td><p>a</p></td><td><p>b</p></td></tr></tbody></table>';\n expect(docToMarkdown(htmlToDoc(defaultSchema, html))).to.equal(\n '| h1 | h2 |\\n| --- | --- |\\n| a | b |\\n'\n );\n });\n\n it('returns an empty string for an empty document', () => {\n expect(docToMarkdown(htmlToDoc(defaultSchema, '<p></p>'))).to.equal('');\n });\n});\n\ndescribe('computeToolbarState', () => {\n it('reports active marks and block info', () => {\n const state = stateWithAllSelected('<h3><strong>bold heading</strong></h3>');\n const ts = computeToolbarState(state);\n expect(ts.bold).to.equal(true);\n expect(ts.italic).to.equal(false);\n expect(ts.blockType).to.equal('heading');\n expect(ts.headingLevel).to.equal(3);\n });\n\n it('reports list and link context', () => {\n const state = stateWithAllSelected(\n '<ul><li><p><a href=\"https://x.dev\">in list</a></p></li></ul>'\n );\n const ts = computeToolbarState(state);\n expect(ts.inBulletList).to.equal(true);\n expect(ts.linkActive).to.equal(true);\n expect(ts.linkHref).to.equal('https://x.dev');\n });\n\n it('reports block info for a Ctrl+A AllSelection', () => {\n const doc = htmlToDoc(defaultSchema, '<h1>sdasd</h1>');\n const base = createEditorState({ doc });\n const state = base.apply(base.tr.setSelection(new AllSelection(base.doc)));\n const ts = computeToolbarState(state);\n expect(ts.blockType).to.equal('heading');\n expect(ts.headingLevel).to.equal(1);\n });\n});\n\ndescribe('indent & outdent', () => {\n /** Cursor inside the second item of a two-item bullet list. */\n function stateInSecondItem() {\n const doc = htmlToDoc(\n defaultSchema,\n '<ul><li><p>one</p></li><li><p>two</p></li></ul>'\n );\n const state = createEditorState({ doc });\n // Position inside \"two\" (after \"one\" paragraph + item boundaries).\n const pos = state.doc.content.size - 4;\n return state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, pos))\n );\n }\n\n it('indent sinks a list item into the previous one', () => {\n let state = stateInSecondItem();\n const applied = getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n expect(docToHtml(state.doc)).to.equal(\n '<ul><li><p>one</p><ul><li><p>two</p></li></ul></li></ul>'\n );\n });\n\n it('outdent lifts a nested item back out', () => {\n let state = stateInSecondItem();\n getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal(\n '<ul><li><p>one</p></li><li><p>two</p></li></ul>'\n );\n });\n\n it('indent adds margin steps to plain paragraphs', () => {\n let state = stateWithAllSelected('<p>text</p>');\n getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n // Browsers may serialize style attributes with a trailing semicolon.\n expect(docToHtml(state.doc)).to.include('margin-inline-start: 40px');\n getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('margin-inline-start: 80px');\n getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>text</p>');\n });\n\n it('outdent at indent 0 outside lists and quotes does nothing', () => {\n let state = stateWithAllSelected('<p>text</p>');\n const applied = getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(false);\n });\n\n it('outdent lifts a block out of a blockquote', () => {\n let state = stateWithAllSelected('<blockquote><p>quoted</p></blockquote>');\n const applied = getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n expect(docToHtml(state.doc)).to.equal('<p>quoted</p>');\n });\n});\n\ndescribe('list properties', () => {\n it('sets and clears bullet marker styles', () => {\n let state = stateWithAllSelected('<ul><li><p>a</p></li></ul>');\n getCommand(state, 'setListStyle', { style: 'square' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('list-style-type: square');\n getCommand(state, 'setListStyle', { style: null })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<ul><li><p>a</p></li></ul>');\n });\n\n it('sets numbering style as the HTML type attribute', () => {\n let state = stateWithAllSelected('<ol><li><p>a</p></li></ol>');\n getCommand(state, 'setListStyle', { style: 'lower-roman' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<ol type=\"i\"><li><p>a</p></li></ol>');\n });\n\n it('sets the start number of an ordered list', () => {\n let state = stateWithAllSelected('<ol><li><p>a</p></li></ol>');\n getCommand(state, 'setListStart', { start: 5 })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<ol start=\"5\"><li><p>a</p></li></ol>');\n });\n\n it('round-trips ol type through parsing', () => {\n const doc = htmlToDoc(defaultSchema, '<ol type=\"A\" start=\"3\"><li><p>x</p></li></ol>');\n expect(docToHtml(doc)).to.equal('<ol start=\"3\" type=\"A\"><li><p>x</p></li></ol>');\n });\n});\n\ndescribe('figure & image commands', () => {\n /** State with a NodeSelection on the inline image. */\n function stateWithImageSelected() {\n const doc = htmlToDoc(defaultSchema, '<p><img src=\"https://x.co/i.png\" alt=\"pic\"></p>');\n const state = createEditorState({ doc });\n // Image node position: inside the paragraph at pos 1.\n return state.apply(state.tr.setSelection(NodeSelection.create(state.doc, 1)));\n }\n\n it('parses and serializes a figure with caption', () => {\n const html =\n '<figure><img src=\"https://x.co/i.png\" alt=\"pic\"><figcaption>My caption</figcaption></figure>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('<figure');\n expect(out).to.include('src=\"https://x.co/i.png\"');\n expect(out).to.include('<figcaption');\n expect(out).to.include('My caption');\n });\n\n it('parses image width from inline style', () => {\n const doc = htmlToDoc(defaultSchema, '<p><img src=\"https://x.co/i.png\" style=\"width: 240px\"></p>');\n expect(docToHtml(doc)).to.include('width: 240px');\n });\n\n it('toggleImageCaption converts an inline image into a figure', () => {\n let state = stateWithImageSelected();\n const applied = getCommand(state, 'toggleImageCaption')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n const out = docToHtml(state.doc);\n expect(out).to.include('<figure');\n expect(out).to.include('pic'); // alt prefills the caption\n });\n\n it('toggleImageCaption converts a figure back to an inline image', () => {\n let state = stateWithAllSelected(\n '<figure><img src=\"https://x.co/i.png\"><figcaption>cap</figcaption></figure>'\n );\n // Cursor is inside the caption — selectedImageInfo resolves the figure.\n const applied = getCommand(state, 'toggleImageCaption')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n const out = docToHtml(state.doc);\n expect(out).to.not.include('<figure');\n expect(out).to.include('<img');\n });\n\n it('setImageAlign promotes an inline image to an aligned figure', () => {\n let state = stateWithImageSelected();\n getCommand(state, 'setImageAlign', { align: 'center' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('data-align=\"center\"');\n });\n\n it('setImageWidth writes the width attr', () => {\n let state = stateWithImageSelected();\n getCommand(state, 'setImageWidth', { width: 320 })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('width: 320px');\n });\n\n it('deleteImage removes the selected image', () => {\n let state = stateWithImageSelected();\n getCommand(state, 'deleteImage')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('<img');\n });\n});\n\ndescribe('paste from Office', () => {\n it('detects Word and Google Docs clipboard HTML', () => {\n expect(isOfficeHtml('<p class=\"MsoNormal\">x</p>')).to.equal(true);\n expect(isOfficeHtml('<b id=\"docs-internal-guid-abc\"><p>x</p></b>')).to.equal(true);\n expect(isOfficeHtml('<p>plain</p>')).to.equal(false);\n });\n\n it('converts Word list paragraphs into a real bullet list', () => {\n const word =\n '<p class=\"MsoListParagraph\" style=\"mso-list:l0 level1 lfo1\">' +\n '<span style=\"mso-list:Ignore\">·<span> </span></span>Alpha</p>' +\n '<p class=\"MsoListParagraph\" style=\"mso-list:l0 level1 lfo1\">' +\n '<span style=\"mso-list:Ignore\">·<span> </span></span>Beta</p>';\n const out = cleanOfficeHtml(word);\n expect(out).to.include('<ul>');\n expect(out).to.include('Alpha');\n expect(out).to.include('Beta');\n expect(out).to.not.include('mso-list');\n });\n\n it('converts numbered Word paragraphs into an ordered list with nesting', () => {\n const word =\n '<p style=\"mso-list:l0 level1 lfo1\"><span style=\"mso-list:Ignore\">1.</span>One</p>' +\n '<p style=\"mso-list:l0 level2 lfo1\"><span style=\"mso-list:Ignore\">a.</span>Nested</p>' +\n '<p style=\"mso-list:l0 level1 lfo1\"><span style=\"mso-list:Ignore\">2.</span>Two</p>';\n const out = cleanOfficeHtml(word);\n expect(out.indexOf('<ol>')).to.be.greaterThan(-1);\n // Nested list sits inside the first item.\n expect(out.indexOf('Nested')).to.be.greaterThan(out.indexOf('One'));\n expect(out.indexOf('Two')).to.be.greaterThan(out.indexOf('Nested'));\n });\n\n it('unwraps the Google Docs bold guid wrapper', () => {\n const gdocs =\n '<b id=\"docs-internal-guid-x\" style=\"font-weight:normal\"><p>hello</p></b>';\n const out = cleanOfficeHtml(gdocs);\n expect(out).to.equal('<p>hello</p>');\n });\n\n it('drops conditional comments and o:p tags', () => {\n // Downlevel-hidden conditional: the marker content is inside the comment.\n const word = '<p><!--[if !supportLists]>junk<![endif]-->text<o:p></o:p></p>';\n const out = cleanOfficeHtml(word);\n expect(out).to.not.include('junk');\n expect(out).to.include('text');\n });\n});\n\ndescribe('line height', () => {\n it('sets and clears line height on textblocks', () => {\n let state = stateWithAllSelected('<p>hello</p>');\n getCommand(state, 'lineHeight', { lineHeight: '1.5' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('line-height: 1.5');\n expect(computeToolbarState(state).lineHeight).to.equal('1.5');\n getCommand(state, 'lineHeight', { lineHeight: null })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>hello</p>');\n });\n\n it('parses line-height styles, converting percentages', () => {\n const doc = htmlToDoc(defaultSchema, '<p style=\"line-height: 150%\">a</p>');\n expect(docToHtml(doc)).to.include('line-height: 1.5');\n });\n\n it('survives the sanitizer', () => {\n expect(sanitizeHtml('<p style=\"line-height: 2\">a</p>')).to.include('line-height: 2');\n });\n\n it('is cleared by clearFormatting', () => {\n let state = stateWithAllSelected('<p style=\"line-height: 2\">hello</p>');\n getCommand(state, 'clearFormatting')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>hello</p>');\n });\n});\n\ndescribe('bookmarks', () => {\n it('inserts a bookmark anchor at the cursor', () => {\n let state = createEditorState({ doc: htmlToDoc(defaultSchema, '<p>hello</p>') });\n state = state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, 1))\n );\n getCommand(state, 'insertBookmark', { id: 'intro' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><a id=\"intro\" data-bookmark=\"true\"></a>hello</p>');\n });\n\n it('rejects empty ids', () => {\n const state = createEditorState({ doc: htmlToDoc(defaultSchema, '<p>hello</p>') });\n expect(getCommand(state, 'insertBookmark', { id: ' ' })!(state)).to.equal(false);\n });\n\n it('round-trips id and legacy name anchors, but not links', () => {\n const doc = htmlToDoc(\n defaultSchema,\n '<p><a id=\"one\"></a>x<a name=\"two\"></a>y<a href=\"https://a.b\">link</a></p>'\n );\n const out = docToHtml(doc);\n expect(out).to.include('<a id=\"one\" data-bookmark=\"true\"></a>');\n expect(out).to.include('<a id=\"two\" data-bookmark=\"true\"></a>');\n expect(out).to.include('<a href=\"https://a.b\">link</a>');\n });\n});\n\ndescribe('layout tables', () => {\n const table = '<table><tr><td><p>a</p></td></tr></table>';\n\n function stateInTable(html: string) {\n const doc = htmlToDoc(defaultSchema, html);\n const state = createEditorState({ doc });\n // Place the cursor inside the first cell's paragraph.\n let pos = 0;\n state.doc.descendants((node, p) => {\n if (!pos && node.isTextblock) pos = p + 1;\n return !pos;\n });\n return state.apply(state.tr.setSelection(TextSelection.create(state.doc, pos)));\n }\n\n it('toggles the surrounding table into layout mode and back', () => {\n let state = stateInTable(table);\n getCommand(state, 'toggleLayoutTable')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<table role=\"presentation\" data-layout=\"true\">');\n expect(computeToolbarState(state).tableLayout).to.equal(true);\n getCommand(state, 'toggleLayoutTable')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('data-layout');\n });\n\n it('parses role=\"presentation\" tables as layout tables', () => {\n const doc = htmlToDoc(\n defaultSchema,\n '<table role=\"presentation\"><tr><td><p>a</p></td></tr></table>'\n );\n expect(docToHtml(doc)).to.include('role=\"presentation\"');\n });\n\n it('returns false outside a table', () => {\n const state = stateWithAllSelected('<p>hello</p>');\n expect(getCommand(state, 'toggleLayoutTable')!(state)).to.equal(false);\n });\n});\n\ndescribe('multi-level lists', () => {\n const nested =\n '<ol data-list-style=\"multilevel\"><li><p>one</p><ol><li><p>deep</p></li></ol></li></ol>';\n\n it('round-trips the multilevel marker', () => {\n const doc = htmlToDoc(defaultSchema, nested);\n expect(docToHtml(doc)).to.include('data-list-style=\"multilevel\"');\n });\n\n it('survives the sanitizer', () => {\n expect(sanitizeHtml(nested)).to.include('data-list-style=\"multilevel\"');\n });\n\n it('applies multilevel to the outermost ordered list from a nested item', () => {\n const html = '<ol><li><p>one</p><ol><li><p>deep</p></li></ol></li></ol>';\n let state = createEditorState({ doc: htmlToDoc(defaultSchema, html) });\n let pos = 0;\n state.doc.descendants((node, p) => {\n if (node.isTextblock && node.textContent === 'deep') pos = p + 1;\n return pos === 0;\n });\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, pos)));\n getCommand(state, 'setListStyle', { style: 'multilevel' })!(state, tr => {\n state = state.apply(tr);\n });\n const out = docToHtml(state.doc);\n // The outer list carries the marker, not the nested one.\n expect(out.startsWith('<ol data-list-style=\"multilevel\">')).to.equal(true);\n expect(out.indexOf('data-list-style')).to.equal(out.lastIndexOf('data-list-style'));\n // The toolbar reports it from the nested cursor, and clearing removes it.\n expect(computeToolbarState(state).listStyle).to.equal('multilevel');\n getCommand(state, 'setListStyle', { style: null })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('data-list-style');\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { expect } from '@open-wc/testing';
|
|
2
|
+
import { TextSelection } from 'prosemirror-state';
|
|
3
|
+
import { defaultSchema, htmlToDoc, docToHtml, createEditorState, getCommand, isExcelHtml, isOfficeHtml, cleanOfficeHtml, armFormatPainter, applyFormatPainter, isFormatPainterArmed, disarmFormatPainter, } from './index';
|
|
4
|
+
/** Editor state with the whole document selected. */
|
|
5
|
+
function stateWithAllSelected(html) {
|
|
6
|
+
const doc = htmlToDoc(defaultSchema, html);
|
|
7
|
+
const state = createEditorState({ doc });
|
|
8
|
+
const selection = TextSelection.create(state.doc, 1, state.doc.content.size - 1);
|
|
9
|
+
return state.apply(state.tr.setSelection(selection));
|
|
10
|
+
}
|
|
11
|
+
/** Runs a command against a state and returns the resulting state. */
|
|
12
|
+
function run(state, name, attrs) {
|
|
13
|
+
let next = state;
|
|
14
|
+
const command = getCommand(state, name, attrs);
|
|
15
|
+
command?.(state, tr => {
|
|
16
|
+
next = state.apply(tr);
|
|
17
|
+
});
|
|
18
|
+
return next;
|
|
19
|
+
}
|
|
20
|
+
describe('changeCase command', () => {
|
|
21
|
+
it('uppercases the selection', () => {
|
|
22
|
+
const state = run(stateWithAllSelected('<p>Hello world</p>'), 'changeCase', { textCase: 'upper' });
|
|
23
|
+
expect(docToHtml(state.doc)).to.equal('<p>HELLO WORLD</p>');
|
|
24
|
+
});
|
|
25
|
+
it('lowercases the selection', () => {
|
|
26
|
+
const state = run(stateWithAllSelected('<p>HELLO</p>'), 'changeCase', { textCase: 'lower' });
|
|
27
|
+
expect(docToHtml(state.doc)).to.equal('<p>hello</p>');
|
|
28
|
+
});
|
|
29
|
+
it('title-cases the selection', () => {
|
|
30
|
+
const state = run(stateWithAllSelected('<p>hello brave world</p>'), 'changeCase', { textCase: 'title' });
|
|
31
|
+
expect(docToHtml(state.doc)).to.equal('<p>Hello Brave World</p>');
|
|
32
|
+
});
|
|
33
|
+
it('sentence-cases the selection', () => {
|
|
34
|
+
const state = run(stateWithAllSelected('<p>hello. there is more. ok</p>'), 'changeCase', {
|
|
35
|
+
textCase: 'sentence',
|
|
36
|
+
});
|
|
37
|
+
expect(docToHtml(state.doc)).to.equal('<p>Hello. There is more. Ok</p>');
|
|
38
|
+
});
|
|
39
|
+
it('preserves marks across the transform', () => {
|
|
40
|
+
const state = run(stateWithAllSelected('<p><strong>bold</strong> plain</p>'), 'changeCase', {
|
|
41
|
+
textCase: 'upper',
|
|
42
|
+
});
|
|
43
|
+
expect(docToHtml(state.doc)).to.equal('<p><strong>BOLD</strong> PLAIN</p>');
|
|
44
|
+
});
|
|
45
|
+
it('is a no-op with an empty selection', () => {
|
|
46
|
+
const doc = htmlToDoc(defaultSchema, '<p>hello</p>');
|
|
47
|
+
const state = createEditorState({ doc });
|
|
48
|
+
expect(getCommand(state, 'changeCase', { textCase: 'upper' })(state, () => { })).to.be.false;
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('merge field', () => {
|
|
52
|
+
it('inserts a merge-field node', () => {
|
|
53
|
+
const doc = htmlToDoc(defaultSchema, '<p></p>');
|
|
54
|
+
let state = createEditorState({ doc });
|
|
55
|
+
state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1)));
|
|
56
|
+
const state2 = run(state, 'insertMergeField', { id: 'first_name', label: 'First name' });
|
|
57
|
+
const out = docToHtml(state2.doc);
|
|
58
|
+
expect(out).to.include('data-merge-field="first_name"');
|
|
59
|
+
expect(out).to.include('First name');
|
|
60
|
+
});
|
|
61
|
+
it('round-trips through HTML', () => {
|
|
62
|
+
const html = '<p><span data-merge-field="email" data-merge-label="Email">Email</span></p>';
|
|
63
|
+
expect(docToHtml(htmlToDoc(defaultSchema, html))).to.include('data-merge-field="email"');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('math', () => {
|
|
67
|
+
it('inserts a math node', () => {
|
|
68
|
+
const doc = htmlToDoc(defaultSchema, '<p></p>');
|
|
69
|
+
let state = createEditorState({ doc });
|
|
70
|
+
state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1)));
|
|
71
|
+
const state2 = run(state, 'insertMath', { latex: 'a^2 + b^2', mathDisplay: 'block' });
|
|
72
|
+
const out = docToHtml(state2.doc);
|
|
73
|
+
expect(out).to.include('data-math="a^2 + b^2"');
|
|
74
|
+
expect(out).to.include('data-math-display="block"');
|
|
75
|
+
});
|
|
76
|
+
it('round-trips through HTML', () => {
|
|
77
|
+
const html = '<p><span data-math="x/y" data-math-display="inline">x/y</span></p>';
|
|
78
|
+
expect(docToHtml(htmlToDoc(defaultSchema, html))).to.include('data-math="x/y"');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('format painter', () => {
|
|
82
|
+
it('copies marks from one selection and applies to the next', () => {
|
|
83
|
+
// <p>BOLD plain</p> — arm over the bold word, then apply to "plain".
|
|
84
|
+
const doc = htmlToDoc(defaultSchema, '<p><strong>bold</strong> plain</p>');
|
|
85
|
+
let state = createEditorState({ doc });
|
|
86
|
+
// Select the bold word (positions 1..5).
|
|
87
|
+
state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1, 5)));
|
|
88
|
+
state = state.apply(armFormatPainter(state));
|
|
89
|
+
expect(isFormatPainterArmed(state)).to.be.true;
|
|
90
|
+
// Select "plain" (positions 6..11) and apply.
|
|
91
|
+
state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 6, 11)));
|
|
92
|
+
const applyTr = applyFormatPainter(state);
|
|
93
|
+
expect(applyTr).to.not.be.null;
|
|
94
|
+
state = state.apply(applyTr);
|
|
95
|
+
// "plain" (6..11) becomes bold; the space at 5 stays plain, so the two
|
|
96
|
+
// bold runs render as separate <strong> tags.
|
|
97
|
+
expect(docToHtml(state.doc)).to.equal('<p><strong>bold</strong> <strong>plain</strong></p>');
|
|
98
|
+
expect(isFormatPainterArmed(state)).to.be.false;
|
|
99
|
+
});
|
|
100
|
+
it('disarms without applying', () => {
|
|
101
|
+
const doc = htmlToDoc(defaultSchema, '<p><strong>bold</strong></p>');
|
|
102
|
+
let state = createEditorState({ doc });
|
|
103
|
+
state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1, 5)));
|
|
104
|
+
state = state.apply(armFormatPainter(state));
|
|
105
|
+
state = state.apply(disarmFormatPainter(state));
|
|
106
|
+
expect(isFormatPainterArmed(state)).to.be.false;
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe('Excel paste', () => {
|
|
110
|
+
const excel = '<html xmlns:x="urn:schemas-microsoft-com:office:excel"><body>' +
|
|
111
|
+
'<table><tr>' +
|
|
112
|
+
'<td align="center" bgcolor="#ffff00" style="mso-number-format:General">Total</td>' +
|
|
113
|
+
'</tr></table></body></html>';
|
|
114
|
+
it('is detected as Excel and Office HTML', () => {
|
|
115
|
+
expect(isExcelHtml(excel)).to.be.true;
|
|
116
|
+
expect(isOfficeHtml(excel)).to.be.true;
|
|
117
|
+
});
|
|
118
|
+
it('preserves cell background and alignment', () => {
|
|
119
|
+
const cleaned = cleanOfficeHtml(excel);
|
|
120
|
+
const doc = htmlToDoc(defaultSchema, cleaned);
|
|
121
|
+
const out = docToHtml(doc);
|
|
122
|
+
expect(out).to.include('Total');
|
|
123
|
+
// Alignment survives on the wrapped paragraph.
|
|
124
|
+
expect(out).to.match(/text-align:\s*center/);
|
|
125
|
+
// Background survives on the cell.
|
|
126
|
+
expect(out.toLowerCase()).to.include('background-color');
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=productivity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"productivity.test.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/productivity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACL,aAAa,EACb,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAEjB,qDAAqD;AACrD,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACjF,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,sEAAsE;AACtE,SAAS,GAAG,CAAC,KAA8C,EAAE,IAAsC,EAAE,KAAwC;IAC3I,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE;QACpB,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG,GAAG,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACnG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG,GAAG,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7F,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,oBAAoB,CAAC,0BAA0B,CAAC,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACzG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,KAAK,GAAG,GAAG,CAAC,oBAAoB,CAAC,iCAAiC,CAAC,EAAE,YAAY,EAAE;YACvF,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,oBAAoB,CAAC,oCAAoC,CAAC,EAAE,YAAY,EAAE;YAC1F,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACvC,KAAK,GAAG,KAAK,CAAC,KAAK,CACjB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAC1D,CAAC;QACF,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QACzF,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,6EAA6E,CAAC;QAC3F,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACvC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QACtF,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,oEAAoE,CAAC;QAClF,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,qEAAqE;QACrE,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,oCAAoC,CAAC,CAAC;QAC3E,IAAI,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACvC,yCAAyC;QACzC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAE/C,8CAA8C;QAC9C,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;QAC/B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAQ,CAAC,CAAC;QAE9B,uEAAuE;QACvE,8CAA8C;QAC9C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC7F,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,8BAA8B,CAAC,CAAC;QACrE,IAAI,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACvC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAE,CAAC,CAAC;QAC9C,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,KAAK,GACT,+DAA+D;QAC/D,aAAa;QACb,mFAAmF;QACnF,6BAA6B,CAAC;IAEhC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACtC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,+CAA+C;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC7C,mCAAmC;QACnC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { TextSelection } from 'prosemirror-state';\nimport {\n defaultSchema,\n htmlToDoc,\n docToHtml,\n createEditorState,\n getCommand,\n isExcelHtml,\n isOfficeHtml,\n cleanOfficeHtml,\n armFormatPainter,\n applyFormatPainter,\n isFormatPainterArmed,\n disarmFormatPainter,\n} from './index';\n\n/** Editor state with the whole document selected. */\nfunction stateWithAllSelected(html: string) {\n const doc = htmlToDoc(defaultSchema, html);\n const state = createEditorState({ doc });\n const selection = TextSelection.create(state.doc, 1, state.doc.content.size - 1);\n return state.apply(state.tr.setSelection(selection));\n}\n\n/** Runs a command against a state and returns the resulting state. */\nfunction run(state: ReturnType<typeof stateWithAllSelected>, name: Parameters<typeof getCommand>[1], attrs?: Parameters<typeof getCommand>[2]) {\n let next = state;\n const command = getCommand(state, name, attrs);\n command?.(state, tr => {\n next = state.apply(tr);\n });\n return next;\n}\n\ndescribe('changeCase command', () => {\n it('uppercases the selection', () => {\n const state = run(stateWithAllSelected('<p>Hello world</p>'), 'changeCase', { textCase: 'upper' });\n expect(docToHtml(state.doc)).to.equal('<p>HELLO WORLD</p>');\n });\n\n it('lowercases the selection', () => {\n const state = run(stateWithAllSelected('<p>HELLO</p>'), 'changeCase', { textCase: 'lower' });\n expect(docToHtml(state.doc)).to.equal('<p>hello</p>');\n });\n\n it('title-cases the selection', () => {\n const state = run(stateWithAllSelected('<p>hello brave world</p>'), 'changeCase', { textCase: 'title' });\n expect(docToHtml(state.doc)).to.equal('<p>Hello Brave World</p>');\n });\n\n it('sentence-cases the selection', () => {\n const state = run(stateWithAllSelected('<p>hello. there is more. ok</p>'), 'changeCase', {\n textCase: 'sentence',\n });\n expect(docToHtml(state.doc)).to.equal('<p>Hello. There is more. Ok</p>');\n });\n\n it('preserves marks across the transform', () => {\n const state = run(stateWithAllSelected('<p><strong>bold</strong> plain</p>'), 'changeCase', {\n textCase: 'upper',\n });\n expect(docToHtml(state.doc)).to.equal('<p><strong>BOLD</strong> PLAIN</p>');\n });\n\n it('is a no-op with an empty selection', () => {\n const doc = htmlToDoc(defaultSchema, '<p>hello</p>');\n const state = createEditorState({ doc });\n expect(getCommand(state, 'changeCase', { textCase: 'upper' })!(state, () => {})).to.be.false;\n });\n});\n\ndescribe('merge field', () => {\n it('inserts a merge-field node', () => {\n const doc = htmlToDoc(defaultSchema, '<p></p>');\n let state = createEditorState({ doc });\n state = state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, 1))\n );\n const state2 = run(state, 'insertMergeField', { id: 'first_name', label: 'First name' });\n const out = docToHtml(state2.doc);\n expect(out).to.include('data-merge-field=\"first_name\"');\n expect(out).to.include('First name');\n });\n\n it('round-trips through HTML', () => {\n const html = '<p><span data-merge-field=\"email\" data-merge-label=\"Email\">Email</span></p>';\n expect(docToHtml(htmlToDoc(defaultSchema, html))).to.include('data-merge-field=\"email\"');\n });\n});\n\ndescribe('math', () => {\n it('inserts a math node', () => {\n const doc = htmlToDoc(defaultSchema, '<p></p>');\n let state = createEditorState({ doc });\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1)));\n const state2 = run(state, 'insertMath', { latex: 'a^2 + b^2', mathDisplay: 'block' });\n const out = docToHtml(state2.doc);\n expect(out).to.include('data-math=\"a^2 + b^2\"');\n expect(out).to.include('data-math-display=\"block\"');\n });\n\n it('round-trips through HTML', () => {\n const html = '<p><span data-math=\"x/y\" data-math-display=\"inline\">x/y</span></p>';\n expect(docToHtml(htmlToDoc(defaultSchema, html))).to.include('data-math=\"x/y\"');\n });\n});\n\ndescribe('format painter', () => {\n it('copies marks from one selection and applies to the next', () => {\n // <p>BOLD plain</p> — arm over the bold word, then apply to \"plain\".\n const doc = htmlToDoc(defaultSchema, '<p><strong>bold</strong> plain</p>');\n let state = createEditorState({ doc });\n // Select the bold word (positions 1..5).\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1, 5)));\n state = state.apply(armFormatPainter(state)!);\n expect(isFormatPainterArmed(state)).to.be.true;\n\n // Select \"plain\" (positions 6..11) and apply.\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 6, 11)));\n const applyTr = applyFormatPainter(state);\n expect(applyTr).to.not.be.null;\n state = state.apply(applyTr!);\n\n // \"plain\" (6..11) becomes bold; the space at 5 stays plain, so the two\n // bold runs render as separate <strong> tags.\n expect(docToHtml(state.doc)).to.equal('<p><strong>bold</strong> <strong>plain</strong></p>');\n expect(isFormatPainterArmed(state)).to.be.false;\n });\n\n it('disarms without applying', () => {\n const doc = htmlToDoc(defaultSchema, '<p><strong>bold</strong></p>');\n let state = createEditorState({ doc });\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1, 5)));\n state = state.apply(armFormatPainter(state)!);\n state = state.apply(disarmFormatPainter(state));\n expect(isFormatPainterArmed(state)).to.be.false;\n });\n});\n\ndescribe('Excel paste', () => {\n const excel =\n '<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\"><body>' +\n '<table><tr>' +\n '<td align=\"center\" bgcolor=\"#ffff00\" style=\"mso-number-format:General\">Total</td>' +\n '</tr></table></body></html>';\n\n it('is detected as Excel and Office HTML', () => {\n expect(isExcelHtml(excel)).to.be.true;\n expect(isOfficeHtml(excel)).to.be.true;\n });\n\n it('preserves cell background and alignment', () => {\n const cleaned = cleanOfficeHtml(excel);\n const doc = htmlToDoc(defaultSchema, cleaned);\n const out = docToHtml(doc);\n expect(out).to.include('Total');\n // Alignment survives on the wrapped paragraph.\n expect(out).to.match(/text-align:\\s*center/);\n // Background survives on the cell.\n expect(out.toLowerCase()).to.include('background-color');\n });\n});\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML sanitization pre-pass. The ProseMirror schema is the real whitelist —
|
|
3
|
+
* anything it can't parse is dropped — but this pass removes actively
|
|
4
|
+
* dangerous content (scripts, event handlers, javascript: URLs) before the
|
|
5
|
+
* string ever touches a live DOM, and strips style declarations down to the
|
|
6
|
+
* set the schema understands.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isSafeUrl(url: string, allowDataImage?: boolean): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Sanitizes an HTML string. Parsing happens in an inert document created by
|
|
11
|
+
* DOMParser, so embedded scripts never execute and images never load.
|
|
12
|
+
*/
|
|
13
|
+
export declare function sanitizeHtml(html: string): string;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML sanitization pre-pass. The ProseMirror schema is the real whitelist —
|
|
3
|
+
* anything it can't parse is dropped — but this pass removes actively
|
|
4
|
+
* dangerous content (scripts, event handlers, javascript: URLs) before the
|
|
5
|
+
* string ever touches a live DOM, and strips style declarations down to the
|
|
6
|
+
* set the schema understands.
|
|
7
|
+
*/
|
|
8
|
+
import { isAllowedEmbedSrc } from './plugins/embeds';
|
|
9
|
+
/** Elements removed together with their content. */
|
|
10
|
+
const DROP_WITH_CONTENT = new Set([
|
|
11
|
+
'script', 'style', 'frame', 'frameset', 'object', 'embed',
|
|
12
|
+
'applet', 'form', 'input', 'textarea', 'select', 'button', 'meta', 'link',
|
|
13
|
+
'base', 'title', 'noscript', 'template', 'svg', 'math', 'canvas', 'audio',
|
|
14
|
+
'video', 'dialog', 'slot',
|
|
15
|
+
]);
|
|
16
|
+
/** Elements kept as-is (with filtered attributes). Extended in later phases. */
|
|
17
|
+
const ALLOWED_TAGS = new Set([
|
|
18
|
+
'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'ul', 'ol', 'li',
|
|
19
|
+
'br', 'hr', 'a', 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'del',
|
|
20
|
+
'span', 'code', 'sub', 'sup', 'div', 'font',
|
|
21
|
+
'pre', 'figure', 'figcaption', 'img', 'iframe',
|
|
22
|
+
'table', 'thead', 'tbody', 'tfoot', 'tr', 'td', 'th', 'colgroup', 'col',
|
|
23
|
+
]);
|
|
24
|
+
/** Attributes allowed per tag (on top of GLOBAL_ATTRS). */
|
|
25
|
+
const TAG_ATTRS = {
|
|
26
|
+
a: new Set(['href', 'title', 'target', 'rel', 'id', 'name', 'data-bookmark']),
|
|
27
|
+
table: new Set(['role', 'data-layout']),
|
|
28
|
+
ol: new Set(['start', 'type', 'data-list-style']),
|
|
29
|
+
ul: new Set(['data-task-list']),
|
|
30
|
+
figure: new Set(['data-align']),
|
|
31
|
+
li: new Set(['data-task-item', 'data-checked']),
|
|
32
|
+
span: new Set([
|
|
33
|
+
'data-mention-trigger', 'data-mention-key', 'data-mention-label',
|
|
34
|
+
'data-merge-field', 'data-merge-label', 'data-math', 'data-math-display',
|
|
35
|
+
]),
|
|
36
|
+
pre: new Set(['data-language']),
|
|
37
|
+
img: new Set(['src', 'alt', 'title', 'width', 'height']),
|
|
38
|
+
td: new Set(['colspan', 'rowspan', 'data-colwidth']),
|
|
39
|
+
th: new Set(['colspan', 'rowspan', 'data-colwidth']),
|
|
40
|
+
col: new Set(['span', 'width']),
|
|
41
|
+
div: new Set(['data-embed-provider', 'data-width', 'data-align']),
|
|
42
|
+
iframe: new Set(['src', 'title', 'frameborder', 'allowfullscreen', 'allow']),
|
|
43
|
+
};
|
|
44
|
+
const GLOBAL_ATTRS = new Set(['style', 'align']);
|
|
45
|
+
/** Style declarations the schema can represent. Everything else is noise. */
|
|
46
|
+
const ALLOWED_STYLES = new Set([
|
|
47
|
+
'color', 'background-color', 'font-family', 'font-size', 'font-style',
|
|
48
|
+
'font-weight', 'text-align', 'text-decoration', 'text-decoration-line',
|
|
49
|
+
'vertical-align', 'margin-left', 'margin-inline-start', 'list-style-type',
|
|
50
|
+
'line-height',
|
|
51
|
+
]);
|
|
52
|
+
const SAFE_URL_PROTOCOLS = ['http:', 'https:', 'mailto:', 'tel:', 'ftp:'];
|
|
53
|
+
export function isSafeUrl(url, allowDataImage = false) {
|
|
54
|
+
const trimmed = url.trim();
|
|
55
|
+
if (trimmed === '')
|
|
56
|
+
return false;
|
|
57
|
+
// Relative URLs and fragments have no protocol — safe.
|
|
58
|
+
if (/^(#|\/|\.\/|\.\.\/)/.test(trimmed))
|
|
59
|
+
return true;
|
|
60
|
+
const match = /^([a-z][a-z0-9+.-]*):/i.exec(trimmed);
|
|
61
|
+
if (!match)
|
|
62
|
+
return true;
|
|
63
|
+
const protocol = `${match[1].toLowerCase()}:`;
|
|
64
|
+
if (SAFE_URL_PROTOCOLS.includes(protocol))
|
|
65
|
+
return true;
|
|
66
|
+
if (allowDataImage && protocol === 'data:') {
|
|
67
|
+
// Raster images only — data:image/svg+xml can carry scripts.
|
|
68
|
+
return /^data:image\/(png|gif|jpe?g|webp|avif|bmp);/i.test(trimmed);
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
/** Size styles allowed only where they are part of the document model. */
|
|
73
|
+
const SIZED_TAGS = {
|
|
74
|
+
img: new Set(['width', 'height']),
|
|
75
|
+
figure: new Set(['width', 'margin-right']),
|
|
76
|
+
div: new Set(['width', 'max-width']),
|
|
77
|
+
};
|
|
78
|
+
function filterStyle(value, tag) {
|
|
79
|
+
const extra = SIZED_TAGS[tag];
|
|
80
|
+
return value
|
|
81
|
+
.split(';')
|
|
82
|
+
.map(decl => decl.trim())
|
|
83
|
+
.filter(decl => {
|
|
84
|
+
const name = decl.slice(0, decl.indexOf(':')).trim().toLowerCase();
|
|
85
|
+
if (!ALLOWED_STYLES.has(name) && !(extra && extra.has(name)))
|
|
86
|
+
return false;
|
|
87
|
+
// Defense in depth: CSS url()/expression() smuggling.
|
|
88
|
+
return !/url\s*\(|expression\s*\(/i.test(decl);
|
|
89
|
+
})
|
|
90
|
+
.join('; ');
|
|
91
|
+
}
|
|
92
|
+
function sanitizeElement(el) {
|
|
93
|
+
const tag = el.tagName.toLowerCase();
|
|
94
|
+
const allowed = TAG_ATTRS[tag];
|
|
95
|
+
for (const attr of Array.from(el.attributes)) {
|
|
96
|
+
const name = attr.name.toLowerCase();
|
|
97
|
+
const keep = (GLOBAL_ATTRS.has(name) || (allowed !== undefined && allowed.has(name))) &&
|
|
98
|
+
!name.startsWith('on');
|
|
99
|
+
if (!keep) {
|
|
100
|
+
el.removeAttribute(attr.name);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (name === 'style') {
|
|
104
|
+
const filtered = filterStyle(attr.value, tag);
|
|
105
|
+
if (filtered)
|
|
106
|
+
el.setAttribute('style', filtered);
|
|
107
|
+
else
|
|
108
|
+
el.removeAttribute('style');
|
|
109
|
+
}
|
|
110
|
+
else if (name === 'href' || name === 'src') {
|
|
111
|
+
// Raster data: URLs are allowed on images only.
|
|
112
|
+
if (!isSafeUrl(attr.value, tag === 'img'))
|
|
113
|
+
el.removeAttribute(attr.name);
|
|
114
|
+
}
|
|
115
|
+
else if (name === 'target') {
|
|
116
|
+
if (attr.value === '_blank')
|
|
117
|
+
el.setAttribute('rel', 'noopener noreferrer');
|
|
118
|
+
else
|
|
119
|
+
el.removeAttribute('target');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function walk(node) {
|
|
124
|
+
for (const child of Array.from(node.children)) {
|
|
125
|
+
const tag = child.tagName.toLowerCase();
|
|
126
|
+
if (DROP_WITH_CONTENT.has(tag)) {
|
|
127
|
+
child.remove();
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
// iframes are allowed ONLY for allowlisted embed providers.
|
|
131
|
+
if (tag === 'iframe' && !isAllowedEmbedSrc(child.getAttribute('src') ?? '')) {
|
|
132
|
+
child.remove();
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (!ALLOWED_TAGS.has(tag)) {
|
|
136
|
+
// Unknown wrapper (article, section, table for now, …): keep its
|
|
137
|
+
// content, drop the element itself.
|
|
138
|
+
walk(child);
|
|
139
|
+
child.replaceWith(...Array.from(child.childNodes));
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
sanitizeElement(child);
|
|
143
|
+
walk(child);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Sanitizes an HTML string. Parsing happens in an inert document created by
|
|
148
|
+
* DOMParser, so embedded scripts never execute and images never load.
|
|
149
|
+
*/
|
|
150
|
+
export function sanitizeHtml(html) {
|
|
151
|
+
const doc = new DOMParser().parseFromString(html, 'text/html');
|
|
152
|
+
walk(doc.body);
|
|
153
|
+
return doc.body.innerHTML;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/sanitize.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * HTML sanitization pre-pass. The ProseMirror schema is the real whitelist —\n * anything it can't parse is dropped — but this pass removes actively\n * dangerous content (scripts, event handlers, javascript: URLs) before the\n * string ever touches a live DOM, and strips style declarations down to the\n * set the schema understands.\n */\n\nimport { isAllowedEmbedSrc } from './plugins/embeds';\n\n/** Elements removed together with their content. */\nconst DROP_WITH_CONTENT = new Set([\n 'script', 'style', 'frame', 'frameset', 'object', 'embed',\n 'applet', 'form', 'input', 'textarea', 'select', 'button', 'meta', 'link',\n 'base', 'title', 'noscript', 'template', 'svg', 'math', 'canvas', 'audio',\n 'video', 'dialog', 'slot',\n]);\n\n/** Elements kept as-is (with filtered attributes). Extended in later phases. */\nconst ALLOWED_TAGS = new Set([\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'ul', 'ol', 'li',\n 'br', 'hr', 'a', 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'del',\n 'span', 'code', 'sub', 'sup', 'div', 'font',\n 'pre', 'figure', 'figcaption', 'img', 'iframe',\n 'table', 'thead', 'tbody', 'tfoot', 'tr', 'td', 'th', 'colgroup', 'col',\n]);\n\n/** Attributes allowed per tag (on top of GLOBAL_ATTRS). */\nconst TAG_ATTRS: Record<string, Set<string>> = {\n a: new Set(['href', 'title', 'target', 'rel', 'id', 'name', 'data-bookmark']),\n table: new Set(['role', 'data-layout']),\n ol: new Set(['start', 'type', 'data-list-style']),\n ul: new Set(['data-task-list']),\n figure: new Set(['data-align']),\n li: new Set(['data-task-item', 'data-checked']),\n span: new Set([\n 'data-mention-trigger', 'data-mention-key', 'data-mention-label',\n 'data-merge-field', 'data-merge-label', 'data-math', 'data-math-display',\n ]),\n pre: new Set(['data-language']),\n img: new Set(['src', 'alt', 'title', 'width', 'height']),\n td: new Set(['colspan', 'rowspan', 'data-colwidth']),\n th: new Set(['colspan', 'rowspan', 'data-colwidth']),\n col: new Set(['span', 'width']),\n div: new Set(['data-embed-provider', 'data-width', 'data-align']),\n iframe: new Set(['src', 'title', 'frameborder', 'allowfullscreen', 'allow']),\n};\n\nconst GLOBAL_ATTRS = new Set(['style', 'align']);\n\n/** Style declarations the schema can represent. Everything else is noise. */\nconst ALLOWED_STYLES = new Set([\n 'color', 'background-color', 'font-family', 'font-size', 'font-style',\n 'font-weight', 'text-align', 'text-decoration', 'text-decoration-line',\n 'vertical-align', 'margin-left', 'margin-inline-start', 'list-style-type',\n 'line-height',\n]);\n\nconst SAFE_URL_PROTOCOLS = ['http:', 'https:', 'mailto:', 'tel:', 'ftp:'];\n\nexport function isSafeUrl(url: string, allowDataImage = false): boolean {\n const trimmed = url.trim();\n if (trimmed === '') return false;\n // Relative URLs and fragments have no protocol — safe.\n if (/^(#|\\/|\\.\\/|\\.\\.\\/)/.test(trimmed)) return true;\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(trimmed);\n if (!match) return true;\n const protocol = `${match[1].toLowerCase()}:`;\n if (SAFE_URL_PROTOCOLS.includes(protocol)) return true;\n if (allowDataImage && protocol === 'data:') {\n // Raster images only — data:image/svg+xml can carry scripts.\n return /^data:image\\/(png|gif|jpe?g|webp|avif|bmp);/i.test(trimmed);\n }\n return false;\n}\n\n/** Size styles allowed only where they are part of the document model. */\nconst SIZED_TAGS: Record<string, Set<string>> = {\n img: new Set(['width', 'height']),\n figure: new Set(['width', 'margin-right']),\n div: new Set(['width', 'max-width']),\n};\n\nfunction filterStyle(value: string, tag: string): string {\n const extra = SIZED_TAGS[tag];\n return value\n .split(';')\n .map(decl => decl.trim())\n .filter(decl => {\n const name = decl.slice(0, decl.indexOf(':')).trim().toLowerCase();\n if (!ALLOWED_STYLES.has(name) && !(extra && extra.has(name))) return false;\n // Defense in depth: CSS url()/expression() smuggling.\n return !/url\\s*\\(|expression\\s*\\(/i.test(decl);\n })\n .join('; ');\n}\n\nfunction sanitizeElement(el: Element): void {\n const tag = el.tagName.toLowerCase();\n const allowed = TAG_ATTRS[tag];\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const keep =\n (GLOBAL_ATTRS.has(name) || (allowed !== undefined && allowed.has(name))) &&\n !name.startsWith('on');\n if (!keep) {\n el.removeAttribute(attr.name);\n continue;\n }\n if (name === 'style') {\n const filtered = filterStyle(attr.value, tag);\n if (filtered) el.setAttribute('style', filtered);\n else el.removeAttribute('style');\n } else if (name === 'href' || name === 'src') {\n // Raster data: URLs are allowed on images only.\n if (!isSafeUrl(attr.value, tag === 'img')) el.removeAttribute(attr.name);\n } else if (name === 'target') {\n if (attr.value === '_blank') el.setAttribute('rel', 'noopener noreferrer');\n else el.removeAttribute('target');\n }\n }\n}\n\nfunction walk(node: Element): void {\n for (const child of Array.from(node.children)) {\n const tag = child.tagName.toLowerCase();\n if (DROP_WITH_CONTENT.has(tag)) {\n child.remove();\n continue;\n }\n // iframes are allowed ONLY for allowlisted embed providers.\n if (tag === 'iframe' && !isAllowedEmbedSrc(child.getAttribute('src') ?? '')) {\n child.remove();\n continue;\n }\n if (!ALLOWED_TAGS.has(tag)) {\n // Unknown wrapper (article, section, table for now, …): keep its\n // content, drop the element itself.\n walk(child);\n child.replaceWith(...Array.from(child.childNodes));\n continue;\n }\n sanitizeElement(child);\n walk(child);\n }\n}\n\n/**\n * Sanitizes an HTML string. Parsing happens in an inert document created by\n * DOMParser, so embedded scripts never execute and images never load.\n */\nexport function sanitizeHtml(html: string): string {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n walk(doc.body);\n return doc.body.innerHTML;\n}\n"]}
|