@tiptap/core 3.0.0-next.3 → 3.0.0-next.5
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/LICENSE.md +21 -0
- package/README.md +5 -1
- package/dist/index.cjs +2627 -2651
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2423 -2688
- package/dist/index.d.ts +2423 -2688
- package/dist/index.js +2639 -2684
- package/dist/index.js.map +1 -1
- package/dist/jsx-runtime/jsx-runtime.cjs +56 -0
- package/dist/jsx-runtime/jsx-runtime.cjs.map +1 -0
- package/dist/jsx-runtime/jsx-runtime.d.cts +22 -0
- package/dist/jsx-runtime/jsx-runtime.d.ts +22 -0
- package/dist/jsx-runtime/jsx-runtime.js +26 -0
- package/dist/jsx-runtime/jsx-runtime.js.map +1 -0
- package/jsx-runtime/index.cjs +1 -0
- package/jsx-runtime/index.d.cts +1 -0
- package/jsx-runtime/index.d.ts +1 -0
- package/jsx-runtime/index.js +1 -0
- package/package.json +27 -6
- package/src/CommandManager.ts +2 -9
- package/src/Editor.ts +191 -94
- package/src/EventEmitter.ts +7 -10
- package/src/Extendable.ts +483 -0
- package/src/Extension.ts +5 -496
- package/src/ExtensionManager.ts +81 -135
- package/src/InputRule.ts +35 -48
- package/src/Mark.ts +135 -623
- package/src/MarkView.ts +66 -0
- package/src/Node.ts +325 -829
- package/src/NodePos.ts +1 -3
- package/src/NodeView.ts +10 -20
- package/src/PasteRule.ts +43 -55
- package/src/Tracker.ts +7 -9
- package/src/commands/blur.ts +14 -12
- package/src/commands/clearContent.ts +12 -5
- package/src/commands/clearNodes.ts +32 -30
- package/src/commands/command.ts +1 -1
- package/src/commands/createParagraphNear.ts +5 -3
- package/src/commands/cut.ts +12 -10
- package/src/commands/deleteCurrentNode.ts +23 -21
- package/src/commands/deleteNode.ts +18 -16
- package/src/commands/deleteRange.ts +10 -8
- package/src/commands/deleteSelection.ts +5 -3
- package/src/commands/enter.ts +6 -4
- package/src/commands/exitCode.ts +5 -3
- package/src/commands/extendMarkRange.ts +14 -12
- package/src/commands/first.ts +2 -4
- package/src/commands/focus.ts +51 -48
- package/src/commands/forEach.ts +2 -2
- package/src/commands/insertContent.ts +12 -14
- package/src/commands/insertContentAt.ts +105 -98
- package/src/commands/join.ts +20 -12
- package/src/commands/joinItemBackward.ts +16 -18
- package/src/commands/joinItemForward.ts +16 -18
- package/src/commands/joinTextblockBackward.ts +5 -3
- package/src/commands/joinTextblockForward.ts +5 -3
- package/src/commands/keyboardShortcut.ts +29 -34
- package/src/commands/lift.ts +10 -8
- package/src/commands/liftEmptyBlock.ts +6 -4
- package/src/commands/liftListItem.ts +6 -4
- package/src/commands/newlineInCode.ts +5 -3
- package/src/commands/resetAttributes.ts +36 -41
- package/src/commands/scrollIntoView.ts +9 -7
- package/src/commands/selectAll.ts +10 -8
- package/src/commands/selectNodeBackward.ts +5 -3
- package/src/commands/selectNodeForward.ts +5 -3
- package/src/commands/selectParentNode.ts +5 -3
- package/src/commands/selectTextblockEnd.ts +5 -3
- package/src/commands/selectTextblockStart.ts +5 -3
- package/src/commands/setContent.ts +37 -36
- package/src/commands/setMark.ts +55 -57
- package/src/commands/setMeta.ts +7 -5
- package/src/commands/setNode.ts +32 -30
- package/src/commands/setNodeSelection.ts +11 -9
- package/src/commands/setTextSelection.ts +15 -13
- package/src/commands/sinkListItem.ts +6 -4
- package/src/commands/splitBlock.ts +67 -76
- package/src/commands/splitListItem.ts +93 -106
- package/src/commands/toggleList.ts +73 -71
- package/src/commands/toggleMark.ts +11 -9
- package/src/commands/toggleNode.ts +18 -16
- package/src/commands/toggleWrap.ts +10 -8
- package/src/commands/undoInputRule.ts +31 -29
- package/src/commands/unsetAllMarks.ts +16 -14
- package/src/commands/unsetMark.ts +27 -25
- package/src/commands/updateAttributes.ts +92 -100
- package/src/commands/wrapIn.ts +6 -4
- package/src/commands/wrapInList.ts +6 -4
- package/src/extensions/clipboardTextSerializer.ts +2 -4
- package/src/extensions/delete.ts +89 -0
- package/src/extensions/focusEvents.ts +2 -6
- package/src/extensions/index.ts +1 -0
- package/src/extensions/keymap.ts +58 -50
- package/src/extensions/paste.ts +0 -1
- package/src/extensions/tabindex.ts +1 -1
- package/src/helpers/combineTransactionSteps.ts +1 -4
- package/src/helpers/createChainableState.ts +1 -4
- package/src/helpers/createDocument.ts +1 -3
- package/src/helpers/createNodeFromContent.ts +4 -10
- package/src/helpers/findChildrenInRange.ts +1 -5
- package/src/helpers/findParentNode.ts +3 -1
- package/src/helpers/flattenExtensions.ts +30 -0
- package/src/helpers/getAttributes.ts +1 -4
- package/src/helpers/getAttributesFromExtensions.ts +28 -37
- package/src/helpers/getChangedRanges.ts +13 -11
- package/src/helpers/getExtensionField.ts +11 -11
- package/src/helpers/getMarkAttributes.ts +1 -4
- package/src/helpers/getMarkRange.ts +5 -15
- package/src/helpers/getMarkType.ts +1 -3
- package/src/helpers/getNodeAttributes.ts +1 -4
- package/src/helpers/getNodeType.ts +1 -3
- package/src/helpers/getRenderedAttributes.ts +1 -3
- package/src/helpers/getSchema.ts +2 -2
- package/src/helpers/getSchemaByResolvedExtensions.ts +45 -77
- package/src/helpers/getSplittedAttributes.ts +4 -4
- package/src/helpers/getTextContentFromNodes.ts +8 -11
- package/src/helpers/index.ts +4 -0
- package/src/helpers/injectExtensionAttributesToParseRule.ts +1 -1
- package/src/helpers/isActive.ts +1 -5
- package/src/helpers/isExtensionRulesEnabled.ts +1 -3
- package/src/helpers/isNodeEmpty.ts +2 -2
- package/src/helpers/resolveExtensions.ts +25 -0
- package/src/helpers/resolveFocusPosition.ts +3 -14
- package/src/helpers/rewriteUnknownContent.ts +149 -0
- package/src/helpers/sortExtensions.ts +26 -0
- package/src/index.ts +3 -7
- package/src/inputRules/markInputRule.ts +1 -5
- package/src/inputRules/nodeInputRule.ts +2 -9
- package/src/inputRules/textInputRule.ts +1 -4
- package/src/inputRules/textblockTypeInputRule.ts +2 -8
- package/src/inputRules/wrappingInputRule.ts +13 -19
- package/src/jsx-runtime.ts +64 -0
- package/src/pasteRules/markPasteRule.ts +1 -3
- package/src/pasteRules/nodePasteRule.ts +2 -8
- package/src/pasteRules/textPasteRule.ts +1 -4
- package/src/types.ts +529 -174
- package/src/utilities/createStyleTag.ts +3 -1
- package/src/utilities/deleteProps.ts +7 -11
- package/src/utilities/elementFromString.ts +3 -0
- package/src/utilities/findDuplicates.ts +4 -1
- package/src/utilities/index.ts +1 -0
- package/src/utilities/isFunction.ts +1 -0
- package/src/utilities/isMacOS.ts +1 -3
- package/src/utilities/isiOS.ts +5 -10
- package/src/utilities/mergeAttributes.ts +17 -7
- package/src/utilities/removeDuplicates.ts +1 -3
|
@@ -64,42 +64,37 @@ declare module '@tiptap/core' {
|
|
|
64
64
|
* @param name The name of the keyboard shortcut.
|
|
65
65
|
* @example editor.commands.keyboardShortcut('Mod-b')
|
|
66
66
|
*/
|
|
67
|
-
keyboardShortcut: (name: string) => ReturnType
|
|
67
|
+
keyboardShortcut: (name: string) => ReturnType
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
export const keyboardShortcut: RawCommands['keyboardShortcut'] =
|
|
73
|
-
|
|
74
|
-
view,
|
|
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
|
-
if (newStep && dispatch) {
|
|
100
|
-
tr.maybeStep(newStep)
|
|
101
|
-
}
|
|
102
|
-
})
|
|
72
|
+
export const keyboardShortcut: RawCommands['keyboardShortcut'] =
|
|
73
|
+
name =>
|
|
74
|
+
({ editor, view, tr, dispatch }) => {
|
|
75
|
+
const keys = normalizeKeyName(name).split(/-(?!$)/)
|
|
76
|
+
const key = keys.find(item => !['Alt', 'Ctrl', 'Meta', 'Shift'].includes(item))
|
|
77
|
+
const event = new KeyboardEvent('keydown', {
|
|
78
|
+
key: key === 'Space' ? ' ' : key,
|
|
79
|
+
altKey: keys.includes('Alt'),
|
|
80
|
+
ctrlKey: keys.includes('Ctrl'),
|
|
81
|
+
metaKey: keys.includes('Meta'),
|
|
82
|
+
shiftKey: keys.includes('Shift'),
|
|
83
|
+
bubbles: true,
|
|
84
|
+
cancelable: true,
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
const capturedTransaction = editor.captureTransaction(() => {
|
|
88
|
+
view.someProp('handleKeyDown', f => f(view, event))
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
capturedTransaction?.steps.forEach(step => {
|
|
92
|
+
const newStep = step.map(tr.mapping)
|
|
93
|
+
|
|
94
|
+
if (newStep && dispatch) {
|
|
95
|
+
tr.maybeStep(newStep)
|
|
96
|
+
}
|
|
97
|
+
})
|
|
103
98
|
|
|
104
|
-
|
|
105
|
-
}
|
|
99
|
+
return true
|
|
100
|
+
}
|
package/src/commands/lift.ts
CHANGED
|
@@ -20,13 +20,15 @@ declare module '@tiptap/core' {
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
export const lift: RawCommands['lift'] =
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
export const lift: RawCommands['lift'] =
|
|
24
|
+
(typeOrName, attributes = {}) =>
|
|
25
|
+
({ state, dispatch }) => {
|
|
26
|
+
const type = getNodeType(typeOrName, state.schema)
|
|
27
|
+
const isActive = isNodeActive(state, type, attributes)
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
if (!isActive) {
|
|
30
|
+
return false
|
|
31
|
+
}
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
+
return originalLift(state, dispatch)
|
|
34
|
+
}
|
|
@@ -9,11 +9,13 @@ declare module '@tiptap/core' {
|
|
|
9
9
|
* If the cursor is in an empty textblock that can be lifted, lift the block.
|
|
10
10
|
* @example editor.commands.liftEmptyBlock()
|
|
11
11
|
*/
|
|
12
|
-
liftEmptyBlock: () => ReturnType
|
|
12
|
+
liftEmptyBlock: () => ReturnType
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export const liftEmptyBlock: RawCommands['liftEmptyBlock'] =
|
|
18
|
-
|
|
19
|
-
}
|
|
17
|
+
export const liftEmptyBlock: RawCommands['liftEmptyBlock'] =
|
|
18
|
+
() =>
|
|
19
|
+
({ state, dispatch }) => {
|
|
20
|
+
return originalLiftEmptyBlock(state, dispatch)
|
|
21
|
+
}
|
|
@@ -17,8 +17,10 @@ declare module '@tiptap/core' {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export const liftListItem: RawCommands['liftListItem'] =
|
|
21
|
-
|
|
20
|
+
export const liftListItem: RawCommands['liftListItem'] =
|
|
21
|
+
typeOrName =>
|
|
22
|
+
({ state, dispatch }) => {
|
|
23
|
+
const type = getNodeType(typeOrName, state.schema)
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
+
return originalLiftListItem(type)(state, dispatch)
|
|
26
|
+
}
|
|
@@ -14,6 +14,8 @@ declare module '@tiptap/core' {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export const newlineInCode: RawCommands['newlineInCode'] =
|
|
18
|
-
|
|
19
|
-
}
|
|
17
|
+
export const newlineInCode: RawCommands['newlineInCode'] =
|
|
18
|
+
() =>
|
|
19
|
+
({ state, dispatch }) => {
|
|
20
|
+
return originalNewlineInCode(state, dispatch)
|
|
21
|
+
}
|
|
@@ -15,56 +15,51 @@ declare module '@tiptap/core' {
|
|
|
15
15
|
* @param attributes The attributes of the node to reset.
|
|
16
16
|
* @example editor.commands.resetAttributes('heading', 'level')
|
|
17
17
|
*/
|
|
18
|
-
resetAttributes: (
|
|
19
|
-
typeOrName: string | NodeType | MarkType,
|
|
20
|
-
attributes: string | string[],
|
|
21
|
-
) => ReturnType
|
|
18
|
+
resetAttributes: (typeOrName: string | NodeType | MarkType, attributes: string | string[]) => ReturnType
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
22
|
|
|
26
|
-
export const resetAttributes: RawCommands['resetAttributes'] =
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
export const resetAttributes: RawCommands['resetAttributes'] =
|
|
24
|
+
(typeOrName, attributes) =>
|
|
25
|
+
({ tr, state, dispatch }) => {
|
|
26
|
+
let nodeType: NodeType | null = null
|
|
27
|
+
let markType: MarkType | null = null
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
const schemaType = getSchemaTypeNameByName(
|
|
30
|
+
typeof typeOrName === 'string' ? typeOrName : typeOrName.name,
|
|
31
|
+
state.schema,
|
|
32
|
+
)
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
if (!schemaType) {
|
|
35
|
+
return false
|
|
36
|
+
}
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
if (schemaType === 'node') {
|
|
39
|
+
nodeType = getNodeType(typeOrName as NodeType, state.schema)
|
|
40
|
+
}
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
if (schemaType === 'mark') {
|
|
43
|
+
markType = getMarkType(typeOrName as MarkType, state.schema)
|
|
44
|
+
}
|
|
46
45
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
46
|
+
if (dispatch) {
|
|
47
|
+
tr.selection.ranges.forEach(range => {
|
|
48
|
+
state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {
|
|
49
|
+
if (nodeType && nodeType === node.type) {
|
|
50
|
+
tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attributes))
|
|
51
|
+
}
|
|
53
52
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
})
|
|
64
|
-
}
|
|
53
|
+
if (markType && node.marks.length) {
|
|
54
|
+
node.marks.forEach(mark => {
|
|
55
|
+
if (markType === mark.type) {
|
|
56
|
+
tr.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attributes)))
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
})
|
|
65
61
|
})
|
|
66
|
-
}
|
|
67
|
-
}
|
|
62
|
+
}
|
|
68
63
|
|
|
69
|
-
|
|
70
|
-
}
|
|
64
|
+
return true
|
|
65
|
+
}
|
|
@@ -7,15 +7,17 @@ declare module '@tiptap/core' {
|
|
|
7
7
|
* Scroll the selection into view.
|
|
8
8
|
* @example editor.commands.scrollIntoView()
|
|
9
9
|
*/
|
|
10
|
-
scrollIntoView: () => ReturnType
|
|
10
|
+
scrollIntoView: () => ReturnType
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export const scrollIntoView: RawCommands['scrollIntoView'] =
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
export const scrollIntoView: RawCommands['scrollIntoView'] =
|
|
16
|
+
() =>
|
|
17
|
+
({ tr, dispatch }) => {
|
|
18
|
+
if (dispatch) {
|
|
19
|
+
tr.scrollIntoView()
|
|
20
|
+
}
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
+
return true
|
|
23
|
+
}
|
|
@@ -9,17 +9,19 @@ declare module '@tiptap/core' {
|
|
|
9
9
|
* Select the whole document.
|
|
10
10
|
* @example editor.commands.selectAll()
|
|
11
11
|
*/
|
|
12
|
-
selectAll: () => ReturnType
|
|
12
|
+
selectAll: () => ReturnType
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export const selectAll: RawCommands['selectAll'] =
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
export const selectAll: RawCommands['selectAll'] =
|
|
18
|
+
() =>
|
|
19
|
+
({ tr, dispatch }) => {
|
|
20
|
+
if (dispatch) {
|
|
21
|
+
const selection = new AllSelection(tr.doc)
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
tr.setSelection(selection)
|
|
24
|
+
}
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
+
return true
|
|
27
|
+
}
|
|
@@ -14,6 +14,8 @@ declare module '@tiptap/core' {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export const selectNodeBackward: RawCommands['selectNodeBackward'] =
|
|
18
|
-
|
|
19
|
-
}
|
|
17
|
+
export const selectNodeBackward: RawCommands['selectNodeBackward'] =
|
|
18
|
+
() =>
|
|
19
|
+
({ state, dispatch }) => {
|
|
20
|
+
return originalSelectNodeBackward(state, dispatch)
|
|
21
|
+
}
|
|
@@ -14,6 +14,8 @@ declare module '@tiptap/core' {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export const selectNodeForward: RawCommands['selectNodeForward'] =
|
|
18
|
-
|
|
19
|
-
}
|
|
17
|
+
export const selectNodeForward: RawCommands['selectNodeForward'] =
|
|
18
|
+
() =>
|
|
19
|
+
({ state, dispatch }) => {
|
|
20
|
+
return originalSelectNodeForward(state, dispatch)
|
|
21
|
+
}
|
|
@@ -14,6 +14,8 @@ declare module '@tiptap/core' {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export const selectParentNode: RawCommands['selectParentNode'] =
|
|
18
|
-
|
|
19
|
-
}
|
|
17
|
+
export const selectParentNode: RawCommands['selectParentNode'] =
|
|
18
|
+
() =>
|
|
19
|
+
({ state, dispatch }) => {
|
|
20
|
+
return originalSelectParentNode(state, dispatch)
|
|
21
|
+
}
|
|
@@ -16,6 +16,8 @@ declare module '@tiptap/core' {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export const selectTextblockEnd: RawCommands['selectTextblockEnd'] =
|
|
20
|
-
|
|
21
|
-
}
|
|
19
|
+
export const selectTextblockEnd: RawCommands['selectTextblockEnd'] =
|
|
20
|
+
() =>
|
|
21
|
+
({ state, dispatch }) => {
|
|
22
|
+
return originalSelectTextblockEnd(state, dispatch)
|
|
23
|
+
}
|
|
@@ -16,6 +16,8 @@ declare module '@tiptap/core' {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export const selectTextblockStart: RawCommands['selectTextblockStart'] =
|
|
20
|
-
|
|
21
|
-
}
|
|
19
|
+
export const selectTextblockStart: RawCommands['selectTextblockStart'] =
|
|
20
|
+
() =>
|
|
21
|
+
({ state, dispatch }) => {
|
|
22
|
+
return originalSelectTextblockStart(state, dispatch)
|
|
23
|
+
}
|
|
@@ -19,55 +19,56 @@ declare module '@tiptap/core' {
|
|
|
19
19
|
*/
|
|
20
20
|
content: Content | Fragment | ProseMirrorNode,
|
|
21
21
|
|
|
22
|
-
/**
|
|
23
|
-
* Whether to emit an update event.
|
|
24
|
-
* @default false
|
|
25
|
-
*/
|
|
26
|
-
emitUpdate?: boolean,
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Options for parsing the content.
|
|
30
|
-
* @default {}
|
|
31
|
-
*/
|
|
32
|
-
parseOptions?: ParseOptions,
|
|
33
22
|
/**
|
|
34
23
|
* Options for `setContent`.
|
|
35
24
|
*/
|
|
36
25
|
options?: {
|
|
26
|
+
/**
|
|
27
|
+
* Options for parsing the content.
|
|
28
|
+
* @default {}
|
|
29
|
+
*/
|
|
30
|
+
parseOptions?: ParseOptions
|
|
31
|
+
|
|
37
32
|
/**
|
|
38
33
|
* Whether to throw an error if the content is invalid.
|
|
39
34
|
*/
|
|
40
|
-
errorOnInvalidContent?: boolean
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
35
|
+
errorOnInvalidContent?: boolean
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Whether to emit an update event.
|
|
39
|
+
* @default true
|
|
40
|
+
*/
|
|
41
|
+
emitUpdate?: boolean
|
|
42
|
+
},
|
|
43
|
+
) => ReturnType
|
|
44
|
+
}
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
47
|
|
|
47
|
-
export const setContent: RawCommands['setContent'] =
|
|
48
|
-
|
|
49
|
-
}) => {
|
|
50
|
-
|
|
48
|
+
export const setContent: RawCommands['setContent'] =
|
|
49
|
+
(content, { errorOnInvalidContent, emitUpdate = true, parseOptions = {} } = {}) =>
|
|
50
|
+
({ editor, tr, dispatch, commands }) => {
|
|
51
|
+
const { doc } = tr
|
|
51
52
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
// This is to keep backward compatibility with the previous behavior
|
|
54
|
+
// TODO remove this in the next major version
|
|
55
|
+
if (parseOptions.preserveWhitespace !== 'full') {
|
|
56
|
+
const document = createDocument(content, editor.schema, parseOptions, {
|
|
57
|
+
errorOnInvalidContent: errorOnInvalidContent ?? editor.options.enableContentCheck,
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
if (dispatch) {
|
|
61
|
+
tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate)
|
|
62
|
+
}
|
|
63
|
+
return true
|
|
64
|
+
}
|
|
58
65
|
|
|
59
66
|
if (dispatch) {
|
|
60
|
-
tr.
|
|
67
|
+
tr.setMeta('preventUpdate', !emitUpdate)
|
|
61
68
|
}
|
|
62
|
-
return true
|
|
63
|
-
}
|
|
64
69
|
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
return commands.insertContentAt({ from: 0, to: doc.content.size }, content, {
|
|
71
|
+
parseOptions,
|
|
72
|
+
errorOnInvalidContent: errorOnInvalidContent ?? editor.options.enableContentCheck,
|
|
73
|
+
})
|
|
67
74
|
}
|
|
68
|
-
|
|
69
|
-
return commands.insertContentAt({ from: 0, to: doc.content.size }, content, {
|
|
70
|
-
parseOptions,
|
|
71
|
-
errorOnInvalidContent: options.errorOnInvalidContent ?? editor.options.enableContentCheck,
|
|
72
|
-
})
|
|
73
|
-
}
|
package/src/commands/setMark.ts
CHANGED
|
@@ -31,18 +31,14 @@ function canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType)
|
|
|
31
31
|
const currentMarks = state.storedMarks ?? cursor.marks()
|
|
32
32
|
|
|
33
33
|
// There can be no current marks that exclude the new mark
|
|
34
|
-
return (
|
|
35
|
-
!!newMarkType.isInSet(currentMarks)
|
|
36
|
-
|| !currentMarks.some(mark => mark.type.excludes(newMarkType))
|
|
37
|
-
)
|
|
34
|
+
return !!newMarkType.isInSet(currentMarks) || !currentMarks.some(mark => mark.type.excludes(newMarkType))
|
|
38
35
|
}
|
|
39
36
|
|
|
40
37
|
const { ranges } = selection
|
|
41
38
|
|
|
42
39
|
return ranges.some(({ $from, $to }) => {
|
|
43
|
-
let someNodeSupportsMark =
|
|
44
|
-
? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType)
|
|
45
|
-
: false
|
|
40
|
+
let someNodeSupportsMark =
|
|
41
|
+
$from.depth === 0 ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType) : false
|
|
46
42
|
|
|
47
43
|
state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {
|
|
48
44
|
// If we already found a mark that we can enable, return false to bypass the remaining search
|
|
@@ -52,8 +48,8 @@ function canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType)
|
|
|
52
48
|
|
|
53
49
|
if (node.isInline) {
|
|
54
50
|
const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType)
|
|
55
|
-
const currentMarksAllowMarkType =
|
|
56
|
-
|| !node.marks.some(otherMark => otherMark.type.excludes(newMarkType))
|
|
51
|
+
const currentMarksAllowMarkType =
|
|
52
|
+
!!newMarkType.isInSet(node.marks) || !node.marks.some(otherMark => otherMark.type.excludes(newMarkType))
|
|
57
53
|
|
|
58
54
|
someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType
|
|
59
55
|
}
|
|
@@ -63,54 +59,56 @@ function canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType)
|
|
|
63
59
|
return someNodeSupportsMark
|
|
64
60
|
})
|
|
65
61
|
}
|
|
66
|
-
export const setMark: RawCommands['setMark'] =
|
|
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
|
-
|
|
62
|
+
export const setMark: RawCommands['setMark'] =
|
|
63
|
+
(typeOrName, attributes = {}) =>
|
|
64
|
+
({ tr, state, dispatch }) => {
|
|
65
|
+
const { selection } = tr
|
|
66
|
+
const { empty, ranges } = selection
|
|
67
|
+
const type = getMarkType(typeOrName, state.schema)
|
|
68
|
+
|
|
69
|
+
if (dispatch) {
|
|
70
|
+
if (empty) {
|
|
71
|
+
const oldAttributes = getMarkAttributes(state, type)
|
|
72
|
+
|
|
73
|
+
tr.addStoredMark(
|
|
74
|
+
type.create({
|
|
75
|
+
...oldAttributes,
|
|
76
|
+
...attributes,
|
|
77
|
+
}),
|
|
78
|
+
)
|
|
79
|
+
} else {
|
|
80
|
+
ranges.forEach(range => {
|
|
81
|
+
const from = range.$from.pos
|
|
82
|
+
const to = range.$to.pos
|
|
83
|
+
|
|
84
|
+
state.doc.nodesBetween(from, to, (node, pos) => {
|
|
85
|
+
const trimmedFrom = Math.max(pos, from)
|
|
86
|
+
const trimmedTo = Math.min(pos + node.nodeSize, to)
|
|
87
|
+
const someHasMark = node.marks.find(mark => mark.type === type)
|
|
88
|
+
|
|
89
|
+
// if there is already a mark of this type
|
|
90
|
+
// we know that we have to merge its attributes
|
|
91
|
+
// otherwise we add a fresh new mark
|
|
92
|
+
if (someHasMark) {
|
|
93
|
+
node.marks.forEach(mark => {
|
|
94
|
+
if (type === mark.type) {
|
|
95
|
+
tr.addMark(
|
|
96
|
+
trimmedFrom,
|
|
97
|
+
trimmedTo,
|
|
98
|
+
type.create({
|
|
99
|
+
...mark.attrs,
|
|
100
|
+
...attributes,
|
|
101
|
+
}),
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
} else {
|
|
106
|
+
tr.addMark(trimmedFrom, trimmedTo, type.create(attributes))
|
|
107
|
+
}
|
|
108
|
+
})
|
|
110
109
|
})
|
|
111
|
-
}
|
|
110
|
+
}
|
|
112
111
|
}
|
|
113
|
-
}
|
|
114
112
|
|
|
115
|
-
|
|
116
|
-
}
|
|
113
|
+
return canSetMark(state, tr, type)
|
|
114
|
+
}
|
package/src/commands/setMeta.ts
CHANGED
|
@@ -11,13 +11,15 @@ declare module '@tiptap/core' {
|
|
|
11
11
|
* @param value The value to store.
|
|
12
12
|
* @example editor.commands.setMeta('foo', 'bar')
|
|
13
13
|
*/
|
|
14
|
-
setMeta: (key: string | Plugin | PluginKey, value: any) => ReturnType
|
|
14
|
+
setMeta: (key: string | Plugin | PluginKey, value: any) => ReturnType
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export const setMeta: RawCommands['setMeta'] =
|
|
20
|
-
|
|
19
|
+
export const setMeta: RawCommands['setMeta'] =
|
|
20
|
+
(key, value) =>
|
|
21
|
+
({ tr }) => {
|
|
22
|
+
tr.setMeta(key, value)
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
+
return true
|
|
25
|
+
}
|