Skip to content

Commit 844de93

Browse files
authored
feat: add factory function for extensions (#1390)
1 parent 61b934e commit 844de93

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

packages/core/src/editor/BlockNoteEditor.ts

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,6 @@ import {
99
import { Node, Schema } from "prosemirror-model";
1010
// import "./blocknote.css";
1111
import * as Y from "yjs";
12-
import {
13-
getBlock,
14-
getNextBlock,
15-
getParentBlock,
16-
getPrevBlock,
17-
} from "../api/blockManipulation/getBlock/getBlock.js";
1812
import { insertBlocks } from "../api/blockManipulation/commands/insertBlocks/insertBlocks.js";
1913
import {
2014
moveBlocksDown,
@@ -29,15 +23,21 @@ import {
2923
import { removeBlocks } from "../api/blockManipulation/commands/removeBlocks/removeBlocks.js";
3024
import { replaceBlocks } from "../api/blockManipulation/commands/replaceBlocks/replaceBlocks.js";
3125
import { updateBlock } from "../api/blockManipulation/commands/updateBlock/updateBlock.js";
32-
import { insertContentAt } from "../api/blockManipulation/insertContentAt.js";
3326
import {
34-
getTextCursorPosition,
35-
setTextCursorPosition,
36-
} from "../api/blockManipulation/selections/textCursorPosition/textCursorPosition.js";
27+
getBlock,
28+
getNextBlock,
29+
getParentBlock,
30+
getPrevBlock,
31+
} from "../api/blockManipulation/getBlock/getBlock.js";
32+
import { insertContentAt } from "../api/blockManipulation/insertContentAt.js";
3733
import {
3834
getSelection,
3935
setSelection,
4036
} from "../api/blockManipulation/selections/selection.js";
37+
import {
38+
getTextCursorPosition,
39+
setTextCursorPosition,
40+
} from "../api/blockManipulation/selections/textCursorPosition/textCursorPosition.js";
4141
import { createExternalHTMLExporter } from "../api/exporters/html/externalHTMLExporter.js";
4242
import { blocksToMarkdown } from "../api/exporters/markdown/markdownExporter.js";
4343
import { HTMLToBlocks } from "../api/parsers/html/parseHTML.js";
@@ -89,11 +89,15 @@ import { en } from "../i18n/locales/index.js";
8989

9090
import { Plugin, Transaction } from "@tiptap/pm/state";
9191
import { dropCursor } from "prosemirror-dropcursor";
92+
import { EditorView } from "prosemirror-view";
9293
import { createInternalHTMLSerializer } from "../api/exporters/html/internalHTMLSerializer.js";
9394
import { inlineContentToNodes } from "../api/nodeConversions/blockToNode.js";
9495
import { nodeToBlock } from "../api/nodeConversions/nodeToBlock.js";
9596
import "../style.css";
96-
import { EditorView } from "prosemirror-view";
97+
98+
export type BlockNoteExtensionFactory = (
99+
editor: BlockNoteEditor<any, any, any>
100+
) => BlockNoteExtension;
97101

98102
export type BlockNoteExtension =
99103
| AnyExtension
@@ -213,7 +217,7 @@ export type BlockNoteEditorOptions<
213217
/**
214218
* (experimental) add extra prosemirror plugins or tiptap extensions to the editor
215219
*/
216-
_extensions: Record<string, BlockNoteExtension>;
220+
_extensions: Record<string, BlockNoteExtension | BlockNoteExtensionFactory>;
217221

218222
trailingBlock?: boolean;
219223

@@ -449,6 +453,10 @@ export class BlockNoteEditor<
449453

450454
// add extensions from options
451455
Object.entries(newOptions._extensions || {}).forEach(([key, ext]) => {
456+
if (typeof ext === "function") {
457+
// factory
458+
ext = ext(this);
459+
}
452460
this.extensions[key] = ext;
453461
});
454462

0 commit comments

Comments
 (0)