@blocknote/core 0.15.11 → 0.17.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 +3349 -2773
- package/dist/blocknote.js.map +1 -1
- package/dist/blocknote.umd.cjs +6 -6
- package/dist/blocknote.umd.cjs.map +1 -1
- package/dist/webpack-stats.json +1 -1
- package/package.json +5 -2
- package/src/api/blockManipulation/commands/insertBlocks/__snapshots__/insertBlocks.test.ts.snap +3087 -0
- package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.ts +132 -0
- package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +71 -0
- package/src/api/blockManipulation/commands/mergeBlocks/__snapshots__/mergeBlocks.test.ts.snap +2276 -0
- package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts +131 -0
- package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.ts +103 -0
- package/src/api/blockManipulation/commands/moveBlock/__snapshots__/moveBlock.test.ts.snap +3767 -0
- package/src/api/blockManipulation/commands/moveBlock/moveBlock.test.ts +192 -0
- package/src/api/blockManipulation/commands/moveBlock/moveBlock.ts +178 -0
- package/src/api/blockManipulation/commands/removeBlocks/__snapshots__/removeBlocks.test.ts.snap +1136 -0
- package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.ts +34 -0
- package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.ts +100 -0
- package/src/api/blockManipulation/commands/replaceBlocks/__snapshots__/replaceBlocks.test.ts.snap +4931 -0
- package/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.ts +222 -0
- package/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.ts +70 -0
- package/src/api/blockManipulation/commands/splitBlock/__snapshots__/splitBlock.test.ts.snap +2924 -0
- package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +136 -0
- package/src/api/blockManipulation/commands/splitBlock/splitBlock.ts +48 -0
- package/src/api/blockManipulation/commands/updateBlock/__snapshots__/updateBlock.test.ts.snap +8376 -0
- package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +300 -0
- package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +199 -0
- package/src/api/blockManipulation/insertContentAt.ts +96 -0
- package/src/api/blockManipulation/selections/textCursorPosition/__snapshots__/textCursorPosition.test.ts.snap +316 -0
- package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.ts +53 -0
- package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +130 -0
- package/src/api/blockManipulation/setupTestEnv.ts +179 -0
- package/src/api/clipboard/__snapshots__/childToParent.html +1 -0
- package/src/api/clipboard/__snapshots__/childrenToNextParent.html +1 -0
- package/src/api/clipboard/__snapshots__/childrenToNextParentsChildren.html +1 -0
- package/src/api/clipboard/__snapshots__/image.html +1 -0
- package/src/api/clipboard/__snapshots__/multipleStyledText.html +1 -0
- package/src/api/clipboard/__snapshots__/nestedImage.html +1 -0
- package/src/api/clipboard/__snapshots__/partialChildToParent.html +1 -0
- package/src/api/clipboard/__snapshots__/styledText.html +1 -0
- package/src/api/clipboard/__snapshots__/tableAllCells.html +1 -0
- package/src/api/clipboard/__snapshots__/tableCell.html +1 -0
- package/src/api/clipboard/__snapshots__/tableCellText.html +1 -0
- package/src/api/clipboard/__snapshots__/tableRow.html +1 -0
- package/src/api/clipboard/__snapshots__/unstyledText.html +1 -0
- package/src/api/clipboard/clipboard.test.ts +283 -0
- package/src/api/{parsers → clipboard/fromClipboard}/fileDropExtension.ts +8 -4
- package/src/api/{parsers → clipboard/fromClipboard}/handleFileInsertion.ts +12 -7
- package/src/api/{parsers → clipboard/fromClipboard}/pasteExtension.ts +19 -8
- package/src/api/clipboard/toClipboard/copyExtension.ts +243 -0
- package/src/api/exporters/html/__snapshots__/complex/misc/external.html +1 -1
- package/src/api/exporters/html/__snapshots__/lists/basic/external.html +1 -1
- package/src/api/exporters/html/__snapshots__/lists/nested/external.html +1 -1
- package/src/api/exporters/html/externalHTMLExporter.ts +42 -87
- package/src/api/exporters/html/htmlConversion.test.ts +19 -156
- package/src/api/exporters/html/internalHTMLSerializer.ts +21 -69
- package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +263 -0
- package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +158 -0
- package/src/api/exporters/markdown/markdownExporter.test.ts +10 -10
- package/src/api/exporters/markdown/markdownExporter.ts +11 -7
- package/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.ts +2 -2
- package/src/api/getBlockInfoFromPos.ts +172 -90
- package/src/api/nodeConversions/blockToNode.ts +257 -0
- package/src/api/nodeConversions/fragmentToBlocks.ts +60 -0
- package/src/api/nodeConversions/nodeConversions.test.ts +9 -8
- package/src/api/nodeConversions/{nodeConversions.ts → nodeToBlock.ts} +20 -262
- package/src/api/parsers/html/parseHTML.test.ts +5 -8
- package/src/api/parsers/html/parseHTML.ts +8 -4
- package/src/api/parsers/html/util/nestedLists.test.ts +2 -2
- package/src/api/parsers/markdown/__snapshots__/pasted/complex.json +319 -0
- package/src/api/parsers/markdown/__snapshots__/pasted/issue-226-1.json +81 -0
- package/src/api/parsers/{html/__snapshots__/paste/parse-deep-nested-content.json → markdown/__snapshots__/pasted/issue-226-2.json} +35 -110
- package/src/api/parsers/markdown/__snapshots__/pasted/nested.json +81 -0
- package/src/api/parsers/markdown/__snapshots__/pasted/non-nested.json +81 -0
- package/src/api/parsers/markdown/__snapshots__/pasted/styled.json +61 -0
- package/src/api/parsers/markdown/parseMarkdown.test.ts +16 -1
- package/src/api/parsers/markdown/parseMarkdown.ts +8 -4
- package/src/api/testUtil/cases/customBlocks.ts +11 -11
- package/src/api/testUtil/cases/customInlineContent.ts +6 -6
- package/src/api/testUtil/cases/customStyles.ts +6 -6
- package/src/api/testUtil/cases/defaultSchema.ts +4 -4
- package/src/api/testUtil/index.ts +6 -6
- package/src/api/testUtil/partialBlockTestUtil.ts +5 -5
- package/src/api/testUtil/paste.ts +46 -0
- package/src/blocks/AudioBlockContent/AudioBlockContent.ts +5 -5
- package/src/blocks/FileBlockContent/FileBlockContent.ts +4 -4
- package/src/blocks/FileBlockContent/fileBlockHelpers.ts +2 -2
- package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +61 -39
- package/src/blocks/ImageBlockContent/ImageBlockContent.ts +5 -5
- package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +30 -18
- package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +67 -33
- package/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts +23 -19
- package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +22 -24
- package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +31 -19
- package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +16 -11
- package/src/blocks/TableBlockContent/TableBlockContent.ts +4 -5
- package/src/blocks/VideoBlockContent/VideoBlockContent.ts +5 -5
- package/src/blocks/defaultBlockHelpers.ts +4 -4
- package/src/blocks/defaultBlockTypeGuards.ts +5 -5
- package/src/blocks/defaultBlocks.ts +13 -13
- package/src/blocks/defaultProps.ts +1 -1
- package/src/editor/BlockNoteEditor.test.ts +14 -7
- package/src/editor/BlockNoteEditor.ts +82 -149
- package/src/editor/BlockNoteExtensions.ts +15 -11
- package/src/editor/BlockNoteSchema.ts +7 -7
- package/src/editor/BlockNoteTipTapEditor.ts +5 -3
- package/src/editor/cursorPositionTypes.ts +7 -2
- package/src/editor/selectionTypes.ts +6 -2
- package/src/editor/transformPasted.ts +34 -2
- package/src/extensions/BackgroundColor/BackgroundColorExtension.ts +1 -1
- package/src/extensions/BackgroundColor/BackgroundColorMark.ts +1 -1
- package/src/extensions/FilePanel/FilePanelPlugin.ts +4 -4
- package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +8 -4
- package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +333 -0
- package/src/extensions/LinkToolbar/LinkToolbarPlugin.ts +9 -4
- package/src/extensions/{NonEditableBlocks/NonEditableBlockPlugin.ts → NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts} +2 -2
- package/src/extensions/Placeholder/PlaceholderPlugin.ts +1 -1
- package/src/extensions/SideMenu/SideMenuPlugin.ts +72 -402
- package/src/extensions/SideMenu/dragging.ts +251 -0
- package/src/extensions/SuggestionMenu/DefaultSuggestionItem.ts +1 -1
- package/src/extensions/SuggestionMenu/SuggestionPlugin.ts +8 -4
- package/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.ts +8 -4
- package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +19 -15
- package/src/extensions/TableHandles/TableHandlesPlugin.ts +11 -7
- package/src/extensions/TextColor/TextColorExtension.ts +1 -1
- package/src/extensions/TextColor/TextColorMark.ts +1 -1
- package/src/i18n/dictionary.ts +1 -1
- package/src/i18n/locales/ar.ts +1 -1
- package/src/i18n/locales/fr.ts +1 -1
- package/src/i18n/locales/hr.ts +308 -0
- package/src/i18n/locales/index.ts +15 -14
- package/src/i18n/locales/is.ts +1 -1
- package/src/i18n/locales/ja.ts +1 -1
- package/src/i18n/locales/ko.ts +1 -1
- package/src/i18n/locales/nl.ts +1 -1
- package/src/i18n/locales/pl.ts +1 -1
- package/src/i18n/locales/pt.ts +1 -1
- package/src/i18n/locales/ru.ts +1 -1
- package/src/i18n/locales/vi.ts +1 -1
- package/src/i18n/locales/zh.ts +1 -1
- package/src/index.ts +45 -44
- package/src/pm-nodes/BlockContainer.ts +3 -647
- package/src/pm-nodes/BlockGroup.ts +2 -2
- package/src/pm-nodes/index.ts +3 -3
- package/src/schema/blocks/createSpec.ts +24 -14
- package/src/schema/blocks/internal.ts +9 -9
- package/src/schema/blocks/types.ts +4 -4
- package/src/schema/index.ts +10 -10
- package/src/schema/inlineContent/createSpec.ts +9 -10
- package/src/schema/inlineContent/internal.ts +3 -3
- package/src/schema/inlineContent/types.ts +2 -2
- package/src/schema/styles/createSpec.ts +4 -3
- package/src/schema/styles/internal.ts +1 -1
- package/types/src/api/blockManipulation/commands/insertBlocks/insertBlocks.d.ts +4 -0
- package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.d.ts +7 -0
- package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.d.ts +1 -0
- package/types/src/api/blockManipulation/commands/moveBlock/moveBlock.d.ts +5 -0
- package/types/src/api/blockManipulation/commands/moveBlock/moveBlock.test.d.ts +1 -0
- package/types/src/api/blockManipulation/commands/removeBlocks/removeBlocks.d.ts +7 -0
- package/types/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.d.ts +1 -0
- package/types/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.d.ts +7 -0
- package/types/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.d.ts +1 -0
- package/types/src/api/blockManipulation/commands/splitBlock/splitBlock.d.ts +5 -0
- package/types/src/api/blockManipulation/commands/splitBlock/splitBlock.test.d.ts +1 -0
- package/types/src/api/blockManipulation/commands/updateBlock/updateBlock.d.ts +11 -0
- package/types/src/api/blockManipulation/commands/updateBlock/updateBlock.test.d.ts +1 -0
- package/types/src/api/blockManipulation/insertContentAt.d.ts +6 -0
- package/types/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.d.ts +5 -0
- package/types/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.d.ts +1 -0
- package/types/src/api/blockManipulation/setupTestEnv.d.ts +492 -0
- package/types/src/api/clipboard/clipboard.test.d.ts +1 -0
- package/types/src/api/clipboard/fromClipboard/fileDropExtension.d.ts +6 -0
- package/types/src/api/{parsers → clipboard/fromClipboard}/handleFileInsertion.d.ts +2 -2
- package/types/src/api/clipboard/fromClipboard/pasteExtension.d.ts +6 -0
- package/types/src/api/clipboard/toClipboard/copyExtension.d.ts +12 -0
- package/types/src/api/exporters/html/externalHTMLExporter.d.ts +7 -8
- package/types/src/api/exporters/html/internalHTMLSerializer.d.ts +6 -10
- package/types/src/api/exporters/html/util/serializeBlocksExternalHTML.d.ts +10 -0
- package/types/src/api/exporters/html/util/serializeBlocksInternalHTML.d.ts +11 -0
- package/types/src/api/exporters/markdown/markdownExporter.d.ts +3 -3
- package/types/src/api/getBlockInfoFromPos.d.ts +63 -20
- package/types/src/api/nodeConversions/blockToNode.d.ts +15 -0
- package/types/src/api/nodeConversions/fragmentToBlocks.d.ts +7 -0
- package/types/src/api/nodeConversions/nodeToBlock.d.ts +16 -0
- package/types/src/api/parsers/html/parseHTML.d.ts +2 -2
- package/types/src/api/parsers/markdown/parseMarkdown.d.ts +2 -2
- package/types/src/api/testUtil/cases/customBlocks.d.ts +39 -39
- package/types/src/api/testUtil/cases/customInlineContent.d.ts +35 -35
- package/types/src/api/testUtil/cases/customStyles.d.ts +35 -35
- package/types/src/api/testUtil/cases/defaultSchema.d.ts +2 -2
- package/types/src/api/testUtil/index.d.ts +6 -6
- package/types/src/api/testUtil/partialBlockTestUtil.d.ts +4 -4
- package/types/src/api/testUtil/paste.d.ts +2 -0
- package/types/src/blocks/AudioBlockContent/AudioBlockContent.d.ts +4 -4
- package/types/src/blocks/FileBlockContent/FileBlockContent.d.ts +4 -4
- package/types/src/blocks/FileBlockContent/fileBlockHelpers.d.ts +2 -2
- package/types/src/blocks/HeadingBlockContent/HeadingBlockContent.d.ts +2 -2
- package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +4 -4
- package/types/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.d.ts +2 -2
- package/types/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.d.ts +2 -2
- package/types/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.d.ts +2 -2
- package/types/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.d.ts +2 -2
- package/types/src/blocks/ParagraphBlockContent/ParagraphBlockContent.d.ts +2 -2
- package/types/src/blocks/TableBlockContent/TableBlockContent.d.ts +2 -2
- package/types/src/blocks/VideoBlockContent/VideoBlockContent.d.ts +4 -4
- package/types/src/blocks/defaultBlockHelpers.d.ts +3 -3
- package/types/src/blocks/defaultBlockTypeGuards.d.ts +4 -4
- package/types/src/blocks/defaultBlocks.d.ts +38 -38
- package/types/src/blocks/defaultProps.d.ts +1 -1
- package/types/src/editor/BlockNoteEditor.d.ts +28 -16
- package/types/src/editor/BlockNoteExtensions.d.ts +3 -3
- package/types/src/editor/BlockNoteSchema.d.ts +4 -4
- package/types/src/editor/BlockNoteTipTapEditor.d.ts +2 -2
- package/types/src/editor/cursorPositionTypes.d.ts +3 -2
- package/types/src/editor/selectionTypes.d.ts +2 -2
- package/types/src/editor/transformPasted.d.ts +8 -1
- package/types/src/extensions/BackgroundColor/BackgroundColorMark.d.ts +1 -1
- package/types/src/extensions/FilePanel/FilePanelPlugin.d.ts +4 -4
- package/types/src/extensions/FormattingToolbar/FormattingToolbarPlugin.d.ts +4 -4
- package/types/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.d.ts +5 -0
- package/types/src/extensions/LinkToolbar/LinkToolbarPlugin.d.ts +4 -4
- package/types/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.d.ts +2 -0
- package/types/src/extensions/Placeholder/PlaceholderPlugin.d.ts +1 -1
- package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +12 -28
- package/types/src/extensions/SideMenu/dragging.d.ts +17 -0
- package/types/src/extensions/SuggestionMenu/DefaultSuggestionItem.d.ts +1 -1
- package/types/src/extensions/SuggestionMenu/SuggestionPlugin.d.ts +4 -4
- package/types/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.d.ts +3 -3
- package/types/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.d.ts +4 -4
- package/types/src/extensions/TableHandles/TableHandlesPlugin.d.ts +4 -4
- package/types/src/extensions/TextColor/TextColorMark.d.ts +1 -1
- package/types/src/i18n/dictionary.d.ts +1 -1
- package/types/src/i18n/locales/ar.d.ts +1 -1
- package/types/src/i18n/locales/fr.d.ts +1 -1
- package/types/src/i18n/locales/hr.d.ts +239 -0
- package/types/src/i18n/locales/index.d.ts +15 -14
- package/types/src/i18n/locales/is.d.ts +1 -1
- package/types/src/i18n/locales/ja.d.ts +1 -1
- package/types/src/i18n/locales/ko.d.ts +1 -1
- package/types/src/i18n/locales/nl.d.ts +1 -1
- package/types/src/i18n/locales/pl.d.ts +1 -1
- package/types/src/i18n/locales/pt.d.ts +1 -1
- package/types/src/i18n/locales/ru.d.ts +1 -1
- package/types/src/i18n/locales/vi.d.ts +1 -1
- package/types/src/i18n/locales/zh.d.ts +1 -1
- package/types/src/index.d.ts +45 -44
- package/types/src/pm-nodes/BlockContainer.d.ts +2 -16
- package/types/src/pm-nodes/BlockGroup.d.ts +1 -1
- package/types/src/pm-nodes/index.d.ts +3 -3
- package/types/src/schema/blocks/createSpec.d.ts +5 -5
- package/types/src/schema/blocks/internal.d.ts +5 -5
- package/types/src/schema/blocks/types.d.ts +4 -4
- package/types/src/schema/index.d.ts +10 -10
- package/types/src/schema/inlineContent/createSpec.d.ts +3 -3
- package/types/src/schema/inlineContent/internal.d.ts +2 -2
- package/types/src/schema/inlineContent/types.d.ts +2 -2
- package/types/src/schema/styles/createSpec.d.ts +1 -1
- package/types/src/schema/styles/internal.d.ts +1 -1
- package/src/api/blockManipulation/__snapshots__/blockManipulation.test.ts.snap +0 -714
- package/src/api/blockManipulation/blockManipulation.test.ts +0 -292
- package/src/api/blockManipulation/blockManipulation.ts +0 -350
- package/src/api/exporters/copyExtension.ts +0 -164
- package/src/api/exporters/html/__snapshots_fragment_edge_cases__/selectionLeavesBlockChildren.html +0 -1
- package/src/api/exporters/html/__snapshots_fragment_edge_cases__/selectionSpansBlocksChildren.html +0 -1
- package/src/api/exporters/html/util/sharedHTMLConversion.ts +0 -130
- package/src/api/exporters/html/util/simplifyBlocksRehypePlugin.ts +0 -218
- package/src/api/getCurrentBlockContentType.ts +0 -14
- package/src/api/parsers/html/__snapshots__/paste/parse-google-docs-html.json +0 -476
- package/types/src/api/blockManipulation/blockManipulation.d.ts +0 -14
- package/types/src/api/exporters/copyExtension.d.ts +0 -6
- package/types/src/api/exporters/html/util/sharedHTMLConversion.d.ts +0 -9
- package/types/src/api/exporters/html/util/simplifyBlocksRehypePlugin.d.ts +0 -16
- package/types/src/api/getCurrentBlockContentType.d.ts +0 -2
- package/types/src/api/nodeConversions/nodeConversions.d.ts +0 -24
- package/types/src/api/parsers/fileDropExtension.d.ts +0 -6
- package/types/src/api/parsers/pasteExtension.d.ts +0 -6
- package/types/src/extensions/NonEditableBlocks/NonEditableBlockPlugin.d.ts +0 -2
- /package/src/api/{exporters/html/__snapshots_fragment_edge_cases__/selectionWithinBlockChildren.html → clipboard/__snapshots__/multipleChildren.html} +0 -0
- /package/src/api/{parsers → clipboard/fromClipboard}/acceptedMIMETypes.ts +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/list-test.json → list-test.json} +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/parse-basic-block-types.json → parse-basic-block-types.json} +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/parse-div-with-inline-content.json → parse-div-with-inline-content.json} +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/parse-divs.json → parse-divs.json} +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/parse-fake-image-caption.json → parse-fake-image-caption.json} +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/parse-image-in-paragraph.json → parse-image-in-paragraph.json} +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/parse-mixed-nested-lists.json → parse-mixed-nested-lists.json} +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/parse-nested-lists-with-paragraphs.json → parse-nested-lists-with-paragraphs.json} +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/parse-nested-lists.json → parse-nested-lists.json} +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/parse-notion-html.json → parse-notion-html.json} +0 -0
- /package/src/api/parsers/html/__snapshots__/{paste/parse-two-divs.json → parse-two-divs.json} +0 -0
- /package/types/src/api/blockManipulation/{blockManipulation.test.d.ts → commands/insertBlocks/insertBlocks.test.d.ts} +0 -0
- /package/types/src/api/{parsers → clipboard/fromClipboard}/acceptedMIMETypes.d.ts +0 -0
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { DOMSerializer,
|
|
1
|
+
import { DOMSerializer, Schema } from "prosemirror-model";
|
|
2
2
|
|
|
3
|
-
import { PartialBlock } from "../../../blocks/defaultBlocks";
|
|
4
|
-
import type { BlockNoteEditor } from "../../../editor/BlockNoteEditor";
|
|
5
|
-
import { BlockSchema, InlineContentSchema, StyleSchema } from "../../../schema";
|
|
6
|
-
import { esmDependencies } from "../../../util/esmDependencies";
|
|
7
|
-
import { blockToNode } from "../../nodeConversions/nodeConversions";
|
|
3
|
+
import { PartialBlock } from "../../../blocks/defaultBlocks.js";
|
|
4
|
+
import type { BlockNoteEditor } from "../../../editor/BlockNoteEditor.js";
|
|
8
5
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
BlockSchema,
|
|
7
|
+
InlineContent,
|
|
8
|
+
InlineContentSchema,
|
|
9
|
+
StyleSchema,
|
|
10
|
+
} from "../../../schema/index.js";
|
|
11
|
+
import {
|
|
12
|
+
serializeBlocksExternalHTML,
|
|
13
|
+
serializeInlineContentExternalHTML,
|
|
14
|
+
} from "./util/serializeBlocksExternalHTML.js";
|
|
13
15
|
|
|
14
16
|
// Used to export BlockNote blocks and ProseMirror nodes to HTML for use outside
|
|
15
17
|
// the editor. Blocks are exported using the `toExternalHTML` method in their
|
|
@@ -24,26 +26,6 @@ import { simplifyBlocks } from "./util/simplifyBlocksRehypePlugin";
|
|
|
24
26
|
// 3. While nesting for list items is preserved, other types of blocks nested
|
|
25
27
|
// inside a list are un-nested and a new list is created after them.
|
|
26
28
|
// 4. The HTML is wrapped in a single `div` element.
|
|
27
|
-
//
|
|
28
|
-
// The serializer has 2 main methods:
|
|
29
|
-
// `exportBlocks`: Exports an array of blocks to HTML.
|
|
30
|
-
// `exportFragment`: Exports a ProseMirror fragment to HTML. This is mostly
|
|
31
|
-
// useful if you want to export a selection which may not start/end at the
|
|
32
|
-
// start/end of a block.
|
|
33
|
-
export interface ExternalHTMLExporter<
|
|
34
|
-
BSchema extends BlockSchema,
|
|
35
|
-
I extends InlineContentSchema,
|
|
36
|
-
S extends StyleSchema
|
|
37
|
-
> {
|
|
38
|
-
exportBlocks: (
|
|
39
|
-
blocks: PartialBlock<BSchema, I, S>[],
|
|
40
|
-
options: { document?: Document }
|
|
41
|
-
) => string;
|
|
42
|
-
exportProseMirrorFragment: (
|
|
43
|
-
fragment: Fragment,
|
|
44
|
-
options: { document?: Document }
|
|
45
|
-
) => string;
|
|
46
|
-
}
|
|
47
29
|
|
|
48
30
|
// Needs to be sync because it's used in drag handler event (SideMenuPlugin)
|
|
49
31
|
// Ideally, call `await initializeESMDependencies()` before calling this function
|
|
@@ -54,69 +36,42 @@ export const createExternalHTMLExporter = <
|
|
|
54
36
|
>(
|
|
55
37
|
schema: Schema,
|
|
56
38
|
editor: BlockNoteEditor<BSchema, I, S>
|
|
57
|
-
)
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
if (!deps) {
|
|
61
|
-
throw new Error(
|
|
62
|
-
"External HTML exporter requires ESM dependencies to be initialized"
|
|
63
|
-
);
|
|
64
|
-
}
|
|
39
|
+
) => {
|
|
40
|
+
const serializer = DOMSerializer.fromSchema(schema);
|
|
65
41
|
|
|
66
|
-
|
|
67
|
-
serializeNodeInner: (
|
|
68
|
-
node: Node,
|
|
69
|
-
options: { document?: Document }
|
|
70
|
-
) => HTMLElement;
|
|
71
|
-
exportProseMirrorFragment: (
|
|
72
|
-
fragment: Fragment,
|
|
73
|
-
options: { document?: Document }
|
|
74
|
-
) => string;
|
|
42
|
+
return {
|
|
75
43
|
exportBlocks: (
|
|
76
44
|
blocks: PartialBlock<BSchema, I, S>[],
|
|
77
45
|
options: { document?: Document }
|
|
78
|
-
) =>
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
.unified()
|
|
92
|
-
.use(deps.rehypeParse.default, { fragment: true })
|
|
93
|
-
.use(simplifyBlocks, {
|
|
94
|
-
orderedListItemBlockTypes: new Set<string>(["numberedListItem"]),
|
|
95
|
-
unorderedListItemBlockTypes: new Set<string>([
|
|
96
|
-
"bulletListItem",
|
|
97
|
-
"checkListItem",
|
|
98
|
-
]),
|
|
99
|
-
})
|
|
100
|
-
.use(deps.rehypeStringify.default)
|
|
101
|
-
.processSync(serializeProseMirrorFragment(fragment, serializer, options));
|
|
46
|
+
) => {
|
|
47
|
+
const html = serializeBlocksExternalHTML(
|
|
48
|
+
editor,
|
|
49
|
+
blocks,
|
|
50
|
+
serializer,
|
|
51
|
+
new Set<string>(["numberedListItem"]),
|
|
52
|
+
new Set<string>(["bulletListItem", "checkListItem"]),
|
|
53
|
+
options
|
|
54
|
+
);
|
|
55
|
+
const div = document.createElement("div");
|
|
56
|
+
div.append(html);
|
|
57
|
+
return div.innerHTML;
|
|
58
|
+
},
|
|
102
59
|
|
|
103
|
-
|
|
104
|
-
|
|
60
|
+
exportInlineContent: (
|
|
61
|
+
inlineContent: InlineContent<I, S>[],
|
|
62
|
+
options: { document?: Document }
|
|
63
|
+
) => {
|
|
64
|
+
const domFragment = serializeInlineContentExternalHTML(
|
|
65
|
+
editor,
|
|
66
|
+
inlineContent as any,
|
|
67
|
+
serializer,
|
|
68
|
+
options
|
|
69
|
+
);
|
|
105
70
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
options
|
|
109
|
-
) => {
|
|
110
|
-
const nodes = blocks.map((block) =>
|
|
111
|
-
blockToNode(block, schema, editor.schema.styleSchema)
|
|
112
|
-
);
|
|
113
|
-
const blockGroup = schema.nodes["blockGroup"].create(null, nodes);
|
|
71
|
+
const parent = document.createElement("div");
|
|
72
|
+
parent.append(domFragment.cloneNode(true));
|
|
114
73
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
options
|
|
118
|
-
);
|
|
74
|
+
return parent.innerHTML;
|
|
75
|
+
},
|
|
119
76
|
};
|
|
120
|
-
|
|
121
|
-
return serializer;
|
|
122
77
|
};
|
|
@@ -1,19 +1,23 @@
|
|
|
1
|
-
import { TextSelection } from "prosemirror-state";
|
|
2
1
|
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
3
|
-
import { BlockNoteEditor } from "../../../editor/BlockNoteEditor";
|
|
4
2
|
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
import {
|
|
3
|
+
import { PartialBlock } from "../../../blocks/defaultBlocks.js";
|
|
4
|
+
import { BlockNoteEditor } from "../../../editor/BlockNoteEditor.js";
|
|
5
|
+
import {
|
|
6
|
+
addIdsToBlocks,
|
|
7
|
+
partialBlocksToBlocksForTesting,
|
|
8
|
+
} from "../../../index.js";
|
|
9
|
+
import {
|
|
10
|
+
BlockSchema,
|
|
11
|
+
InlineContentSchema,
|
|
12
|
+
StyleSchema,
|
|
13
|
+
} from "../../../schema/index.js";
|
|
14
|
+
import { initializeESMDependencies } from "../../../util/esmDependencies.js";
|
|
15
|
+
import { customBlocksTestCases } from "../../testUtil/cases/customBlocks.js";
|
|
16
|
+
import { customInlineContentTestCases } from "../../testUtil/cases/customInlineContent.js";
|
|
17
|
+
import { customStylesTestCases } from "../../testUtil/cases/customStyles.js";
|
|
18
|
+
import { defaultSchemaTestCases } from "../../testUtil/cases/defaultSchema.js";
|
|
19
|
+
import { createExternalHTMLExporter } from "./externalHTMLExporter.js";
|
|
20
|
+
import { createInternalHTMLSerializer } from "./internalHTMLSerializer.js";
|
|
17
21
|
|
|
18
22
|
async function convertToHTMLAndCompareSnapshots<
|
|
19
23
|
B extends BlockSchema,
|
|
@@ -26,6 +30,7 @@ async function convertToHTMLAndCompareSnapshots<
|
|
|
26
30
|
snapshotName: string
|
|
27
31
|
) {
|
|
28
32
|
addIdsToBlocks(blocks);
|
|
33
|
+
|
|
29
34
|
const serializer = createInternalHTMLSerializer(editor.pmSchema, editor);
|
|
30
35
|
const internalHTML = serializer.serializeBlocks(blocks, {});
|
|
31
36
|
const internalHTMLSnapshotPath =
|
|
@@ -106,145 +111,3 @@ describe("Test HTML conversion", () => {
|
|
|
106
111
|
});
|
|
107
112
|
}
|
|
108
113
|
});
|
|
109
|
-
|
|
110
|
-
// Fragments created from ProseMirror selections don't always conform to the
|
|
111
|
-
// schema. This is because ProseMirror preserves the full ancestry of selected
|
|
112
|
-
// nodes, but not the siblings of ancestor nodes. These tests are to verify that
|
|
113
|
-
// Fragments like this are exported to HTML properly, as they can't be created
|
|
114
|
-
// from Block objects like all the other test cases (Block object conversions
|
|
115
|
-
// always conform to the schema).
|
|
116
|
-
describe("Test ProseMirror fragment edge case conversion", () => {
|
|
117
|
-
let editor: BlockNoteEditor;
|
|
118
|
-
const div = document.createElement("div");
|
|
119
|
-
beforeEach(() => {
|
|
120
|
-
editor = BlockNoteEditor.create();
|
|
121
|
-
editor.mount(div);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
afterEach(() => {
|
|
125
|
-
editor.mount(undefined);
|
|
126
|
-
editor._tiptapEditor.destroy();
|
|
127
|
-
editor = undefined as any;
|
|
128
|
-
|
|
129
|
-
delete (window as Window & { __TEST_OPTIONS?: any }).__TEST_OPTIONS;
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
// When the selection starts in a nested block, the Fragment from it omits the
|
|
133
|
-
// `blockContent` node of the parent `blockContainer` if it's not also
|
|
134
|
-
// included in the selection. In the schema, `blockContainer` nodes should
|
|
135
|
-
// contain a single `blockContent` node, so this edge case needs to be tested.
|
|
136
|
-
describe("No block content", () => {
|
|
137
|
-
const blocks: PartialBlock[] = [
|
|
138
|
-
{
|
|
139
|
-
type: "paragraph",
|
|
140
|
-
content: "Paragraph 1",
|
|
141
|
-
children: [
|
|
142
|
-
{
|
|
143
|
-
type: "paragraph",
|
|
144
|
-
content: "Nested Paragraph 1",
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
type: "paragraph",
|
|
148
|
-
content: "Nested Paragraph 2",
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
type: "paragraph",
|
|
152
|
-
content: "Nested Paragraph 3",
|
|
153
|
-
},
|
|
154
|
-
],
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
type: "paragraph",
|
|
158
|
-
content: "Paragraph 2",
|
|
159
|
-
children: [
|
|
160
|
-
{
|
|
161
|
-
type: "paragraph",
|
|
162
|
-
content: "Nested Paragraph 1",
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
type: "paragraph",
|
|
166
|
-
content: "Nested Paragraph 2",
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
type: "paragraph",
|
|
170
|
-
content: "Nested Paragraph 3",
|
|
171
|
-
},
|
|
172
|
-
],
|
|
173
|
-
},
|
|
174
|
-
];
|
|
175
|
-
|
|
176
|
-
beforeEach(() => {
|
|
177
|
-
editor.replaceBlocks(editor.document, blocks);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it("Selection within a block's children", async () => {
|
|
181
|
-
// Selection starts and ends within the first block's children.
|
|
182
|
-
editor.dispatch(
|
|
183
|
-
editor._tiptapEditor.state.tr.setSelection(
|
|
184
|
-
TextSelection.create(editor._tiptapEditor.state.doc, 18, 80)
|
|
185
|
-
)
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
const copiedFragment =
|
|
189
|
-
editor._tiptapEditor.state.selection.content().content;
|
|
190
|
-
|
|
191
|
-
await initializeESMDependencies();
|
|
192
|
-
const exporter = createExternalHTMLExporter(editor.pmSchema, editor);
|
|
193
|
-
const externalHTML = exporter.exportProseMirrorFragment(
|
|
194
|
-
copiedFragment,
|
|
195
|
-
{}
|
|
196
|
-
);
|
|
197
|
-
expect(externalHTML).toMatchFileSnapshot(
|
|
198
|
-
"./__snapshots_fragment_edge_cases__/" +
|
|
199
|
-
"selectionWithinBlockChildren.html"
|
|
200
|
-
);
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
it("Selection leaves a block's children", async () => {
|
|
204
|
-
// Selection starts and ends within the first block's children and ends
|
|
205
|
-
// outside, at a shallower nesting level in the second block.
|
|
206
|
-
editor.dispatch(
|
|
207
|
-
editor._tiptapEditor.state.tr.setSelection(
|
|
208
|
-
TextSelection.create(editor._tiptapEditor.state.doc, 18, 97)
|
|
209
|
-
)
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
const copiedFragment =
|
|
213
|
-
editor._tiptapEditor.state.selection.content().content;
|
|
214
|
-
|
|
215
|
-
await initializeESMDependencies();
|
|
216
|
-
const exporter = createExternalHTMLExporter(editor.pmSchema, editor);
|
|
217
|
-
const externalHTML = exporter.exportProseMirrorFragment(
|
|
218
|
-
copiedFragment,
|
|
219
|
-
{}
|
|
220
|
-
);
|
|
221
|
-
expect(externalHTML).toMatchFileSnapshot(
|
|
222
|
-
"./__snapshots_fragment_edge_cases__/" +
|
|
223
|
-
"selectionLeavesBlockChildren.html"
|
|
224
|
-
);
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
it("Selection spans multiple blocks' children", async () => {
|
|
228
|
-
// Selection starts and ends within the first block's children and ends
|
|
229
|
-
// within the second block's children.
|
|
230
|
-
editor.dispatch(
|
|
231
|
-
editor._tiptapEditor.state.tr.setSelection(
|
|
232
|
-
TextSelection.create(editor._tiptapEditor.state.doc, 18, 163)
|
|
233
|
-
)
|
|
234
|
-
);
|
|
235
|
-
|
|
236
|
-
const copiedFragment =
|
|
237
|
-
editor._tiptapEditor.state.selection.content().content;
|
|
238
|
-
await initializeESMDependencies();
|
|
239
|
-
const exporter = createExternalHTMLExporter(editor.pmSchema, editor);
|
|
240
|
-
const externalHTML = exporter.exportProseMirrorFragment(
|
|
241
|
-
copiedFragment,
|
|
242
|
-
{}
|
|
243
|
-
);
|
|
244
|
-
expect(externalHTML).toMatchFileSnapshot(
|
|
245
|
-
"./__snapshots_fragment_edge_cases__/" +
|
|
246
|
-
"selectionSpansBlocksChildren.html"
|
|
247
|
-
);
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
});
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { DOMSerializer,
|
|
2
|
-
import { PartialBlock } from "../../../blocks/defaultBlocks";
|
|
3
|
-
import type { BlockNoteEditor } from "../../../editor/BlockNoteEditor";
|
|
4
|
-
import { BlockSchema, InlineContentSchema, StyleSchema } from "../../../schema";
|
|
5
|
-
import { blockToNode } from "../../nodeConversions/nodeConversions";
|
|
1
|
+
import { DOMSerializer, Schema } from "prosemirror-model";
|
|
2
|
+
import { PartialBlock } from "../../../blocks/defaultBlocks.js";
|
|
3
|
+
import type { BlockNoteEditor } from "../../../editor/BlockNoteEditor.js";
|
|
6
4
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
BlockSchema,
|
|
6
|
+
InlineContentSchema,
|
|
7
|
+
StyleSchema,
|
|
8
|
+
} from "../../../schema/index.js";
|
|
9
|
+
import { serializeBlocksInternalHTML } from "./util/serializeBlocksInternalHTML.js";
|
|
11
10
|
// Used to serialize BlockNote blocks and ProseMirror nodes to HTML without
|
|
12
11
|
// losing data. Blocks are exported using the `toInternalHTML` method in their
|
|
13
12
|
// `blockSpec`.
|
|
@@ -17,29 +16,6 @@ import {
|
|
|
17
16
|
// editor, including the `blockGroup` and `blockContainer` wrappers. This also
|
|
18
17
|
// means that it can be converted back to the original blocks without any data
|
|
19
18
|
// loss.
|
|
20
|
-
//
|
|
21
|
-
// The serializer has 2 main methods:
|
|
22
|
-
// `serializeFragment`: Serializes a ProseMirror fragment to HTML. This is
|
|
23
|
-
// mostly useful if you want to serialize a selection which may not start/end at
|
|
24
|
-
// the start/end of a block.
|
|
25
|
-
// `serializeBlocks`: Serializes an array of blocks to HTML.
|
|
26
|
-
export interface InternalHTMLSerializer<
|
|
27
|
-
BSchema extends BlockSchema,
|
|
28
|
-
I extends InlineContentSchema,
|
|
29
|
-
S extends StyleSchema
|
|
30
|
-
> {
|
|
31
|
-
// TODO: Ideally we would expand the BlockNote API to support partial
|
|
32
|
-
// selections so we don't need this.
|
|
33
|
-
serializeProseMirrorFragment: (
|
|
34
|
-
fragment: Fragment,
|
|
35
|
-
options: { document?: Document }
|
|
36
|
-
) => string;
|
|
37
|
-
serializeBlocks: (
|
|
38
|
-
blocks: PartialBlock<BSchema, I, S>[],
|
|
39
|
-
options: { document?: Document }
|
|
40
|
-
) => string;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
19
|
export const createInternalHTMLSerializer = <
|
|
44
20
|
BSchema extends BlockSchema,
|
|
45
21
|
I extends InlineContentSchema,
|
|
@@ -47,45 +23,21 @@ export const createInternalHTMLSerializer = <
|
|
|
47
23
|
>(
|
|
48
24
|
schema: Schema,
|
|
49
25
|
editor: BlockNoteEditor<BSchema, I, S>
|
|
50
|
-
)
|
|
51
|
-
const serializer = DOMSerializer.fromSchema(schema)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
options: { document?: Document }
|
|
55
|
-
) => HTMLElement;
|
|
26
|
+
) => {
|
|
27
|
+
const serializer = DOMSerializer.fromSchema(schema);
|
|
28
|
+
|
|
29
|
+
return {
|
|
56
30
|
serializeBlocks: (
|
|
57
31
|
blocks: PartialBlock<BSchema, I, S>[],
|
|
58
32
|
options: { document?: Document }
|
|
59
|
-
) =>
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
33
|
+
) => {
|
|
34
|
+
return serializeBlocksInternalHTML(
|
|
35
|
+
editor,
|
|
36
|
+
blocks,
|
|
37
|
+
serializer,
|
|
38
|
+
false,
|
|
39
|
+
options
|
|
40
|
+
).outerHTML;
|
|
41
|
+
},
|
|
65
42
|
};
|
|
66
|
-
|
|
67
|
-
serializer.serializeNodeInner = (
|
|
68
|
-
node: Node,
|
|
69
|
-
options: { document?: Document }
|
|
70
|
-
) => serializeNodeInner(node, options, serializer, editor, false);
|
|
71
|
-
|
|
72
|
-
serializer.serializeProseMirrorFragment = (fragment: Fragment, options) =>
|
|
73
|
-
serializeProseMirrorFragment(fragment, serializer, options);
|
|
74
|
-
|
|
75
|
-
serializer.serializeBlocks = (
|
|
76
|
-
blocks: PartialBlock<BSchema, I, S>[],
|
|
77
|
-
options
|
|
78
|
-
) => {
|
|
79
|
-
const nodes = blocks.map((block) =>
|
|
80
|
-
blockToNode(block, schema, editor.schema.styleSchema)
|
|
81
|
-
);
|
|
82
|
-
const blockGroup = schema.nodes["blockGroup"].create(null, nodes);
|
|
83
|
-
|
|
84
|
-
return serializer.serializeProseMirrorFragment(
|
|
85
|
-
Fragment.from(blockGroup),
|
|
86
|
-
options
|
|
87
|
-
);
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
return serializer;
|
|
91
43
|
};
|