@prosekit/extensions 0.11.4 → 0.11.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commit/style.css +2 -0
- package/dist/commit/style.css.map +1 -0
- package/dist/commit/style.js +1 -0
- package/dist/drop-indicator-E7nCfdnR.js +58 -0
- package/dist/drop-indicator-E7nCfdnR.js.map +1 -0
- package/dist/enter-rule-RdhEA900.js +2 -1
- package/dist/enter-rule-RdhEA900.js.map +1 -0
- package/dist/file-DVUhe5KJ.js +134 -0
- package/dist/file-DVUhe5KJ.js.map +1 -0
- package/dist/gap-cursor/style.css +2 -0
- package/dist/gap-cursor/style.css.map +1 -0
- package/dist/gap-cursor/style.js +1 -0
- package/dist/index-DY6lIIYV.d.ts +134 -0
- package/dist/index-DY6lIIYV.d.ts.map +1 -0
- package/dist/{input-rule-Gji4N7Oe.js → input-rule-B17tpW4m.js} +3 -3
- package/dist/input-rule-B17tpW4m.js.map +1 -0
- package/dist/list/style.css +2 -0
- package/dist/list/style.css.map +1 -0
- package/dist/list/style.js +1 -0
- package/dist/loro/style.css +2 -0
- package/dist/loro/style.css.map +1 -0
- package/dist/loro/style.js +1 -0
- package/dist/{mark-rule-D7zaa32n.js → mark-rule-CGmswjQ_.js} +3 -3
- package/dist/mark-rule-CGmswjQ_.js.map +1 -0
- package/dist/{paste-rule-Cca3n5TA.js → paste-rule-BIztzELg.js} +5 -15
- package/dist/paste-rule-BIztzELg.js.map +1 -0
- package/dist/placeholder/style.css +2 -0
- package/dist/placeholder/style.css.map +1 -0
- package/dist/placeholder/style.js +1 -0
- package/dist/prosekit-extensions-autocomplete.d.ts +2 -1
- package/dist/prosekit-extensions-autocomplete.d.ts.map +1 -0
- package/dist/prosekit-extensions-autocomplete.js +2 -9
- package/dist/prosekit-extensions-autocomplete.js.map +1 -0
- package/dist/prosekit-extensions-blockquote.d.ts +2 -1
- package/dist/prosekit-extensions-blockquote.d.ts.map +1 -0
- package/dist/prosekit-extensions-blockquote.js +4 -4
- package/dist/prosekit-extensions-blockquote.js.map +1 -0
- package/dist/prosekit-extensions-bold.d.ts +2 -1
- package/dist/prosekit-extensions-bold.d.ts.map +1 -0
- package/dist/prosekit-extensions-bold.js +3 -2
- package/dist/prosekit-extensions-bold.js.map +1 -0
- package/dist/prosekit-extensions-code-block.d.ts +3 -2
- package/dist/prosekit-extensions-code-block.d.ts.map +1 -0
- package/dist/prosekit-extensions-code-block.js +5 -6
- package/dist/prosekit-extensions-code-block.js.map +1 -0
- package/dist/prosekit-extensions-code.d.ts +2 -1
- package/dist/prosekit-extensions-code.d.ts.map +1 -0
- package/dist/prosekit-extensions-code.js +3 -2
- package/dist/prosekit-extensions-code.js.map +1 -0
- package/dist/prosekit-extensions-commit.d.ts +2 -1
- package/dist/prosekit-extensions-commit.d.ts.map +1 -0
- package/dist/prosekit-extensions-commit.js +11 -13
- package/dist/prosekit-extensions-commit.js.map +1 -0
- package/dist/prosekit-extensions-doc.d.ts +2 -1
- package/dist/prosekit-extensions-doc.d.ts.map +1 -0
- package/dist/prosekit-extensions-doc.js +2 -1
- package/dist/prosekit-extensions-doc.js.map +1 -0
- package/dist/prosekit-extensions-drop-cursor.d.ts +2 -1
- package/dist/prosekit-extensions-drop-cursor.d.ts.map +1 -0
- package/dist/prosekit-extensions-drop-cursor.js +2 -1
- package/dist/prosekit-extensions-drop-cursor.js.map +1 -0
- package/dist/prosekit-extensions-drop-indicator.d.ts +5 -107
- package/dist/prosekit-extensions-drop-indicator.d.ts.map +1 -0
- package/dist/prosekit-extensions-drop-indicator.js +1 -1
- package/dist/prosekit-extensions-enter-rule.d.ts +2 -1
- package/dist/prosekit-extensions-enter-rule.d.ts.map +1 -0
- package/dist/prosekit-extensions-file.d.ts +2 -125
- package/dist/prosekit-extensions-file.js +1 -139
- package/dist/prosekit-extensions-gap-cursor.d.ts +2 -2
- package/dist/prosekit-extensions-gap-cursor.d.ts.map +1 -0
- package/dist/prosekit-extensions-gap-cursor.js +2 -1
- package/dist/prosekit-extensions-gap-cursor.js.map +1 -0
- package/dist/prosekit-extensions-hard-break.d.ts +2 -5
- package/dist/prosekit-extensions-hard-break.d.ts.map +1 -0
- package/dist/prosekit-extensions-hard-break.js +2 -1
- package/dist/prosekit-extensions-hard-break.js.map +1 -0
- package/dist/prosekit-extensions-heading.d.ts +2 -1
- package/dist/prosekit-extensions-heading.d.ts.map +1 -0
- package/dist/prosekit-extensions-heading.js +5 -6
- package/dist/prosekit-extensions-heading.js.map +1 -0
- package/dist/prosekit-extensions-horizontal-rule.d.ts +2 -1
- package/dist/prosekit-extensions-horizontal-rule.d.ts.map +1 -0
- package/dist/prosekit-extensions-horizontal-rule.js +5 -6
- package/dist/prosekit-extensions-horizontal-rule.js.map +1 -0
- package/dist/prosekit-extensions-image.d.ts +80 -3
- package/dist/prosekit-extensions-image.d.ts.map +1 -0
- package/dist/prosekit-extensions-image.js +90 -10
- package/dist/prosekit-extensions-image.js.map +1 -0
- package/dist/prosekit-extensions-input-rule.d.ts +2 -1
- package/dist/prosekit-extensions-input-rule.d.ts.map +1 -0
- package/dist/prosekit-extensions-input-rule.js +1 -1
- package/dist/prosekit-extensions-italic.d.ts +2 -1
- package/dist/prosekit-extensions-italic.d.ts.map +1 -0
- package/dist/prosekit-extensions-italic.js +3 -2
- package/dist/prosekit-extensions-italic.js.map +1 -0
- package/dist/prosekit-extensions-link.d.ts +2 -1
- package/dist/prosekit-extensions-link.d.ts.map +1 -0
- package/dist/prosekit-extensions-link.js +6 -5
- package/dist/prosekit-extensions-link.js.map +1 -0
- package/dist/prosekit-extensions-list.d.ts +22 -21
- package/dist/prosekit-extensions-list.d.ts.map +1 -0
- package/dist/prosekit-extensions-list.js +7 -8
- package/dist/prosekit-extensions-list.js.map +1 -0
- package/dist/prosekit-extensions-loro.d.ts +14 -13
- package/dist/prosekit-extensions-loro.d.ts.map +1 -0
- package/dist/prosekit-extensions-loro.js +2 -1
- package/dist/prosekit-extensions-loro.js.map +1 -0
- package/dist/prosekit-extensions-mark-rule.d.ts +2 -1
- package/dist/prosekit-extensions-mark-rule.d.ts.map +1 -0
- package/dist/prosekit-extensions-mark-rule.js +1 -1
- package/dist/prosekit-extensions-mention.d.ts +2 -1
- package/dist/prosekit-extensions-mention.d.ts.map +1 -0
- package/dist/prosekit-extensions-mention.js +2 -1
- package/dist/prosekit-extensions-mention.js.map +1 -0
- package/dist/prosekit-extensions-mod-click-prevention.d.ts +2 -1
- package/dist/prosekit-extensions-mod-click-prevention.d.ts.map +1 -0
- package/dist/prosekit-extensions-mod-click-prevention.js +2 -1
- package/dist/prosekit-extensions-mod-click-prevention.js.map +1 -0
- package/dist/prosekit-extensions-paragraph.d.ts +2 -5
- package/dist/prosekit-extensions-paragraph.d.ts.map +1 -0
- package/dist/prosekit-extensions-paragraph.js +2 -1
- package/dist/prosekit-extensions-paragraph.js.map +1 -0
- package/dist/prosekit-extensions-paste-rule.d.ts +2 -1
- package/dist/prosekit-extensions-paste-rule.d.ts.map +1 -0
- package/dist/prosekit-extensions-paste-rule.js +1 -1
- package/dist/prosekit-extensions-placeholder.d.ts +2 -1
- package/dist/prosekit-extensions-placeholder.d.ts.map +1 -0
- package/dist/prosekit-extensions-placeholder.js +5 -5
- package/dist/prosekit-extensions-placeholder.js.map +1 -0
- package/dist/prosekit-extensions-readonly.d.ts +2 -1
- package/dist/prosekit-extensions-readonly.d.ts.map +1 -0
- package/dist/prosekit-extensions-readonly.js +2 -1
- package/dist/prosekit-extensions-readonly.js.map +1 -0
- package/dist/prosekit-extensions-search.d.ts +2 -1
- package/dist/prosekit-extensions-search.d.ts.map +1 -0
- package/dist/prosekit-extensions-search.js +3 -3
- package/dist/prosekit-extensions-search.js.map +1 -0
- package/dist/prosekit-extensions-strike.d.ts +2 -1
- package/dist/prosekit-extensions-strike.d.ts.map +1 -0
- package/dist/prosekit-extensions-strike.js +3 -2
- package/dist/prosekit-extensions-strike.js.map +1 -0
- package/dist/prosekit-extensions-table.d.ts +47 -114
- package/dist/prosekit-extensions-table.d.ts.map +1 -0
- package/dist/prosekit-extensions-table.js +2 -2
- package/dist/prosekit-extensions-text-align.d.ts +2 -1
- package/dist/prosekit-extensions-text-align.d.ts.map +1 -0
- package/dist/prosekit-extensions-text-align.js +2 -1
- package/dist/prosekit-extensions-text-align.js.map +1 -0
- package/dist/prosekit-extensions-text.d.ts +2 -1
- package/dist/prosekit-extensions-text.d.ts.map +1 -0
- package/dist/prosekit-extensions-text.js +2 -1
- package/dist/prosekit-extensions-text.js.map +1 -0
- package/dist/prosekit-extensions-underline.d.ts +2 -1
- package/dist/prosekit-extensions-underline.d.ts.map +1 -0
- package/dist/prosekit-extensions-underline.js +2 -1
- package/dist/prosekit-extensions-underline.js.map +1 -0
- package/dist/prosekit-extensions-virtual-selection.d.ts +2 -1
- package/dist/prosekit-extensions-virtual-selection.d.ts.map +1 -0
- package/dist/prosekit-extensions-virtual-selection.js +3 -3
- package/dist/prosekit-extensions-virtual-selection.js.map +1 -0
- package/dist/prosekit-extensions-yjs.d.ts +2 -1
- package/dist/prosekit-extensions-yjs.d.ts.map +1 -0
- package/dist/prosekit-extensions-yjs.js +2 -1
- package/dist/prosekit-extensions-yjs.js.map +1 -0
- package/dist/prosekit-extensions.js +1 -0
- package/dist/search/style.css +2 -0
- package/dist/search/style.css.map +1 -0
- package/dist/search/style.js +1 -0
- package/dist/{shiki-highlighter-chunk-DSPM0T27.d.ts → shiki-highlighter-chunk-Cwu1Jr9o.d.ts} +2 -1
- package/dist/shiki-highlighter-chunk-Cwu1Jr9o.d.ts.map +1 -0
- package/dist/shiki-highlighter-chunk.d.ts +1 -1
- package/dist/shiki-highlighter-chunk.js +3 -5
- package/dist/shiki-highlighter-chunk.js.map +1 -0
- package/dist/table/style.css +2 -0
- package/dist/table/style.css.map +1 -0
- package/dist/table/style.js +1 -0
- package/dist/table-BNwuK7xg.js +297 -0
- package/dist/table-BNwuK7xg.js.map +1 -0
- package/dist/virtual-selection/style.css +2 -0
- package/dist/virtual-selection/style.css.map +1 -0
- package/dist/virtual-selection/style.js +1 -0
- package/dist/yjs/style.css +2 -0
- package/dist/yjs/style.css.map +1 -0
- package/dist/yjs/style.js +1 -0
- package/package.json +12 -10
- package/src/autocomplete/autocomplete-helpers.ts +74 -0
- package/src/autocomplete/autocomplete-plugin.ts +186 -0
- package/src/autocomplete/autocomplete-rule.ts +117 -0
- package/src/autocomplete/autocomplete.spec.ts +132 -0
- package/src/autocomplete/autocomplete.ts +29 -0
- package/src/autocomplete/index.ts +9 -0
- package/src/blockquote/blockquote-commands.ts +32 -0
- package/src/blockquote/blockquote-input-rule.ts +14 -0
- package/src/blockquote/blockquote-keymap.spec.ts +45 -0
- package/src/blockquote/blockquote-keymap.ts +31 -0
- package/src/blockquote/blockquote-spec.ts +24 -0
- package/src/blockquote/blockquote.ts +34 -0
- package/src/blockquote/index.ts +14 -0
- package/src/bold/bold-commands.ts +23 -0
- package/src/bold/bold-input-rule.spec.ts +51 -0
- package/src/bold/bold-input-rule.ts +18 -0
- package/src/bold/bold-keymap.ts +14 -0
- package/src/bold/bold-spec.ts +53 -0
- package/src/bold/bold.ts +32 -0
- package/src/bold/index.ts +14 -0
- package/src/code/code-commands.ts +23 -0
- package/src/code/code-input-rule.ts +18 -0
- package/src/code/code-keymap.ts +14 -0
- package/src/code/code-spec.ts +28 -0
- package/src/code/code.ts +32 -0
- package/src/code/index.ts +14 -0
- package/src/code-block/code-block-commands.ts +44 -0
- package/src/code-block/code-block-highlight.ts +40 -0
- package/src/code-block/code-block-input-rule.ts +36 -0
- package/src/code-block/code-block-keymap.ts +61 -0
- package/src/code-block/code-block-shiki.ts +58 -0
- package/src/code-block/code-block-spec.spec.ts +164 -0
- package/src/code-block/code-block-spec.ts +71 -0
- package/src/code-block/code-block-types.ts +8 -0
- package/src/code-block/code-block.ts +46 -0
- package/src/code-block/index.ts +32 -0
- package/src/code-block/shiki-bundle.ts +8 -0
- package/src/code-block/shiki-highlighter-chunk.ts +84 -0
- package/src/code-block/shiki-highlighter.ts +22 -0
- package/src/code-block/shiki-parser.ts +36 -0
- package/src/commit/index.ts +330 -0
- package/src/commit/style.css +7 -0
- package/src/doc/index.ts +21 -0
- package/src/drop-cursor/drop-cursor.ts +46 -0
- package/src/drop-cursor/index.ts +5 -0
- package/src/drop-indicator/drop-indicator-facet.ts +62 -0
- package/src/drop-indicator/drop-indicator.ts +35 -0
- package/src/drop-indicator/index.ts +14 -0
- package/src/enter-rule/index.ts +241 -0
- package/src/file/file-drop-handler.ts +75 -0
- package/src/file/file-paste-handler.spec.ts +95 -0
- package/src/file/file-paste-handler.ts +59 -0
- package/src/file/file-upload.ts +140 -0
- package/src/file/helpers.ts +39 -0
- package/src/file/index.ts +16 -0
- package/src/gap-cursor/gap-cursor.ts +28 -0
- package/src/gap-cursor/index.ts +4 -0
- package/src/gap-cursor/style.css +25 -0
- package/src/hard-break/hard-break-commands.ts +31 -0
- package/src/hard-break/hard-break-keymap.spec.ts +45 -0
- package/src/hard-break/hard-break-keymap.ts +16 -0
- package/src/hard-break/hard-break-spec.ts +31 -0
- package/src/hard-break/hard-break.ts +32 -0
- package/src/hard-break/index.ts +13 -0
- package/src/heading/heading-commands.ts +37 -0
- package/src/heading/heading-input-rule.ts +22 -0
- package/src/heading/heading-keymap.spec.ts +53 -0
- package/src/heading/heading-keymap.ts +40 -0
- package/src/heading/heading-spec.ts +39 -0
- package/src/heading/heading-types.ts +3 -0
- package/src/heading/heading.ts +34 -0
- package/src/heading/index.ts +15 -0
- package/src/horizontal-rule/horizontal-rule-commands.spec.ts +61 -0
- package/src/horizontal-rule/horizontal-rule-commands.ts +37 -0
- package/src/horizontal-rule/horizontal-rule-input-rule.spec.ts +61 -0
- package/src/horizontal-rule/horizontal-rule-input-rule.ts +26 -0
- package/src/horizontal-rule/horizontal-rule-spec.ts +21 -0
- package/src/horizontal-rule/horizontal-rule.ts +29 -0
- package/src/horizontal-rule/index.ts +14 -0
- package/src/image/image-commands.ts +36 -0
- package/src/image/image-spec.ts +72 -0
- package/src/image/image-upload-handler.ts +156 -0
- package/src/image/image.ts +25 -0
- package/src/image/index.ts +22 -0
- package/src/index.ts +1 -0
- package/src/input-rule/index.ts +237 -0
- package/src/italic/index.ts +14 -0
- package/src/italic/italic-commands.spec.ts +75 -0
- package/src/italic/italic-commands.ts +23 -0
- package/src/italic/italic-input-rule.spec.ts +25 -0
- package/src/italic/italic-input-rule.ts +18 -0
- package/src/italic/italic-keymap.ts +14 -0
- package/src/italic/italic-spec.ts +35 -0
- package/src/italic/italic.ts +34 -0
- package/src/link/index.spec.ts +88 -0
- package/src/link/index.ts +156 -0
- package/src/link/link-paste-rule.spec.ts +194 -0
- package/src/link/link-paste-rule.ts +22 -0
- package/src/link/link-regex.spec.ts +82 -0
- package/src/link/link-regex.ts +79 -0
- package/src/link/link-types.ts +8 -0
- package/src/list/index.ts +25 -0
- package/src/list/list-commands.ts +61 -0
- package/src/list/list-drop-indicator.ts +37 -0
- package/src/list/list-input-rules.ts +14 -0
- package/src/list/list-keymap.spec.ts +39 -0
- package/src/list/list-keymap.ts +48 -0
- package/src/list/list-plugins.ts +35 -0
- package/src/list/list-serializer.ts +38 -0
- package/src/list/list-spec.ts +60 -0
- package/src/list/list-types.spec.ts +10 -0
- package/src/list/list-types.ts +23 -0
- package/src/list/list.spec.ts +134 -0
- package/src/list/list.ts +38 -0
- package/src/list/style.css +128 -0
- package/src/loro/index.ts +17 -0
- package/src/loro/loro-commands.ts +27 -0
- package/src/loro/loro-cursor-plugin.ts +28 -0
- package/src/loro/loro-keymap.ts +23 -0
- package/src/loro/loro-sync-plugin.ts +14 -0
- package/src/loro/loro-undo-plugin.ts +12 -0
- package/src/loro/loro.ts +75 -0
- package/src/loro/style.css +33 -0
- package/src/mark-rule/apply.ts +129 -0
- package/src/mark-rule/index.ts +2 -0
- package/src/mark-rule/mark-rule.spec.ts +123 -0
- package/src/mark-rule/mark-rule.ts +48 -0
- package/src/mark-rule/range.ts +107 -0
- package/src/mark-rule/types.ts +30 -0
- package/src/mention/index.ts +90 -0
- package/src/mod-click-prevention/index.ts +35 -0
- package/src/paragraph/index.ts +7 -0
- package/src/paragraph/paragraph-commands.ts +29 -0
- package/src/paragraph/paragraph-keymap.ts +15 -0
- package/src/paragraph/paragraph-spec.ts +31 -0
- package/src/paragraph/paragraph.ts +37 -0
- package/src/paste-rule/index.ts +10 -0
- package/src/paste-rule/mark-paste-rule.spec.ts +112 -0
- package/src/paste-rule/mark-paste-rule.ts +194 -0
- package/src/paste-rule/paste-rule-plugin.ts +53 -0
- package/src/paste-rule/paste-rule.spec.ts +96 -0
- package/src/paste-rule/paste-rule.ts +60 -0
- package/src/paste-rule/split-text-by-regex.spec.ts +97 -0
- package/src/paste-rule/split-text-by-regex.ts +44 -0
- package/src/placeholder/index.ts +113 -0
- package/src/placeholder/style.css +7 -0
- package/src/readonly/index.ts +22 -0
- package/src/search/index.ts +140 -0
- package/src/search/style.css +13 -0
- package/src/strike/index.ts +101 -0
- package/src/table/index.ts +53 -0
- package/src/table/style.css +42 -0
- package/src/table/table-commands/delete-cell-selection.spec.ts +41 -0
- package/src/table/table-commands/delete-cell-selection.ts +1 -0
- package/src/table/table-commands/exit-table.spec.ts +45 -0
- package/src/table/table-commands/exit-table.ts +49 -0
- package/src/table/table-commands/insert-table.spec.ts +39 -0
- package/src/table/table-commands/insert-table.ts +80 -0
- package/src/table/table-commands/move-table-column.spec.ts +618 -0
- package/src/table/table-commands/move-table-column.ts +4 -0
- package/src/table/table-commands/move-table-row.spec.ts +380 -0
- package/src/table/table-commands/move-table-row.ts +4 -0
- package/src/table/table-commands/select-table-cell.spec.ts +34 -0
- package/src/table/table-commands/select-table-cell.ts +35 -0
- package/src/table/table-commands/select-table-column.spec.ts +33 -0
- package/src/table/table-commands/select-table-column.ts +39 -0
- package/src/table/table-commands/select-table-row.spec.ts +32 -0
- package/src/table/table-commands/select-table-row.ts +39 -0
- package/src/table/table-commands/select-table.spec.ts +36 -0
- package/src/table/table-commands/select-table.ts +50 -0
- package/src/table/table-commands.ts +110 -0
- package/src/table/table-drop-indicator.ts +40 -0
- package/src/table/table-plugins.ts +15 -0
- package/src/table/table-spec.spec.ts +113 -0
- package/src/table/table-spec.ts +109 -0
- package/src/table/table-utils.ts +16 -0
- package/src/table/table.ts +49 -0
- package/src/table/test-utils.ts +28 -0
- package/src/testing/clipboard.ts +58 -0
- package/src/testing/format-html.ts +5 -0
- package/src/testing/index.ts +161 -0
- package/src/testing/keyboard.ts +36 -0
- package/src/testing/markdown.ts +23 -0
- package/src/text/index.ts +24 -0
- package/src/text-align/index.ts +133 -0
- package/src/types/assert-type-equal.ts +8 -0
- package/src/underline/index.ts +83 -0
- package/src/virtual-selection/index.ts +100 -0
- package/src/virtual-selection/style.css +5 -0
- package/src/yjs/index.ts +22 -0
- package/src/yjs/style.css +31 -0
- package/src/yjs/yjs-commands.ts +27 -0
- package/src/yjs/yjs-cursor-plugin.ts +25 -0
- package/src/yjs/yjs-keymap.ts +23 -0
- package/src/yjs/yjs-sync-plugin.ts +23 -0
- package/src/yjs/yjs-undo-plugin.ts +87 -0
- package/src/yjs/yjs.ts +84 -0
- package/dist/drop-indicator-dB9rZn8e.js +0 -267
- package/dist/table-CPI9ZxbK.js +0 -760
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineCommands,
|
|
3
|
+
type Extension,
|
|
4
|
+
} from '@prosekit/core'
|
|
5
|
+
import {
|
|
6
|
+
addColumnAfter,
|
|
7
|
+
addColumnBefore,
|
|
8
|
+
addRowAfter,
|
|
9
|
+
addRowBefore,
|
|
10
|
+
deleteColumn,
|
|
11
|
+
deleteRow,
|
|
12
|
+
deleteTable,
|
|
13
|
+
mergeCells,
|
|
14
|
+
splitCell,
|
|
15
|
+
} from 'prosemirror-tables'
|
|
16
|
+
|
|
17
|
+
import { deleteCellSelection } from './table-commands/delete-cell-selection'
|
|
18
|
+
import { exitTable } from './table-commands/exit-table'
|
|
19
|
+
import {
|
|
20
|
+
insertTable,
|
|
21
|
+
type InsertTableOptions,
|
|
22
|
+
} from './table-commands/insert-table'
|
|
23
|
+
import {
|
|
24
|
+
moveTableColumn,
|
|
25
|
+
type MoveTableColumnOptions,
|
|
26
|
+
} from './table-commands/move-table-column'
|
|
27
|
+
import {
|
|
28
|
+
moveTableRow,
|
|
29
|
+
type MoveTableRowOptions,
|
|
30
|
+
} from './table-commands/move-table-row'
|
|
31
|
+
import {
|
|
32
|
+
selectTable,
|
|
33
|
+
type SelectTableOptions,
|
|
34
|
+
} from './table-commands/select-table'
|
|
35
|
+
import {
|
|
36
|
+
selectTableCell,
|
|
37
|
+
type SelectTableCellOptions,
|
|
38
|
+
} from './table-commands/select-table-cell'
|
|
39
|
+
import {
|
|
40
|
+
selectTableColumn,
|
|
41
|
+
type SelectTableColumnOptions,
|
|
42
|
+
} from './table-commands/select-table-column'
|
|
43
|
+
import {
|
|
44
|
+
selectTableRow,
|
|
45
|
+
type SelectTableRowOptions,
|
|
46
|
+
} from './table-commands/select-table-row'
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
51
|
+
export type TableCommandsExtension = Extension<{
|
|
52
|
+
Commands: {
|
|
53
|
+
insertTable: [options: InsertTableOptions]
|
|
54
|
+
exitTable: []
|
|
55
|
+
|
|
56
|
+
selectTable: [options?: SelectTableOptions]
|
|
57
|
+
selectTableCell: [options?: SelectTableCellOptions]
|
|
58
|
+
selectTableColumn: [options?: SelectTableColumnOptions]
|
|
59
|
+
selectTableRow: [options?: SelectTableRowOptions]
|
|
60
|
+
|
|
61
|
+
addTableColumnBefore: []
|
|
62
|
+
addTableColumnAfter: []
|
|
63
|
+
addTableRowAbove: []
|
|
64
|
+
addTableRowBelow: []
|
|
65
|
+
|
|
66
|
+
deleteTable: []
|
|
67
|
+
deleteTableColumn: []
|
|
68
|
+
deleteTableRow: []
|
|
69
|
+
deleteCellSelection: []
|
|
70
|
+
|
|
71
|
+
mergeTableCells: []
|
|
72
|
+
splitTableCell: []
|
|
73
|
+
|
|
74
|
+
moveTableRow: [options: MoveTableRowOptions]
|
|
75
|
+
moveTableColumn: [options: MoveTableColumnOptions]
|
|
76
|
+
}
|
|
77
|
+
}>
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Adds commands for working with `table` nodes.
|
|
81
|
+
*
|
|
82
|
+
* @public
|
|
83
|
+
*/
|
|
84
|
+
export function defineTableCommands(): TableCommandsExtension {
|
|
85
|
+
return defineCommands({
|
|
86
|
+
insertTable,
|
|
87
|
+
exitTable: () => exitTable,
|
|
88
|
+
|
|
89
|
+
selectTable,
|
|
90
|
+
selectTableCell,
|
|
91
|
+
selectTableColumn,
|
|
92
|
+
selectTableRow,
|
|
93
|
+
|
|
94
|
+
addTableColumnBefore: () => addColumnBefore,
|
|
95
|
+
addTableColumnAfter: () => addColumnAfter,
|
|
96
|
+
addTableRowAbove: () => addRowBefore,
|
|
97
|
+
addTableRowBelow: () => addRowAfter,
|
|
98
|
+
|
|
99
|
+
deleteTable: () => deleteTable,
|
|
100
|
+
deleteTableColumn: () => deleteColumn,
|
|
101
|
+
deleteTableRow: () => deleteRow,
|
|
102
|
+
deleteCellSelection: () => deleteCellSelection,
|
|
103
|
+
|
|
104
|
+
mergeTableCells: () => mergeCells,
|
|
105
|
+
splitTableCell: () => splitCell,
|
|
106
|
+
|
|
107
|
+
moveTableRow,
|
|
108
|
+
moveTableColumn,
|
|
109
|
+
})
|
|
110
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { PlainExtension } from '@prosekit/core'
|
|
2
|
+
|
|
3
|
+
import type { DragEventHandler } from '../drop-indicator'
|
|
4
|
+
import { defineDropIndicator } from '../drop-indicator'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Hides the drop indicator when dragging a table column or row by using the
|
|
8
|
+
* table handle.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export function defineTableDropIndicator(): PlainExtension {
|
|
13
|
+
return defineDropIndicator({
|
|
14
|
+
onDrag,
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const matchMap = new WeakMap<DataTransfer, boolean>()
|
|
19
|
+
|
|
20
|
+
const onDrag: DragEventHandler = ({ event }): boolean => {
|
|
21
|
+
const dataTransfer = event.dataTransfer
|
|
22
|
+
if (!dataTransfer) return true
|
|
23
|
+
|
|
24
|
+
let match: boolean
|
|
25
|
+
|
|
26
|
+
if (matchMap.has(dataTransfer)) {
|
|
27
|
+
match = matchMap.get(dataTransfer)!
|
|
28
|
+
} else {
|
|
29
|
+
// On Safari, accessing `dataTransfer.types` is more than 10x slower than in
|
|
30
|
+
// Chrome. This becomes a bottleneck when `onDrag` is called frequently, so
|
|
31
|
+
// we cache the result in a WeakMap.
|
|
32
|
+
const types = dataTransfer.types
|
|
33
|
+
match = types.includes('application/x-prosekit-table-handle-drag')
|
|
34
|
+
matchMap.set(dataTransfer, match)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Don't show the drop indicator when the drag event has
|
|
38
|
+
// "application/x-prosekit-table-handle-drag" type.
|
|
39
|
+
return !match
|
|
40
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
definePlugin,
|
|
3
|
+
type PlainExtension,
|
|
4
|
+
} from '@prosekit/core'
|
|
5
|
+
import {
|
|
6
|
+
columnResizing,
|
|
7
|
+
tableEditing,
|
|
8
|
+
} from 'prosemirror-tables'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
export function defineTablePlugins(): PlainExtension {
|
|
14
|
+
return definePlugin([tableEditing(), columnResizing()])
|
|
15
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { union } from '@prosekit/core'
|
|
2
|
+
import pick from 'just-pick'
|
|
3
|
+
import {
|
|
4
|
+
describe,
|
|
5
|
+
expect,
|
|
6
|
+
it,
|
|
7
|
+
} from 'vitest'
|
|
8
|
+
|
|
9
|
+
import { defineDoc } from '../doc'
|
|
10
|
+
import { defineParagraph } from '../paragraph'
|
|
11
|
+
import { defineText } from '../text'
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
defineTableCellSpec,
|
|
15
|
+
defineTableHeaderCellSpec,
|
|
16
|
+
defineTableRowSpec,
|
|
17
|
+
defineTableSpec,
|
|
18
|
+
} from './table-spec'
|
|
19
|
+
|
|
20
|
+
describe('table spec', () => {
|
|
21
|
+
it('should be defined', () => {
|
|
22
|
+
const extension = union(
|
|
23
|
+
defineDoc(),
|
|
24
|
+
defineParagraph(),
|
|
25
|
+
defineText(),
|
|
26
|
+
defineTableSpec(),
|
|
27
|
+
defineTableRowSpec(),
|
|
28
|
+
defineTableCellSpec(),
|
|
29
|
+
defineTableHeaderCellSpec(),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
const nodes = extension.schema?.spec.nodes.toObject() || {}
|
|
33
|
+
const pickedNodes = pick(nodes, [
|
|
34
|
+
'table',
|
|
35
|
+
'tableCell',
|
|
36
|
+
'tableHeaderCell',
|
|
37
|
+
'tableRow',
|
|
38
|
+
])
|
|
39
|
+
|
|
40
|
+
expect(pickedNodes).toMatchInlineSnapshot(`
|
|
41
|
+
{
|
|
42
|
+
"table": {
|
|
43
|
+
"content": "tableRow+",
|
|
44
|
+
"group": "block",
|
|
45
|
+
"isolating": true,
|
|
46
|
+
"parseDOM": [
|
|
47
|
+
{
|
|
48
|
+
"tag": "table",
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
"tableRole": "table",
|
|
52
|
+
"toDOM": [Function],
|
|
53
|
+
},
|
|
54
|
+
"tableCell": {
|
|
55
|
+
"attrs": {
|
|
56
|
+
"colspan": {
|
|
57
|
+
"default": 1,
|
|
58
|
+
},
|
|
59
|
+
"colwidth": {
|
|
60
|
+
"default": null,
|
|
61
|
+
},
|
|
62
|
+
"rowspan": {
|
|
63
|
+
"default": 1,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
"content": "block+",
|
|
67
|
+
"isolating": true,
|
|
68
|
+
"parseDOM": [
|
|
69
|
+
{
|
|
70
|
+
"getAttrs": [Function],
|
|
71
|
+
"tag": "td",
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
"tableRole": "cell",
|
|
75
|
+
"toDOM": [Function],
|
|
76
|
+
},
|
|
77
|
+
"tableHeaderCell": {
|
|
78
|
+
"attrs": {
|
|
79
|
+
"colspan": {
|
|
80
|
+
"default": 1,
|
|
81
|
+
},
|
|
82
|
+
"colwidth": {
|
|
83
|
+
"default": null,
|
|
84
|
+
},
|
|
85
|
+
"rowspan": {
|
|
86
|
+
"default": 1,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
"content": "block+",
|
|
90
|
+
"isolating": true,
|
|
91
|
+
"parseDOM": [
|
|
92
|
+
{
|
|
93
|
+
"getAttrs": [Function],
|
|
94
|
+
"tag": "th",
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
"tableRole": "header_cell",
|
|
98
|
+
"toDOM": [Function],
|
|
99
|
+
},
|
|
100
|
+
"tableRow": {
|
|
101
|
+
"content": "(tableCell | tableHeaderCell)*",
|
|
102
|
+
"parseDOM": [
|
|
103
|
+
{
|
|
104
|
+
"tag": "tr",
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
"tableRole": "row",
|
|
108
|
+
"toDOM": [Function],
|
|
109
|
+
},
|
|
110
|
+
}
|
|
111
|
+
`)
|
|
112
|
+
})
|
|
113
|
+
})
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineNodeSpec,
|
|
3
|
+
type Extension,
|
|
4
|
+
} from '@prosekit/core'
|
|
5
|
+
import type {
|
|
6
|
+
AttributeSpec,
|
|
7
|
+
Attrs,
|
|
8
|
+
} from '@prosekit/pm/model'
|
|
9
|
+
import { tableNodes } from 'prosemirror-tables'
|
|
10
|
+
|
|
11
|
+
const cellContent = 'block+'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export interface CellAttrs {
|
|
17
|
+
colspan?: number
|
|
18
|
+
rowspan?: number
|
|
19
|
+
colwidth?: number[] | null
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const cellAttrs = {
|
|
23
|
+
colspan: { default: 1 },
|
|
24
|
+
rowspan: { default: 1 },
|
|
25
|
+
colwidth: { default: null },
|
|
26
|
+
} satisfies Record<string, AttributeSpec>
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export type TableSpecExtension = Extension<{
|
|
32
|
+
Nodes: {
|
|
33
|
+
table: Attrs
|
|
34
|
+
}
|
|
35
|
+
}>
|
|
36
|
+
|
|
37
|
+
const specs = tableNodes({
|
|
38
|
+
tableGroup: 'block',
|
|
39
|
+
cellContent,
|
|
40
|
+
cellAttributes: {},
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
export function defineTableSpec(): TableSpecExtension {
|
|
47
|
+
return defineNodeSpec({
|
|
48
|
+
...specs['table'],
|
|
49
|
+
content: 'tableRow+',
|
|
50
|
+
name: 'table',
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @internal
|
|
56
|
+
*/
|
|
57
|
+
export type TableRowSpecExtension = Extension<{
|
|
58
|
+
Nodes: {
|
|
59
|
+
tableRow: Attrs
|
|
60
|
+
}
|
|
61
|
+
}>
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @internal
|
|
65
|
+
*/
|
|
66
|
+
export function defineTableRowSpec(): TableRowSpecExtension {
|
|
67
|
+
return defineNodeSpec({
|
|
68
|
+
...specs['table_row'],
|
|
69
|
+
content: '(tableCell | tableHeaderCell)*',
|
|
70
|
+
name: 'tableRow',
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @internal
|
|
76
|
+
*/
|
|
77
|
+
export type TableCellSpecExtension = Extension<{
|
|
78
|
+
Nodes: {
|
|
79
|
+
tableCell: CellAttrs
|
|
80
|
+
}
|
|
81
|
+
}>
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
export function defineTableCellSpec(): TableCellSpecExtension {
|
|
87
|
+
return defineNodeSpec({
|
|
88
|
+
...specs['table_cell'],
|
|
89
|
+
name: 'tableCell',
|
|
90
|
+
attrs: cellAttrs,
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @internal
|
|
96
|
+
*/
|
|
97
|
+
export type TableHeaderCellSpecExtension = Extension<{
|
|
98
|
+
Nodes: {
|
|
99
|
+
tableHeaderCell: CellAttrs
|
|
100
|
+
}
|
|
101
|
+
}>
|
|
102
|
+
|
|
103
|
+
export function defineTableHeaderCellSpec(): TableHeaderCellSpecExtension {
|
|
104
|
+
return defineNodeSpec({
|
|
105
|
+
...specs['table_header'],
|
|
106
|
+
name: 'tableHeaderCell',
|
|
107
|
+
attrs: cellAttrs,
|
|
108
|
+
})
|
|
109
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CellSelection } from 'prosemirror-tables'
|
|
2
|
+
|
|
3
|
+
export {
|
|
4
|
+
findCellPos,
|
|
5
|
+
findCellRange,
|
|
6
|
+
findTable,
|
|
7
|
+
} from 'prosemirror-tables'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Checks if the given object is a `CellSelection` instance.
|
|
11
|
+
*
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
export function isCellSelection(value: unknown): value is CellSelection {
|
|
15
|
+
return value instanceof CellSelection
|
|
16
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {
|
|
2
|
+
union,
|
|
3
|
+
type Union,
|
|
4
|
+
} from '@prosekit/core'
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
defineTableCommands,
|
|
8
|
+
type TableCommandsExtension,
|
|
9
|
+
} from './table-commands'
|
|
10
|
+
import { defineTableDropIndicator } from './table-drop-indicator'
|
|
11
|
+
import { defineTablePlugins } from './table-plugins'
|
|
12
|
+
import {
|
|
13
|
+
defineTableCellSpec,
|
|
14
|
+
defineTableHeaderCellSpec,
|
|
15
|
+
defineTableRowSpec,
|
|
16
|
+
defineTableSpec,
|
|
17
|
+
type TableCellSpecExtension,
|
|
18
|
+
type TableHeaderCellSpecExtension,
|
|
19
|
+
type TableRowSpecExtension,
|
|
20
|
+
type TableSpecExtension,
|
|
21
|
+
} from './table-spec'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export type TableExtension = Union<
|
|
27
|
+
[
|
|
28
|
+
TableSpecExtension,
|
|
29
|
+
TableRowSpecExtension,
|
|
30
|
+
TableCellSpecExtension,
|
|
31
|
+
TableHeaderCellSpecExtension,
|
|
32
|
+
TableCommandsExtension,
|
|
33
|
+
]
|
|
34
|
+
>
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @public
|
|
38
|
+
*/
|
|
39
|
+
export function defineTable(): TableExtension {
|
|
40
|
+
return union(
|
|
41
|
+
defineTableSpec(),
|
|
42
|
+
defineTableRowSpec(),
|
|
43
|
+
defineTableCellSpec(),
|
|
44
|
+
defineTableHeaderCellSpec(),
|
|
45
|
+
defineTablePlugins(),
|
|
46
|
+
defineTableCommands(),
|
|
47
|
+
defineTableDropIndicator(),
|
|
48
|
+
)
|
|
49
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Command,
|
|
3
|
+
Selection,
|
|
4
|
+
} from '@prosekit/pm/state'
|
|
5
|
+
import { CellSelection } from 'prosemirror-tables'
|
|
6
|
+
|
|
7
|
+
import { isCellSelection } from './table-utils'
|
|
8
|
+
|
|
9
|
+
// Helper to create a cell selection between two positions
|
|
10
|
+
export function setCellSelection(from: number, to: number): Command {
|
|
11
|
+
const command: Command = (state, dispatch) => {
|
|
12
|
+
const selection = CellSelection.create(state.doc, from, to)
|
|
13
|
+
dispatch?.(state.tr.setSelection(selection))
|
|
14
|
+
return true
|
|
15
|
+
}
|
|
16
|
+
return command
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function inspectSelectedCells(selection: Selection): string[] {
|
|
20
|
+
if (isCellSelection(selection)) {
|
|
21
|
+
const cells: string[] = []
|
|
22
|
+
selection.forEachCell((node) => {
|
|
23
|
+
cells.push(node.textContent)
|
|
24
|
+
})
|
|
25
|
+
return cells
|
|
26
|
+
}
|
|
27
|
+
return []
|
|
28
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { EditorView } from '@prosekit/pm/view'
|
|
2
|
+
|
|
3
|
+
import { formatHTML } from './format-html'
|
|
4
|
+
|
|
5
|
+
async function readBlobFromClipboard(mimeType: string): Promise<Blob | undefined> {
|
|
6
|
+
const clipboardItems = await navigator.clipboard.read()
|
|
7
|
+
const clipboardItem = clipboardItems[0]
|
|
8
|
+
if (!clipboardItem) {
|
|
9
|
+
return undefined
|
|
10
|
+
}
|
|
11
|
+
if (!clipboardItem.types.includes(mimeType)) {
|
|
12
|
+
return undefined
|
|
13
|
+
}
|
|
14
|
+
return await clipboardItem.getType(mimeType)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async function readTextFromClipboard(mimeType: string): Promise<string | undefined> {
|
|
18
|
+
const blob = await readBlobFromClipboard(mimeType)
|
|
19
|
+
if (!blob) {
|
|
20
|
+
return undefined
|
|
21
|
+
}
|
|
22
|
+
return await blob.text()
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export async function readPlainTextFromClipboard(): Promise<string> {
|
|
26
|
+
return await readTextFromClipboard('text/plain') || ''
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function readHtmlTextFromClipboard(format = true): Promise<string> {
|
|
30
|
+
let html = await readTextFromClipboard('text/html') || ''
|
|
31
|
+
if (format) {
|
|
32
|
+
html = formatHTML(html)
|
|
33
|
+
}
|
|
34
|
+
return html
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function pasteFiles(view: EditorView, files: File[]) {
|
|
38
|
+
const clipboardData = new DataTransfer()
|
|
39
|
+
for (const file of files) {
|
|
40
|
+
clipboardData.items.add(file)
|
|
41
|
+
}
|
|
42
|
+
const event = new ClipboardEvent('paste', { clipboardData })
|
|
43
|
+
view.pasteHTML('<div></div>', event)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function pasteText(view: EditorView, text: string) {
|
|
47
|
+
const clipboardData = new DataTransfer()
|
|
48
|
+
clipboardData.setData('text/plain', text)
|
|
49
|
+
const event = new ClipboardEvent('paste', { clipboardData })
|
|
50
|
+
view.pasteText(text, event)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function pasteHTML(view: EditorView, html: string) {
|
|
54
|
+
const clipboardData = new DataTransfer()
|
|
55
|
+
clipboardData.setData('text/html', html)
|
|
56
|
+
const event = new ClipboardEvent('paste', { clipboardData })
|
|
57
|
+
view.pasteHTML(html, event)
|
|
58
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import '@prosekit/pm/view/style/prosemirror.css'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
defineBaseCommands,
|
|
5
|
+
defineBaseKeymap,
|
|
6
|
+
defineHistory,
|
|
7
|
+
union,
|
|
8
|
+
type Extension,
|
|
9
|
+
type ExtractMarkActions,
|
|
10
|
+
type ExtractNodeActions,
|
|
11
|
+
type NodeChild,
|
|
12
|
+
} from '@prosekit/core'
|
|
13
|
+
import {
|
|
14
|
+
createTestEditor,
|
|
15
|
+
type TestEditor,
|
|
16
|
+
} from '@prosekit/core/test'
|
|
17
|
+
|
|
18
|
+
import { defineBlockquote } from '../blockquote'
|
|
19
|
+
import { defineBold } from '../bold'
|
|
20
|
+
import { defineCode } from '../code'
|
|
21
|
+
import { defineCodeBlock } from '../code-block'
|
|
22
|
+
import { defineDoc } from '../doc'
|
|
23
|
+
import { defineHardBreak } from '../hard-break'
|
|
24
|
+
import { defineHeading } from '../heading'
|
|
25
|
+
import { defineHorizontalRule } from '../horizontal-rule'
|
|
26
|
+
import { defineImage } from '../image'
|
|
27
|
+
import { defineItalic } from '../italic'
|
|
28
|
+
import { defineLink } from '../link'
|
|
29
|
+
import {
|
|
30
|
+
defineList,
|
|
31
|
+
type ListAttrs,
|
|
32
|
+
} from '../list'
|
|
33
|
+
import { defineParagraph } from '../paragraph'
|
|
34
|
+
import { defineStrike } from '../strike'
|
|
35
|
+
import { defineTable } from '../table'
|
|
36
|
+
import type { CellAttrs } from '../table/table-spec'
|
|
37
|
+
import { defineText } from '../text'
|
|
38
|
+
import { defineUnderline } from '../underline'
|
|
39
|
+
|
|
40
|
+
import {
|
|
41
|
+
readHtmlTextFromClipboard,
|
|
42
|
+
readPlainTextFromClipboard,
|
|
43
|
+
} from './clipboard'
|
|
44
|
+
import { pressKey } from './keyboard'
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
export function defineTestExtension() {
|
|
50
|
+
return union(
|
|
51
|
+
defineDoc(),
|
|
52
|
+
defineText(),
|
|
53
|
+
defineHeading(),
|
|
54
|
+
defineHistory(),
|
|
55
|
+
defineList(),
|
|
56
|
+
defineBlockquote(),
|
|
57
|
+
defineBaseKeymap(),
|
|
58
|
+
defineBaseCommands(),
|
|
59
|
+
defineItalic(),
|
|
60
|
+
defineBold(),
|
|
61
|
+
defineUnderline(),
|
|
62
|
+
defineStrike(),
|
|
63
|
+
defineCode(),
|
|
64
|
+
defineLink(),
|
|
65
|
+
defineImage(),
|
|
66
|
+
defineParagraph(),
|
|
67
|
+
defineTable(),
|
|
68
|
+
defineHorizontalRule(),
|
|
69
|
+
defineHardBreak(),
|
|
70
|
+
defineCodeBlock(),
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @internal
|
|
76
|
+
*/
|
|
77
|
+
export function setupTestFromExtension<E extends Extension>(
|
|
78
|
+
extension: E,
|
|
79
|
+
): {
|
|
80
|
+
editor: TestEditor<E>
|
|
81
|
+
n: ExtractNodeActions<E>
|
|
82
|
+
m: ExtractMarkActions<E>
|
|
83
|
+
} {
|
|
84
|
+
const editor = createTestEditor({ extension })
|
|
85
|
+
|
|
86
|
+
const div = document.body.appendChild(document.createElement('div'))
|
|
87
|
+
div.style.minWidth = '200px'
|
|
88
|
+
div.style.minHeight = '200px'
|
|
89
|
+
editor.mount(div)
|
|
90
|
+
editor.view.dom.focus()
|
|
91
|
+
|
|
92
|
+
const n = editor.nodes
|
|
93
|
+
const m = editor.marks
|
|
94
|
+
return { editor, n, m }
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @internal
|
|
99
|
+
*/
|
|
100
|
+
export function setupTest() {
|
|
101
|
+
const { editor, m, n } = setupTestFromExtension(defineTestExtension())
|
|
102
|
+
|
|
103
|
+
const listWithAttrs = (attrs: ListAttrs) => {
|
|
104
|
+
return (...children: NodeChild[]) => {
|
|
105
|
+
return n.list(attrs, ...children)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const headingWithAttrs = (attrs: { level: number }) => {
|
|
110
|
+
return (...children: NodeChild[]) => {
|
|
111
|
+
return n.heading(attrs, ...children)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const p = n.paragraph
|
|
116
|
+
|
|
117
|
+
const td = (text?: string, attrs?: CellAttrs) => {
|
|
118
|
+
return n.tableCell({ ...attrs }, text ? p(text) : p())
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const th = (text?: string, attrs?: CellAttrs) => {
|
|
122
|
+
return n.tableHeaderCell({ ...attrs }, text ? p(text) : p())
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const copy = async () => {
|
|
126
|
+
editor.view.dom.focus()
|
|
127
|
+
await pressKey('mod-C')
|
|
128
|
+
const html = await readHtmlTextFromClipboard()
|
|
129
|
+
const plain = await readPlainTextFromClipboard()
|
|
130
|
+
return { html, plain }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
editor,
|
|
135
|
+
m,
|
|
136
|
+
n: {
|
|
137
|
+
...n,
|
|
138
|
+
|
|
139
|
+
p,
|
|
140
|
+
|
|
141
|
+
td,
|
|
142
|
+
th,
|
|
143
|
+
tr: n.tableRow,
|
|
144
|
+
|
|
145
|
+
h1: headingWithAttrs({ level: 1 }),
|
|
146
|
+
h2: headingWithAttrs({ level: 2 }),
|
|
147
|
+
h3: headingWithAttrs({ level: 3 }),
|
|
148
|
+
h4: headingWithAttrs({ level: 4 }),
|
|
149
|
+
h5: headingWithAttrs({ level: 5 }),
|
|
150
|
+
h6: headingWithAttrs({ level: 6 }),
|
|
151
|
+
|
|
152
|
+
bullet: listWithAttrs({ kind: 'bullet' }),
|
|
153
|
+
ordered: listWithAttrs({ kind: 'ordered' }),
|
|
154
|
+
checked: listWithAttrs({ kind: 'task', checked: true }),
|
|
155
|
+
unchecked: listWithAttrs({ kind: 'task', checked: false }),
|
|
156
|
+
collapsed: listWithAttrs({ kind: 'toggle', collapsed: true }),
|
|
157
|
+
expanded: listWithAttrs({ kind: 'toggle', collapsed: false }),
|
|
158
|
+
},
|
|
159
|
+
copy,
|
|
160
|
+
}
|
|
161
|
+
}
|