forked from TypeCellOS/BlockNote
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBlockNoteExtensions.ts
More file actions
133 lines (119 loc) · 4.48 KB
/
BlockNoteExtensions.ts
File metadata and controls
133 lines (119 loc) · 4.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import { Extensions, extensions } from "@tiptap/core";
import Bold from "@tiptap/extension-bold";
import Code from "@tiptap/extension-code";
import DropCursor from "@tiptap/extension-dropcursor";
import GapCursor from "@tiptap/extension-gapcursor";
import HardBreak from "@tiptap/extension-hard-break";
import { History } from "@tiptap/extension-history";
import Italic from "@tiptap/extension-italic";
import { Link } from "@tiptap/extension-link";
import Strike from "@tiptap/extension-strike";
import Text from "@tiptap/extension-text";
import Underline from "@tiptap/extension-underline";
import { BackgroundColorExtension } from "./extensions/BackgroundColor/BackgroundColorExtension";
import { BackgroundColorMark } from "./extensions/BackgroundColor/BackgroundColorMark";
import { blocks } from "./extensions/Blocks";
import blockStyles from "./extensions/Blocks/nodes/Block.module.css";
import { BlockSideMenuFactory } from "./extensions/DraggableBlocks/BlockSideMenuFactoryTypes";
import { DraggableBlocksExtension } from "./extensions/DraggableBlocks/DraggableBlocksExtension";
import { FormattingToolbarExtension } from "./extensions/FormattingToolbar/FormattingToolbarExtension";
import { FormattingToolbarFactory } from "./extensions/FormattingToolbar/FormattingToolbarFactoryTypes";
import HyperlinkMark from "./extensions/HyperlinkToolbar/HyperlinkMark";
import { HyperlinkToolbarFactory } from "./extensions/HyperlinkToolbar/HyperlinkToolbarFactoryTypes";
import { Placeholder } from "./extensions/Placeholder/PlaceholderExtension";
import { SlashCommand, SlashMenuExtension } from "./extensions/SlashMenu";
import { SlashMenuItem } from "./extensions/SlashMenu/SlashMenuItem";
import { TextAlignmentExtension } from "./extensions/TextAlignment/TextAlignmentExtension";
import { TextColorExtension } from "./extensions/TextColor/TextColorExtension";
import { TextColorMark } from "./extensions/TextColor/TextColorMark";
import { TrailingNode } from "./extensions/TrailingNode/TrailingNodeExtension";
import UniqueID from "./extensions/UniqueID/UniqueID";
import { SuggestionsMenuFactory } from "./shared/plugins/suggestion/SuggestionsMenuFactoryTypes";
export type UiFactories = Partial<{
formattingToolbarFactory: FormattingToolbarFactory;
hyperlinkToolbarFactory: HyperlinkToolbarFactory;
slashMenuFactory: SuggestionsMenuFactory<SlashMenuItem>;
blockSideMenuFactory: BlockSideMenuFactory;
}>;
/**
* Get all the Tiptap extensions BlockNote is configured with by default
*/
export const getBlockNoteExtensions = (opts: {
uiFactories: UiFactories;
slashCommands: SlashCommand[];
}) => {
const ret: Extensions = [
extensions.ClipboardTextSerializer,
extensions.Commands,
extensions.Editable,
extensions.FocusEvents,
extensions.Tabindex,
// DevTools,
GapCursor,
// DropCursor,
Placeholder.configure({
emptyNodeClass: blockStyles.isEmpty,
hasAnchorClass: blockStyles.hasAnchor,
isFilterClass: blockStyles.isFilter,
includeChildren: true,
showOnlyCurrent: false,
}),
UniqueID.configure({
types: ["blockContainer"],
}),
HardBreak,
// Comments,
// basics:
Text,
// marks:
Bold,
Code,
Italic,
Strike,
Underline,
TextColorMark,
TextColorExtension,
BackgroundColorMark,
BackgroundColorExtension,
TextAlignmentExtension,
// custom blocks:
...blocks,
DropCursor.configure({ width: 5, color: "#ddeeff" }),
History,
// This needs to be at the bottom of this list, because Key events (such as enter, when selecting a /command),
// should be handled before Enter handlers in other components like splitListItem
TrailingNode,
];
if (opts.uiFactories.blockSideMenuFactory) {
ret.push(
DraggableBlocksExtension.configure({
blockSideMenuFactory: opts.uiFactories.blockSideMenuFactory,
})
);
}
if (opts.uiFactories.formattingToolbarFactory) {
ret.push(
FormattingToolbarExtension.configure({
formattingToolbarFactory: opts.uiFactories.formattingToolbarFactory,
})
);
}
if (opts.uiFactories.hyperlinkToolbarFactory) {
ret.push(
HyperlinkMark.configure({
hyperlinkToolbarFactory: opts.uiFactories.hyperlinkToolbarFactory,
})
);
} else {
ret.push(Link);
}
if (opts.uiFactories.slashMenuFactory) {
ret.push(
SlashMenuExtension.configure({
commands: opts.slashCommands,
slashMenuFactory: opts.uiFactories.slashMenuFactory,
})
);
}
return ret;
};