@blocknote/core 0.19.2 → 0.21.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 +2035 -1758
- package/dist/blocknote.js.map +1 -1
- package/dist/blocknote.umd.cjs +6 -6
- package/dist/blocknote.umd.cjs.map +1 -1
- package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js +6 -3
- package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js.map +1 -1
- package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.js +219 -0
- package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.test.js +175 -0
- package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.test.js.map +1 -0
- package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js +4 -1
- package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js.map +1 -1
- package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js +6 -3
- package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js.map +1 -1
- package/dist/src/api/blockManipulation/getBlock/getBlock.js +56 -0
- package/dist/src/api/blockManipulation/getBlock/getBlock.js.map +1 -0
- package/dist/src/api/blockManipulation/selections/selection.js +149 -0
- package/dist/src/api/blockManipulation/selections/selection.js.map +1 -0
- package/dist/src/api/blockManipulation/selections/selection.test.js +39 -0
- package/dist/src/api/blockManipulation/selections/selection.test.js.map +1 -0
- package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js +3 -0
- package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js.map +1 -1
- package/dist/src/api/clipboard/clipboard.test.js +6 -3
- package/dist/src/api/clipboard/clipboard.test.js.map +1 -1
- package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js +1 -1
- package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js.map +1 -1
- package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js +2 -3
- package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js.map +1 -1
- package/dist/src/api/clipboard/fromClipboard/pasteExtension.js +5 -5
- package/dist/src/api/clipboard/fromClipboard/pasteExtension.js.map +1 -1
- package/dist/src/api/clipboard/toClipboard/copyExtension.js +4 -2
- package/dist/src/api/clipboard/toClipboard/copyExtension.js.map +1 -1
- package/dist/src/api/nodeUtil.js +1 -1
- package/dist/src/api/nodeUtil.js.map +1 -1
- package/dist/src/api/parsers/markdown/parseMarkdown.test.js +4 -1
- package/dist/src/api/parsers/markdown/parseMarkdown.test.js.map +1 -1
- package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js +14 -7
- package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js.map +1 -1
- package/dist/src/blocks/AudioBlockContent/{audioBlockHelpers.js → parseAudioElement.js} +1 -1
- package/dist/src/blocks/AudioBlockContent/parseAudioElement.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/FileBlockContent.js +5 -4
- package/dist/src/blocks/FileBlockContent/FileBlockContent.js.map +1 -1
- package/dist/src/blocks/FileBlockContent/helpers/parse/parseEmbedElement.js +5 -0
- package/dist/src/blocks/FileBlockContent/helpers/parse/parseEmbedElement.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/helpers/parse/parseFigureElement.js +10 -0
- package/dist/src/blocks/FileBlockContent/helpers/parse/parseFigureElement.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/helpers/render/createAddFileButton.js +39 -0
- package/dist/src/blocks/FileBlockContent/helpers/render/createAddFileButton.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/helpers/render/createFileBlockWrapper.js +51 -0
- package/dist/src/blocks/FileBlockContent/helpers/render/createFileBlockWrapper.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/helpers/render/createFileNameWithIcon.js +17 -0
- package/dist/src/blocks/FileBlockContent/helpers/render/createFileNameWithIcon.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/helpers/render/createResizableFileBlockWrapper.js +147 -0
- package/dist/src/blocks/FileBlockContent/helpers/render/createResizableFileBlockWrapper.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createFigureWithCaption.js +9 -0
- package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createFigureWithCaption.js.map +1 -0
- package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createLinkWithCaption.js +11 -0
- package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createLinkWithCaption.js.map +1 -0
- package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js +17 -9
- package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js.map +1 -1
- package/dist/src/blocks/ImageBlockContent/{imageBlockHelpers.js → parseImageElement.js} +1 -1
- package/dist/src/blocks/ImageBlockContent/parseImageElement.js.map +1 -0
- package/dist/src/blocks/TableBlockContent/TableExtension.js +8 -1
- package/dist/src/blocks/TableBlockContent/TableExtension.js.map +1 -1
- package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js +18 -7
- package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js.map +1 -1
- package/dist/src/blocks/VideoBlockContent/{videoBlockHelpers.js → parseVideoElement.js} +1 -1
- package/dist/src/blocks/VideoBlockContent/parseVideoElement.js.map +1 -0
- package/dist/src/editor/BlockNoteEditor.js +64 -62
- package/dist/src/editor/BlockNoteEditor.js.map +1 -1
- package/dist/src/editor/BlockNoteExtensions.js +5 -8
- package/dist/src/editor/BlockNoteExtensions.js.map +1 -1
- package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js +4 -2
- package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js.map +1 -1
- package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js +10 -8
- package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js.map +1 -1
- package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js +7 -3
- package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js.map +1 -1
- package/dist/src/extensions/LinkToolbar/protocols.js +14 -0
- package/dist/src/extensions/LinkToolbar/protocols.js.map +1 -0
- package/dist/src/extensions/Placeholder/PlaceholderPlugin.js +19 -13
- package/dist/src/extensions/Placeholder/PlaceholderPlugin.js.map +1 -1
- package/dist/src/extensions/SideMenu/SideMenuPlugin.js +5 -1
- package/dist/src/extensions/SideMenu/SideMenuPlugin.js.map +1 -1
- package/dist/src/extensions/SideMenu/dragging.js +8 -1
- package/dist/src/extensions/SideMenu/dragging.js.map +1 -1
- package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js +3 -3
- package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js.map +1 -1
- package/dist/src/extensions/TableHandles/TableHandlesPlugin.js +37 -11
- package/dist/src/extensions/TableHandles/TableHandlesPlugin.js.map +1 -1
- package/dist/src/i18n/locales/ru.js +1 -1
- package/dist/src/index.js +9 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/schema/inlineContent/createSpec.js +1 -1
- package/dist/src/schema/inlineContent/createSpec.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/webpack-stats.json +1 -1
- package/package.json +3 -3
- package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +6 -6
- package/src/api/blockManipulation/commands/moveBlocks/__snapshots__/moveBlocks.test.ts.snap +9506 -0
- package/src/api/blockManipulation/commands/moveBlocks/moveBlocks.test.ts +295 -0
- package/src/api/blockManipulation/commands/moveBlocks/moveBlocks.ts +336 -0
- package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +5 -1
- package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +11 -3
- package/src/api/blockManipulation/getBlock/getBlock.ts +141 -0
- package/src/api/blockManipulation/selections/__snapshots__/selection.test.ts.snap +660 -0
- package/src/api/blockManipulation/selections/selection.test.ts +56 -0
- package/src/api/blockManipulation/selections/selection.ts +244 -0
- package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +4 -0
- package/src/api/clipboard/__snapshots__/tableAllCells.html +1 -1
- package/src/api/clipboard/__snapshots__/tableCell.html +1 -1
- package/src/api/clipboard/__snapshots__/tableRow.html +1 -1
- package/src/api/clipboard/clipboard.test.ts +7 -3
- package/src/api/clipboard/fromClipboard/handleFileInsertion.ts +1 -1
- package/src/api/clipboard/fromClipboard/handleVSCodePaste.ts +7 -14
- package/src/api/clipboard/fromClipboard/pasteExtension.ts +6 -6
- package/src/api/clipboard/toClipboard/copyExtension.ts +7 -2
- package/src/api/exporters/html/__snapshots__/file/basic/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/file/nested/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/file/noCaption/internal.html +1 -1
- package/src/api/exporters/html/__snapshots__/file/noName/internal.html +1 -1
- 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/noCaption/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__/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/noCaption/internal.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/markdown/__snapshots__/simpleImage/basic/markdown.md +1 -1
- package/src/api/exporters/markdown/__snapshots__/simpleImage/nested/markdown.md +2 -2
- package/src/api/exporters/markdown/__snapshots__/simpleImage/noCaption/markdown.md +1 -1
- package/src/api/exporters/markdown/__snapshots__/simpleImage/noName/markdown.md +1 -1
- package/src/api/nodeUtil.ts +2 -2
- package/src/api/parsers/markdown/parseMarkdown.test.ts +5 -7
- package/src/blocks/AudioBlockContent/AudioBlockContent.ts +13 -14
- package/src/blocks/FileBlockContent/FileBlockContent.ts +5 -12
- package/src/blocks/FileBlockContent/helpers/parse/parseEmbedElement.ts +5 -0
- package/src/blocks/FileBlockContent/helpers/parse/parseFigureElement.ts +16 -0
- package/src/blocks/FileBlockContent/helpers/render/createAddFileButton.ts +63 -0
- package/src/blocks/FileBlockContent/helpers/render/createFileBlockWrapper.ts +80 -0
- package/src/blocks/FileBlockContent/helpers/render/createFileNameWithIcon.ts +24 -0
- package/src/blocks/FileBlockContent/helpers/render/createResizableFileBlockWrapper.ts +204 -0
- package/src/blocks/FileBlockContent/helpers/toExternalHTML/createFigureWithCaption.ts +13 -0
- package/src/blocks/FileBlockContent/helpers/toExternalHTML/createLinkWithCaption.ts +15 -0
- package/src/blocks/ImageBlockContent/ImageBlockContent.ts +20 -28
- package/src/blocks/TableBlockContent/TableExtension.ts +12 -1
- package/src/blocks/VideoBlockContent/VideoBlockContent.ts +20 -27
- package/src/editor/Block.css +35 -51
- package/src/editor/BlockNoteEditor.ts +101 -92
- package/src/editor/BlockNoteExtensions.ts +9 -8
- package/src/editor/editor.css +1 -0
- package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +4 -2
- package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +11 -8
- package/src/extensions/LinkToolbar/LinkToolbarPlugin.ts +11 -4
- package/src/extensions/LinkToolbar/protocols.ts +13 -0
- package/src/extensions/Placeholder/PlaceholderPlugin.ts +29 -21
- package/src/extensions/SideMenu/SideMenuPlugin.ts +5 -1
- package/src/extensions/SideMenu/dragging.ts +8 -1
- package/src/extensions/SuggestionMenu/SuggestionPlugin.ts +3 -6
- package/src/extensions/TableHandles/TableHandlesPlugin.ts +49 -12
- package/src/i18n/locales/ru.ts +1 -1
- package/src/index.ts +9 -2
- package/src/schema/inlineContent/createSpec.ts +2 -2
- package/types/src/api/blockManipulation/commands/moveBlocks/moveBlocks.d.ts +15 -0
- package/types/src/api/blockManipulation/getBlock/getBlock.d.ts +7 -0
- package/types/src/api/blockManipulation/selections/selection.d.ts +5 -0
- package/types/src/api/blockManipulation/selections/selection.test.d.ts +1 -0
- package/types/src/api/clipboard/fromClipboard/handleVSCodePaste.d.ts +2 -3
- package/types/src/api/clipboard/fromClipboard/pasteExtension.d.ts +1 -3
- package/types/src/api/nodeUtil.d.ts +1 -1
- package/types/src/blocks/AudioBlockContent/AudioBlockContent.d.ts +2 -5
- package/types/src/blocks/FileBlockContent/FileBlockContent.d.ts +2 -5
- package/types/src/blocks/FileBlockContent/helpers/parse/parseEmbedElement.d.ts +3 -0
- package/types/src/blocks/FileBlockContent/helpers/parse/parseFigureElement.d.ts +4 -0
- package/types/src/blocks/FileBlockContent/helpers/render/createAddFileButton.d.ts +6 -0
- package/types/src/blocks/FileBlockContent/helpers/render/createFileBlockWrapper.d.ts +9 -0
- package/types/src/blocks/FileBlockContent/helpers/render/createFileNameWithIcon.d.ts +6 -0
- package/types/src/blocks/FileBlockContent/helpers/render/createResizableFileBlockWrapper.d.ts +9 -0
- package/types/src/blocks/FileBlockContent/helpers/toExternalHTML/createFigureWithCaption.d.ts +3 -0
- package/types/src/blocks/FileBlockContent/helpers/toExternalHTML/createLinkWithCaption.d.ts +3 -0
- package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +2 -5
- package/types/src/blocks/VideoBlockContent/VideoBlockContent.d.ts +2 -5
- package/types/src/editor/BlockNoteEditor.d.ts +60 -14
- package/types/src/editor/BlockNoteExtensions.d.ts +1 -0
- package/types/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.d.ts +1 -0
- package/types/src/extensions/LinkToolbar/protocols.d.ts +2 -0
- package/types/src/index.d.ts +9 -2
- package/types/src/pm-nodes/BlockContainer.d.ts +2 -2
- package/types/src/pm-nodes/BlockGroup.d.ts +2 -2
- package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js +0 -116
- package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js.map +0 -1
- package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js +0 -110
- package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js.map +0 -1
- package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js.map +0 -1
- package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js +0 -317
- package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js.map +0 -1
- package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js.map +0 -1
- package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js.map +0 -1
- package/src/api/blockManipulation/commands/moveBlock/__snapshots__/moveBlock.test.ts.snap +0 -3799
- package/src/api/blockManipulation/commands/moveBlock/moveBlock.test.ts +0 -196
- package/src/api/blockManipulation/commands/moveBlock/moveBlock.ts +0 -176
- package/src/blocks/FileBlockContent/fileBlockHelpers.ts +0 -456
- package/types/src/api/blockManipulation/commands/moveBlock/moveBlock.d.ts +0 -5
- package/types/src/blocks/FileBlockContent/fileBlockHelpers.d.ts +0 -41
- /package/src/blocks/AudioBlockContent/{audioBlockHelpers.ts → parseAudioElement.ts} +0 -0
- /package/src/blocks/ImageBlockContent/{imageBlockHelpers.ts → parseImageElement.ts} +0 -0
- /package/src/blocks/VideoBlockContent/{videoBlockHelpers.ts → parseVideoElement.ts} +0 -0
- /package/types/src/api/blockManipulation/commands/{moveBlock/moveBlock.test.d.ts → moveBlocks/moveBlocks.test.d.ts} +0 -0
- /package/types/src/blocks/AudioBlockContent/{audioBlockHelpers.d.ts → parseAudioElement.d.ts} +0 -0
- /package/types/src/blocks/ImageBlockContent/{imageBlockHelpers.d.ts → parseImageElement.d.ts} +0 -0
- /package/types/src/blocks/VideoBlockContent/{videoBlockHelpers.d.ts → parseVideoElement.d.ts} +0 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { TextSelection } from "prosemirror-state";
|
|
2
|
+
import { TableMap } from "prosemirror-tables";
|
|
3
|
+
|
|
4
|
+
import { Block } from "../../../blocks/defaultBlocks.js";
|
|
5
|
+
import type { BlockNoteEditor } from "../../../editor/BlockNoteEditor";
|
|
6
|
+
import { Selection } from "../../../editor/selectionTypes.js";
|
|
7
|
+
import {
|
|
8
|
+
BlockIdentifier,
|
|
9
|
+
BlockSchema,
|
|
10
|
+
InlineContentSchema,
|
|
11
|
+
StyleSchema,
|
|
12
|
+
} from "../../../schema/index.js";
|
|
13
|
+
import { getBlockInfo, getNearestBlockPos } from "../../getBlockInfoFromPos.js";
|
|
14
|
+
import { nodeToBlock } from "../../nodeConversions/nodeToBlock.js";
|
|
15
|
+
import { getNodeById } from "../../nodeUtil.js";
|
|
16
|
+
|
|
17
|
+
export function getSelection<
|
|
18
|
+
BSchema extends BlockSchema,
|
|
19
|
+
I extends InlineContentSchema,
|
|
20
|
+
S extends StyleSchema
|
|
21
|
+
>(
|
|
22
|
+
editor: BlockNoteEditor<BSchema, I, S>
|
|
23
|
+
): Selection<BSchema, I, S> | undefined {
|
|
24
|
+
const state = editor._tiptapEditor.state;
|
|
25
|
+
|
|
26
|
+
// Return undefined if the selection is collapsed or a node is selected.
|
|
27
|
+
if (state.selection.empty || "node" in state.selection) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const $startBlockBeforePos = state.doc.resolve(
|
|
32
|
+
getNearestBlockPos(state.doc, state.selection.from).posBeforeNode
|
|
33
|
+
);
|
|
34
|
+
const $endBlockBeforePos = state.doc.resolve(
|
|
35
|
+
getNearestBlockPos(state.doc, state.selection.to).posBeforeNode
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
// Converts the node at the given index and depth around `$startBlockBeforePos`
|
|
39
|
+
// to a block. Used to get blocks at given indices at the shared depth and
|
|
40
|
+
// at the depth of `$startBlockBeforePos`.
|
|
41
|
+
const indexToBlock = (
|
|
42
|
+
index: number,
|
|
43
|
+
depth?: number
|
|
44
|
+
): Block<BSchema, I, S> => {
|
|
45
|
+
const pos = $startBlockBeforePos.posAtIndex(index, depth);
|
|
46
|
+
const node = state.doc.resolve(pos).nodeAfter;
|
|
47
|
+
|
|
48
|
+
if (!node) {
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Error getting selection - node not found at position ${pos}`
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return nodeToBlock(
|
|
55
|
+
node,
|
|
56
|
+
editor.schema.blockSchema,
|
|
57
|
+
editor.schema.inlineContentSchema,
|
|
58
|
+
editor.schema.styleSchema,
|
|
59
|
+
editor.blockCache
|
|
60
|
+
);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const blocks: Block<BSchema, I, S>[] = [];
|
|
64
|
+
// Minimum depth at which the blocks share a common ancestor.
|
|
65
|
+
const sharedDepth = $startBlockBeforePos.sharedDepth($endBlockBeforePos.pos);
|
|
66
|
+
const startIndex = $startBlockBeforePos.index(sharedDepth);
|
|
67
|
+
const endIndex = $endBlockBeforePos.index(sharedDepth);
|
|
68
|
+
|
|
69
|
+
// In most cases, we want to return the blocks spanned by the selection at the
|
|
70
|
+
// shared depth. However, when the block in which the selection starts is at a
|
|
71
|
+
// higher depth than the shared depth, we omit the first block at the shared
|
|
72
|
+
// depth. Instead, we include the first block at its depth, and any blocks at
|
|
73
|
+
// a higher index up to the shared depth. The following example illustrates
|
|
74
|
+
// this:
|
|
75
|
+
// - id-0
|
|
76
|
+
// - id-1
|
|
77
|
+
// - >|id-2
|
|
78
|
+
// - id-3
|
|
79
|
+
// - id-4
|
|
80
|
+
// - id-5
|
|
81
|
+
// - id-6
|
|
82
|
+
// - id-7
|
|
83
|
+
// - id-8
|
|
84
|
+
// - id-9|<
|
|
85
|
+
// - id-10
|
|
86
|
+
// Here, each block is represented by its ID, and the selection is represented
|
|
87
|
+
// by the `>|` and `|<` markers. So the selection starts in block `id-2` and
|
|
88
|
+
// ends in block `id-8`. In this case, the shared depth is 0, since the blocks
|
|
89
|
+
// `id-6`, `id-7`, and `id-8` set the shared depth, as they are the least
|
|
90
|
+
// nested blocks spanned by the selection. Therefore, these blocks are all
|
|
91
|
+
// added to the `blocks` array. However, the selection starts in block `id-2`,
|
|
92
|
+
// which is at a higher depth than the shared depth. So we add block `id-2` to
|
|
93
|
+
// the `blocks` array, as well as any later siblings (in this case, `id-3`),
|
|
94
|
+
// and move up one level of depth. The ancestor of block `id-2` at this depth
|
|
95
|
+
// is block `id-1`, so we add all its later siblings to the `blocks` array as
|
|
96
|
+
// well, again moving up one level of depth. Since we're now at the shared
|
|
97
|
+
// depth, we are done. The final `blocks` array for this example would be:
|
|
98
|
+
// [ id-2, id-3, id-4, id-6, id-7, id-8, id-9 ]
|
|
99
|
+
if ($startBlockBeforePos.depth > sharedDepth) {
|
|
100
|
+
// Adds the block that the selection starts in.
|
|
101
|
+
blocks.push(
|
|
102
|
+
nodeToBlock(
|
|
103
|
+
$startBlockBeforePos.nodeAfter!,
|
|
104
|
+
editor.schema.blockSchema,
|
|
105
|
+
editor.schema.inlineContentSchema,
|
|
106
|
+
editor.schema.styleSchema,
|
|
107
|
+
editor.blockCache
|
|
108
|
+
)
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
// Traverses all depths from the depth of the block in which the selection
|
|
112
|
+
// starts, up to the shared depth.
|
|
113
|
+
for (let depth = $startBlockBeforePos.depth; depth > sharedDepth; depth--) {
|
|
114
|
+
const parentNode = $startBlockBeforePos.node(depth);
|
|
115
|
+
|
|
116
|
+
if (parentNode.type.isInGroup("childContainer")) {
|
|
117
|
+
const startIndexAtDepth = $startBlockBeforePos.index(depth) + 1;
|
|
118
|
+
const childCountAtDepth = $startBlockBeforePos.node(depth).childCount;
|
|
119
|
+
|
|
120
|
+
// Adds all blocks after the index of the block in which the selection
|
|
121
|
+
// starts (or its ancestors at lower depths).
|
|
122
|
+
for (let i = startIndexAtDepth; i < childCountAtDepth; i++) {
|
|
123
|
+
blocks.push(indexToBlock(i, depth));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
// Adds the first block spanned by the selection at the shared depth.
|
|
129
|
+
blocks.push(indexToBlock(startIndex, sharedDepth));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Adds all blocks spanned by the selection at the shared depth, excluding
|
|
133
|
+
// the first.
|
|
134
|
+
for (let i = startIndex + 1; i <= endIndex; i++) {
|
|
135
|
+
blocks.push(indexToBlock(i, sharedDepth));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (blocks.length === 0) {
|
|
139
|
+
throw new Error(
|
|
140
|
+
`Error getting selection - selection doesn't span any blocks (${state.selection})`
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return {
|
|
145
|
+
blocks,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function setSelection<
|
|
150
|
+
BSchema extends BlockSchema,
|
|
151
|
+
I extends InlineContentSchema,
|
|
152
|
+
S extends StyleSchema
|
|
153
|
+
>(
|
|
154
|
+
editor: BlockNoteEditor<BSchema, I, S>,
|
|
155
|
+
startBlock: BlockIdentifier,
|
|
156
|
+
endBlock: BlockIdentifier
|
|
157
|
+
) {
|
|
158
|
+
const startBlockId =
|
|
159
|
+
typeof startBlock === "string" ? startBlock : startBlock.id;
|
|
160
|
+
const endBlockId = typeof endBlock === "string" ? endBlock : endBlock.id;
|
|
161
|
+
|
|
162
|
+
if (startBlockId === endBlockId) {
|
|
163
|
+
throw new Error(
|
|
164
|
+
`Attempting to set selection with the same anchor and head blocks (id ${startBlockId})`
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const doc = editor._tiptapEditor.state.doc;
|
|
169
|
+
|
|
170
|
+
const anchorPosInfo = getNodeById(startBlockId, doc);
|
|
171
|
+
if (!anchorPosInfo) {
|
|
172
|
+
throw new Error(`Block with ID ${startBlockId} not found`);
|
|
173
|
+
}
|
|
174
|
+
const headPosInfo = getNodeById(endBlockId, doc);
|
|
175
|
+
if (!headPosInfo) {
|
|
176
|
+
throw new Error(`Block with ID ${endBlockId} not found`);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const anchorBlockInfo = getBlockInfo(anchorPosInfo);
|
|
180
|
+
const headBlockInfo = getBlockInfo(headPosInfo);
|
|
181
|
+
|
|
182
|
+
const anchorBlockConfig =
|
|
183
|
+
editor.schema.blockSchema[
|
|
184
|
+
anchorBlockInfo.blockNoteType as keyof typeof editor.schema.blockSchema
|
|
185
|
+
];
|
|
186
|
+
const headBlockConfig =
|
|
187
|
+
editor.schema.blockSchema[
|
|
188
|
+
headBlockInfo.blockNoteType as keyof typeof editor.schema.blockSchema
|
|
189
|
+
];
|
|
190
|
+
|
|
191
|
+
if (
|
|
192
|
+
!anchorBlockInfo.isBlockContainer ||
|
|
193
|
+
anchorBlockConfig.content === "none"
|
|
194
|
+
) {
|
|
195
|
+
throw new Error(
|
|
196
|
+
`Attempting to set selection anchor in block without content (id ${startBlockId})`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
if (!headBlockInfo.isBlockContainer || headBlockConfig.content === "none") {
|
|
200
|
+
throw new Error(
|
|
201
|
+
`Attempting to set selection anchor in block without content (id ${endBlockId})`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
let startPos: number;
|
|
206
|
+
let endPos: number;
|
|
207
|
+
|
|
208
|
+
if (anchorBlockConfig.content === "table") {
|
|
209
|
+
const tableMap = TableMap.get(anchorBlockInfo.blockContent.node);
|
|
210
|
+
const firstCellPos =
|
|
211
|
+
anchorBlockInfo.blockContent.beforePos +
|
|
212
|
+
tableMap.positionAt(0, 0, anchorBlockInfo.blockContent.node) +
|
|
213
|
+
1;
|
|
214
|
+
startPos = firstCellPos + 2;
|
|
215
|
+
} else {
|
|
216
|
+
startPos = anchorBlockInfo.blockContent.beforePos + 1;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (headBlockConfig.content === "table") {
|
|
220
|
+
const tableMap = TableMap.get(headBlockInfo.blockContent.node);
|
|
221
|
+
const lastCellPos =
|
|
222
|
+
headBlockInfo.blockContent.beforePos +
|
|
223
|
+
tableMap.positionAt(
|
|
224
|
+
tableMap.height - 1,
|
|
225
|
+
tableMap.width - 1,
|
|
226
|
+
headBlockInfo.blockContent.node
|
|
227
|
+
) +
|
|
228
|
+
1;
|
|
229
|
+
const lastCellNodeSize = doc.resolve(lastCellPos).nodeAfter!.nodeSize;
|
|
230
|
+
endPos = lastCellPos + lastCellNodeSize - 2;
|
|
231
|
+
} else {
|
|
232
|
+
endPos = headBlockInfo.blockContent.afterPos - 1;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// TODO: We should polish up the `MultipleNodeSelection` and use that instead.
|
|
236
|
+
// Right now it's missing a few things like a jsonID and styling to show
|
|
237
|
+
// which nodes are selected. `TextSelection` is ok for now, but has the
|
|
238
|
+
// restriction that the start/end blocks must have content.
|
|
239
|
+
editor._tiptapEditor.dispatch(
|
|
240
|
+
editor._tiptapEditor.state.tr.setSelection(
|
|
241
|
+
TextSelection.create(editor._tiptapEditor.state.doc, startPos, endPos)
|
|
242
|
+
)
|
|
243
|
+
);
|
|
244
|
+
}
|
|
@@ -96,6 +96,10 @@ export function setTextCursorPosition<
|
|
|
96
96
|
const id = typeof targetBlock === "string" ? targetBlock : targetBlock.id;
|
|
97
97
|
|
|
98
98
|
const posInfo = getNodeById(id, editor._tiptapEditor.state.doc);
|
|
99
|
+
if (!posInfo) {
|
|
100
|
+
throw new Error(`Block with ID ${id} not found`);
|
|
101
|
+
}
|
|
102
|
+
|
|
99
103
|
const info = getBlockInfo(posInfo);
|
|
100
104
|
|
|
101
105
|
const contentType: "none" | "inline" | "table" =
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<tr><td colspan="1" rowspan="1"><p>Table Cell</p></td><td colspan="1" rowspan="1"><p>Table Cell</p></td></tr><tr><td colspan="1" rowspan="1"><p>Table Cell</p></td><td colspan="1" rowspan="1"><p>Table Cell</p></td></tr>
|
|
1
|
+
<table><tr><td colspan="1" rowspan="1"><p>Table Cell</p></td><td colspan="1" rowspan="1"><p>Table Cell</p></td></tr><tr><td colspan="1" rowspan="1"><p>Table Cell</p></td><td colspan="1" rowspan="1"><p>Table Cell</p></td></tr></table>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<tr><td colspan="1" rowspan="1"><p>Table Cell</p></td></tr>
|
|
1
|
+
<table><tr><td colspan="1" rowspan="1"><p>Table Cell</p></td></tr></table>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<tr><td colspan="1" rowspan="1"><p>Table Cell</p></td><td colspan="1" rowspan="1"><p>Table Cell</p></td></tr>
|
|
1
|
+
<table><tr><td colspan="1" rowspan="1"><p>Table Cell</p></td><td colspan="1" rowspan="1"><p>Table Cell</p></td></tr></table>
|
|
@@ -167,14 +167,18 @@ describe("Test ProseMirror selection clipboard HTML", () => {
|
|
|
167
167
|
// Sets the editor selection to the given start and end positions, then
|
|
168
168
|
// exports the selected content to HTML and compares it to a snapshot.
|
|
169
169
|
async function testSelection(testCase: SelectionTestCase) {
|
|
170
|
+
if (!editor.prosemirrorView) {
|
|
171
|
+
throw new Error("Editor view not initialized.");
|
|
172
|
+
}
|
|
173
|
+
|
|
170
174
|
editor.dispatch(
|
|
171
175
|
editor._tiptapEditor.state.tr.setSelection(
|
|
172
|
-
testCase.createSelection(editor.
|
|
176
|
+
testCase.createSelection(editor.prosemirrorView.state.doc)
|
|
173
177
|
)
|
|
174
178
|
);
|
|
175
179
|
|
|
176
180
|
const { clipboardHTML, externalHTML } = selectedFragmentToHTML(
|
|
177
|
-
editor.
|
|
181
|
+
editor.prosemirrorView,
|
|
178
182
|
editor
|
|
179
183
|
);
|
|
180
184
|
|
|
@@ -184,7 +188,7 @@ describe("Test ProseMirror selection clipboard HTML", () => {
|
|
|
184
188
|
|
|
185
189
|
const originalDocument = editor.document;
|
|
186
190
|
doPaste(
|
|
187
|
-
editor.
|
|
191
|
+
editor.prosemirrorView,
|
|
188
192
|
"text",
|
|
189
193
|
clipboardHTML,
|
|
190
194
|
false,
|
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
export async function handleVSCodePaste<
|
|
9
|
-
BSchema extends BlockSchema,
|
|
10
|
-
I extends InlineContentSchema,
|
|
11
|
-
S extends StyleSchema
|
|
12
|
-
>(event: ClipboardEvent, editor: BlockNoteEditor<BSchema, I, S>) {
|
|
13
|
-
const view = editor.prosemirrorView;
|
|
1
|
+
import { EditorView } from "prosemirror-view";
|
|
2
|
+
|
|
3
|
+
export async function handleVSCodePaste(
|
|
4
|
+
event: ClipboardEvent,
|
|
5
|
+
view: EditorView
|
|
6
|
+
) {
|
|
14
7
|
const { schema } = view.state;
|
|
15
8
|
|
|
16
9
|
if (!event.clipboardData) {
|
|
@@ -38,7 +31,7 @@ export async function handleVSCodePaste<
|
|
|
38
31
|
|
|
39
32
|
// strip carriage return chars from text pasted as code
|
|
40
33
|
// see: https://github.com/ProseMirror/prosemirror-view/commit/a50a6bcceb4ce52ac8fcc6162488d8875613aacd
|
|
41
|
-
|
|
34
|
+
view.pasteHTML(
|
|
42
35
|
`<pre><code class="language-${language}">${text.replace(
|
|
43
36
|
/\r\n?/g,
|
|
44
37
|
"\n"
|
|
@@ -19,14 +19,14 @@ export const createPasteFromClipboardExtension = <
|
|
|
19
19
|
>(
|
|
20
20
|
editor: BlockNoteEditor<BSchema, I, S>
|
|
21
21
|
) =>
|
|
22
|
-
Extension.create
|
|
22
|
+
Extension.create({
|
|
23
23
|
name: "pasteFromClipboard",
|
|
24
24
|
addProseMirrorPlugins() {
|
|
25
25
|
return [
|
|
26
26
|
new Plugin({
|
|
27
27
|
props: {
|
|
28
28
|
handleDOMEvents: {
|
|
29
|
-
paste(
|
|
29
|
+
paste(view, event) {
|
|
30
30
|
event.preventDefault();
|
|
31
31
|
|
|
32
32
|
if (!editor.isEditable) {
|
|
@@ -45,7 +45,7 @@ export const createPasteFromClipboardExtension = <
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
if (format === "vscode-editor-data") {
|
|
48
|
-
handleVSCodePaste(event,
|
|
48
|
+
handleVSCodePaste(event, view);
|
|
49
49
|
return true;
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -57,18 +57,18 @@ export const createPasteFromClipboardExtension = <
|
|
|
57
57
|
let data = event.clipboardData!.getData(format);
|
|
58
58
|
|
|
59
59
|
if (format === "blocknote/html") {
|
|
60
|
-
|
|
60
|
+
view.pasteHTML(data);
|
|
61
61
|
return true;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
if (format === "text/html") {
|
|
65
65
|
const htmlNode = nestedListsToBlockNoteStructure(data.trim());
|
|
66
66
|
data = htmlNode.innerHTML;
|
|
67
|
-
|
|
67
|
+
view.pasteHTML(data);
|
|
68
68
|
return true;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
view.pasteText(data);
|
|
72
72
|
|
|
73
73
|
return true;
|
|
74
74
|
},
|
|
@@ -80,7 +80,10 @@ function fragmentToExternalHTML<
|
|
|
80
80
|
editor.schema.styleSchema
|
|
81
81
|
);
|
|
82
82
|
|
|
83
|
-
externalHTML = externalHTMLExporter.exportInlineContent(
|
|
83
|
+
externalHTML = `<table>${externalHTMLExporter.exportInlineContent(
|
|
84
|
+
ic as any,
|
|
85
|
+
{}
|
|
86
|
+
)}</table>`;
|
|
84
87
|
} else if (isWithinBlockContent) {
|
|
85
88
|
// first convert selection to blocknote-style inline content, and then
|
|
86
89
|
// pass this to the exporter
|
|
@@ -189,7 +192,9 @@ export const createCopyToClipboardExtension = <
|
|
|
189
192
|
},
|
|
190
193
|
cut(view, event) {
|
|
191
194
|
copyToClipboard(editor, view, event);
|
|
192
|
-
|
|
195
|
+
if (view.editable) {
|
|
196
|
+
view.dispatch(view.state.tr.deleteSelection());
|
|
197
|
+
}
|
|
193
198
|
// Prevent default PM handler to be called
|
|
194
199
|
return true;
|
|
195
200
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="file" data-name="example" data-url="exampleURL" data-caption="Caption" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-file-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="file" data-name="example" data-url="exampleURL" data-caption="Caption" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-file-name-with-icon"><div class="bn-file-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z"></path></svg></div><p class="bn-file-name">example</p></div><p class="bn-file-caption">Caption</p></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="file" data-name="example" data-url="exampleURL" data-caption="Caption" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-file-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="file" data-name="example" data-url="exampleURL" data-caption="Caption" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-file-name-with-icon"><div class="bn-file-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z"></path></svg></div><p class="bn-file-name">example</p></div><p class="bn-file-caption">Caption</p></div></div><div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="2"><div class="bn-block" data-node-type="blockContainer" data-id="2"><div class="bn-block-content" data-content-type="file" data-name="example" data-url="exampleURL" data-caption="Caption" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-file-name-with-icon"><div class="bn-file-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z"></path></svg></div><p class="bn-file-name">example</p></div><p class="bn-file-caption">Caption</p></div></div></div></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="file" data-name="example" data-url="exampleURL" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-file-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="file" data-name="example" data-url="exampleURL" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-file-name-with-icon"><div class="bn-file-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z"></path></svg></div><p class="bn-file-name">example</p></div></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="file" data-url="exampleURL" data-caption="Caption" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-file-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="file" data-url="exampleURL" data-caption="Caption" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-file-name-with-icon"><div class="bn-file-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z"></path></svg></div><p class="bn-file-name"></p></div><p class="bn-file-caption">Caption</p></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="image" data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="image" data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="example" draggable="false"></div><p class="bn-file-caption">Caption</p></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="image" data-url="exampleURL" data-caption="Caption" data-preview-width="256" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="image" data-url="exampleURL" data-caption="Caption" data-preview-width="256" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="Caption" draggable="false"></div><p class="bn-file-caption">Caption</p></div></div><div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="2"><div class="bn-block" data-node-type="blockContainer" data-id="2"><div class="bn-block-content" data-content-type="image" data-url="exampleURL" data-caption="Caption" data-preview-width="256" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="Caption" draggable="false"></div><p class="bn-file-caption">Caption</p></div></div></div></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="image" data-name="example" data-url="exampleURL" data-preview-width="256" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="image" data-name="example" data-url="exampleURL" data-preview-width="256" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="example" draggable="false"></div></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="image" data-url="exampleURL" data-caption="Caption" data-preview-width="256" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="image" data-url="exampleURL" data-caption="Caption" data-preview-width="256" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="Caption" draggable="false"></div><p class="bn-file-caption">Caption</p></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="image" data-name="example" data-url="exampleURL" data-caption="Caption" data-show-preview="false" data-preview-width="256" data-file-block=""><div class="bn-file-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="image" data-name="example" data-url="exampleURL" data-caption="Caption" data-show-preview="false" data-preview-width="256" data-file-block=""><div class="bn-file-block-content-wrapper"><div class="bn-file-name-with-icon"><div class="bn-file-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z"></path></svg></div><p class="bn-file-name">example</p></div><p class="bn-file-caption">Caption</p></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-
|
|
1
|
+
<div style="width: 256px;" data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="example" draggable="false"></div><p class="bn-file-caption">Caption</p></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="simpleImage" data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-file-block-content-wrapper"><div class="bn-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="simpleImage" data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-file-block-content-wrapper"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="example" draggable="false"></div><p class="bn-file-caption">Caption</p></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-
|
|
1
|
+
<div style="width: 256px;" data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="example" draggable="false"></div><p class="bn-file-caption">Caption</p></div><div style="width: 256px;" data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="example" draggable="false"></div><p class="bn-file-caption">Caption</p></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="simpleImage" data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-file-block-content-wrapper"><div class="bn-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="simpleImage" data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-file-block-content-wrapper"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="example" draggable="false"></div><p class="bn-file-caption">Caption</p></div></div><div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="2"><div class="bn-block" data-node-type="blockContainer" data-id="2"><div class="bn-block-content" data-content-type="simpleImage" data-name="example" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-file-block-content-wrapper"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="example" draggable="false"></div><p class="bn-file-caption">Caption</p></div></div></div></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div data-name="example" data-url="exampleURL" data-preview-width="256"><div class="bn-
|
|
1
|
+
<div style="width: 256px;" data-name="example" data-url="exampleURL" data-preview-width="256"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="example" draggable="false"></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="simpleImage" data-name="example" data-url="exampleURL" data-preview-width="256"><div class="bn-file-block-content-wrapper"><div class="bn-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="simpleImage" data-name="example" data-url="exampleURL" data-preview-width="256"><div class="bn-file-block-content-wrapper"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="example" draggable="false"></div></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-
|
|
1
|
+
<div style="width: 256px;" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="Caption" draggable="false"></div><p class="bn-file-caption">Caption</p></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="simpleImage" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-file-block-content-wrapper"><div class="bn-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="simpleImage" data-url="exampleURL" data-caption="Caption" data-preview-width="256"><div class="bn-file-block-content-wrapper"><div class="bn-visual-media-wrapper"><img class="bn-visual-media" src="exampleURL" alt="Caption" draggable="false"></div><p class="bn-file-caption">Caption</p></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div data-name="example" data-url="exampleURL" data-caption="Caption" data-show-preview="false" data-preview-width="256"><div class="bn-file-
|
|
1
|
+
<div data-name="example" data-url="exampleURL" data-caption="Caption" data-show-preview="false" data-preview-width="256"><div class="bn-file-name-with-icon"><div class="bn-file-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z"></path></svg></div><p class="bn-file-name">example</p></div><p class="bn-file-caption">Caption</p></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="simpleImage" data-name="example" data-url="exampleURL" data-caption="Caption" data-show-preview="false" data-preview-width="256"><div class="bn-file-
|
|
1
|
+
<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1"><div class="bn-block-content" data-content-type="simpleImage" data-name="example" data-url="exampleURL" data-caption="Caption" data-show-preview="false" data-preview-width="256"><div class="bn-file-block-content-wrapper"><div class="bn-file-name-with-icon"><div class="bn-file-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M3 8L9.00319 2H19.9978C20.5513 2 21 2.45531 21 2.9918V21.0082C21 21.556 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5501 3 20.9932V8ZM10 4V9H5V20H19V4H10Z"></path></svg></div><p class="bn-file-name">example</p></div><p class="bn-file-caption">Caption</p></div></div></div></div></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
![example]()
|
|
1
|
+

|
package/src/api/nodeUtil.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { Node } from "prosemirror-model";
|
|
|
6
6
|
export function getNodeById(
|
|
7
7
|
id: string,
|
|
8
8
|
doc: Node
|
|
9
|
-
): { node: Node; posBeforeNode: number } {
|
|
9
|
+
): { node: Node; posBeforeNode: number } | undefined {
|
|
10
10
|
let targetNode: Node | undefined = undefined;
|
|
11
11
|
let posBeforeNode: number | undefined = undefined;
|
|
12
12
|
|
|
@@ -28,7 +28,7 @@ export function getNodeById(
|
|
|
28
28
|
});
|
|
29
29
|
|
|
30
30
|
if (targetNode === undefined || posBeforeNode === undefined) {
|
|
31
|
-
|
|
31
|
+
return undefined;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
return {
|