@blocknote/core 0.9.5 → 0.10.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 +3699 -2600
- package/dist/blocknote.js.map +1 -1
- package/dist/blocknote.umd.cjs +7 -7
- package/dist/blocknote.umd.cjs.map +1 -1
- package/dist/style.css +1 -1
- package/dist/webpack-stats.json +1 -0
- package/package.json +8 -4
- package/src/api/README.md +8 -0
- package/src/api/blockManipulation/blockManipulation.test.ts +72 -10
- package/src/api/blockManipulation/blockManipulation.ts +38 -18
- package/src/api/exporters/copyExtension.ts +68 -0
- package/src/api/exporters/html/__snapshots__/complex/misc/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/complex/misc/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/customParagraph/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/customParagraph/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/customParagraph/nested/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/customParagraph/nested/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/customParagraph/styled/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/customParagraph/styled/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/fontSize/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/fontSize/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/between-links/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/between-links/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/end/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/end/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/link/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/link/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/multiple/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/multiple/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/only/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/only/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/start/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/start/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/styles/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/hardbreak/styles/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/image/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/image/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/image/button/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/image/button/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/image/nested/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/image/nested/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/link/adjacent/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/link/adjacent/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/link/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/link/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/link/styled/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/link/styled/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/mention/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/mention/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/paragraph/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/paragraph/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/paragraph/empty/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/paragraph/empty/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/paragraph/nested/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/paragraph/nested/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/paragraph/styled/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/paragraph/styled/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/paste/parse-basic-block-types.json +140 -0
- package/src/api/exporters/html/__snapshots__/paste/parse-deep-nested-content.json +240 -0
- package/src/api/exporters/html/__snapshots__/paste/parse-div-with-inline-content.json +91 -0
- package/src/api/exporters/html/__snapshots__/paste/parse-divs.json +19 -0
- package/src/api/exporters/html/__snapshots__/paste/parse-fake-image-caption.json +31 -0
- package/src/api/exporters/html/__snapshots__/paste/parse-mixed-nested-lists.json +70 -0
- package/src/api/exporters/html/__snapshots__/paste/parse-nested-lists-with-paragraphs.json +70 -0
- package/src/api/exporters/html/__snapshots__/paste/parse-nested-lists.json +70 -0
- package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/nested/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/nested/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/styled/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/styled/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleImage/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleImage/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleImage/button/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleImage/button/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleImage/nested/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/simpleImage/nested/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/small/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/small/basic/internal.html +1 -0
- package/src/api/exporters/html/__snapshots__/tag/basic/external.html +1 -0
- package/src/api/exporters/html/__snapshots__/tag/basic/internal.html +1 -0
- package/src/api/exporters/html/externalHTMLExporter.ts +98 -0
- package/src/api/exporters/html/htmlConversion.test.ts +100 -0
- package/src/api/exporters/html/internalHTMLSerializer.ts +80 -0
- package/src/api/exporters/html/util/sharedHTMLConversion.ts +128 -0
- package/src/api/{formatConversions → exporters/html/util}/simplifyBlocksRehypePlugin.ts +13 -0
- package/src/api/exporters/markdown/__snapshots__/complex/misc/markdown.md +5 -0
- package/src/api/exporters/markdown/__snapshots__/customParagraph/basic/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/customParagraph/nested/markdown.md +5 -0
- package/src/api/exporters/markdown/__snapshots__/customParagraph/styled/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/fontSize/basic/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/hardbreak/basic/markdown.md +2 -0
- package/src/api/exporters/markdown/__snapshots__/hardbreak/between-links/markdown.md +2 -0
- package/src/api/exporters/markdown/__snapshots__/hardbreak/end/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/hardbreak/link/markdown.md +2 -0
- package/src/api/exporters/markdown/__snapshots__/hardbreak/multiple/markdown.md +3 -0
- package/src/api/exporters/markdown/__snapshots__/hardbreak/start/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/hardbreak/styles/markdown.md +2 -0
- package/src/api/exporters/markdown/__snapshots__/image/basic/markdown.md +3 -0
- package/src/api/exporters/markdown/__snapshots__/image/button/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/image/nested/markdown.md +7 -0
- package/src/api/exporters/markdown/__snapshots__/link/adjacent/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/link/basic/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/link/styled/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/mention/basic/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/paragraph/basic/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/paragraph/empty/markdown.md +0 -0
- package/src/api/exporters/markdown/__snapshots__/paragraph/nested/markdown.md +5 -0
- package/src/api/exporters/markdown/__snapshots__/paragraph/styled/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/simpleCustomParagraph/basic/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/simpleCustomParagraph/nested/markdown.md +5 -0
- package/src/api/exporters/markdown/__snapshots__/simpleCustomParagraph/styled/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/simpleImage/basic/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/simpleImage/button/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/simpleImage/nested/markdown.md +3 -0
- package/src/api/exporters/markdown/__snapshots__/small/basic/markdown.md +1 -0
- package/src/api/exporters/markdown/__snapshots__/tag/basic/markdown.md +1 -0
- package/src/api/exporters/markdown/markdownExporter.test.ts +85 -0
- package/src/api/exporters/markdown/markdownExporter.ts +42 -0
- package/src/api/nodeConversions/__snapshots__/nodeConversions.test.ts.snap +486 -125
- package/src/api/nodeConversions/nodeConversions.test.ts +67 -498
- package/src/api/nodeConversions/nodeConversions.ts +311 -98
- package/src/api/parsers/html/__snapshots__/paste/list-test.json +105 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-basic-block-types.json +140 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-deep-nested-content.json +240 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-div-with-inline-content.json +91 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-divs.json +121 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-fake-image-caption.json +31 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-google-docs-html.json +476 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-mixed-nested-lists.json +140 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-nested-lists-with-paragraphs.json +140 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-nested-lists.json +157 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-notion-html.json +470 -0
- package/src/api/parsers/html/__snapshots__/paste/parse-two-divs.json +36 -0
- package/src/api/parsers/html/parseHTML.test.ts +440 -0
- package/src/api/parsers/html/parseHTML.ts +42 -0
- package/src/api/parsers/html/util/__snapshots__/nestedLists.test.ts.snap +129 -0
- package/src/api/parsers/html/util/nestedLists.test.ts +176 -0
- package/src/api/parsers/html/util/nestedLists.ts +113 -0
- package/src/api/parsers/markdown/__snapshots__/complex.json +353 -0
- package/src/api/parsers/markdown/__snapshots__/issue-226-1.json +71 -0
- package/src/api/parsers/markdown/__snapshots__/issue-226-2.json +144 -0
- package/src/api/parsers/markdown/__snapshots__/nested.json +72 -0
- package/src/api/parsers/markdown/__snapshots__/non-nested.json +71 -0
- package/src/api/parsers/markdown/__snapshots__/styled.json +58 -0
- package/src/api/parsers/markdown/parseMarkdown.test.ts +114 -0
- package/src/api/parsers/markdown/parseMarkdown.ts +84 -0
- package/src/api/parsers/pasteExtension.ts +59 -0
- package/src/api/testUtil/cases/customBlocks.ts +282 -0
- package/src/api/testUtil/cases/customInlineContent.ts +114 -0
- package/src/api/testUtil/cases/customStyles.ts +100 -0
- package/src/api/testUtil/cases/defaultSchema.ts +399 -0
- package/src/api/testUtil/index.ts +17 -0
- package/src/api/testUtil/partialBlockTestUtil.ts +127 -0
- package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +136 -0
- package/src/{extensions/Blocks/nodes/BlockContent → blocks}/ImageBlockContent/ImageBlockContent.ts +117 -31
- package/src/{extensions/Blocks/nodes/BlockContent → blocks}/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +34 -47
- package/src/{extensions/Blocks/nodes/BlockContent → blocks}/ListItemBlockContent/ListItemKeyboardShortcuts.ts +1 -1
- package/src/{extensions/Blocks/nodes/BlockContent → blocks}/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +1 -1
- package/src/{extensions/Blocks/nodes/BlockContent → blocks}/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +34 -56
- package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +43 -0
- package/src/blocks/README.md +3 -0
- package/src/blocks/TableBlockContent/TableBlockContent.ts +74 -0
- package/src/blocks/TableBlockContent/TableExtension.ts +63 -0
- package/src/blocks/defaultBlockHelpers.ts +95 -0
- package/src/blocks/defaultBlocks.ts +60 -0
- package/src/blocks/defaultProps.ts +24 -0
- package/src/{extensions/Blocks/nodes/Block.module.css → editor/Block.css} +70 -66
- package/src/{BlockNoteEditor.test.ts → editor/BlockNoteEditor.test.ts} +2 -2
- package/src/{BlockNoteEditor.ts → editor/BlockNoteEditor.ts} +382 -159
- package/src/{BlockNoteExtensions.ts → editor/BlockNoteExtensions.ts} +59 -40
- package/src/editor/README.md +3 -0
- package/src/editor/cursorPositionTypes.ts +16 -0
- package/src/{editor.module.css → editor/editor.css} +42 -15
- package/src/editor/selectionTypes.ts +14 -0
- package/src/editor/transformPasted.ts +58 -0
- package/src/extensions/BackgroundColor/BackgroundColorExtension.ts +1 -36
- package/src/extensions/BackgroundColor/BackgroundColorMark.ts +12 -27
- package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +16 -24
- package/src/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts +12 -10
- package/src/extensions/ImageToolbar/ImageToolbarPlugin.ts +35 -73
- package/src/extensions/Placeholder/PlaceholderExtension.ts +4 -4
- package/src/extensions/README.md +3 -0
- package/src/extensions/SideMenu/SideMenuPlugin.ts +77 -37
- package/src/extensions/SlashMenu/BaseSlashMenuItem.ts +7 -6
- package/src/extensions/SlashMenu/SlashMenuPlugin.ts +9 -7
- package/src/extensions/SlashMenu/defaultSlashMenuItems.ts +98 -35
- package/src/extensions/TableHandles/TableHandlesPlugin.ts +617 -0
- package/src/extensions/TextAlignment/TextAlignmentExtension.ts +3 -51
- package/src/extensions/TextColor/TextColorExtension.ts +1 -29
- package/src/extensions/TextColor/TextColorMark.ts +7 -27
- package/src/extensions/UniqueID/UniqueID.ts +28 -2
- package/src/extensions-shared/README.md +3 -0
- package/src/{shared/plugins → extensions-shared}/suggestion/SuggestionPlugin.ts +19 -13
- package/src/index.ts +21 -15
- package/src/{extensions/Blocks/nodes → pm-nodes}/BlockContainer.ts +161 -96
- package/src/pm-nodes/BlockGroup.ts +54 -0
- package/src/pm-nodes/Doc.ts +7 -0
- package/src/pm-nodes/README.md +42 -0
- package/src/pm-nodes/index.ts +3 -0
- package/src/schema/README.md +3 -0
- package/src/schema/blocks/createSpec.ts +220 -0
- package/src/schema/blocks/internal.ts +253 -0
- package/src/schema/blocks/types.ts +252 -0
- package/src/schema/index.ts +10 -0
- package/src/schema/inlineContent/createSpec.ts +119 -0
- package/src/schema/inlineContent/internal.ts +105 -0
- package/src/schema/inlineContent/types.ts +144 -0
- package/src/schema/propTypes.ts +32 -0
- package/src/schema/styles/createSpec.ts +85 -0
- package/src/schema/styles/internal.ts +96 -0
- package/src/schema/styles/types.ts +42 -0
- package/src/util/README.md +3 -0
- package/src/{shared/utils.ts → util/browser.ts} +4 -8
- package/src/util/string.ts +3 -0
- package/src/util/typescript.ts +5 -0
- package/types/src/BlockNoteEditor.d.ts +51 -37
- package/types/src/BlockNoteExtensions.d.ts +8 -3
- package/types/src/api/blockManipulation/blockManipulation.d.ts +5 -4
- package/types/src/api/exporters/copyExtension.d.ts +6 -0
- package/types/src/api/exporters/html/externalHTMLExporter.d.ts +8 -0
- package/types/src/api/exporters/html/internalHTMLSerializer.d.ts +8 -0
- package/types/src/api/exporters/html/util/sharedHTMLConversion.d.ts +7 -0
- package/types/src/api/exporters/markdown/markdownExporter.d.ts +5 -0
- package/types/src/api/exporters/markdown/markdownExporter.test.d.ts +1 -0
- package/types/src/api/getBlockInfoFromPos.d.ts +27 -0
- package/types/src/api/nodeConversions/nodeConversions.d.ts +14 -6
- package/types/src/api/nodeConversions/testUtil.d.ts +7 -2
- package/types/src/api/nodeUtil.d.ts +8 -0
- package/types/src/api/parsers/html/parseHTML.d.ts +3 -0
- package/types/src/api/parsers/html/parseHTML.test.d.ts +1 -0
- package/types/src/api/parsers/html/util/nestedLists.d.ts +1 -0
- package/types/src/api/parsers/html/util/nestedLists.test.d.ts +1 -0
- package/types/src/api/parsers/markdown/parseMarkdown.d.ts +3 -0
- package/types/src/api/parsers/markdown/parseMarkdown.test.d.ts +1 -0
- package/types/src/api/parsers/pasteExtension.d.ts +6 -0
- package/types/src/api/testCases/cases/customBlocks.d.ts +345 -0
- package/types/src/api/testCases/cases/customInlineContent.d.ts +29 -0
- package/types/src/api/testCases/cases/customStyles.d.ts +64 -0
- package/types/src/api/testCases/cases/defaultSchema.d.ts +3 -0
- package/types/src/api/testCases/index.d.ts +12 -0
- package/types/src/api/testUtil/cases/customBlocks.d.ts +345 -0
- package/types/src/api/testUtil/cases/customInlineContent.d.ts +29 -0
- package/types/src/api/testUtil/cases/customStyles.d.ts +64 -0
- package/types/src/api/testUtil/cases/defaultSchema.d.ts +3 -0
- package/types/src/api/testUtil/index.d.ts +12 -0
- package/types/src/api/testUtil/partialBlockTestUtil.d.ts +7 -0
- package/types/src/blocks/HeadingBlockContent/HeadingBlockContent.d.ts +58 -0
- package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +93 -0
- package/types/src/blocks/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.d.ts +1 -0
- package/types/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.d.ts +46 -0
- package/types/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.d.ts +2 -0
- package/types/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.d.ts +2 -0
- package/types/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.d.ts +46 -0
- package/types/src/blocks/ParagraphBlockContent/ParagraphBlockContent.d.ts +52 -0
- package/types/src/blocks/TableBlockContent/TableBlockContent.d.ts +53 -0
- package/types/src/blocks/TableBlockContent/TableExtension.d.ts +2 -0
- package/types/src/blocks/defaultBlockHelpers.d.ts +10 -0
- package/types/src/blocks/defaultBlocks.d.ts +577 -0
- package/types/src/blocks/defaultProps.d.ts +15 -0
- package/types/src/editor/BlockNoteEditor.d.ts +299 -0
- package/types/src/editor/BlockNoteEditor.test.d.ts +1 -0
- package/types/src/editor/BlockNoteExtensions.d.ts +24 -0
- package/types/src/editor/cursorPositionTypes.d.ts +6 -0
- package/types/src/editor/selectionTypes.d.ts +4 -0
- package/types/src/editor/transformPasted.d.ts +12 -0
- package/types/src/extensions/BackgroundColor/BackgroundColorExtension.d.ts +0 -7
- package/types/src/extensions/BackgroundColor/BackgroundColorMark.d.ts +7 -9
- package/types/src/extensions/Blocks/api/blocks/createSpec.d.ts +35 -0
- package/types/src/extensions/Blocks/api/blocks/internal.d.ts +45 -0
- package/types/src/extensions/Blocks/api/blocks/types.d.ts +114 -0
- package/types/src/extensions/Blocks/api/cursorPositionTypes.d.ts +7 -5
- package/types/src/extensions/Blocks/api/defaultBlocks.d.ts +573 -113
- package/types/src/extensions/Blocks/api/defaultProps.d.ts +2 -1
- package/types/src/extensions/Blocks/api/inlineContent/createSpec.d.ts +21 -0
- package/types/src/extensions/Blocks/api/inlineContent/internal.d.ts +25 -0
- package/types/src/extensions/Blocks/api/inlineContent/types.d.ts +62 -0
- package/types/src/extensions/Blocks/api/selectionTypes.d.ts +5 -3
- package/types/src/extensions/Blocks/api/styles/createSpec.d.ts +13 -0
- package/types/src/extensions/Blocks/api/styles/internal.d.ts +22 -0
- package/types/src/extensions/Blocks/api/styles/types.d.ts +21 -0
- package/types/src/extensions/Blocks/nodes/BlockContainer.d.ts +8 -4
- package/types/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.d.ts +38 -23
- package/types/src/extensions/Blocks/nodes/BlockContent/ImageBlockContent/ImageBlockContent.d.ts +75 -17
- package/types/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.d.ts +30 -19
- package/types/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.d.ts +30 -19
- package/types/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.d.ts +36 -28
- package/types/src/extensions/Blocks/nodes/BlockContent/TableBlockContent/TableBlockContent.d.ts +53 -0
- package/types/src/extensions/Blocks/nodes/BlockContent/TableBlockContent/TableExtension.d.ts +2 -0
- package/types/src/extensions/Blocks/nodes/BlockContent/defaultBlockHelpers.d.ts +12 -0
- package/types/src/extensions/Blocks/nodes/BlockGroup.d.ts +1 -1
- package/types/src/extensions/FormattingToolbar/FormattingToolbarPlugin.d.ts +8 -6
- package/types/src/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.d.ts +6 -6
- package/types/src/extensions/ImageToolbar/ImageToolbarPlugin.d.ts +11 -16
- package/types/src/extensions/NonEditableBlocks/NonEditableBlockPlugin.d.ts +2 -0
- package/types/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.d.ts +14 -0
- package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +19 -11
- package/types/src/extensions/SlashMenu/BaseSlashMenuItem.d.ts +5 -6
- package/types/src/extensions/SlashMenu/SlashMenuPlugin.d.ts +6 -6
- package/types/src/extensions/SlashMenu/defaultSlashMenuItems.d.ts +2 -1
- package/types/src/extensions/TableHandles/TableHandlesPlugin.d.ts +74 -0
- package/types/src/extensions/TextAlignment/TextAlignmentExtension.d.ts +0 -7
- package/types/src/extensions/TextColor/TextColorExtension.d.ts +0 -7
- package/types/src/extensions/TextColor/TextColorMark.d.ts +7 -9
- package/types/src/extensions/UniqueID/UniqueID.d.ts +1 -1
- package/types/src/extensions-shared/BaseUiElementTypes.d.ts +7 -0
- package/types/src/extensions-shared/suggestion/SuggestionItem.d.ts +3 -0
- package/types/src/extensions-shared/suggestion/SuggestionPlugin.d.ts +36 -0
- package/types/src/index.d.ts +20 -15
- package/types/src/pm-nodes/BlockContainer.d.ts +28 -0
- package/types/src/pm-nodes/BlockGroup.d.ts +10 -0
- package/types/src/pm-nodes/Doc.d.ts +2 -0
- package/types/src/pm-nodes/index.d.ts +3 -0
- package/types/src/schema/blocks/createSpec.d.ts +35 -0
- package/types/src/schema/blocks/internal.d.ts +45 -0
- package/types/src/schema/blocks/types.d.ts +107 -0
- package/types/src/schema/index.d.ts +10 -0
- package/types/src/schema/inlineContent/createSpec.d.ts +21 -0
- package/types/src/schema/inlineContent/internal.d.ts +28 -0
- package/types/src/schema/inlineContent/types.d.ts +62 -0
- package/types/src/schema/propTypes.d.ts +8 -0
- package/types/src/schema/styles/createSpec.d.ts +13 -0
- package/types/src/schema/styles/internal.d.ts +22 -0
- package/types/src/schema/styles/types.d.ts +21 -0
- package/types/src/shared/plugins/suggestion/SuggestionPlugin.d.ts +4 -2
- package/types/src/util/EventEmitter.d.ts +11 -0
- package/types/src/util/browser.d.ts +3 -0
- package/types/src/util/string.d.ts +1 -0
- package/types/src/util/typescript.d.ts +3 -0
- package/src/api/formatConversions/__snapshots__/formatConversions.test.ts.snap +0 -346
- package/src/api/formatConversions/formatConversions.test.ts +0 -753
- package/src/api/formatConversions/formatConversions.ts +0 -133
- package/src/api/nodeConversions/testUtil.ts +0 -65
- package/src/extensions/Blocks/api/block.ts +0 -307
- package/src/extensions/Blocks/api/blockTypes.ts +0 -249
- package/src/extensions/Blocks/api/cursorPositionTypes.ts +0 -7
- package/src/extensions/Blocks/api/defaultBlocks.ts +0 -16
- package/src/extensions/Blocks/api/defaultProps.ts +0 -16
- package/src/extensions/Blocks/api/inlineContentTypes.ts +0 -36
- package/src/extensions/Blocks/api/selectionTypes.ts +0 -5
- package/src/extensions/Blocks/api/serialization.ts +0 -29
- package/src/extensions/Blocks/helpers/findBlock.ts +0 -5
- package/src/extensions/Blocks/index.ts +0 -8
- package/src/extensions/Blocks/nodes/BlockAttributes.ts +0 -10
- package/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts +0 -142
- package/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts +0 -62
- package/src/extensions/Blocks/nodes/BlockGroup.ts +0 -53
- package/types/src/api/formatConversions/formatConversions.d.ts +0 -6
- package/types/src/extensions/Blocks/api/block.d.ts +0 -20
- package/types/src/extensions/Blocks/api/blockTypes.d.ts +0 -103
- package/types/src/extensions/Blocks/api/inlineContentTypes.d.ts +0 -30
- package/types/src/extensions/Blocks/api/serialization.d.ts +0 -2
- /package/src/{shared/EditorElement.ts → api/exporters/markdown/__snapshots__/hardbreak/only/markdown.md} +0 -0
- /package/src/api/{formatConversions → exporters/markdown}/removeUnderlinesRehypePlugin.ts +0 -0
- /package/src/{extensions/Blocks/helpers → api}/getBlockInfoFromPos.ts +0 -0
- /package/src/api/{util/nodeUtil.ts → nodeUtil.ts} +0 -0
- /package/src/{extensions/Blocks/nodes/BlockContent → blocks}/ImageBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.ts +0 -0
- /package/src/extensions/{Blocks → NonEditableBlocks}/NonEditableBlockPlugin.ts +0 -0
- /package/src/extensions/{Blocks → PreviousBlockType}/PreviousBlockTypePlugin.ts +0 -0
- /package/src/{shared → extensions-shared}/BaseUiElementTypes.ts +0 -0
- /package/src/{shared/plugins → extensions-shared}/suggestion/SuggestionItem.ts +0 -0
- /package/src/{shared → util}/EventEmitter.ts +0 -0
- /package/types/src/api/{formatConversions/formatConversions.test.d.ts → exporters/html/htmlConversion.test.d.ts} +0 -0
- /package/types/src/api/{formatConversions → exporters/html/util}/simplifyBlocksRehypePlugin.d.ts +0 -0
- /package/types/src/api/{formatConversions → exporters/markdown}/removeUnderlinesRehypePlugin.d.ts +0 -0
|
@@ -3,56 +3,79 @@ import { Node } from "prosemirror-model";
|
|
|
3
3
|
// import "./blocknote.css";
|
|
4
4
|
import { Editor as TiptapEditor } from "@tiptap/core/dist/packages/core/src/Editor";
|
|
5
5
|
import * as Y from "yjs";
|
|
6
|
-
import { getBlockNoteExtensions } from "./BlockNoteExtensions";
|
|
7
6
|
import {
|
|
8
7
|
insertBlocks,
|
|
9
8
|
removeBlocks,
|
|
10
9
|
replaceBlocks,
|
|
11
10
|
updateBlock,
|
|
12
|
-
} from "
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
blocksToMarkdown,
|
|
17
|
-
markdownToBlocks,
|
|
18
|
-
} from "./api/formatConversions/formatConversions";
|
|
11
|
+
} from "../api/blockManipulation/blockManipulation";
|
|
12
|
+
import { createExternalHTMLExporter } from "../api/exporters/html/externalHTMLExporter";
|
|
13
|
+
import { blocksToMarkdown } from "../api/exporters/markdown/markdownExporter";
|
|
14
|
+
import { getBlockInfoFromPos } from "../api/getBlockInfoFromPos";
|
|
19
15
|
import {
|
|
20
16
|
blockToNode,
|
|
21
17
|
nodeToBlock,
|
|
22
|
-
} from "
|
|
23
|
-
import { getNodeById } from "
|
|
24
|
-
import
|
|
18
|
+
} from "../api/nodeConversions/nodeConversions";
|
|
19
|
+
import { getNodeById } from "../api/nodeUtil";
|
|
20
|
+
import { HTMLToBlocks } from "../api/parsers/html/parseHTML";
|
|
21
|
+
import { markdownToBlocks } from "../api/parsers/markdown/parseMarkdown";
|
|
22
|
+
import {
|
|
23
|
+
DefaultBlockSchema,
|
|
24
|
+
DefaultInlineContentSchema,
|
|
25
|
+
DefaultStyleSchema,
|
|
26
|
+
defaultBlockSchema,
|
|
27
|
+
defaultBlockSpecs,
|
|
28
|
+
defaultInlineContentSpecs,
|
|
29
|
+
defaultStyleSpecs,
|
|
30
|
+
} from "../blocks/defaultBlocks";
|
|
31
|
+
import { FormattingToolbarProsemirrorPlugin } from "../extensions/FormattingToolbar/FormattingToolbarPlugin";
|
|
32
|
+
import { HyperlinkToolbarProsemirrorPlugin } from "../extensions/HyperlinkToolbar/HyperlinkToolbarPlugin";
|
|
33
|
+
import { ImageToolbarProsemirrorPlugin } from "../extensions/ImageToolbar/ImageToolbarPlugin";
|
|
34
|
+
import { SideMenuProsemirrorPlugin } from "../extensions/SideMenu/SideMenuPlugin";
|
|
35
|
+
import { BaseSlashMenuItem } from "../extensions/SlashMenu/BaseSlashMenuItem";
|
|
36
|
+
import { SlashMenuProsemirrorPlugin } from "../extensions/SlashMenu/SlashMenuPlugin";
|
|
37
|
+
import { getDefaultSlashMenuItems } from "../extensions/SlashMenu/defaultSlashMenuItems";
|
|
38
|
+
import { TableHandlesProsemirrorPlugin } from "../extensions/TableHandles/TableHandlesPlugin";
|
|
39
|
+
import { UniqueID } from "../extensions/UniqueID/UniqueID";
|
|
25
40
|
import {
|
|
26
41
|
Block,
|
|
27
42
|
BlockIdentifier,
|
|
28
43
|
BlockNoteDOMAttributes,
|
|
29
44
|
BlockSchema,
|
|
45
|
+
BlockSchemaFromSpecs,
|
|
46
|
+
BlockSchemaWithBlock,
|
|
47
|
+
BlockSpecs,
|
|
48
|
+
InlineContentSchema,
|
|
49
|
+
InlineContentSchemaFromSpecs,
|
|
50
|
+
InlineContentSpecs,
|
|
30
51
|
PartialBlock,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
DefaultBlockSchema,
|
|
35
|
-
defaultBlockSchema,
|
|
36
|
-
} from "./extensions/Blocks/api/defaultBlocks";
|
|
37
|
-
import {
|
|
38
|
-
ColorStyle,
|
|
52
|
+
StyleSchema,
|
|
53
|
+
StyleSchemaFromSpecs,
|
|
54
|
+
StyleSpecs,
|
|
39
55
|
Styles,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
import {
|
|
46
|
-
|
|
47
|
-
import {
|
|
48
|
-
import {
|
|
49
|
-
|
|
50
|
-
import {
|
|
51
|
-
import {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
+
getBlockSchemaFromSpecs,
|
|
57
|
+
getInlineContentSchemaFromSpecs,
|
|
58
|
+
getStyleSchemaFromSpecs,
|
|
59
|
+
} from "../schema";
|
|
60
|
+
import { mergeCSSClasses } from "../util/browser";
|
|
61
|
+
import { UnreachableCaseError } from "../util/typescript";
|
|
62
|
+
|
|
63
|
+
import { getBlockNoteExtensions } from "./BlockNoteExtensions";
|
|
64
|
+
import { TextCursorPosition } from "./cursorPositionTypes";
|
|
65
|
+
|
|
66
|
+
import { Selection } from "./selectionTypes";
|
|
67
|
+
import { transformPasted } from "./transformPasted";
|
|
68
|
+
|
|
69
|
+
// CSS
|
|
70
|
+
import "prosemirror-tables/style/tables.css";
|
|
71
|
+
import "./Block.css";
|
|
72
|
+
import "./editor.css";
|
|
73
|
+
|
|
74
|
+
export type BlockNoteEditorOptions<
|
|
75
|
+
BSpecs extends BlockSpecs,
|
|
76
|
+
ISpecs extends InlineContentSpecs,
|
|
77
|
+
SSpecs extends StyleSpecs
|
|
78
|
+
> = {
|
|
56
79
|
// TODO: Figure out if enableBlockNoteExtensions/disableHistoryExtension are needed and document them.
|
|
57
80
|
enableBlockNoteExtensions: boolean;
|
|
58
81
|
/**
|
|
@@ -61,7 +84,7 @@ export type BlockNoteEditorOptions<BSchema extends BlockSchema> = {
|
|
|
61
84
|
*
|
|
62
85
|
* @default defaultSlashMenuItems from `./extensions/SlashMenu`
|
|
63
86
|
*/
|
|
64
|
-
slashMenuItems: BaseSlashMenuItem<any>[];
|
|
87
|
+
slashMenuItems: BaseSlashMenuItem<any, any, any>[];
|
|
65
88
|
|
|
66
89
|
/**
|
|
67
90
|
* The HTML element that should be used as the parent element for the editor.
|
|
@@ -78,15 +101,33 @@ export type BlockNoteEditorOptions<BSchema extends BlockSchema> = {
|
|
|
78
101
|
/**
|
|
79
102
|
* A callback function that runs when the editor is ready to be used.
|
|
80
103
|
*/
|
|
81
|
-
onEditorReady: (
|
|
104
|
+
onEditorReady: (
|
|
105
|
+
editor: BlockNoteEditor<
|
|
106
|
+
BlockSchemaFromSpecs<BSpecs>,
|
|
107
|
+
InlineContentSchemaFromSpecs<ISpecs>,
|
|
108
|
+
StyleSchemaFromSpecs<SSpecs>
|
|
109
|
+
>
|
|
110
|
+
) => void;
|
|
82
111
|
/**
|
|
83
112
|
* A callback function that runs whenever the editor's contents change.
|
|
84
113
|
*/
|
|
85
|
-
onEditorContentChange: (
|
|
114
|
+
onEditorContentChange: (
|
|
115
|
+
editor: BlockNoteEditor<
|
|
116
|
+
BlockSchemaFromSpecs<BSpecs>,
|
|
117
|
+
InlineContentSchemaFromSpecs<ISpecs>,
|
|
118
|
+
StyleSchemaFromSpecs<SSpecs>
|
|
119
|
+
>
|
|
120
|
+
) => void;
|
|
86
121
|
/**
|
|
87
122
|
* A callback function that runs whenever the text cursor position changes.
|
|
88
123
|
*/
|
|
89
|
-
onTextCursorPositionChange: (
|
|
124
|
+
onTextCursorPositionChange: (
|
|
125
|
+
editor: BlockNoteEditor<
|
|
126
|
+
BlockSchemaFromSpecs<BSpecs>,
|
|
127
|
+
InlineContentSchemaFromSpecs<ISpecs>,
|
|
128
|
+
StyleSchemaFromSpecs<SSpecs>
|
|
129
|
+
>
|
|
130
|
+
) => void;
|
|
90
131
|
/**
|
|
91
132
|
* Locks the editor from being editable by the user if set to `false`.
|
|
92
133
|
*/
|
|
@@ -94,7 +135,11 @@ export type BlockNoteEditorOptions<BSchema extends BlockSchema> = {
|
|
|
94
135
|
/**
|
|
95
136
|
* The content that should be in the editor when it's created, represented as an array of partial block objects.
|
|
96
137
|
*/
|
|
97
|
-
initialContent: PartialBlock<
|
|
138
|
+
initialContent: PartialBlock<
|
|
139
|
+
BlockSchemaFromSpecs<BSpecs>,
|
|
140
|
+
InlineContentSchemaFromSpecs<ISpecs>,
|
|
141
|
+
StyleSchemaFromSpecs<SSpecs>
|
|
142
|
+
>[];
|
|
98
143
|
/**
|
|
99
144
|
* Use default BlockNote font and reset the styles of <p> <li> <h1> elements etc., that are used in BlockNote.
|
|
100
145
|
*
|
|
@@ -105,7 +150,11 @@ export type BlockNoteEditorOptions<BSchema extends BlockSchema> = {
|
|
|
105
150
|
/**
|
|
106
151
|
* A list of block types that should be available in the editor.
|
|
107
152
|
*/
|
|
108
|
-
|
|
153
|
+
blockSpecs: BSpecs;
|
|
154
|
+
|
|
155
|
+
styleSpecs: SSpecs;
|
|
156
|
+
|
|
157
|
+
inlineContentSpecs: ISpecs;
|
|
109
158
|
|
|
110
159
|
/**
|
|
111
160
|
* A custom function to handle file uploads.
|
|
@@ -140,7 +189,7 @@ export type BlockNoteEditorOptions<BSchema extends BlockSchema> = {
|
|
|
140
189
|
};
|
|
141
190
|
|
|
142
191
|
// tiptap options, undocumented
|
|
143
|
-
_tiptapOptions:
|
|
192
|
+
_tiptapOptions: Partial<EditorOptions>;
|
|
144
193
|
};
|
|
145
194
|
|
|
146
195
|
const blockNoteTipTapOptions = {
|
|
@@ -149,52 +198,115 @@ const blockNoteTipTapOptions = {
|
|
|
149
198
|
enableCoreExtensions: false,
|
|
150
199
|
};
|
|
151
200
|
|
|
152
|
-
export class BlockNoteEditor<
|
|
201
|
+
export class BlockNoteEditor<
|
|
202
|
+
BSchema extends BlockSchema = DefaultBlockSchema,
|
|
203
|
+
ISchema extends InlineContentSchema = DefaultInlineContentSchema,
|
|
204
|
+
SSchema extends StyleSchema = DefaultStyleSchema
|
|
205
|
+
> {
|
|
153
206
|
public readonly _tiptapEditor: TiptapEditor & { contentComponent: any };
|
|
154
|
-
public blockCache = new WeakMap<Node, Block<
|
|
155
|
-
public readonly
|
|
207
|
+
public blockCache = new WeakMap<Node, Block<any, any, any>>();
|
|
208
|
+
public readonly blockSchema: BSchema;
|
|
209
|
+
public readonly inlineContentSchema: ISchema;
|
|
210
|
+
public readonly styleSchema: SSchema;
|
|
211
|
+
|
|
212
|
+
public readonly blockImplementations: BlockSpecs;
|
|
213
|
+
public readonly inlineContentImplementations: InlineContentSpecs;
|
|
214
|
+
public readonly styleImplementations: StyleSpecs;
|
|
215
|
+
|
|
156
216
|
public ready = false;
|
|
157
217
|
|
|
158
|
-
public readonly sideMenu: SideMenuProsemirrorPlugin<
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
218
|
+
public readonly sideMenu: SideMenuProsemirrorPlugin<
|
|
219
|
+
BSchema,
|
|
220
|
+
ISchema,
|
|
221
|
+
SSchema
|
|
222
|
+
>;
|
|
223
|
+
public readonly formattingToolbar: FormattingToolbarProsemirrorPlugin;
|
|
224
|
+
public readonly slashMenu: SlashMenuProsemirrorPlugin<
|
|
225
|
+
BSchema,
|
|
226
|
+
ISchema,
|
|
227
|
+
SSchema,
|
|
228
|
+
any
|
|
229
|
+
>;
|
|
230
|
+
public readonly hyperlinkToolbar: HyperlinkToolbarProsemirrorPlugin<
|
|
231
|
+
BSchema,
|
|
232
|
+
ISchema,
|
|
233
|
+
SSchema
|
|
234
|
+
>;
|
|
235
|
+
public readonly imageToolbar: ImageToolbarProsemirrorPlugin<
|
|
236
|
+
BSchema,
|
|
237
|
+
ISchema,
|
|
238
|
+
SSchema
|
|
239
|
+
>;
|
|
240
|
+
public readonly tableHandles:
|
|
241
|
+
| TableHandlesProsemirrorPlugin<
|
|
242
|
+
BSchema extends BlockSchemaWithBlock<
|
|
243
|
+
"table",
|
|
244
|
+
DefaultBlockSchema["table"]
|
|
245
|
+
>
|
|
246
|
+
? BSchema
|
|
247
|
+
: any,
|
|
248
|
+
ISchema,
|
|
249
|
+
SSchema
|
|
250
|
+
>
|
|
251
|
+
| undefined;
|
|
163
252
|
|
|
164
253
|
public readonly uploadFile: ((file: File) => Promise<string>) | undefined;
|
|
165
254
|
|
|
166
|
-
|
|
167
|
-
|
|
255
|
+
public static create<
|
|
256
|
+
BSpecs extends BlockSpecs = typeof defaultBlockSpecs,
|
|
257
|
+
ISpecs extends InlineContentSpecs = typeof defaultInlineContentSpecs,
|
|
258
|
+
SSpecs extends StyleSpecs = typeof defaultStyleSpecs
|
|
259
|
+
>(options: Partial<BlockNoteEditorOptions<BSpecs, ISpecs, SSpecs>> = {}) {
|
|
260
|
+
return new BlockNoteEditor(options) as BlockNoteEditor<
|
|
261
|
+
BlockSchemaFromSpecs<BSpecs>,
|
|
262
|
+
InlineContentSchemaFromSpecs<ISpecs>,
|
|
263
|
+
StyleSchemaFromSpecs<SSpecs>
|
|
264
|
+
>;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private constructor(
|
|
268
|
+
private readonly options: Partial<BlockNoteEditorOptions<any, any, any>>
|
|
168
269
|
) {
|
|
169
270
|
// apply defaults
|
|
170
|
-
const newOptions
|
|
171
|
-
defaultStyles: boolean;
|
|
172
|
-
blockSchema: BSchema;
|
|
173
|
-
} = {
|
|
271
|
+
const newOptions = {
|
|
174
272
|
defaultStyles: true,
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
// to be a huge pain, hence the `as any` casts.
|
|
180
|
-
blockSchema: options.blockSchema || (defaultBlockSchema as any),
|
|
273
|
+
blockSpecs: options.blockSpecs || defaultBlockSpecs,
|
|
274
|
+
styleSpecs: options.styleSpecs || defaultStyleSpecs,
|
|
275
|
+
inlineContentSpecs:
|
|
276
|
+
options.inlineContentSpecs || defaultInlineContentSpecs,
|
|
181
277
|
...options,
|
|
182
278
|
};
|
|
183
279
|
|
|
280
|
+
this.blockSchema = getBlockSchemaFromSpecs(newOptions.blockSpecs);
|
|
281
|
+
this.inlineContentSchema = getInlineContentSchemaFromSpecs(
|
|
282
|
+
newOptions.inlineContentSpecs
|
|
283
|
+
);
|
|
284
|
+
this.styleSchema = getStyleSchemaFromSpecs(newOptions.styleSpecs);
|
|
285
|
+
this.blockImplementations = newOptions.blockSpecs;
|
|
286
|
+
this.inlineContentImplementations = newOptions.inlineContentSpecs;
|
|
287
|
+
this.styleImplementations = newOptions.styleSpecs;
|
|
288
|
+
|
|
184
289
|
this.sideMenu = new SideMenuProsemirrorPlugin(this);
|
|
185
290
|
this.formattingToolbar = new FormattingToolbarProsemirrorPlugin(this);
|
|
186
291
|
this.slashMenu = new SlashMenuProsemirrorPlugin(
|
|
187
292
|
this,
|
|
188
293
|
newOptions.slashMenuItems ||
|
|
189
|
-
getDefaultSlashMenuItems(
|
|
294
|
+
(getDefaultSlashMenuItems(this.blockSchema) as any)
|
|
190
295
|
);
|
|
191
296
|
this.hyperlinkToolbar = new HyperlinkToolbarProsemirrorPlugin(this);
|
|
192
297
|
this.imageToolbar = new ImageToolbarProsemirrorPlugin(this);
|
|
193
298
|
|
|
194
|
-
|
|
299
|
+
if (this.blockSchema.table === defaultBlockSchema.table) {
|
|
300
|
+
this.tableHandles = new TableHandlesProsemirrorPlugin(this as any);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const extensions = getBlockNoteExtensions({
|
|
195
304
|
editor: this,
|
|
196
305
|
domAttributes: newOptions.domAttributes || {},
|
|
197
|
-
blockSchema:
|
|
306
|
+
blockSchema: this.blockSchema,
|
|
307
|
+
blockSpecs: newOptions.blockSpecs,
|
|
308
|
+
styleSpecs: newOptions.styleSpecs,
|
|
309
|
+
inlineContentSpecs: newOptions.inlineContentSpecs,
|
|
198
310
|
collaboration: newOptions.collaboration,
|
|
199
311
|
});
|
|
200
312
|
|
|
@@ -208,15 +320,20 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
208
320
|
this.slashMenu.plugin,
|
|
209
321
|
this.hyperlinkToolbar.plugin,
|
|
210
322
|
this.imageToolbar.plugin,
|
|
323
|
+
...(this.tableHandles ? [this.tableHandles.plugin] : []),
|
|
211
324
|
];
|
|
212
325
|
},
|
|
213
326
|
});
|
|
214
327
|
extensions.push(blockNoteUIExtension);
|
|
215
328
|
|
|
216
|
-
this.schema = newOptions.blockSchema;
|
|
217
|
-
|
|
218
329
|
this.uploadFile = newOptions.uploadFile;
|
|
219
330
|
|
|
331
|
+
if (newOptions.collaboration && newOptions.initialContent) {
|
|
332
|
+
console.warn(
|
|
333
|
+
"When using Collaboration, initialContent might cause conflicts, because changes should come from the collaboration provider"
|
|
334
|
+
);
|
|
335
|
+
}
|
|
336
|
+
|
|
220
337
|
const initialContent =
|
|
221
338
|
newOptions.initialContent ||
|
|
222
339
|
(options.collaboration
|
|
@@ -227,41 +344,64 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
227
344
|
id: UniqueID.options.generateID(),
|
|
228
345
|
},
|
|
229
346
|
]);
|
|
347
|
+
const styleSchema = this.styleSchema;
|
|
230
348
|
|
|
231
|
-
const tiptapOptions: EditorOptions = {
|
|
349
|
+
const tiptapOptions: Partial<EditorOptions> = {
|
|
232
350
|
...blockNoteTipTapOptions,
|
|
233
351
|
...newOptions._tiptapOptions,
|
|
234
352
|
onBeforeCreate(editor) {
|
|
235
|
-
|
|
236
|
-
// when using collaboration
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
|
|
353
|
+
newOptions._tiptapOptions?.onBeforeCreate?.(editor);
|
|
240
354
|
// We always set the initial content to a single paragraph block. This
|
|
241
355
|
// allows us to easily replace it with the actual initial content once
|
|
242
356
|
// the TipTap editor is initialized.
|
|
243
357
|
const schema = editor.editor.schema;
|
|
358
|
+
|
|
359
|
+
// This is a hack to make "initial content detection" by y-prosemirror (and also tiptap isEmpty)
|
|
360
|
+
// properly detect whether or not the document has changed.
|
|
361
|
+
// We change the doc.createAndFill function to make sure the initial block id is set, instead of null
|
|
362
|
+
let cache: any;
|
|
363
|
+
const oldCreateAndFill = schema.nodes.doc.createAndFill;
|
|
364
|
+
(schema.nodes.doc as any).createAndFill = (...args: any) => {
|
|
365
|
+
if (cache) {
|
|
366
|
+
return cache;
|
|
367
|
+
}
|
|
368
|
+
const ret = oldCreateAndFill.apply(schema.nodes.doc, args);
|
|
369
|
+
|
|
370
|
+
// create a copy that we can mutate (otherwise, assigning attrs is not safe and corrupts the pm state)
|
|
371
|
+
const jsonNode = JSON.parse(JSON.stringify(ret!.toJSON()));
|
|
372
|
+
jsonNode.content[0].content[0].attrs.id = "initialBlockId";
|
|
373
|
+
|
|
374
|
+
cache = Node.fromJSON(schema, jsonNode);
|
|
375
|
+
return ret;
|
|
376
|
+
};
|
|
377
|
+
|
|
244
378
|
const root = schema.node(
|
|
245
379
|
"doc",
|
|
246
380
|
undefined,
|
|
247
381
|
schema.node("blockGroup", undefined, [
|
|
248
|
-
blockToNode(
|
|
382
|
+
blockToNode(
|
|
383
|
+
{ id: "initialBlockId", type: "paragraph" },
|
|
384
|
+
schema,
|
|
385
|
+
styleSchema
|
|
386
|
+
),
|
|
249
387
|
])
|
|
250
388
|
);
|
|
251
389
|
editor.editor.options.content = root.toJSON();
|
|
252
390
|
},
|
|
253
|
-
onCreate: () => {
|
|
391
|
+
onCreate: (editor) => {
|
|
392
|
+
newOptions._tiptapOptions?.onCreate?.(editor);
|
|
254
393
|
// We need to wait for the TipTap editor to init before we can set the
|
|
255
394
|
// initial content, as the schema may contain custom blocks which need
|
|
256
395
|
// it to render.
|
|
257
396
|
if (initialContent !== undefined) {
|
|
258
|
-
this.replaceBlocks(this.topLevelBlocks, initialContent);
|
|
397
|
+
this.replaceBlocks(this.topLevelBlocks, initialContent as any);
|
|
259
398
|
}
|
|
260
399
|
|
|
261
400
|
newOptions.onEditorReady?.(this);
|
|
262
401
|
this.ready = true;
|
|
263
402
|
},
|
|
264
|
-
onUpdate: () => {
|
|
403
|
+
onUpdate: (editor) => {
|
|
404
|
+
newOptions._tiptapOptions?.onUpdate?.(editor);
|
|
265
405
|
// This seems to be necessary due to a bug in TipTap:
|
|
266
406
|
// https://github.com/ueberdosis/tiptap/issues/2583
|
|
267
407
|
if (!this.ready) {
|
|
@@ -270,7 +410,8 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
270
410
|
|
|
271
411
|
newOptions.onEditorContentChange?.(this);
|
|
272
412
|
},
|
|
273
|
-
onSelectionUpdate: () => {
|
|
413
|
+
onSelectionUpdate: (editor) => {
|
|
414
|
+
newOptions._tiptapOptions?.onSelectionUpdate?.(editor);
|
|
274
415
|
// This seems to be necessary due to a bug in TipTap:
|
|
275
416
|
// https://github.com/ueberdosis/tiptap/issues/2583
|
|
276
417
|
if (!this.ready) {
|
|
@@ -279,21 +420,29 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
279
420
|
|
|
280
421
|
newOptions.onTextCursorPositionChange?.(this);
|
|
281
422
|
},
|
|
282
|
-
editable:
|
|
423
|
+
editable:
|
|
424
|
+
options.editable !== undefined
|
|
425
|
+
? options.editable
|
|
426
|
+
: newOptions._tiptapOptions?.editable !== undefined
|
|
427
|
+
? newOptions._tiptapOptions?.editable
|
|
428
|
+
: true,
|
|
283
429
|
extensions:
|
|
284
430
|
newOptions.enableBlockNoteExtensions === false
|
|
285
|
-
? newOptions._tiptapOptions?.extensions
|
|
431
|
+
? newOptions._tiptapOptions?.extensions || []
|
|
286
432
|
: [...(newOptions._tiptapOptions?.extensions || []), ...extensions],
|
|
287
433
|
editorProps: {
|
|
434
|
+
...newOptions._tiptapOptions?.editorProps,
|
|
288
435
|
attributes: {
|
|
436
|
+
...newOptions._tiptapOptions?.editorProps?.attributes,
|
|
289
437
|
...newOptions.domAttributes?.editor,
|
|
290
438
|
class: mergeCSSClasses(
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
newOptions.defaultStyles ? styles
|
|
439
|
+
"bn-root",
|
|
440
|
+
"bn-editor",
|
|
441
|
+
newOptions.defaultStyles ? "bn-default-styles" : "",
|
|
294
442
|
newOptions.domAttributes?.editor?.class || ""
|
|
295
443
|
),
|
|
296
444
|
},
|
|
445
|
+
transformPasted,
|
|
297
446
|
},
|
|
298
447
|
};
|
|
299
448
|
|
|
@@ -326,11 +475,19 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
326
475
|
* Gets a snapshot of all top-level (non-nested) blocks in the editor.
|
|
327
476
|
* @returns A snapshot of all top-level (non-nested) blocks in the editor.
|
|
328
477
|
*/
|
|
329
|
-
public get topLevelBlocks(): Block<BSchema>[] {
|
|
330
|
-
const blocks: Block<BSchema>[] = [];
|
|
478
|
+
public get topLevelBlocks(): Block<BSchema, ISchema, SSchema>[] {
|
|
479
|
+
const blocks: Block<BSchema, ISchema, SSchema>[] = [];
|
|
331
480
|
|
|
332
481
|
this._tiptapEditor.state.doc.firstChild!.descendants((node) => {
|
|
333
|
-
blocks.push(
|
|
482
|
+
blocks.push(
|
|
483
|
+
nodeToBlock(
|
|
484
|
+
node,
|
|
485
|
+
this.blockSchema,
|
|
486
|
+
this.inlineContentSchema,
|
|
487
|
+
this.styleSchema,
|
|
488
|
+
this.blockCache
|
|
489
|
+
)
|
|
490
|
+
);
|
|
334
491
|
|
|
335
492
|
return false;
|
|
336
493
|
});
|
|
@@ -345,12 +502,12 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
345
502
|
*/
|
|
346
503
|
public getBlock(
|
|
347
504
|
blockIdentifier: BlockIdentifier
|
|
348
|
-
): Block<BSchema> | undefined {
|
|
505
|
+
): Block<BSchema, ISchema, SSchema> | undefined {
|
|
349
506
|
const id =
|
|
350
507
|
typeof blockIdentifier === "string"
|
|
351
508
|
? blockIdentifier
|
|
352
509
|
: blockIdentifier.id;
|
|
353
|
-
let newBlock: Block<BSchema> | undefined = undefined;
|
|
510
|
+
let newBlock: Block<BSchema, ISchema, SSchema> | undefined = undefined;
|
|
354
511
|
|
|
355
512
|
this._tiptapEditor.state.doc.firstChild!.descendants((node) => {
|
|
356
513
|
if (typeof newBlock !== "undefined") {
|
|
@@ -361,7 +518,13 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
361
518
|
return true;
|
|
362
519
|
}
|
|
363
520
|
|
|
364
|
-
newBlock = nodeToBlock(
|
|
521
|
+
newBlock = nodeToBlock(
|
|
522
|
+
node,
|
|
523
|
+
this.blockSchema,
|
|
524
|
+
this.inlineContentSchema,
|
|
525
|
+
this.styleSchema,
|
|
526
|
+
this.blockCache
|
|
527
|
+
);
|
|
365
528
|
|
|
366
529
|
return false;
|
|
367
530
|
});
|
|
@@ -375,7 +538,7 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
375
538
|
* @param reverse Whether the blocks should be traversed in reverse order.
|
|
376
539
|
*/
|
|
377
540
|
public forEachBlock(
|
|
378
|
-
callback: (block: Block<BSchema>) => boolean,
|
|
541
|
+
callback: (block: Block<BSchema, ISchema, SSchema>) => boolean,
|
|
379
542
|
reverse = false
|
|
380
543
|
): void {
|
|
381
544
|
const blocks = this.topLevelBlocks.slice();
|
|
@@ -384,7 +547,9 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
384
547
|
blocks.reverse();
|
|
385
548
|
}
|
|
386
549
|
|
|
387
|
-
function traverseBlockArray(
|
|
550
|
+
function traverseBlockArray(
|
|
551
|
+
blockArray: Block<BSchema, ISchema, SSchema>[]
|
|
552
|
+
): boolean {
|
|
388
553
|
for (const block of blockArray) {
|
|
389
554
|
if (!callback(block)) {
|
|
390
555
|
return false;
|
|
@@ -425,7 +590,11 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
425
590
|
* Gets a snapshot of the current text cursor position.
|
|
426
591
|
* @returns A snapshot of the current text cursor position.
|
|
427
592
|
*/
|
|
428
|
-
public getTextCursorPosition(): TextCursorPosition<
|
|
593
|
+
public getTextCursorPosition(): TextCursorPosition<
|
|
594
|
+
BSchema,
|
|
595
|
+
ISchema,
|
|
596
|
+
SSchema
|
|
597
|
+
> {
|
|
429
598
|
const { node, depth, startPos, endPos } = getBlockInfoFromPos(
|
|
430
599
|
this._tiptapEditor.state.doc,
|
|
431
600
|
this._tiptapEditor.state.selection.from
|
|
@@ -453,15 +622,33 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
453
622
|
}
|
|
454
623
|
|
|
455
624
|
return {
|
|
456
|
-
block: nodeToBlock(
|
|
625
|
+
block: nodeToBlock(
|
|
626
|
+
node,
|
|
627
|
+
this.blockSchema,
|
|
628
|
+
this.inlineContentSchema,
|
|
629
|
+
this.styleSchema,
|
|
630
|
+
this.blockCache
|
|
631
|
+
),
|
|
457
632
|
prevBlock:
|
|
458
633
|
prevNode === undefined
|
|
459
634
|
? undefined
|
|
460
|
-
: nodeToBlock(
|
|
635
|
+
: nodeToBlock(
|
|
636
|
+
prevNode,
|
|
637
|
+
this.blockSchema,
|
|
638
|
+
this.inlineContentSchema,
|
|
639
|
+
this.styleSchema,
|
|
640
|
+
this.blockCache
|
|
641
|
+
),
|
|
461
642
|
nextBlock:
|
|
462
643
|
nextNode === undefined
|
|
463
644
|
? undefined
|
|
464
|
-
: nodeToBlock(
|
|
645
|
+
: nodeToBlock(
|
|
646
|
+
nextNode,
|
|
647
|
+
this.blockSchema,
|
|
648
|
+
this.inlineContentSchema,
|
|
649
|
+
this.styleSchema,
|
|
650
|
+
this.blockCache
|
|
651
|
+
),
|
|
465
652
|
};
|
|
466
653
|
}
|
|
467
654
|
|
|
@@ -483,25 +670,42 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
483
670
|
posBeforeNode + 2
|
|
484
671
|
)!;
|
|
485
672
|
|
|
486
|
-
|
|
487
|
-
|
|
673
|
+
const contentType: "none" | "inline" | "table" =
|
|
674
|
+
this.blockSchema[contentNode.type.name]!.content;
|
|
675
|
+
|
|
676
|
+
if (contentType === "none") {
|
|
488
677
|
this._tiptapEditor.commands.setNodeSelection(startPos);
|
|
489
678
|
return;
|
|
490
679
|
}
|
|
491
680
|
|
|
492
|
-
if (
|
|
493
|
-
|
|
681
|
+
if (contentType === "inline") {
|
|
682
|
+
if (placement === "start") {
|
|
683
|
+
this._tiptapEditor.commands.setTextSelection(startPos + 1);
|
|
684
|
+
} else {
|
|
685
|
+
this._tiptapEditor.commands.setTextSelection(
|
|
686
|
+
startPos + contentNode.nodeSize - 1
|
|
687
|
+
);
|
|
688
|
+
}
|
|
689
|
+
} else if (contentType === "table") {
|
|
690
|
+
if (placement === "start") {
|
|
691
|
+
// Need to offset the position as we have to get through the `tableRow`
|
|
692
|
+
// and `tableCell` nodes to get to the `tableParagraph` node we want to
|
|
693
|
+
// set the selection in.
|
|
694
|
+
this._tiptapEditor.commands.setTextSelection(startPos + 4);
|
|
695
|
+
} else {
|
|
696
|
+
this._tiptapEditor.commands.setTextSelection(
|
|
697
|
+
startPos + contentNode.nodeSize - 4
|
|
698
|
+
);
|
|
699
|
+
}
|
|
494
700
|
} else {
|
|
495
|
-
|
|
496
|
-
startPos + contentNode.nodeSize - 1
|
|
497
|
-
);
|
|
701
|
+
throw new UnreachableCaseError(contentType);
|
|
498
702
|
}
|
|
499
703
|
}
|
|
500
704
|
|
|
501
705
|
/**
|
|
502
706
|
* Gets a snapshot of the current selection.
|
|
503
707
|
*/
|
|
504
|
-
public getSelection(): Selection<BSchema> | undefined {
|
|
708
|
+
public getSelection(): Selection<BSchema, ISchema, SSchema> | undefined {
|
|
505
709
|
// Either the TipTap selection is empty, or it's a node selection. In either
|
|
506
710
|
// case, it only spans one block, so we return undefined.
|
|
507
711
|
if (
|
|
@@ -512,8 +716,10 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
512
716
|
return undefined;
|
|
513
717
|
}
|
|
514
718
|
|
|
515
|
-
const blocks: Block<BSchema>[] = [];
|
|
719
|
+
const blocks: Block<BSchema, ISchema, SSchema>[] = [];
|
|
516
720
|
|
|
721
|
+
// TODO: This adds all child blocks to the same array. Needs to find min
|
|
722
|
+
// depth and only add blocks at that depth.
|
|
517
723
|
this._tiptapEditor.state.doc.descendants((node, pos) => {
|
|
518
724
|
if (node.type.spec.group !== "blockContent") {
|
|
519
725
|
return true;
|
|
@@ -529,7 +735,9 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
529
735
|
blocks.push(
|
|
530
736
|
nodeToBlock(
|
|
531
737
|
this._tiptapEditor.state.doc.resolve(pos).node(),
|
|
532
|
-
this.
|
|
738
|
+
this.blockSchema,
|
|
739
|
+
this.inlineContentSchema,
|
|
740
|
+
this.styleSchema,
|
|
533
741
|
this.blockCache
|
|
534
742
|
)
|
|
535
743
|
);
|
|
@@ -565,11 +773,11 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
565
773
|
* `referenceBlock`. Inserts the blocks at the start of the existing block's children if "nested" is used.
|
|
566
774
|
*/
|
|
567
775
|
public insertBlocks(
|
|
568
|
-
blocksToInsert: PartialBlock<BSchema>[],
|
|
776
|
+
blocksToInsert: PartialBlock<BSchema, ISchema, SSchema>[],
|
|
569
777
|
referenceBlock: BlockIdentifier,
|
|
570
778
|
placement: "before" | "after" | "nested" = "before"
|
|
571
779
|
): void {
|
|
572
|
-
insertBlocks(blocksToInsert, referenceBlock, placement, this
|
|
780
|
+
insertBlocks(blocksToInsert, referenceBlock, placement, this);
|
|
573
781
|
}
|
|
574
782
|
|
|
575
783
|
/**
|
|
@@ -581,7 +789,7 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
581
789
|
*/
|
|
582
790
|
public updateBlock(
|
|
583
791
|
blockToUpdate: BlockIdentifier,
|
|
584
|
-
update: PartialBlock<BSchema>
|
|
792
|
+
update: PartialBlock<BSchema, ISchema, SSchema>
|
|
585
793
|
) {
|
|
586
794
|
updateBlock(blockToUpdate, update, this._tiptapEditor);
|
|
587
795
|
}
|
|
@@ -603,32 +811,28 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
603
811
|
*/
|
|
604
812
|
public replaceBlocks(
|
|
605
813
|
blocksToRemove: BlockIdentifier[],
|
|
606
|
-
blocksToInsert: PartialBlock<BSchema>[]
|
|
814
|
+
blocksToInsert: PartialBlock<BSchema, ISchema, SSchema>[]
|
|
607
815
|
) {
|
|
608
|
-
replaceBlocks(blocksToRemove, blocksToInsert, this
|
|
816
|
+
replaceBlocks(blocksToRemove, blocksToInsert, this);
|
|
609
817
|
}
|
|
610
818
|
|
|
611
819
|
/**
|
|
612
820
|
* Gets the active text styles at the text cursor position or at the end of the current selection if it's active.
|
|
613
821
|
*/
|
|
614
822
|
public getActiveStyles() {
|
|
615
|
-
const styles: Styles = {};
|
|
823
|
+
const styles: Styles<SSchema> = {};
|
|
616
824
|
const marks = this._tiptapEditor.state.selection.$to.marks();
|
|
617
825
|
|
|
618
|
-
const toggleStyles = new Set<ToggledStyle>([
|
|
619
|
-
"bold",
|
|
620
|
-
"italic",
|
|
621
|
-
"underline",
|
|
622
|
-
"strike",
|
|
623
|
-
"code",
|
|
624
|
-
]);
|
|
625
|
-
const colorStyles = new Set<ColorStyle>(["textColor", "backgroundColor"]);
|
|
626
|
-
|
|
627
826
|
for (const mark of marks) {
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
827
|
+
const config = this.styleSchema[mark.type.name];
|
|
828
|
+
if (!config) {
|
|
829
|
+
console.warn("mark not found in styleschema", mark.type.name);
|
|
830
|
+
continue;
|
|
831
|
+
}
|
|
832
|
+
if (config.propSchema === "boolean") {
|
|
833
|
+
(styles as any)[config.type] = true;
|
|
834
|
+
} else {
|
|
835
|
+
(styles as any)[config.type] = mark.attrs.stringValue;
|
|
632
836
|
}
|
|
633
837
|
}
|
|
634
838
|
|
|
@@ -639,23 +843,20 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
639
843
|
* Adds styles to the currently selected content.
|
|
640
844
|
* @param styles The styles to add.
|
|
641
845
|
*/
|
|
642
|
-
public addStyles(styles: Styles) {
|
|
643
|
-
const toggleStyles = new Set<ToggledStyle>([
|
|
644
|
-
"bold",
|
|
645
|
-
"italic",
|
|
646
|
-
"underline",
|
|
647
|
-
"strike",
|
|
648
|
-
"code",
|
|
649
|
-
]);
|
|
650
|
-
const colorStyles = new Set<ColorStyle>(["textColor", "backgroundColor"]);
|
|
651
|
-
|
|
846
|
+
public addStyles(styles: Styles<SSchema>) {
|
|
652
847
|
this._tiptapEditor.view.focus();
|
|
653
848
|
|
|
654
849
|
for (const [style, value] of Object.entries(styles)) {
|
|
655
|
-
|
|
850
|
+
const config = this.styleSchema[style];
|
|
851
|
+
if (!config) {
|
|
852
|
+
throw new Error(`style ${style} not found in styleSchema`);
|
|
853
|
+
}
|
|
854
|
+
if (config.propSchema === "boolean") {
|
|
656
855
|
this._tiptapEditor.commands.setMark(style);
|
|
657
|
-
} else if (
|
|
658
|
-
this._tiptapEditor.commands.setMark(style, {
|
|
856
|
+
} else if (config.propSchema === "string") {
|
|
857
|
+
this._tiptapEditor.commands.setMark(style, { stringValue: value });
|
|
858
|
+
} else {
|
|
859
|
+
throw new UnreachableCaseError(config.propSchema);
|
|
659
860
|
}
|
|
660
861
|
}
|
|
661
862
|
}
|
|
@@ -664,7 +865,7 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
664
865
|
* Removes styles from the currently selected content.
|
|
665
866
|
* @param styles The styles to remove.
|
|
666
867
|
*/
|
|
667
|
-
public removeStyles(styles: Styles) {
|
|
868
|
+
public removeStyles(styles: Styles<SSchema>) {
|
|
668
869
|
this._tiptapEditor.view.focus();
|
|
669
870
|
|
|
670
871
|
for (const style of Object.keys(styles)) {
|
|
@@ -676,23 +877,20 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
676
877
|
* Toggles styles on the currently selected content.
|
|
677
878
|
* @param styles The styles to toggle.
|
|
678
879
|
*/
|
|
679
|
-
public toggleStyles(styles: Styles) {
|
|
680
|
-
const toggleStyles = new Set<ToggledStyle>([
|
|
681
|
-
"bold",
|
|
682
|
-
"italic",
|
|
683
|
-
"underline",
|
|
684
|
-
"strike",
|
|
685
|
-
"code",
|
|
686
|
-
]);
|
|
687
|
-
const colorStyles = new Set<ColorStyle>(["textColor", "backgroundColor"]);
|
|
688
|
-
|
|
880
|
+
public toggleStyles(styles: Styles<SSchema>) {
|
|
689
881
|
this._tiptapEditor.view.focus();
|
|
690
882
|
|
|
691
883
|
for (const [style, value] of Object.entries(styles)) {
|
|
692
|
-
|
|
884
|
+
const config = this.styleSchema[style];
|
|
885
|
+
if (!config) {
|
|
886
|
+
throw new Error(`style ${style} not found in styleSchema`);
|
|
887
|
+
}
|
|
888
|
+
if (config.propSchema === "boolean") {
|
|
693
889
|
this._tiptapEditor.commands.toggleMark(style);
|
|
694
|
-
} else if (
|
|
695
|
-
this._tiptapEditor.commands.toggleMark(style, {
|
|
890
|
+
} else if (config.propSchema === "string") {
|
|
891
|
+
this._tiptapEditor.commands.toggleMark(style, { stringValue: value });
|
|
892
|
+
} else {
|
|
893
|
+
throw new UnreachableCaseError(config.propSchema);
|
|
696
894
|
}
|
|
697
895
|
}
|
|
698
896
|
}
|
|
@@ -777,14 +975,21 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
777
975
|
this._tiptapEditor.commands.liftListItem("blockContainer");
|
|
778
976
|
}
|
|
779
977
|
|
|
978
|
+
// TODO: Fix when implementing HTML/Markdown import & export
|
|
780
979
|
/**
|
|
781
980
|
* Serializes blocks into an HTML string. To better conform to HTML standards, children of blocks which aren't list
|
|
782
981
|
* items are un-nested in the output HTML.
|
|
783
982
|
* @param blocks An array of blocks that should be serialized into HTML.
|
|
784
983
|
* @returns The blocks, serialized as an HTML string.
|
|
785
984
|
*/
|
|
786
|
-
public async
|
|
787
|
-
|
|
985
|
+
public async blocksToHTMLLossy(
|
|
986
|
+
blocks = this.topLevelBlocks
|
|
987
|
+
): Promise<string> {
|
|
988
|
+
const exporter = createExternalHTMLExporter(
|
|
989
|
+
this._tiptapEditor.schema,
|
|
990
|
+
this
|
|
991
|
+
);
|
|
992
|
+
return exporter.exportBlocks(blocks);
|
|
788
993
|
}
|
|
789
994
|
|
|
790
995
|
/**
|
|
@@ -794,8 +999,16 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
794
999
|
* @param html The HTML string to parse blocks from.
|
|
795
1000
|
* @returns The blocks parsed from the HTML string.
|
|
796
1001
|
*/
|
|
797
|
-
public async
|
|
798
|
-
|
|
1002
|
+
public async tryParseHTMLToBlocks(
|
|
1003
|
+
html: string
|
|
1004
|
+
): Promise<Block<BSchema, ISchema, SSchema>[]> {
|
|
1005
|
+
return HTMLToBlocks(
|
|
1006
|
+
html,
|
|
1007
|
+
this.blockSchema,
|
|
1008
|
+
this.inlineContentSchema,
|
|
1009
|
+
this.styleSchema,
|
|
1010
|
+
this._tiptapEditor.schema
|
|
1011
|
+
);
|
|
799
1012
|
}
|
|
800
1013
|
|
|
801
1014
|
/**
|
|
@@ -804,8 +1017,10 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
804
1017
|
* @param blocks An array of blocks that should be serialized into Markdown.
|
|
805
1018
|
* @returns The blocks, serialized as a Markdown string.
|
|
806
1019
|
*/
|
|
807
|
-
public async
|
|
808
|
-
|
|
1020
|
+
public async blocksToMarkdownLossy(
|
|
1021
|
+
blocks: Block<BSchema, ISchema, SSchema>[] = this.topLevelBlocks
|
|
1022
|
+
): Promise<string> {
|
|
1023
|
+
return blocksToMarkdown(blocks, this._tiptapEditor.schema, this);
|
|
809
1024
|
}
|
|
810
1025
|
|
|
811
1026
|
/**
|
|
@@ -815,8 +1030,16 @@ export class BlockNoteEditor<BSchema extends BlockSchema = DefaultBlockSchema> {
|
|
|
815
1030
|
* @param markdown The Markdown string to parse blocks from.
|
|
816
1031
|
* @returns The blocks parsed from the Markdown string.
|
|
817
1032
|
*/
|
|
818
|
-
public async
|
|
819
|
-
|
|
1033
|
+
public async tryParseMarkdownToBlocks(
|
|
1034
|
+
markdown: string
|
|
1035
|
+
): Promise<Block<BSchema, ISchema, SSchema>[]> {
|
|
1036
|
+
return markdownToBlocks(
|
|
1037
|
+
markdown,
|
|
1038
|
+
this.blockSchema,
|
|
1039
|
+
this.inlineContentSchema,
|
|
1040
|
+
this.styleSchema,
|
|
1041
|
+
this._tiptapEditor.schema
|
|
1042
|
+
);
|
|
820
1043
|
}
|
|
821
1044
|
|
|
822
1045
|
/**
|