@tiptap/core 3.0.0-next.3 → 3.0.0-next.4
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 +2402 -2540
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1355 -1273
- package/dist/index.d.ts +1355 -1273
- package/dist/index.js +2408 -2562
- package/dist/index.js.map +1 -1
- package/package.json +9 -5
- package/src/CommandManager.ts +2 -9
- package/src/Editor.ts +87 -72
- package/src/EventEmitter.ts +7 -10
- package/src/Extension.ts +8 -14
- package/src/ExtensionManager.ts +26 -125
- package/src/InputRule.ts +35 -48
- package/src/Mark.ts +9 -9
- package/src/Node.ts +9 -9
- 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 +6 -4
- 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 +45 -48
- package/src/commands/forEach.ts +2 -2
- package/src/commands/insertContent.ts +12 -14
- package/src/commands/insertContentAt.ts +101 -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 +25 -25
- 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/focusEvents.ts +2 -6
- package/src/extensions/keymap.ts +54 -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 +1 -4
- 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/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/pasteRules/markPasteRule.ts +1 -3
- package/src/pasteRules/nodePasteRule.ts +2 -8
- package/src/pasteRules/textPasteRule.ts +1 -4
- package/src/types.ts +212 -172
- package/src/utilities/createStyleTag.ts +3 -1
- package/src/utilities/deleteProps.ts +7 -11
- package/src/utilities/findDuplicates.ts +4 -1
- 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 +16 -6
- package/src/utilities/removeDuplicates.ts +1 -3
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
|
+
}
|
package/src/commands/setNode.ts
CHANGED
|
@@ -18,38 +18,40 @@ declare module '@tiptap/core' {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export const setNode: RawCommands['setNode'] =
|
|
22
|
-
|
|
21
|
+
export const setNode: RawCommands['setNode'] =
|
|
22
|
+
(typeOrName, attributes = {}) =>
|
|
23
|
+
({ state, dispatch, chain }) => {
|
|
24
|
+
const type = getNodeType(typeOrName, state.schema)
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
let attributesToCopy: Record<string, any> | undefined
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
if (state.selection.$anchor.sameParent(state.selection.$head)) {
|
|
29
|
+
// only copy attributes if the selection is pointing to a node of the same type
|
|
30
|
+
attributesToCopy = state.selection.$anchor.parent.attrs
|
|
31
|
+
}
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
// TODO: use a fallback like insertContent?
|
|
34
|
+
if (!type.isTextblock) {
|
|
35
|
+
console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.')
|
|
34
36
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
return false
|
|
38
|
+
}
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
40
|
+
return (
|
|
41
|
+
chain()
|
|
42
|
+
// try to convert node to default node if needed
|
|
43
|
+
.command(({ commands }) => {
|
|
44
|
+
const canSetBlock = setBlockType(type, { ...attributesToCopy, ...attributes })(state)
|
|
45
|
+
|
|
46
|
+
if (canSetBlock) {
|
|
47
|
+
return true
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return commands.clearNodes()
|
|
51
|
+
})
|
|
52
|
+
.command(({ state: updatedState }) => {
|
|
53
|
+
return setBlockType(type, { ...attributesToCopy, ...attributes })(updatedState, dispatch)
|
|
54
|
+
})
|
|
55
|
+
.run()
|
|
56
|
+
)
|
|
57
|
+
}
|
|
@@ -16,14 +16,16 @@ declare module '@tiptap/core' {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export const setNodeSelection: RawCommands['setNodeSelection'] =
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
export const setNodeSelection: RawCommands['setNodeSelection'] =
|
|
20
|
+
position =>
|
|
21
|
+
({ tr, dispatch }) => {
|
|
22
|
+
if (dispatch) {
|
|
23
|
+
const { doc } = tr
|
|
24
|
+
const from = minMax(position, 0, doc.content.size)
|
|
25
|
+
const selection = NodeSelection.create(doc, from)
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
tr.setSelection(selection)
|
|
28
|
+
}
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
+
return true
|
|
31
|
+
}
|
|
@@ -16,18 +16,20 @@ declare module '@tiptap/core' {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export const setTextSelection: RawCommands['setTextSelection'] =
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
export const setTextSelection: RawCommands['setTextSelection'] =
|
|
20
|
+
position =>
|
|
21
|
+
({ tr, dispatch }) => {
|
|
22
|
+
if (dispatch) {
|
|
23
|
+
const { doc } = tr
|
|
24
|
+
const { from, to } = typeof position === 'number' ? { from: position, to: position } : position
|
|
25
|
+
const minPos = TextSelection.atStart(doc).from
|
|
26
|
+
const maxPos = TextSelection.atEnd(doc).to
|
|
27
|
+
const resolvedFrom = minMax(from, minPos, maxPos)
|
|
28
|
+
const resolvedEnd = minMax(to, minPos, maxPos)
|
|
29
|
+
const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd)
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
tr.setSelection(selection)
|
|
32
|
+
}
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
+
return true
|
|
35
|
+
}
|
|
@@ -17,8 +17,10 @@ declare module '@tiptap/core' {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export const sinkListItem: RawCommands['sinkListItem'] =
|
|
21
|
-
|
|
20
|
+
export const sinkListItem: RawCommands['sinkListItem'] =
|
|
21
|
+
typeOrName =>
|
|
22
|
+
({ state, dispatch }) => {
|
|
23
|
+
const type = getNodeType(typeOrName, state.schema)
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
+
return originalSinkListItem(type)(state, dispatch)
|
|
26
|
+
}
|
|
@@ -29,95 +29,86 @@ declare module '@tiptap/core' {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
export const splitBlock: RawCommands['splitBlock'] =
|
|
33
|
-
|
|
34
|
-
}) => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (selection instanceof NodeSelection && selection.node.isBlock) {
|
|
45
|
-
if (!$from.parentOffset || !canSplit(doc, $from.pos)) {
|
|
46
|
-
return false
|
|
47
|
-
}
|
|
32
|
+
export const splitBlock: RawCommands['splitBlock'] =
|
|
33
|
+
({ keepMarks = true } = {}) =>
|
|
34
|
+
({ tr, state, dispatch, editor }) => {
|
|
35
|
+
const { selection, doc } = tr
|
|
36
|
+
const { $from, $to } = selection
|
|
37
|
+
const extensionAttributes = editor.extensionManager.attributes
|
|
38
|
+
const newAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs)
|
|
39
|
+
|
|
40
|
+
if (selection instanceof NodeSelection && selection.node.isBlock) {
|
|
41
|
+
if (!$from.parentOffset || !canSplit(doc, $from.pos)) {
|
|
42
|
+
return false
|
|
43
|
+
}
|
|
48
44
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
45
|
+
if (dispatch) {
|
|
46
|
+
if (keepMarks) {
|
|
47
|
+
ensureMarks(state, editor.extensionManager.splittableMarks)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
tr.split($from.pos).scrollIntoView()
|
|
52
51
|
}
|
|
53
52
|
|
|
54
|
-
|
|
53
|
+
return true
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (!$from.parent.isBlock) {
|
|
61
|
-
return false
|
|
62
|
-
}
|
|
56
|
+
if (!$from.parent.isBlock) {
|
|
57
|
+
return false
|
|
58
|
+
}
|
|
63
59
|
|
|
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
|
-
attrs: newAttributes,
|
|
92
|
-
},
|
|
93
|
-
]
|
|
94
|
-
: undefined
|
|
95
|
-
}
|
|
60
|
+
const atEnd = $to.parentOffset === $to.parent.content.size
|
|
61
|
+
|
|
62
|
+
const deflt = $from.depth === 0 ? undefined : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)))
|
|
63
|
+
|
|
64
|
+
let types =
|
|
65
|
+
atEnd && deflt
|
|
66
|
+
? [
|
|
67
|
+
{
|
|
68
|
+
type: deflt,
|
|
69
|
+
attrs: newAttributes,
|
|
70
|
+
},
|
|
71
|
+
]
|
|
72
|
+
: undefined
|
|
73
|
+
|
|
74
|
+
let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types)
|
|
75
|
+
|
|
76
|
+
if (!types && !can && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)) {
|
|
77
|
+
can = true
|
|
78
|
+
types = deflt
|
|
79
|
+
? [
|
|
80
|
+
{
|
|
81
|
+
type: deflt,
|
|
82
|
+
attrs: newAttributes,
|
|
83
|
+
},
|
|
84
|
+
]
|
|
85
|
+
: undefined
|
|
86
|
+
}
|
|
96
87
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
88
|
+
if (dispatch) {
|
|
89
|
+
if (can) {
|
|
90
|
+
if (selection instanceof TextSelection) {
|
|
91
|
+
tr.deleteSelection()
|
|
92
|
+
}
|
|
102
93
|
|
|
103
|
-
|
|
94
|
+
tr.split(tr.mapping.map($from.pos), 1, types)
|
|
104
95
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
96
|
+
if (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) {
|
|
97
|
+
const first = tr.mapping.map($from.before())
|
|
98
|
+
const $first = tr.doc.resolve(first)
|
|
108
99
|
|
|
109
|
-
|
|
110
|
-
|
|
100
|
+
if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) {
|
|
101
|
+
tr.setNodeMarkup(tr.mapping.map($from.before()), deflt)
|
|
102
|
+
}
|
|
111
103
|
}
|
|
112
104
|
}
|
|
113
|
-
}
|
|
114
105
|
|
|
115
|
-
|
|
116
|
-
|
|
106
|
+
if (keepMarks) {
|
|
107
|
+
ensureMarks(state, editor.extensionManager.splittableMarks)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
tr.scrollIntoView()
|
|
117
111
|
}
|
|
118
112
|
|
|
119
|
-
|
|
113
|
+
return can
|
|
120
114
|
}
|
|
121
|
-
|
|
122
|
-
return can
|
|
123
|
-
}
|