@blocknote/core 0.17.1 → 0.19.0
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/blocknote.js +2774 -1804
- package/dist/blocknote.js.map +1 -1
- package/dist/blocknote.umd.cjs +9 -6
- package/dist/blocknote.umd.cjs.map +1 -1
- package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js +27 -0
- package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js +99 -0
- package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js +97 -0
- package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js +88 -0
- package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js +116 -0
- package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js +106 -0
- package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js +57 -0
- package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js +43 -0
- package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js +27 -0
- package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js +29 -0
- package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js +157 -0
- package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js +27 -0
- package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js +64 -0
- package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js +145 -0
- package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js +252 -0
- package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js.map +1 -0
- package/dist/src/api/blockManipulation/insertContentAt.js +64 -0
- package/dist/src/api/blockManipulation/insertContentAt.js.map +1 -0
- package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js +76 -0
- package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js.map +1 -0
- package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js +33 -0
- package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js.map +1 -0
- package/dist/src/api/blockManipulation/setupTestEnv.js +172 -0
- package/dist/src/api/blockManipulation/setupTestEnv.js.map +1 -0
- package/dist/src/api/clipboard/clipboard.test.js +246 -0
- package/dist/src/api/clipboard/clipboard.test.js.map +1 -0
- package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js +8 -0
- package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js.map +1 -0
- package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js +38 -0
- package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js.map +1 -0
- package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js +109 -0
- package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js.map +1 -0
- package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js +26 -0
- package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js.map +1 -0
- package/dist/src/api/clipboard/fromClipboard/pasteExtension.js +57 -0
- package/dist/src/api/clipboard/fromClipboard/pasteExtension.js.map +1 -0
- package/dist/src/api/clipboard/toClipboard/copyExtension.js +132 -0
- package/dist/src/api/clipboard/toClipboard/copyExtension.js.map +1 -0
- package/dist/src/api/exporters/html/externalHTMLExporter.js +35 -0
- package/dist/src/api/exporters/html/externalHTMLExporter.js.map +1 -0
- package/dist/src/api/exporters/html/htmlConversion.test.js +72 -0
- package/dist/src/api/exporters/html/htmlConversion.test.js.map +1 -0
- package/dist/src/api/exporters/html/internalHTMLSerializer.js +21 -0
- package/dist/src/api/exporters/html/internalHTMLSerializer.js.map +1 -0
- package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js +141 -0
- package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js.map +1 -0
- package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js +96 -0
- package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js.map +1 -0
- package/dist/src/api/exporters/markdown/markdownExporter.js +31 -0
- package/dist/src/api/exporters/markdown/markdownExporter.js.map +1 -0
- package/dist/src/api/exporters/markdown/markdownExporter.test.js +57 -0
- package/dist/src/api/exporters/markdown/markdownExporter.test.js.map +1 -0
- package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js +33 -0
- package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js.map +1 -0
- package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js +37 -0
- package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js.map +1 -0
- package/dist/src/api/getBlockInfoFromPos.js +171 -0
- package/dist/src/api/getBlockInfoFromPos.js.map +1 -0
- package/dist/src/api/nodeConversions/blockToNode.js +197 -0
- package/dist/src/api/nodeConversions/blockToNode.js.map +1 -0
- package/dist/src/api/nodeConversions/fragmentToBlocks.js +50 -0
- package/dist/src/api/nodeConversions/fragmentToBlocks.js.map +1 -0
- package/dist/src/api/nodeConversions/nodeConversions.test.js +54 -0
- package/dist/src/api/nodeConversions/nodeConversions.test.js.map +1 -0
- package/dist/src/api/nodeConversions/nodeToBlock.js +316 -0
- package/dist/src/api/nodeConversions/nodeToBlock.js.map +1 -0
- package/dist/src/api/nodeUtil.js +28 -0
- package/dist/src/api/nodeUtil.js.map +1 -0
- package/dist/src/api/parsers/html/parseHTML.js +19 -0
- package/dist/src/api/parsers/html/parseHTML.js.map +1 -0
- package/dist/src/api/parsers/html/parseHTML.test.js +470 -0
- package/dist/src/api/parsers/html/parseHTML.test.js.map +1 -0
- package/dist/src/api/parsers/html/util/nestedLists.js +106 -0
- package/dist/src/api/parsers/html/util/nestedLists.js.map +1 -0
- package/dist/src/api/parsers/html/util/nestedLists.test.js +166 -0
- package/dist/src/api/parsers/html/util/nestedLists.test.js.map +1 -0
- package/dist/src/api/parsers/markdown/parseMarkdown.js +52 -0
- package/dist/src/api/parsers/markdown/parseMarkdown.js.map +1 -0
- package/dist/src/api/parsers/markdown/parseMarkdown.test.js +109 -0
- package/dist/src/api/parsers/markdown/parseMarkdown.test.js.map +1 -0
- package/dist/src/api/testUtil/cases/customBlocks.js +313 -0
- package/dist/src/api/testUtil/cases/customBlocks.js.map +1 -0
- package/dist/src/api/testUtil/cases/customInlineContent.js +91 -0
- package/dist/src/api/testUtil/cases/customInlineContent.js.map +1 -0
- package/dist/src/api/testUtil/cases/customStyles.js +83 -0
- package/dist/src/api/testUtil/cases/customStyles.js.map +1 -0
- package/dist/src/api/testUtil/cases/defaultSchema.js +673 -0
- package/dist/src/api/testUtil/cases/defaultSchema.js.map +1 -0
- package/dist/src/api/testUtil/index.js +2 -0
- package/dist/src/api/testUtil/index.js.map +1 -0
- package/dist/src/api/testUtil/partialBlockTestUtil.js +114 -0
- package/dist/src/api/testUtil/partialBlockTestUtil.js.map +1 -0
- package/dist/src/api/testUtil/paste.js +29 -0
- package/dist/src/api/testUtil/paste.js.map +1 -0
- package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js +97 -0
- package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js.map +1 -0
- package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js +5 -0
- package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js.map +1 -0
- package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js +273 -0
- package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js.map +1 -0
- package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js +90 -0
- package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/FileBlockContent.js +70 -0
- package/dist/src/blocks/FileBlockContent/FileBlockContent.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js +317 -0
- package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js +15 -0
- package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js.map +1 -0
- package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js +141 -0
- package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js.map +1 -0
- package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js +106 -0
- package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js.map +1 -0
- package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js +6 -0
- package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js.map +1 -0
- package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js +111 -0
- package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js.map +1 -0
- package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js +218 -0
- package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js.map +1 -0
- package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js +41 -0
- package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js.map +1 -0
- package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js +58 -0
- package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js.map +1 -0
- package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js +128 -0
- package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js.map +1 -0
- package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js +51 -0
- package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js.map +1 -0
- package/dist/src/blocks/TableBlockContent/TableBlockContent.js +130 -0
- package/dist/src/blocks/TableBlockContent/TableBlockContent.js.map +1 -0
- package/dist/src/blocks/TableBlockContent/TableExtension.js +57 -0
- package/dist/src/blocks/TableBlockContent/TableExtension.js.map +1 -0
- package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js +103 -0
- package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js.map +1 -0
- package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js +6 -0
- package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js.map +1 -0
- package/dist/src/blocks/defaultBlockHelpers.js +50 -0
- package/dist/src/blocks/defaultBlockHelpers.js.map +1 -0
- package/dist/src/blocks/defaultBlockTypeGuards.js +40 -0
- package/dist/src/blocks/defaultBlockTypeGuards.js.map +1 -0
- package/dist/src/blocks/defaultBlocks.js +50 -0
- package/dist/src/blocks/defaultBlocks.js.map +1 -0
- package/dist/src/blocks/defaultProps.js +19 -0
- package/dist/src/blocks/defaultProps.js.map +1 -0
- package/dist/src/editor/BlockNoteEditor.js +750 -0
- package/dist/src/editor/BlockNoteEditor.js.map +1 -0
- package/dist/src/editor/BlockNoteEditor.test.js +65 -0
- package/dist/src/editor/BlockNoteEditor.test.js.map +1 -0
- package/dist/src/editor/BlockNoteExtensions.js +149 -0
- package/dist/src/editor/BlockNoteExtensions.js.map +1 -0
- package/dist/src/editor/BlockNoteSchema.js +38 -0
- package/dist/src/editor/BlockNoteSchema.js.map +1 -0
- package/dist/src/editor/BlockNoteTipTapEditor.js +169 -0
- package/dist/src/editor/BlockNoteTipTapEditor.js.map +1 -0
- package/dist/src/editor/cursorPositionTypes.js +2 -0
- package/dist/src/editor/cursorPositionTypes.js.map +1 -0
- package/dist/src/editor/defaultColors.js +77 -0
- package/dist/src/editor/defaultColors.js.map +1 -0
- package/dist/src/editor/selectionTypes.js +2 -0
- package/dist/src/editor/selectionTypes.js.map +1 -0
- package/dist/src/editor/transformPasted.js +79 -0
- package/dist/src/editor/transformPasted.js.map +1 -0
- package/dist/src/exporter/Exporter.js +36 -0
- package/dist/src/exporter/Exporter.js.map +1 -0
- package/dist/src/exporter/index.js +3 -0
- package/dist/src/exporter/index.js.map +1 -0
- package/dist/src/exporter/mapping.js +12 -0
- package/dist/src/exporter/mapping.js.map +1 -0
- package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js +30 -0
- package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js.map +1 -0
- package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js +39 -0
- package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js.map +1 -0
- package/dist/src/extensions/FilePanel/FilePanelPlugin.js +131 -0
- package/dist/src/extensions/FilePanel/FilePanelPlugin.js.map +1 -0
- package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js +195 -0
- package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js.map +1 -0
- package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js +309 -0
- package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js.map +1 -0
- package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js +247 -0
- package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js.map +1 -0
- package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js +51 -0
- package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js.map +1 -0
- package/dist/src/extensions/Placeholder/PlaceholderPlugin.js +81 -0
- package/dist/src/extensions/Placeholder/PlaceholderPlugin.js.map +1 -0
- package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js +183 -0
- package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js.map +1 -0
- package/dist/src/extensions/SideMenu/MultipleNodeSelection.js +68 -0
- package/dist/src/extensions/SideMenu/MultipleNodeSelection.js.map +1 -0
- package/dist/src/extensions/SideMenu/SideMenuPlugin.js +339 -0
- package/dist/src/extensions/SideMenu/SideMenuPlugin.js.map +1 -0
- package/dist/src/extensions/SideMenu/dragging.js +128 -0
- package/dist/src/extensions/SideMenu/dragging.js.map +1 -0
- package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js +2 -0
- package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js.map +1 -0
- package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js +2 -0
- package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js.map +1 -0
- package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js +245 -0
- package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js.map +1 -0
- package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js +26 -0
- package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js.map +1 -0
- package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js +244 -0
- package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js.map +1 -0
- package/dist/src/extensions/TableHandles/TableHandlesPlugin.js +553 -0
- package/dist/src/extensions/TableHandles/TableHandlesPlugin.js.map +1 -0
- package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js +36 -0
- package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js.map +1 -0
- package/dist/src/extensions/TextColor/TextColorExtension.js +29 -0
- package/dist/src/extensions/TextColor/TextColorExtension.js.map +1 -0
- package/dist/src/extensions/TextColor/TextColorMark.js +37 -0
- package/dist/src/extensions/TextColor/TextColorMark.js.map +1 -0
- package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js +58 -0
- package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js.map +1 -0
- package/dist/src/extensions/UniqueID/UniqueID.js +283 -0
- package/dist/src/extensions/UniqueID/UniqueID.js.map +1 -0
- package/dist/src/extensions/getDraggableBlockFromElement.js +13 -0
- package/dist/src/extensions/getDraggableBlockFromElement.js.map +1 -0
- package/dist/src/extensions-shared/UiElementPosition.js +2 -0
- package/dist/src/extensions-shared/UiElementPosition.js.map +1 -0
- package/dist/src/i18n/dictionary.js +4 -0
- package/dist/src/i18n/dictionary.js.map +1 -0
- package/dist/src/i18n/locales/ar.js +298 -0
- package/dist/src/i18n/locales/ar.js.map +1 -0
- package/dist/src/i18n/locales/de.js +313 -0
- package/dist/src/i18n/locales/de.js.map +1 -0
- package/dist/src/i18n/locales/en.js +314 -0
- package/dist/src/i18n/locales/en.js.map +1 -0
- package/dist/src/i18n/locales/es.js +312 -0
- package/dist/src/i18n/locales/es.js.map +1 -0
- package/dist/src/i18n/locales/fr.js +313 -0
- package/dist/src/i18n/locales/fr.js.map +1 -0
- package/dist/src/i18n/locales/hr.js +308 -0
- package/dist/src/i18n/locales/hr.js.map +1 -0
- package/dist/src/i18n/locales/index.js +16 -0
- package/dist/src/i18n/locales/index.js.map +1 -0
- package/dist/src/i18n/locales/is.js +305 -0
- package/dist/src/i18n/locales/is.js.map +1 -0
- package/dist/src/i18n/locales/ja.js +333 -0
- package/dist/src/i18n/locales/ja.js.map +1 -0
- package/dist/src/i18n/locales/ko.js +326 -0
- package/dist/src/i18n/locales/ko.js.map +1 -0
- package/dist/src/i18n/locales/nl.js +313 -0
- package/dist/src/i18n/locales/nl.js.map +1 -0
- package/dist/src/i18n/locales/pl.js +297 -0
- package/dist/src/i18n/locales/pl.js.map +1 -0
- package/dist/src/i18n/locales/pt.js +305 -0
- package/dist/src/i18n/locales/pt.js.map +1 -0
- package/dist/src/i18n/locales/ru.js +340 -0
- package/dist/src/i18n/locales/ru.js.map +1 -0
- package/dist/src/i18n/locales/vi.js +312 -0
- package/dist/src/i18n/locales/vi.js.map +1 -0
- package/dist/src/i18n/locales/zh.js +346 -0
- package/dist/src/i18n/locales/zh.js.map +1 -0
- package/dist/src/index.js +55 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/pm-nodes/BlockContainer.js +72 -0
- package/dist/src/pm-nodes/BlockContainer.js.map +1 -0
- package/dist/src/pm-nodes/BlockGroup.js +43 -0
- package/dist/src/pm-nodes/BlockGroup.js.map +1 -0
- package/dist/src/pm-nodes/Doc.js +7 -0
- package/dist/src/pm-nodes/Doc.js.map +1 -0
- package/dist/src/pm-nodes/index.js +4 -0
- package/dist/src/pm-nodes/index.js.map +1 -0
- package/dist/src/schema/blocks/createSpec.js +126 -0
- package/dist/src/schema/blocks/createSpec.js.map +1 -0
- package/dist/src/schema/blocks/internal.js +147 -0
- package/dist/src/schema/blocks/internal.js.map +1 -0
- package/dist/src/schema/blocks/types.js +2 -0
- package/dist/src/schema/blocks/types.js.map +1 -0
- package/dist/src/schema/index.js +11 -0
- package/dist/src/schema/index.js.map +1 -0
- package/dist/src/schema/inlineContent/createSpec.js +64 -0
- package/dist/src/schema/inlineContent/createSpec.js.map +1 -0
- package/dist/src/schema/inlineContent/internal.js +52 -0
- package/dist/src/schema/inlineContent/internal.js.map +1 -0
- package/dist/src/schema/inlineContent/types.js +10 -0
- package/dist/src/schema/inlineContent/types.js.map +1 -0
- package/dist/src/schema/propTypes.js +2 -0
- package/dist/src/schema/propTypes.js.map +1 -0
- package/dist/src/schema/styles/createSpec.js +48 -0
- package/dist/src/schema/styles/createSpec.js.map +1 -0
- package/dist/src/schema/styles/internal.js +53 -0
- package/dist/src/schema/styles/internal.js.map +1 -0
- package/dist/src/schema/styles/types.js +2 -0
- package/dist/src/schema/styles/types.js.map +1 -0
- package/dist/src/util/EventEmitter.js +33 -0
- package/dist/src/util/EventEmitter.js.map +1 -0
- package/dist/src/util/browser.js +17 -0
- package/dist/src/util/browser.js.map +1 -0
- package/dist/src/util/combineByGroup.js +20 -0
- package/dist/src/util/combineByGroup.js.map +1 -0
- package/dist/src/util/esmDependencies.js +35 -0
- package/dist/src/util/esmDependencies.js.map +1 -0
- package/dist/src/util/string.js +14 -0
- package/dist/src/util/string.js.map +1 -0
- package/dist/src/util/typescript.js +12 -0
- package/dist/src/util/typescript.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/webpack-stats.json +1 -1
- package/package.json +9 -7
- package/src/api/blockManipulation/commands/insertBlocks/__snapshots__/insertBlocks.test.ts.snap +30 -0
- package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +2 -0
- package/src/api/blockManipulation/commands/mergeBlocks/__snapshots__/mergeBlocks.test.ts.snap +25 -0
- package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts +2 -2
- package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.ts +104 -39
- package/src/api/blockManipulation/commands/moveBlock/__snapshots__/moveBlock.test.ts.snap +40 -0
- package/src/api/blockManipulation/commands/moveBlock/moveBlock.ts +3 -5
- package/src/api/blockManipulation/commands/nestBlock/nestBlock.ts +100 -0
- package/src/api/blockManipulation/commands/removeBlocks/__snapshots__/removeBlocks.test.ts.snap +10 -0
- package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.ts +1 -1
- package/src/api/blockManipulation/commands/replaceBlocks/__snapshots__/replaceBlocks.test.ts.snap +40 -0
- package/src/api/blockManipulation/commands/splitBlock/__snapshots__/splitBlock.test.ts.snap +30 -0
- package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +8 -4
- package/src/api/blockManipulation/commands/splitBlock/splitBlock.ts +11 -7
- package/src/api/blockManipulation/commands/updateBlock/__snapshots__/updateBlock.test.ts.snap +87 -0
- package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +5 -5
- package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +192 -107
- package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +48 -33
- package/src/api/clipboard/clipboard.test.ts +1 -1
- package/src/api/clipboard/fromClipboard/acceptedMIMETypes.ts +1 -0
- package/src/api/clipboard/fromClipboard/handleFileInsertion.ts +1 -1
- package/src/api/clipboard/fromClipboard/handleVSCodePaste.ts +49 -0
- package/src/api/clipboard/fromClipboard/pasteExtension.ts +6 -0
- package/src/api/clipboard/toClipboard/copyExtension.ts +1 -1
- package/src/api/exporters/html/__snapshots__/codeBlock/defaultLanguage/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/codeBlock/defaultLanguage/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/codeBlock/empty/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/codeBlock/empty/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/codeBlock/python/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/codeBlock/python/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/image/basic/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/image/nested/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/image/noName/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/image/noPreview/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/lists/basic/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/lists/nested/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/simpleImage/basic/external.html +1 -1
- package/src/api/exporters/html/__snapshots__/simpleImage/basic/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/simpleImage/nested/external.html +1 -1
- package/src/api/exporters/html/__snapshots__/simpleImage/nested/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/simpleImage/noCaption/external.html +1 -1
- package/src/api/exporters/html/__snapshots__/simpleImage/noName/external.html +1 -1
- package/src/api/exporters/html/__snapshots__/simpleImage/noName/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/simpleImage/noPreview/external.html +1 -1
- package/src/api/exporters/html/__snapshots__/simpleImage/noPreview/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/table/allColWidths/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/allColWidths/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/mixedColWidths/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/table/mixedColWidths/internal.html +1 -0
- package/src/api/exporters/html/htmlConversion.test.ts +1 -4
- package/src/api/exporters/html/internalHTMLSerializer.ts +2 -7
- package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +7 -1
- package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +75 -33
- package/src/api/exporters/markdown/__snapshots__/codeBlock/defaultLanguage/markdown.md +3 -0
- package/src/api/exporters/markdown/__snapshots__/codeBlock/empty/markdown.md +2 -0
- package/src/api/exporters/markdown/__snapshots__/codeBlock/python/markdown.md +3 -0
- package/src/api/exporters/markdown/__snapshots__/table/allColWidths/markdown.md +5 -0
- package/src/api/exporters/markdown/__snapshots__/table/basic/markdown.md +5 -0
- package/src/api/exporters/markdown/__snapshots__/table/mixedColWidths/markdown.md +5 -0
- package/src/api/exporters/markdown/markdownExporter.test.ts +1 -4
- package/src/api/getBlockInfoFromPos.ts +113 -58
- package/src/api/nodeConversions/__snapshots__/nodeConversions.test.ts.snap +711 -0
- package/src/api/nodeConversions/blockToNode.ts +62 -26
- package/src/api/nodeConversions/fragmentToBlocks.ts +18 -0
- package/src/api/nodeConversions/nodeToBlock.ts +35 -22
- package/src/api/nodeUtil.ts +1 -1
- package/src/api/parsers/html/__snapshots__/parse-notion-html.json +5 -0
- package/src/api/parsers/markdown/parseMarkdown.ts +1 -1
- package/src/api/testUtil/cases/defaultSchema.ts +95 -0
- package/src/api/testUtil/partialBlockTestUtil.ts +41 -4
- package/src/blocks/AudioBlockContent/AudioBlockContent.ts +4 -2
- package/src/blocks/CodeBlockContent/CodeBlockContent.ts +369 -0
- package/src/blocks/CodeBlockContent/defaultSupportedLanguages.ts +96 -0
- package/src/blocks/FileBlockContent/fileBlockHelpers.ts +10 -2
- package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +19 -31
- package/src/blocks/ImageBlockContent/ImageBlockContent.ts +4 -2
- package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +5 -9
- package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +6 -10
- package/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts +1 -1
- package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +11 -4
- package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +5 -9
- package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +4 -8
- package/src/blocks/TableBlockContent/TableBlockContent.ts +83 -8
- package/src/blocks/TableBlockContent/TableExtension.ts +10 -1
- package/src/blocks/VideoBlockContent/VideoBlockContent.ts +4 -2
- package/src/blocks/defaultBlockHelpers.ts +7 -2
- package/src/blocks/defaultBlocks.ts +4 -0
- package/src/editor/Block.css +71 -3
- package/src/editor/BlockNoteEditor.test.ts +2 -2
- package/src/editor/BlockNoteEditor.ts +18 -21
- package/src/editor/BlockNoteExtensions.ts +2 -3
- package/src/editor/BlockNoteTipTapEditor.ts +8 -1
- package/src/editor/defaultColors.ts +77 -0
- package/src/editor/editor.css +43 -5
- package/src/editor/transformPasted.ts +6 -3
- package/src/exporter/Exporter.ts +101 -0
- package/src/exporter/index.ts +2 -0
- package/src/exporter/mapping.ts +75 -0
- package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +8 -0
- package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +201 -48
- package/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts +1 -1
- package/src/extensions/Placeholder/PlaceholderPlugin.ts +5 -0
- package/src/extensions/SideMenu/SideMenuPlugin.ts +141 -52
- package/src/extensions/SideMenu/dragging.ts +3 -54
- package/src/extensions/SuggestionMenu/SuggestionPlugin.ts +5 -0
- package/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.ts +2 -1
- package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +22 -6
- package/src/extensions/TableHandles/TableHandlesPlugin.ts +225 -120
- package/src/extensions/TrailingNode/TrailingNodeExtension.ts +1 -1
- package/src/extensions/getDraggableBlockFromElement.ts +19 -0
- package/src/i18n/locales/ar.ts +6 -0
- package/src/i18n/locales/de.ts +299 -294
- package/src/i18n/locales/en.ts +6 -0
- package/src/i18n/locales/es.ts +310 -274
- package/src/i18n/locales/fr.ts +6 -0
- package/src/i18n/locales/is.ts +6 -0
- package/src/i18n/locales/ja.ts +6 -0
- package/src/i18n/locales/ko.ts +6 -0
- package/src/i18n/locales/nl.ts +6 -0
- package/src/i18n/locales/pl.ts +6 -0
- package/src/i18n/locales/pt.ts +10 -4
- package/src/i18n/locales/ru.ts +6 -0
- package/src/i18n/locales/vi.ts +6 -0
- package/src/i18n/locales/zh.ts +6 -0
- package/src/index.ts +9 -0
- package/src/pm-nodes/BlockContainer.ts +1 -1
- package/src/pm-nodes/BlockGroup.ts +2 -2
- package/src/pm-nodes/README.md +127 -28
- package/src/schema/blocks/createSpec.ts +4 -1
- package/src/schema/blocks/internal.ts +12 -2
- package/src/schema/blocks/types.ts +3 -1
- package/src/util/combineByGroup.ts +25 -0
- package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.d.ts +22 -2
- package/types/src/api/blockManipulation/commands/nestBlock/nestBlock.d.ts +5 -0
- package/types/src/api/blockManipulation/setupTestEnv.d.ts +22 -8
- package/types/src/api/clipboard/fromClipboard/acceptedMIMETypes.d.ts +1 -1
- package/types/src/api/clipboard/fromClipboard/handleVSCodePaste.d.ts +3 -0
- package/types/src/api/exporters/html/util/serializeBlocksInternalHTML.d.ts +2 -3
- package/types/src/api/getBlockInfoFromPos.d.ts +55 -5
- package/types/src/api/nodeConversions/blockToNode.d.ts +1 -1
- package/types/src/api/nodeConversions/nodeToBlock.d.ts +3 -1
- package/types/src/api/testUtil/cases/customBlocks.d.ts +22 -8
- package/types/src/api/testUtil/cases/customInlineContent.d.ts +22 -8
- package/types/src/api/testUtil/cases/customStyles.d.ts +22 -8
- package/types/src/api/testUtil/partialBlockTestUtil.d.ts +2 -1
- package/types/src/blocks/AudioBlockContent/AudioBlockContent.d.ts +1 -0
- package/types/src/blocks/CodeBlockContent/CodeBlockContent.d.ts +57 -0
- package/types/src/blocks/CodeBlockContent/defaultSupportedLanguages.d.ts +6 -0
- package/types/src/blocks/FileBlockContent/fileBlockHelpers.d.ts +1 -0
- package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +1 -0
- package/types/src/blocks/TableBlockContent/TableBlockContent.d.ts +0 -12
- package/types/src/blocks/TableBlockContent/TableExtension.d.ts +3 -0
- package/types/src/blocks/VideoBlockContent/VideoBlockContent.d.ts +1 -0
- package/types/src/blocks/defaultBlocks.d.ts +45 -16
- package/types/src/editor/BlockNoteEditor.d.ts +4 -3
- package/types/src/editor/BlockNoteTipTapEditor.d.ts +1 -0
- package/types/src/editor/defaultColors.d.ts +76 -0
- package/types/src/exporter/Exporter.d.ts +43 -0
- package/types/src/exporter/index.d.ts +2 -0
- package/types/src/exporter/mapping.d.ts +30 -0
- package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +2 -1
- package/types/src/extensions/SideMenu/dragging.d.ts +1 -6
- package/types/src/extensions/TableHandles/TableHandlesPlugin.d.ts +9 -5
- package/types/src/extensions/getDraggableBlockFromElement.d.ts +5 -0
- package/types/src/i18n/locales/de.d.ts +6 -0
- package/types/src/i18n/locales/en.d.ts +6 -0
- package/types/src/i18n/locales/es.d.ts +6 -0
- package/types/src/index.d.ts +6 -0
- package/types/src/schema/blocks/createSpec.d.ts +1 -1
- package/types/src/schema/blocks/internal.d.ts +2 -2
- package/types/src/schema/blocks/types.d.ts +3 -1
- package/types/src/util/combineByGroup.d.ts +9 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { blockToNode } from "../../../nodeConversions/blockToNode.js";
|
|
2
|
+
import { nodeToBlock } from "../../../nodeConversions/nodeToBlock.js";
|
|
3
|
+
import { getNodeById } from "../../../nodeUtil.js";
|
|
4
|
+
export function insertBlocks(editor, blocksToInsert, referenceBlock, placement = "before") {
|
|
5
|
+
const id = typeof referenceBlock === "string" ? referenceBlock : referenceBlock.id;
|
|
6
|
+
const nodesToInsert = [];
|
|
7
|
+
for (const blockSpec of blocksToInsert) {
|
|
8
|
+
nodesToInsert.push(blockToNode(blockSpec, editor.pmSchema, editor.schema.styleSchema));
|
|
9
|
+
}
|
|
10
|
+
const { node, posBeforeNode } = getNodeById(id, editor._tiptapEditor.state.doc);
|
|
11
|
+
// TODO: we might want to use the ReplaceStep directly here instead of insert,
|
|
12
|
+
// because the fitting algorithm should not be necessary and might even cause unexpected behavior
|
|
13
|
+
if (placement === "before") {
|
|
14
|
+
editor.dispatch(editor._tiptapEditor.state.tr.insert(posBeforeNode, nodesToInsert));
|
|
15
|
+
}
|
|
16
|
+
if (placement === "after") {
|
|
17
|
+
editor.dispatch(editor._tiptapEditor.state.tr.insert(posBeforeNode + node.nodeSize, nodesToInsert));
|
|
18
|
+
}
|
|
19
|
+
// Now that the `PartialBlock`s have been converted to nodes, we can
|
|
20
|
+
// re-convert them into full `Block`s.
|
|
21
|
+
const insertedBlocks = [];
|
|
22
|
+
for (const node of nodesToInsert) {
|
|
23
|
+
insertedBlocks.push(nodeToBlock(node, editor.schema.blockSchema, editor.schema.inlineContentSchema, editor.schema.styleSchema, editor.blockCache));
|
|
24
|
+
}
|
|
25
|
+
return insertedBlocks;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=insertBlocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertBlocks.js","sourceRoot":"","sources":["../../../../../../src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,UAAU,YAAY,CAK1B,MAAsC,EACtC,cAA6C,EAC7C,cAA+B,EAC/B,YAAgC,QAAQ;IAExC,MAAM,EAAE,GACN,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC;IAE1E,MAAM,aAAa,GAAW,EAAE,CAAC;IACjC,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;QACvC,aAAa,CAAC,IAAI,CAChB,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CACnE,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,WAAW,CACzC,EAAE,EACF,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAC/B,CAAC;IAEF,8EAA8E;IAC9E,iGAAiG;IACjG,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,CACnE,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAClC,aAAa,GAAG,IAAI,CAAC,QAAQ,EAC7B,aAAa,CACd,CACF,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,sCAAsC;IACtC,MAAM,cAAc,GAA2B,EAAE,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,cAAc,CAAC,IAAI,CACjB,WAAW,CACT,IAAI,EACJ,MAAM,CAAC,MAAM,CAAC,WAAW,EACzB,MAAM,CAAC,MAAM,CAAC,mBAAmB,EACjC,MAAM,CAAC,MAAM,CAAC,WAAW,EACzB,MAAM,CAAC,UAAU,CAClB,CACF,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { setupTestEnv } from "../../setupTestEnv.js";
|
|
3
|
+
import { insertBlocks } from "./insertBlocks.js";
|
|
4
|
+
const getEditor = setupTestEnv();
|
|
5
|
+
describe("Test insertBlocks", () => {
|
|
6
|
+
it("Insert single basic block before", () => {
|
|
7
|
+
insertBlocks(getEditor(), [{ type: "paragraph" }], "paragraph-0", "before");
|
|
8
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
9
|
+
});
|
|
10
|
+
it("Insert single basic block after", () => {
|
|
11
|
+
insertBlocks(getEditor(), [{ type: "paragraph" }], "paragraph-0", "after");
|
|
12
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
13
|
+
});
|
|
14
|
+
it("Insert multiple blocks before", () => {
|
|
15
|
+
insertBlocks(getEditor(), [
|
|
16
|
+
{ type: "paragraph", content: "Inserted paragraph 1" },
|
|
17
|
+
{ type: "paragraph", content: "Inserted paragraph 2" },
|
|
18
|
+
{ type: "paragraph", content: "Inserted paragraph 3" },
|
|
19
|
+
], "paragraph-0", "before");
|
|
20
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
21
|
+
});
|
|
22
|
+
it("Insert multiple blocks after", () => {
|
|
23
|
+
insertBlocks(getEditor(), [
|
|
24
|
+
{ type: "paragraph", content: "Inserted paragraph 1" },
|
|
25
|
+
{ type: "paragraph", content: "Inserted paragraph 2" },
|
|
26
|
+
{ type: "paragraph", content: "Inserted paragraph 3" },
|
|
27
|
+
], "paragraph-0", "after");
|
|
28
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
29
|
+
});
|
|
30
|
+
it("Insert single complex block before", () => {
|
|
31
|
+
insertBlocks(getEditor(), [
|
|
32
|
+
{
|
|
33
|
+
id: "inserted-heading-with-everything",
|
|
34
|
+
type: "heading",
|
|
35
|
+
props: {
|
|
36
|
+
backgroundColor: "red",
|
|
37
|
+
level: 2,
|
|
38
|
+
textAlignment: "center",
|
|
39
|
+
textColor: "red",
|
|
40
|
+
},
|
|
41
|
+
content: [
|
|
42
|
+
{ type: "text", text: "Heading", styles: { bold: true } },
|
|
43
|
+
{ type: "text", text: " with styled ", styles: {} },
|
|
44
|
+
{ type: "text", text: "content", styles: { italic: true } },
|
|
45
|
+
],
|
|
46
|
+
children: [
|
|
47
|
+
{
|
|
48
|
+
id: "inserted-nested-paragraph-2",
|
|
49
|
+
type: "paragraph",
|
|
50
|
+
content: "Nested Paragraph 2",
|
|
51
|
+
children: [
|
|
52
|
+
{
|
|
53
|
+
id: "inserted-double-nested-paragraph-2",
|
|
54
|
+
type: "paragraph",
|
|
55
|
+
content: "Double Nested Paragraph 2",
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
], "paragraph-0", "before");
|
|
62
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
63
|
+
});
|
|
64
|
+
it("Insert single complex block after", () => {
|
|
65
|
+
insertBlocks(getEditor(), [
|
|
66
|
+
{
|
|
67
|
+
id: "inserted-heading-with-everything",
|
|
68
|
+
type: "heading",
|
|
69
|
+
props: {
|
|
70
|
+
backgroundColor: "red",
|
|
71
|
+
level: 2,
|
|
72
|
+
textAlignment: "center",
|
|
73
|
+
textColor: "red",
|
|
74
|
+
},
|
|
75
|
+
content: [
|
|
76
|
+
{ type: "text", text: "Heading", styles: { bold: true } },
|
|
77
|
+
{ type: "text", text: " with styled ", styles: {} },
|
|
78
|
+
{ type: "text", text: "content", styles: { italic: true } },
|
|
79
|
+
],
|
|
80
|
+
children: [
|
|
81
|
+
{
|
|
82
|
+
id: "inserted-nested-paragraph-2",
|
|
83
|
+
type: "paragraph",
|
|
84
|
+
content: "Nested Paragraph 2",
|
|
85
|
+
children: [
|
|
86
|
+
{
|
|
87
|
+
id: "inserted-double-nested-paragraph-2",
|
|
88
|
+
type: "paragraph",
|
|
89
|
+
content: "Double Nested Paragraph 2",
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
], "paragraph-0", "after");
|
|
96
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=insertBlocks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertBlocks.test.js","sourceRoot":"","sources":["../../../../../../src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { getBlockInfoFromResolvedPos, } from "../../../getBlockInfoFromPos.js";
|
|
2
|
+
/**
|
|
3
|
+
* Returns the block info from the parent block
|
|
4
|
+
* or undefined if we're at the root
|
|
5
|
+
*/
|
|
6
|
+
export const getParentBlockInfo = (doc, beforePos) => {
|
|
7
|
+
const $pos = doc.resolve(beforePos);
|
|
8
|
+
if ($pos.depth <= 1) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
// get start pos of parent
|
|
12
|
+
const parentBeforePos = $pos.posAtIndex($pos.index($pos.depth - 1), $pos.depth - 1);
|
|
13
|
+
const parentBlockInfo = getBlockInfoFromResolvedPos(doc.resolve(parentBeforePos));
|
|
14
|
+
return parentBlockInfo;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Returns the block info from the sibling block before (above) the given block,
|
|
18
|
+
* or undefined if the given block is the first sibling.
|
|
19
|
+
*/
|
|
20
|
+
export const getPrevBlockInfo = (doc, beforePos) => {
|
|
21
|
+
const $pos = doc.resolve(beforePos);
|
|
22
|
+
const indexInParent = $pos.index();
|
|
23
|
+
if (indexInParent === 0) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
const prevBlockBeforePos = $pos.posAtIndex(indexInParent - 1);
|
|
27
|
+
const prevBlockInfo = getBlockInfoFromResolvedPos(doc.resolve(prevBlockBeforePos));
|
|
28
|
+
return prevBlockInfo;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* If a block has children like this:
|
|
32
|
+
* A
|
|
33
|
+
* - B
|
|
34
|
+
* - C
|
|
35
|
+
* -- D
|
|
36
|
+
*
|
|
37
|
+
* Then the bottom nested block returned is D.
|
|
38
|
+
*/
|
|
39
|
+
export const getBottomNestedBlockInfo = (doc, blockInfo) => {
|
|
40
|
+
while (blockInfo.childContainer) {
|
|
41
|
+
const group = blockInfo.childContainer.node;
|
|
42
|
+
const newPos = doc
|
|
43
|
+
.resolve(blockInfo.childContainer.beforePos + 1)
|
|
44
|
+
.posAtIndex(group.childCount - 1);
|
|
45
|
+
blockInfo = getBlockInfoFromResolvedPos(doc.resolve(newPos));
|
|
46
|
+
}
|
|
47
|
+
return blockInfo;
|
|
48
|
+
};
|
|
49
|
+
const canMerge = (prevBlockInfo, nextBlockInfo) => {
|
|
50
|
+
return (prevBlockInfo.isBlockContainer &&
|
|
51
|
+
prevBlockInfo.blockContent.node.type.spec.content === "inline*" &&
|
|
52
|
+
prevBlockInfo.blockContent.node.childCount > 0 &&
|
|
53
|
+
nextBlockInfo.isBlockContainer &&
|
|
54
|
+
nextBlockInfo.blockContent.node.type.spec.content === "inline*");
|
|
55
|
+
};
|
|
56
|
+
const mergeBlocks = (state, dispatch, prevBlockInfo, nextBlockInfo) => {
|
|
57
|
+
// Un-nests all children of the next block.
|
|
58
|
+
if (!nextBlockInfo.isBlockContainer) {
|
|
59
|
+
throw new Error(`Attempted to merge block at position ${nextBlockInfo.bnBlock.beforePos} into previous block at position ${prevBlockInfo.bnBlock.beforePos}, but next block is not a block container`);
|
|
60
|
+
}
|
|
61
|
+
// Removes a level of nesting all children of the next block by 1 level, if it contains both content and block
|
|
62
|
+
// group nodes.
|
|
63
|
+
if (nextBlockInfo.childContainer) {
|
|
64
|
+
const childBlocksStart = state.doc.resolve(nextBlockInfo.childContainer.beforePos + 1);
|
|
65
|
+
const childBlocksEnd = state.doc.resolve(nextBlockInfo.childContainer.afterPos - 1);
|
|
66
|
+
const childBlocksRange = childBlocksStart.blockRange(childBlocksEnd);
|
|
67
|
+
if (dispatch) {
|
|
68
|
+
const pos = state.doc.resolve(nextBlockInfo.bnBlock.beforePos);
|
|
69
|
+
state.tr.lift(childBlocksRange, pos.depth);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Deletes the boundary between the two blocks. Can be thought of as
|
|
73
|
+
// removing the closing tags of the first block and the opening tags of the
|
|
74
|
+
// second one to stitch them together.
|
|
75
|
+
if (dispatch) {
|
|
76
|
+
if (!prevBlockInfo.isBlockContainer) {
|
|
77
|
+
throw new Error(`Attempted to merge block at position ${nextBlockInfo.bnBlock.beforePos} into previous block at position ${prevBlockInfo.bnBlock.beforePos}, but previous block is not a block container`);
|
|
78
|
+
}
|
|
79
|
+
// TODO: test merging between a columnList and paragraph, between two columnLists, and v.v.
|
|
80
|
+
dispatch(state.tr.delete(prevBlockInfo.blockContent.afterPos - 1, nextBlockInfo.blockContent.beforePos + 1));
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
};
|
|
84
|
+
export const mergeBlocksCommand = (posBetweenBlocks) => ({ state, dispatch, }) => {
|
|
85
|
+
const $pos = state.doc.resolve(posBetweenBlocks);
|
|
86
|
+
const nextBlockInfo = getBlockInfoFromResolvedPos($pos);
|
|
87
|
+
const prevBlockInfo = getPrevBlockInfo(state.doc, nextBlockInfo.bnBlock.beforePos);
|
|
88
|
+
if (!prevBlockInfo) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
const bottomNestedBlockInfo = getBottomNestedBlockInfo(state.doc, prevBlockInfo);
|
|
92
|
+
if (!canMerge(bottomNestedBlockInfo, nextBlockInfo)) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return mergeBlocks(state, dispatch, bottomNestedBlockInfo, nextBlockInfo);
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=mergeBlocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeBlocks.js","sourceRoot":"","sources":["../../../../../../src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { getBlockInfoFromSelection } from "../../../getBlockInfoFromPos.js";
|
|
3
|
+
import { setupTestEnv } from "../../setupTestEnv.js";
|
|
4
|
+
import { mergeBlocksCommand } from "./mergeBlocks.js";
|
|
5
|
+
const getEditor = setupTestEnv();
|
|
6
|
+
function mergeBlocks(posBetweenBlocks) {
|
|
7
|
+
return getEditor()._tiptapEditor.commands.command(mergeBlocksCommand(posBetweenBlocks));
|
|
8
|
+
}
|
|
9
|
+
function getPosBeforeSelectedBlock() {
|
|
10
|
+
return getBlockInfoFromSelection(getEditor()._tiptapEditor.state).bnBlock
|
|
11
|
+
.beforePos;
|
|
12
|
+
}
|
|
13
|
+
describe("Test mergeBlocks", () => {
|
|
14
|
+
it("Basic", () => {
|
|
15
|
+
getEditor().setTextCursorPosition("paragraph-1");
|
|
16
|
+
mergeBlocks(getPosBeforeSelectedBlock());
|
|
17
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
18
|
+
});
|
|
19
|
+
it("First block has children", () => {
|
|
20
|
+
getEditor().setTextCursorPosition("paragraph-2");
|
|
21
|
+
mergeBlocks(getPosBeforeSelectedBlock());
|
|
22
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
23
|
+
});
|
|
24
|
+
it("Second block has children", () => {
|
|
25
|
+
getEditor().setTextCursorPosition("paragraph-with-children");
|
|
26
|
+
mergeBlocks(getPosBeforeSelectedBlock());
|
|
27
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
28
|
+
});
|
|
29
|
+
it("Second block is empty", () => {
|
|
30
|
+
getEditor().setTextCursorPosition("empty-paragraph");
|
|
31
|
+
mergeBlocks(getPosBeforeSelectedBlock());
|
|
32
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
33
|
+
});
|
|
34
|
+
it("Blocks have different types", () => {
|
|
35
|
+
getEditor().setTextCursorPosition("paragraph-5");
|
|
36
|
+
mergeBlocks(getPosBeforeSelectedBlock());
|
|
37
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
38
|
+
});
|
|
39
|
+
it("Selection is updated", () => {
|
|
40
|
+
getEditor().setTextCursorPosition("paragraph-0", "end");
|
|
41
|
+
const firstBlockEndOffset = getEditor()._tiptapEditor.state.selection.$anchor.parentOffset;
|
|
42
|
+
getEditor().setTextCursorPosition("paragraph-1");
|
|
43
|
+
mergeBlocks(getPosBeforeSelectedBlock());
|
|
44
|
+
const anchorIsAtOldFirstBlockEndPos = getEditor()._tiptapEditor.state.selection.$anchor.parentOffset ===
|
|
45
|
+
firstBlockEndOffset;
|
|
46
|
+
expect(anchorIsAtOldFirstBlockEndPos).toBeTruthy();
|
|
47
|
+
});
|
|
48
|
+
// We expect a no-op for each of the remaining tests as merging should only
|
|
49
|
+
// happen for blocks which both have inline content. We also expect
|
|
50
|
+
// `mergeBlocks` to return false as TipTap commands should do that instead of
|
|
51
|
+
// throwing an error, when the command cannot be executed.
|
|
52
|
+
it("First block is empty", () => {
|
|
53
|
+
getEditor().setTextCursorPosition("paragraph-8");
|
|
54
|
+
const originalDocument = getEditor().document;
|
|
55
|
+
const ret = mergeBlocks(getPosBeforeSelectedBlock());
|
|
56
|
+
expect(getEditor().document).toEqual(originalDocument);
|
|
57
|
+
expect(ret).toBeFalsy();
|
|
58
|
+
});
|
|
59
|
+
it("Inline content & no content", () => {
|
|
60
|
+
getEditor().setTextCursorPosition("image-0");
|
|
61
|
+
const originalDocument = getEditor().document;
|
|
62
|
+
const ret = mergeBlocks(getPosBeforeSelectedBlock());
|
|
63
|
+
expect(getEditor().document).toEqual(originalDocument);
|
|
64
|
+
expect(ret).toBeFalsy();
|
|
65
|
+
});
|
|
66
|
+
it("Inline content & table content", () => {
|
|
67
|
+
getEditor().setTextCursorPosition("table-0");
|
|
68
|
+
const originalDocument = getEditor().document;
|
|
69
|
+
const ret = mergeBlocks(getPosBeforeSelectedBlock());
|
|
70
|
+
expect(getEditor().document).toEqual(originalDocument);
|
|
71
|
+
expect(ret).toBeFalsy();
|
|
72
|
+
});
|
|
73
|
+
it("No content & inline content", () => {
|
|
74
|
+
getEditor().setTextCursorPosition("paragraph-6");
|
|
75
|
+
const originalDocument = getEditor().document;
|
|
76
|
+
const ret = mergeBlocks(getPosBeforeSelectedBlock());
|
|
77
|
+
expect(getEditor().document).toEqual(originalDocument);
|
|
78
|
+
expect(ret).toBeFalsy();
|
|
79
|
+
});
|
|
80
|
+
it("Table content & inline content", () => {
|
|
81
|
+
getEditor().setTextCursorPosition("paragraph-7");
|
|
82
|
+
const originalDocument = getEditor().document;
|
|
83
|
+
const ret = mergeBlocks(getPosBeforeSelectedBlock());
|
|
84
|
+
expect(getEditor().document).toEqual(originalDocument);
|
|
85
|
+
expect(ret).toBeFalsy();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=mergeBlocks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeBlocks.test.js","sourceRoot":"","sources":["../../../../../../src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;AAEjC,SAAS,WAAW,CAAC,gBAAwB;IAC3C,OAAO,SAAS,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAC/C,kBAAkB,CAAC,gBAAgB,CAAC,CACrC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB;IAChC,OAAO,yBAAyB,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,OAAO;SACtE,SAAS,CAAC;AACf,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACf,SAAS,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAEjD,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAEzC,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,SAAS,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAEjD,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAEzC,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,SAAS,EAAE,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;QAE7D,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAEzC,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,SAAS,EAAE,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;QAErD,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAEzC,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,SAAS,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAEjD,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAEzC,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,SAAS,EAAE,CAAC,qBAAqB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAExD,MAAM,mBAAmB,GACvB,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC;QAEjE,SAAS,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAEjD,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAEzC,MAAM,6BAA6B,GACjC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY;YAC9D,mBAAmB,CAAC;QAEtB,MAAM,CAAC,6BAA6B,CAAC,CAAC,UAAU,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,mEAAmE;IACnE,6EAA6E;IAC7E,0DAA0D;IAC1D,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,SAAS,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAEjD,MAAM,gBAAgB,GAAG,SAAS,EAAE,CAAC,QAAQ,CAAC;QAC9C,MAAM,GAAG,GAAG,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAErD,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,SAAS,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,gBAAgB,GAAG,SAAS,EAAE,CAAC,QAAQ,CAAC;QAC9C,MAAM,GAAG,GAAG,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAErD,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,SAAS,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,gBAAgB,GAAG,SAAS,EAAE,CAAC,QAAQ,CAAC;QAC9C,MAAM,GAAG,GAAG,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAErD,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,SAAS,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAEjD,MAAM,gBAAgB,GAAG,SAAS,EAAE,CAAC,QAAQ,CAAC;QAC9C,MAAM,GAAG,GAAG,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAErD,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,SAAS,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAEjD,MAAM,gBAAgB,GAAG,SAAS,EAAE,CAAC,QAAQ,CAAC;QAC9C,MAAM,GAAG,GAAG,WAAW,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAErD,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { NodeSelection, TextSelection } from "prosemirror-state";
|
|
2
|
+
import { CellSelection } from "prosemirror-tables";
|
|
3
|
+
import { getBlockInfoFromSelection } from "../../../getBlockInfoFromPos.js";
|
|
4
|
+
import { getNodeById } from "../../../nodeUtil.js";
|
|
5
|
+
// `getBlockSelectionData` and `updateBlockSelectionFromData` are used to save
|
|
6
|
+
// and restore the selection within a block, when the block is moved.
|
|
7
|
+
function getBlockSelectionData(editor) {
|
|
8
|
+
const { bnBlock } = getBlockInfoFromSelection(editor._tiptapEditor.state);
|
|
9
|
+
const selectionData = {
|
|
10
|
+
blockId: bnBlock.node.attrs.id,
|
|
11
|
+
blockPos: bnBlock.beforePos,
|
|
12
|
+
};
|
|
13
|
+
if (editor._tiptapEditor.state.selection instanceof CellSelection) {
|
|
14
|
+
return {
|
|
15
|
+
...selectionData,
|
|
16
|
+
type: "cell",
|
|
17
|
+
anchorCell: editor._tiptapEditor.state.selection
|
|
18
|
+
.$anchorCell.pos,
|
|
19
|
+
headCell: editor._tiptapEditor.state.selection
|
|
20
|
+
.$headCell.pos,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
else if (editor._tiptapEditor.state.selection instanceof NodeSelection) {
|
|
24
|
+
return {
|
|
25
|
+
...selectionData,
|
|
26
|
+
type: "node",
|
|
27
|
+
from: editor._tiptapEditor.state.selection.from,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
return {
|
|
32
|
+
...selectionData,
|
|
33
|
+
type: "text",
|
|
34
|
+
anchor: editor._tiptapEditor.state.selection.anchor,
|
|
35
|
+
head: editor._tiptapEditor.state.selection.head,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function updateBlockSelectionFromData(editor, data) {
|
|
40
|
+
const blockPos = getNodeById(data.blockId, editor._tiptapEditor.state.doc).posBeforeNode;
|
|
41
|
+
let selection;
|
|
42
|
+
if (data.type === "cell") {
|
|
43
|
+
selection = CellSelection.create(editor._tiptapEditor.state.doc, data.anchorCell + (blockPos - data.blockPos), data.headCell + (blockPos - data.blockPos));
|
|
44
|
+
}
|
|
45
|
+
else if (data.type === "node") {
|
|
46
|
+
selection = NodeSelection.create(editor._tiptapEditor.state.doc, data.from + (blockPos - data.blockPos));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
selection = TextSelection.create(editor._tiptapEditor.state.doc, data.anchor + (blockPos - data.blockPos), data.head + (blockPos - data.blockPos));
|
|
50
|
+
}
|
|
51
|
+
editor._tiptapEditor.view.dispatch(editor._tiptapEditor.state.tr.setSelection(selection));
|
|
52
|
+
}
|
|
53
|
+
export function moveSelectedBlockAndSelection(editor, referenceBlock, placement) {
|
|
54
|
+
const { block } = editor.getTextCursorPosition();
|
|
55
|
+
const selectionData = getBlockSelectionData(editor);
|
|
56
|
+
editor.removeBlocks([block]);
|
|
57
|
+
editor.insertBlocks([block], referenceBlock, placement);
|
|
58
|
+
updateBlockSelectionFromData(editor, selectionData);
|
|
59
|
+
}
|
|
60
|
+
export function moveBlockUp(editor) {
|
|
61
|
+
// This function currently only supports moving a single block.
|
|
62
|
+
const editorSelection = editor.getSelection();
|
|
63
|
+
if (editorSelection && editorSelection.blocks.length > 1) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const { prevBlock, parentBlock } = editor.getTextCursorPosition();
|
|
67
|
+
let referenceBlockId;
|
|
68
|
+
let placement;
|
|
69
|
+
if (!prevBlock) {
|
|
70
|
+
if (parentBlock) {
|
|
71
|
+
referenceBlockId = parentBlock.id;
|
|
72
|
+
placement = "before";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else if (prevBlock.children.length > 0) {
|
|
76
|
+
referenceBlockId = prevBlock.children[prevBlock.children.length - 1].id;
|
|
77
|
+
placement = "after";
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
referenceBlockId = prevBlock.id;
|
|
81
|
+
placement = "before";
|
|
82
|
+
}
|
|
83
|
+
if (!referenceBlockId || !placement) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
moveSelectedBlockAndSelection(editor, referenceBlockId, placement);
|
|
87
|
+
}
|
|
88
|
+
export function moveBlockDown(editor) {
|
|
89
|
+
// This function currently only supports moving a single block.
|
|
90
|
+
const editorSelection = editor.getSelection();
|
|
91
|
+
if (editorSelection && editorSelection.blocks.length > 1) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const { nextBlock, parentBlock } = editor.getTextCursorPosition();
|
|
95
|
+
let referenceBlockId;
|
|
96
|
+
let placement;
|
|
97
|
+
if (!nextBlock) {
|
|
98
|
+
if (parentBlock) {
|
|
99
|
+
referenceBlockId = parentBlock.id;
|
|
100
|
+
placement = "after";
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else if (nextBlock.children.length > 0) {
|
|
104
|
+
referenceBlockId = nextBlock.children[0].id;
|
|
105
|
+
placement = "before";
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
referenceBlockId = nextBlock.id;
|
|
109
|
+
placement = "after";
|
|
110
|
+
}
|
|
111
|
+
if (!referenceBlockId || !placement) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
moveSelectedBlockAndSelection(editor, referenceBlockId, placement);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=moveBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moveBlock.js","sourceRoot":"","sources":["../../../../../../src/api/blockManipulation/commands/moveBlock/moveBlock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { NodeSelection, TextSelection } from "prosemirror-state";
|
|
2
|
+
import { CellSelection } from "prosemirror-tables";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { getBlockInfoFromSelection } from "../../../getBlockInfoFromPos.js";
|
|
5
|
+
import { setupTestEnv } from "../../setupTestEnv.js";
|
|
6
|
+
import { moveBlockDown, moveBlockUp, moveSelectedBlockAndSelection, } from "./moveBlock.js";
|
|
7
|
+
const getEditor = setupTestEnv();
|
|
8
|
+
function makeSelectionSpanContent(selectionType) {
|
|
9
|
+
const { blockContent } = getBlockInfoFromSelection(getEditor()._tiptapEditor.state);
|
|
10
|
+
if (selectionType === "cell") {
|
|
11
|
+
getEditor()._tiptapEditor.view.dispatch(getEditor()._tiptapEditor.state.tr.setSelection(CellSelection.create(getEditor()._tiptapEditor.state.doc, getEditor()
|
|
12
|
+
._tiptapEditor.state.doc.resolve(blockContent.beforePos + 3)
|
|
13
|
+
.before(), getEditor()
|
|
14
|
+
._tiptapEditor.state.doc.resolve(blockContent.afterPos - 3)
|
|
15
|
+
.before())));
|
|
16
|
+
}
|
|
17
|
+
else if (selectionType === "node") {
|
|
18
|
+
const resolvedContentStartPos = getEditor()._tiptapEditor.state.doc.resolve(blockContent.beforePos);
|
|
19
|
+
getEditor()._tiptapEditor.view.dispatch(getEditor()._tiptapEditor.state.tr.setSelection(NodeSelection.create(getEditor()._tiptapEditor.state.doc, getEditor()
|
|
20
|
+
._tiptapEditor.state.doc.resolve(resolvedContentStartPos.after(resolvedContentStartPos.depth + 1))
|
|
21
|
+
.start())));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const resolvedContentStartPos = getEditor()._tiptapEditor.state.doc.resolve(blockContent.beforePos);
|
|
25
|
+
const resolvedContentEndPos = getEditor()._tiptapEditor.state.doc.resolve(blockContent.afterPos);
|
|
26
|
+
getEditor()._tiptapEditor.view.dispatch(getEditor()._tiptapEditor.state.tr.setSelection(TextSelection.create(getEditor()._tiptapEditor.state.doc, getEditor()
|
|
27
|
+
._tiptapEditor.state.doc.resolve(resolvedContentStartPos.after(resolvedContentStartPos.depth + 1))
|
|
28
|
+
.start(), getEditor()
|
|
29
|
+
._tiptapEditor.state.doc.resolve(resolvedContentEndPos.before(resolvedContentEndPos.depth + 1))
|
|
30
|
+
.end())));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
describe("Test moveSelectedBlockAndSelection", () => {
|
|
34
|
+
it("Text selection", () => {
|
|
35
|
+
getEditor().setTextCursorPosition("paragraph-1");
|
|
36
|
+
makeSelectionSpanContent("text");
|
|
37
|
+
moveSelectedBlockAndSelection(getEditor(), "paragraph-0", "before");
|
|
38
|
+
const selection = getEditor()._tiptapEditor.state.selection;
|
|
39
|
+
getEditor().setTextCursorPosition("paragraph-1");
|
|
40
|
+
makeSelectionSpanContent("text");
|
|
41
|
+
expect(selection.eq(getEditor()._tiptapEditor.state.selection)).toBeTruthy();
|
|
42
|
+
});
|
|
43
|
+
it("Node selection", () => {
|
|
44
|
+
getEditor().setTextCursorPosition("image-0");
|
|
45
|
+
makeSelectionSpanContent("node");
|
|
46
|
+
moveSelectedBlockAndSelection(getEditor(), "paragraph-0", "before");
|
|
47
|
+
const selection = getEditor()._tiptapEditor.state.selection;
|
|
48
|
+
getEditor().setTextCursorPosition("image-0");
|
|
49
|
+
makeSelectionSpanContent("node");
|
|
50
|
+
expect(selection.eq(getEditor()._tiptapEditor.state.selection)).toBeTruthy();
|
|
51
|
+
});
|
|
52
|
+
it("Cell selection", () => {
|
|
53
|
+
getEditor().setTextCursorPosition("table-0");
|
|
54
|
+
makeSelectionSpanContent("cell");
|
|
55
|
+
moveSelectedBlockAndSelection(getEditor(), "paragraph-0", "before");
|
|
56
|
+
const selection = getEditor()._tiptapEditor.state.selection;
|
|
57
|
+
getEditor().setTextCursorPosition("table-0");
|
|
58
|
+
makeSelectionSpanContent("cell");
|
|
59
|
+
expect(selection.eq(getEditor()._tiptapEditor.state.selection)).toBeTruthy();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe("Test moveBlockUp", () => {
|
|
63
|
+
it("Basic", () => {
|
|
64
|
+
getEditor().setTextCursorPosition("paragraph-1");
|
|
65
|
+
moveBlockUp(getEditor());
|
|
66
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
67
|
+
});
|
|
68
|
+
it("Into children", () => {
|
|
69
|
+
getEditor().setTextCursorPosition("paragraph-2");
|
|
70
|
+
moveBlockUp(getEditor());
|
|
71
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
72
|
+
});
|
|
73
|
+
it("Out of children", () => {
|
|
74
|
+
getEditor().setTextCursorPosition("nested-paragraph-1");
|
|
75
|
+
moveBlockUp(getEditor());
|
|
76
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
77
|
+
});
|
|
78
|
+
it("First block", () => {
|
|
79
|
+
getEditor().setTextCursorPosition("paragraph-0");
|
|
80
|
+
moveBlockUp(getEditor());
|
|
81
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe("Test moveBlockDown", () => {
|
|
85
|
+
it("Basic", () => {
|
|
86
|
+
getEditor().setTextCursorPosition("paragraph-0");
|
|
87
|
+
moveBlockDown(getEditor());
|
|
88
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
89
|
+
});
|
|
90
|
+
it("Into children", () => {
|
|
91
|
+
getEditor().setTextCursorPosition("paragraph-1");
|
|
92
|
+
moveBlockDown(getEditor());
|
|
93
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
94
|
+
});
|
|
95
|
+
it("Out of children", () => {
|
|
96
|
+
getEditor().setTextCursorPosition("nested-paragraph-1");
|
|
97
|
+
moveBlockDown(getEditor());
|
|
98
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
99
|
+
});
|
|
100
|
+
it("Last block", () => {
|
|
101
|
+
getEditor().setTextCursorPosition("trailing-paragraph");
|
|
102
|
+
moveBlockDown(getEditor());
|
|
103
|
+
expect(getEditor().document).toMatchSnapshot();
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=moveBlock.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moveBlock.test.js","sourceRoot":"","sources":["../../../../../../src/api/blockManipulation/commands/moveBlock/moveBlock.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Fragment, Slice } from "prosemirror-model";
|
|
2
|
+
import { ReplaceAroundStep } from "prosemirror-transform";
|
|
3
|
+
import { getBlockInfoFromSelection } from "../../../getBlockInfoFromPos.js";
|
|
4
|
+
// TODO: Unit tests
|
|
5
|
+
/**
|
|
6
|
+
* This is a modified version of https://github.com/ProseMirror/prosemirror-schema-list/blob/569c2770cbb8092d8f11ea53ecf78cb7a4e8f15a/src/schema-list.ts#L232
|
|
7
|
+
*
|
|
8
|
+
* The original function derives too many information from the parentnode and itemtype
|
|
9
|
+
*/
|
|
10
|
+
function sinkListItem(itemType, groupType) {
|
|
11
|
+
return function ({ state, dispatch }) {
|
|
12
|
+
const { $from, $to } = state.selection;
|
|
13
|
+
const range = $from.blockRange($to, (node) => node.childCount > 0 &&
|
|
14
|
+
(node.type.name === "blockGroup" || node.type.name === "column") // change necessary to not look at first item child type
|
|
15
|
+
);
|
|
16
|
+
if (!range) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const startIndex = range.startIndex;
|
|
20
|
+
if (startIndex === 0) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
const parent = range.parent;
|
|
24
|
+
const nodeBefore = parent.child(startIndex - 1);
|
|
25
|
+
if (nodeBefore.type !== itemType) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
if (dispatch) {
|
|
29
|
+
const nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type === groupType; // change necessary to check groupType instead of parent.type
|
|
30
|
+
const inner = Fragment.from(nestedBefore ? itemType.create() : null);
|
|
31
|
+
const slice = new Slice(Fragment.from(itemType.create(null, Fragment.from(groupType.create(null, inner))) // change necessary to create "groupType" instead of parent.type
|
|
32
|
+
), nestedBefore ? 3 : 1, 0);
|
|
33
|
+
const before = range.start;
|
|
34
|
+
const after = range.end;
|
|
35
|
+
dispatch(state.tr
|
|
36
|
+
.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after, before, after, slice, 1, true))
|
|
37
|
+
.scrollIntoView());
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function nestBlock(editor) {
|
|
43
|
+
return editor._tiptapEditor.commands.command(sinkListItem(editor._tiptapEditor.schema.nodes["blockContainer"], editor._tiptapEditor.schema.nodes["blockGroup"]));
|
|
44
|
+
}
|
|
45
|
+
export function unnestBlock(editor) {
|
|
46
|
+
editor._tiptapEditor.commands.liftListItem("blockContainer");
|
|
47
|
+
}
|
|
48
|
+
export function canNestBlock(editor) {
|
|
49
|
+
const { bnBlock: blockContainer } = getBlockInfoFromSelection(editor._tiptapEditor.state);
|
|
50
|
+
return (editor._tiptapEditor.state.doc.resolve(blockContainer.beforePos)
|
|
51
|
+
.nodeBefore !== null);
|
|
52
|
+
}
|
|
53
|
+
export function canUnnestBlock(editor) {
|
|
54
|
+
const { bnBlock: blockContainer } = getBlockInfoFromSelection(editor._tiptapEditor.state);
|
|
55
|
+
return (editor._tiptapEditor.state.doc.resolve(blockContainer.beforePos).depth > 1);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=nestBlock.js.map
|