@tiptap/core 2.0.0-beta.19 → 2.0.0-beta.193
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/README.md +2 -2
- package/package.json +16 -20
- package/src/CommandManager.ts +64 -65
- package/src/Editor.ts +116 -78
- package/src/EventEmitter.ts +14 -4
- package/src/Extension.ts +193 -43
- package/src/ExtensionManager.ts +242 -84
- package/src/InputRule.ts +265 -0
- package/src/Mark.ts +277 -48
- package/src/Node.ts +279 -57
- package/src/NodeView.ts +115 -47
- package/src/PasteRule.ts +247 -0
- package/src/Tracker.ts +42 -0
- package/src/commands/blur.ts +12 -6
- package/src/commands/clearContent.ts +3 -3
- package/src/commands/clearNodes.ts +30 -18
- package/src/commands/command.ts +2 -2
- package/src/commands/createParagraphNear.ts +4 -3
- package/src/commands/deleteNode.ts +37 -0
- package/src/commands/deleteRange.ts +3 -3
- package/src/commands/deleteSelection.ts +4 -3
- package/src/commands/enter.ts +3 -3
- package/src/commands/exitCode.ts +4 -3
- package/src/commands/extendMarkRange.ts +12 -11
- package/src/commands/first.ts +3 -3
- package/src/commands/focus.ts +47 -44
- package/src/commands/forEach.ts +24 -0
- package/src/commands/index.ts +50 -0
- package/src/commands/insertContent.ts +13 -24
- package/src/commands/insertContentAt.ts +108 -0
- package/src/commands/joinBackward.ts +4 -3
- package/src/commands/joinForward.ts +4 -3
- package/src/commands/keyboardShortcut.ts +6 -6
- package/src/commands/lift.ts +6 -5
- package/src/commands/liftEmptyBlock.ts +4 -3
- package/src/commands/liftListItem.ts +6 -5
- package/src/commands/newlineInCode.ts +4 -3
- package/src/commands/resetAttributes.ts +62 -0
- package/src/commands/scrollIntoView.ts +3 -3
- package/src/commands/selectAll.ts +8 -6
- package/src/commands/selectNodeBackward.ts +4 -3
- package/src/commands/selectNodeForward.ts +4 -3
- package/src/commands/selectParentNode.ts +4 -3
- package/src/commands/selectTextblockEnd.ts +20 -0
- package/src/commands/selectTextblockStart.ts +20 -0
- package/src/commands/setContent.ts +9 -15
- package/src/commands/setMark.ts +36 -12
- package/src/commands/setMeta.ts +18 -0
- package/src/commands/setNode.ts +29 -7
- package/src/commands/setNodeSelection.ts +27 -0
- package/src/commands/setTextSelection.ts +33 -0
- package/src/commands/sinkListItem.ts +6 -5
- package/src/commands/splitBlock.ts +14 -19
- package/src/commands/splitListItem.ts +45 -18
- package/src/commands/toggleList.ts +83 -18
- package/src/commands/toggleMark.ts +18 -7
- package/src/commands/toggleNode.ts +6 -5
- package/src/commands/toggleWrap.ts +9 -9
- package/src/commands/undoInputRule.ts +34 -5
- package/src/commands/unsetAllMarks.ts +7 -11
- package/src/commands/unsetMark.ts +35 -22
- package/src/commands/updateAttributes.ts +16 -9
- package/src/commands/wrapIn.ts +5 -10
- package/src/commands/wrapInList.ts +6 -5
- package/src/extensions/clipboardTextSerializer.ts +14 -35
- package/src/extensions/commands.ts +3 -144
- package/src/extensions/editable.ts +1 -0
- package/src/extensions/focusEvents.ts +3 -5
- package/src/extensions/index.ts +1 -0
- package/src/extensions/keymap.ts +110 -13
- package/src/extensions/tabindex.ts +18 -0
- package/src/helpers/combineTransactionSteps.ts +18 -0
- package/src/helpers/createChainableState.ts +38 -0
- package/src/helpers/createDocument.ts +5 -6
- package/src/helpers/createNodeFromContent.ts +17 -19
- package/src/helpers/defaultBlockAt.ts +13 -0
- package/src/helpers/findChildren.ts +18 -0
- package/src/helpers/findChildrenInRange.ts +32 -0
- package/src/helpers/findParentNode.ts +3 -2
- package/src/helpers/findParentNodeClosestToPos.ts +3 -2
- package/src/helpers/generateHTML.ts +6 -5
- package/src/helpers/generateJSON.ts +14 -0
- package/src/helpers/generateText.ts +30 -0
- package/src/helpers/getAttributes.ts +28 -0
- package/src/helpers/getAttributesFromExtensions.ts +42 -14
- package/src/helpers/getChangedRanges.ts +83 -0
- package/src/helpers/getDebugJSON.ts +54 -0
- package/src/helpers/getExtensionField.ts +25 -0
- package/src/helpers/getHTMLFromFragment.ts +6 -5
- package/src/helpers/getMarkAttributes.ts +14 -10
- package/src/helpers/getMarkRange.ts +41 -8
- package/src/helpers/getMarkType.ts +5 -1
- package/src/helpers/getMarksBetween.ts +32 -10
- package/src/helpers/getNodeAttributes.ts +9 -9
- package/src/helpers/getNodeType.ts +5 -1
- package/src/helpers/getRenderedAttributes.ts +6 -7
- package/src/helpers/getSchema.ts +7 -133
- package/src/helpers/getSchemaByResolvedExtensions.ts +148 -0
- package/src/helpers/getSchemaTypeByName.ts +2 -10
- package/src/helpers/getSchemaTypeNameByName.ts +1 -1
- package/src/helpers/getSplittedAttributes.ts +4 -4
- package/src/helpers/getText.ts +19 -0
- package/src/helpers/getTextBetween.ts +49 -0
- package/src/helpers/getTextContentFromNodes.ts +17 -0
- package/src/helpers/getTextSerializersFromSchema.ts +10 -0
- package/src/helpers/index.ts +33 -0
- package/src/helpers/injectExtensionAttributesToParseRule.ts +17 -19
- package/src/helpers/isActive.ts +5 -5
- package/src/helpers/isExtensionRulesEnabled.ts +15 -0
- package/src/helpers/isList.ts +14 -7
- package/src/helpers/isMarkActive.ts +45 -20
- package/src/helpers/isNodeActive.ts +28 -35
- package/src/helpers/isNodeEmpty.ts +1 -1
- package/src/helpers/isNodeSelection.ts +2 -3
- package/src/helpers/isTextSelection.ts +2 -3
- package/src/helpers/posToDOMRect.ts +35 -0
- package/src/helpers/resolveFocusPosition.ts +43 -0
- package/src/helpers/selectionToInsertionEnd.ts +2 -2
- package/src/helpers/splitExtensions.ts +3 -3
- package/src/index.ts +15 -24
- package/src/inputRules/index.ts +5 -0
- package/src/inputRules/markInputRule.ts +59 -39
- package/src/inputRules/nodeInputRule.ts +45 -11
- package/src/inputRules/textInputRule.ts +35 -0
- package/src/inputRules/textblockTypeInputRule.ts +38 -0
- package/src/inputRules/wrappingInputRule.ts +60 -0
- package/src/pasteRules/index.ts +3 -0
- package/src/pasteRules/markPasteRule.ts +62 -53
- package/src/pasteRules/nodePasteRule.ts +39 -0
- package/src/pasteRules/textPasteRule.ts +35 -0
- package/src/style.ts +16 -3
- package/src/types.ts +129 -43
- package/src/utilities/callOrReturn.ts +6 -3
- package/src/utilities/createStyleTag.ts +12 -1
- package/src/utilities/deleteProps.ts +2 -4
- package/src/utilities/elementFromString.ts +4 -5
- package/src/utilities/escapeForRegEx.ts +4 -0
- package/src/utilities/findDuplicates.ts +5 -0
- package/src/utilities/fromString.ts +2 -2
- package/src/utilities/index.ts +3 -0
- package/src/utilities/isEmptyObject.ts +2 -2
- package/src/utilities/isFunction.ts +3 -0
- package/src/utilities/isMacOS.ts +5 -0
- package/src/utilities/isNumber.ts +3 -0
- package/src/utilities/isPlainObject.ts +8 -5
- package/src/utilities/isRegExp.ts +3 -0
- package/src/utilities/isString.ts +3 -0
- package/src/utilities/isiOS.ts +12 -0
- package/src/utilities/mergeAttributes.ts +2 -3
- package/src/utilities/mergeDeep.ts +2 -3
- package/src/utilities/minMax.ts +1 -1
- package/src/utilities/objectIncludes.ts +17 -5
- package/src/utilities/removeDuplicates.ts +15 -0
- package/CHANGELOG.md +0 -346
- package/LICENSE.md +0 -21
- package/dist/packages/core/src/CommandManager.d.ts +0 -13
- package/dist/packages/core/src/Editor.d.ts +0 -142
- package/dist/packages/core/src/EventEmitter.d.ts +0 -7
- package/dist/packages/core/src/Extension.d.ts +0 -155
- package/dist/packages/core/src/ExtensionManager.d.ts +0 -24
- package/dist/packages/core/src/Mark.d.ts +0 -219
- package/dist/packages/core/src/Node.d.ts +0 -273
- package/dist/packages/core/src/NodeView.d.ts +0 -31
- package/dist/packages/core/src/commands/blur.d.ts +0 -12
- package/dist/packages/core/src/commands/clearContent.d.ts +0 -12
- package/dist/packages/core/src/commands/clearNodes.d.ts +0 -12
- package/dist/packages/core/src/commands/command.d.ts +0 -12
- package/dist/packages/core/src/commands/createParagraphNear.d.ts +0 -12
- package/dist/packages/core/src/commands/deleteRange.d.ts +0 -12
- package/dist/packages/core/src/commands/deleteSelection.d.ts +0 -12
- package/dist/packages/core/src/commands/enter.d.ts +0 -12
- package/dist/packages/core/src/commands/exitCode.d.ts +0 -12
- package/dist/packages/core/src/commands/extendMarkRange.d.ts +0 -13
- package/dist/packages/core/src/commands/first.d.ts +0 -12
- package/dist/packages/core/src/commands/focus.d.ts +0 -12
- package/dist/packages/core/src/commands/insertContent.d.ts +0 -12
- package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
- package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
- package/dist/packages/core/src/commands/insertText.d.ts +0 -12
- package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
- package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
- package/dist/packages/core/src/commands/keyboardShortcut.d.ts +0 -12
- package/dist/packages/core/src/commands/lift.d.ts +0 -13
- package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +0 -12
- package/dist/packages/core/src/commands/liftListItem.d.ts +0 -13
- package/dist/packages/core/src/commands/newlineInCode.d.ts +0 -12
- package/dist/packages/core/src/commands/replace.d.ts +0 -13
- package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
- package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
- package/dist/packages/core/src/commands/scrollIntoView.d.ts +0 -12
- package/dist/packages/core/src/commands/selectAll.d.ts +0 -12
- package/dist/packages/core/src/commands/selectNodeBackward.d.ts +0 -12
- package/dist/packages/core/src/commands/selectNodeForward.d.ts +0 -12
- package/dist/packages/core/src/commands/selectParentNode.d.ts +0 -12
- package/dist/packages/core/src/commands/setContent.d.ts +0 -12
- package/dist/packages/core/src/commands/setMark.d.ts +0 -13
- package/dist/packages/core/src/commands/setNode.d.ts +0 -13
- package/dist/packages/core/src/commands/sinkListItem.d.ts +0 -13
- package/dist/packages/core/src/commands/splitBlock.d.ts +0 -14
- package/dist/packages/core/src/commands/splitListItem.d.ts +0 -13
- package/dist/packages/core/src/commands/toggleList.d.ts +0 -13
- package/dist/packages/core/src/commands/toggleMark.d.ts +0 -13
- package/dist/packages/core/src/commands/toggleNode.d.ts +0 -13
- package/dist/packages/core/src/commands/toggleWrap.d.ts +0 -13
- package/dist/packages/core/src/commands/undoInputRule.d.ts +0 -12
- package/dist/packages/core/src/commands/unsetAllMarks.d.ts +0 -12
- package/dist/packages/core/src/commands/unsetMark.d.ts +0 -13
- package/dist/packages/core/src/commands/updateAttributes.d.ts +0 -13
- package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
- package/dist/packages/core/src/commands/wrapIn.d.ts +0 -13
- package/dist/packages/core/src/commands/wrapInList.d.ts +0 -13
- package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +0 -2
- package/dist/packages/core/src/extensions/commands.d.ts +0 -98
- package/dist/packages/core/src/extensions/editable.d.ts +0 -2
- package/dist/packages/core/src/extensions/focusEvents.d.ts +0 -2
- package/dist/packages/core/src/extensions/index.d.ts +0 -5
- package/dist/packages/core/src/extensions/keymap.d.ts +0 -2
- package/dist/packages/core/src/helpers/createDocument.d.ts +0 -4
- package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +0 -8
- package/dist/packages/core/src/helpers/findParentNode.d.ts +0 -9
- package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +0 -8
- package/dist/packages/core/src/helpers/generateHTML.d.ts +0 -2
- package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +0 -6
- package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +0 -2
- package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +0 -4
- package/dist/packages/core/src/helpers/getMarkRange.d.ts +0 -3
- package/dist/packages/core/src/helpers/getMarkType.d.ts +0 -2
- package/dist/packages/core/src/helpers/getMarksBetween.d.ts +0 -3
- package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +0 -4
- package/dist/packages/core/src/helpers/getNodeType.d.ts +0 -2
- package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +0 -3
- package/dist/packages/core/src/helpers/getSchema.d.ts +0 -3
- package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +0 -2
- package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +0 -2
- package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +0 -2
- package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +0 -9
- package/dist/packages/core/src/helpers/isActive.d.ts +0 -3
- package/dist/packages/core/src/helpers/isList.d.ts +0 -2
- package/dist/packages/core/src/helpers/isMarkActive.d.ts +0 -4
- package/dist/packages/core/src/helpers/isNodeActive.d.ts +0 -4
- package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +0 -2
- package/dist/packages/core/src/helpers/isNodeSelection.d.ts +0 -2
- package/dist/packages/core/src/helpers/isTextSelection.d.ts +0 -2
- package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +0 -2
- package/dist/packages/core/src/helpers/splitExtensions.d.ts +0 -9
- package/dist/packages/core/src/index.d.ts +0 -30
- package/dist/packages/core/src/inputRules/markInputRule.d.ts +0 -3
- package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +0 -3
- package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +0 -3
- package/dist/packages/core/src/style.d.ts +0 -2
- package/dist/packages/core/src/types.d.ts +0 -157
- package/dist/packages/core/src/utilities/callOrReturn.d.ts +0 -8
- package/dist/packages/core/src/utilities/createStyleTag.d.ts +0 -1
- package/dist/packages/core/src/utilities/deleteProps.d.ts +0 -7
- package/dist/packages/core/src/utilities/elementFromString.d.ts +0 -1
- package/dist/packages/core/src/utilities/fromString.d.ts +0 -1
- package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
- package/dist/packages/core/src/utilities/isEmptyObject.d.ts +0 -1
- package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
- package/dist/packages/core/src/utilities/isPlainObject.d.ts +0 -1
- package/dist/packages/core/src/utilities/mergeAttributes.d.ts +0 -2
- package/dist/packages/core/src/utilities/mergeDeep.d.ts +0 -2
- package/dist/packages/core/src/utilities/minMax.d.ts +0 -1
- package/dist/packages/core/src/utilities/objectIncludes.d.ts +0 -7
- package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
- package/dist/tiptap-core.bundle.umd.min.js +0 -17
- package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
- package/dist/tiptap-core.cjs.js +0 -3000
- package/dist/tiptap-core.cjs.js.map +0 -1
- package/dist/tiptap-core.esm.js +0 -2975
- package/dist/tiptap-core.esm.js.map +0 -1
- package/dist/tiptap-core.umd.js +0 -2997
- package/dist/tiptap-core.umd.js.map +0 -1
- package/src/commands/insertHTML.ts +0 -30
- package/src/commands/insertNode.ts +0 -33
- package/src/commands/insertText.ts +0 -22
- package/src/commands/replace.ts +0 -20
- package/src/commands/replaceRange.ts +0 -36
- package/src/commands/resetNodeAttributes.ts +0 -31
- package/src/commands/updateNodeAttributes.ts +0 -35
- package/src/utilities/isClass.ts +0 -7
- package/src/utilities/isObject.ts +0 -10
- package/src/utilities/removeElement.ts +0 -5
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { newlineInCode as originalNewlineInCode } from 'prosemirror-commands'
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import { RawCommands } from '../types'
|
|
3
4
|
|
|
4
5
|
declare module '@tiptap/core' {
|
|
5
|
-
interface Commands {
|
|
6
|
+
interface Commands<ReturnType> {
|
|
6
7
|
newlineInCode: {
|
|
7
8
|
/**
|
|
8
9
|
* Add a newline character in code.
|
|
9
10
|
*/
|
|
10
|
-
newlineInCode: () =>
|
|
11
|
+
newlineInCode: () => ReturnType,
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
14
|
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { MarkType, NodeType } from 'prosemirror-model'
|
|
2
|
+
|
|
3
|
+
import { getMarkType } from '../helpers/getMarkType'
|
|
4
|
+
import { getNodeType } from '../helpers/getNodeType'
|
|
5
|
+
import { getSchemaTypeNameByName } from '../helpers/getSchemaTypeNameByName'
|
|
6
|
+
import { RawCommands } from '../types'
|
|
7
|
+
import { deleteProps } from '../utilities/deleteProps'
|
|
8
|
+
|
|
9
|
+
declare module '@tiptap/core' {
|
|
10
|
+
interface Commands<ReturnType> {
|
|
11
|
+
resetAttributes: {
|
|
12
|
+
/**
|
|
13
|
+
* Resets some node attributes to the default value.
|
|
14
|
+
*/
|
|
15
|
+
resetAttributes: (typeOrName: string | NodeType | MarkType, attributes: string | string[]) => ReturnType,
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const resetAttributes: RawCommands['resetAttributes'] = (typeOrName, attributes) => ({ tr, state, dispatch }) => {
|
|
21
|
+
let nodeType: NodeType | null = null
|
|
22
|
+
let markType: MarkType | null = null
|
|
23
|
+
|
|
24
|
+
const schemaType = getSchemaTypeNameByName(
|
|
25
|
+
typeof typeOrName === 'string'
|
|
26
|
+
? typeOrName
|
|
27
|
+
: typeOrName.name,
|
|
28
|
+
state.schema,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
if (!schemaType) {
|
|
32
|
+
return false
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (schemaType === 'node') {
|
|
36
|
+
nodeType = getNodeType(typeOrName as NodeType, state.schema)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (schemaType === 'mark') {
|
|
40
|
+
markType = getMarkType(typeOrName as MarkType, state.schema)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (dispatch) {
|
|
44
|
+
tr.selection.ranges.forEach(range => {
|
|
45
|
+
state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {
|
|
46
|
+
if (nodeType && nodeType === node.type) {
|
|
47
|
+
tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attributes))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (markType && node.marks.length) {
|
|
51
|
+
node.marks.forEach(mark => {
|
|
52
|
+
if (markType === mark.type) {
|
|
53
|
+
tr.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attributes)))
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return true
|
|
62
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RawCommands } from '../types'
|
|
2
2
|
|
|
3
3
|
declare module '@tiptap/core' {
|
|
4
|
-
interface Commands {
|
|
4
|
+
interface Commands<ReturnType> {
|
|
5
5
|
scrollIntoView: {
|
|
6
6
|
/**
|
|
7
7
|
* Scroll the selection into view.
|
|
8
8
|
*/
|
|
9
|
-
scrollIntoView: () =>
|
|
9
|
+
scrollIntoView: () => ReturnType,
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Command, RawCommands } from '../types'
|
|
1
|
+
import { RawCommands } from '../types'
|
|
3
2
|
|
|
4
3
|
declare module '@tiptap/core' {
|
|
5
|
-
interface Commands {
|
|
4
|
+
interface Commands<ReturnType> {
|
|
6
5
|
selectAll: {
|
|
7
6
|
/**
|
|
8
7
|
* Select the whole document.
|
|
9
8
|
*/
|
|
10
|
-
selectAll: () =>
|
|
9
|
+
selectAll: () => ReturnType,
|
|
11
10
|
}
|
|
12
11
|
}
|
|
13
12
|
}
|
|
14
13
|
|
|
15
|
-
export const selectAll: RawCommands['selectAll'] = () => ({
|
|
16
|
-
return
|
|
14
|
+
export const selectAll: RawCommands['selectAll'] = () => ({ tr, commands }) => {
|
|
15
|
+
return commands.setTextSelection({
|
|
16
|
+
from: 0,
|
|
17
|
+
to: tr.doc.content.size,
|
|
18
|
+
})
|
|
17
19
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { selectNodeBackward as originalSelectNodeBackward } from 'prosemirror-commands'
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import { RawCommands } from '../types'
|
|
3
4
|
|
|
4
5
|
declare module '@tiptap/core' {
|
|
5
|
-
interface Commands {
|
|
6
|
+
interface Commands<ReturnType> {
|
|
6
7
|
selectNodeBackward: {
|
|
7
8
|
/**
|
|
8
9
|
* Select a node backward.
|
|
9
10
|
*/
|
|
10
|
-
selectNodeBackward: () =>
|
|
11
|
+
selectNodeBackward: () => ReturnType,
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
14
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { selectNodeForward as originalSelectNodeForward } from 'prosemirror-commands'
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import { RawCommands } from '../types'
|
|
3
4
|
|
|
4
5
|
declare module '@tiptap/core' {
|
|
5
|
-
interface Commands {
|
|
6
|
+
interface Commands<ReturnType> {
|
|
6
7
|
selectNodeForward: {
|
|
7
8
|
/**
|
|
8
9
|
* Select a node forward.
|
|
9
10
|
*/
|
|
10
|
-
selectNodeForward: () =>
|
|
11
|
+
selectNodeForward: () => ReturnType,
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
14
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { selectParentNode as originalSelectParentNode } from 'prosemirror-commands'
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import { RawCommands } from '../types'
|
|
3
4
|
|
|
4
5
|
declare module '@tiptap/core' {
|
|
5
|
-
interface Commands {
|
|
6
|
+
interface Commands<ReturnType> {
|
|
6
7
|
selectParentNode: {
|
|
7
8
|
/**
|
|
8
9
|
* Select the parent node.
|
|
9
10
|
*/
|
|
10
|
-
selectParentNode: () =>
|
|
11
|
+
selectParentNode: () => ReturnType,
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
14
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
// TODO: add types to @types/prosemirror-commands
|
|
3
|
+
import { selectTextblockEnd as originalSelectTextblockEnd } from 'prosemirror-commands'
|
|
4
|
+
|
|
5
|
+
import { RawCommands } from '../types'
|
|
6
|
+
|
|
7
|
+
declare module '@tiptap/core' {
|
|
8
|
+
interface Commands<ReturnType> {
|
|
9
|
+
selectTextblockEnd: {
|
|
10
|
+
/**
|
|
11
|
+
* Moves the cursor to the end of current text block.
|
|
12
|
+
*/
|
|
13
|
+
selectTextblockEnd: () => ReturnType,
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const selectTextblockEnd: RawCommands['selectTextblockEnd'] = () => ({ state, dispatch }) => {
|
|
19
|
+
return originalSelectTextblockEnd(state, dispatch)
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
// TODO: add types to @types/prosemirror-commands
|
|
3
|
+
import { selectTextblockStart as originalSelectTextblockStart } from 'prosemirror-commands'
|
|
4
|
+
|
|
5
|
+
import { RawCommands } from '../types'
|
|
6
|
+
|
|
7
|
+
declare module '@tiptap/core' {
|
|
8
|
+
interface Commands<ReturnType> {
|
|
9
|
+
selectTextblockStart: {
|
|
10
|
+
/**
|
|
11
|
+
* Moves the cursor to the start of current text block.
|
|
12
|
+
*/
|
|
13
|
+
selectTextblockStart: () => ReturnType,
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const selectTextblockStart: RawCommands['selectTextblockStart'] = () => ({ state, dispatch }) => {
|
|
19
|
+
return originalSelectTextblockStart(state, dispatch)
|
|
20
|
+
}
|
|
@@ -1,23 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
Command,
|
|
6
|
-
RawCommands,
|
|
7
|
-
Content,
|
|
8
|
-
} from '../types'
|
|
1
|
+
import { ParseOptions } from 'prosemirror-model'
|
|
2
|
+
|
|
3
|
+
import { createDocument } from '../helpers/createDocument'
|
|
4
|
+
import { Content, RawCommands } from '../types'
|
|
9
5
|
|
|
10
6
|
declare module '@tiptap/core' {
|
|
11
|
-
interface Commands {
|
|
7
|
+
interface Commands<ReturnType> {
|
|
12
8
|
setContent: {
|
|
13
9
|
/**
|
|
14
10
|
* Replace the whole document with new content.
|
|
15
11
|
*/
|
|
16
12
|
setContent: (
|
|
17
13
|
content: Content,
|
|
18
|
-
emitUpdate?:
|
|
19
|
-
parseOptions?:
|
|
20
|
-
) =>
|
|
14
|
+
emitUpdate?: boolean,
|
|
15
|
+
parseOptions?: ParseOptions,
|
|
16
|
+
) => ReturnType,
|
|
21
17
|
}
|
|
22
18
|
}
|
|
23
19
|
}
|
|
@@ -25,11 +21,9 @@ declare module '@tiptap/core' {
|
|
|
25
21
|
export const setContent: RawCommands['setContent'] = (content, emitUpdate = false, parseOptions = {}) => ({ tr, editor, dispatch }) => {
|
|
26
22
|
const { doc } = tr
|
|
27
23
|
const document = createDocument(content, editor.schema, parseOptions)
|
|
28
|
-
const selection = TextSelection.create(doc, 0, doc.content.size)
|
|
29
24
|
|
|
30
25
|
if (dispatch) {
|
|
31
|
-
tr.
|
|
32
|
-
.replaceSelectionWith(document, false)
|
|
26
|
+
tr.replaceWith(0, doc.content.size, document)
|
|
33
27
|
.setMeta('preventUpdate', !emitUpdate)
|
|
34
28
|
}
|
|
35
29
|
|
package/src/commands/setMark.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { MarkType } from 'prosemirror-model'
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
import
|
|
2
|
+
|
|
3
|
+
import { getMarkAttributes } from '../helpers/getMarkAttributes'
|
|
4
|
+
import { getMarkType } from '../helpers/getMarkType'
|
|
5
|
+
import { RawCommands } from '../types'
|
|
5
6
|
|
|
6
7
|
declare module '@tiptap/core' {
|
|
7
|
-
interface Commands {
|
|
8
|
+
interface Commands<ReturnType> {
|
|
8
9
|
setMark: {
|
|
9
10
|
/**
|
|
10
11
|
* Add a mark with new attributes.
|
|
11
12
|
*/
|
|
12
|
-
setMark: (typeOrName: string | MarkType, attributes?:
|
|
13
|
+
setMark: (typeOrName: string | MarkType, attributes?: Record<string, any>) => ReturnType,
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
}
|
|
@@ -18,18 +19,41 @@ export const setMark: RawCommands['setMark'] = (typeOrName, attributes = {}) =>
|
|
|
18
19
|
const { selection } = tr
|
|
19
20
|
const { empty, ranges } = selection
|
|
20
21
|
const type = getMarkType(typeOrName, state.schema)
|
|
21
|
-
const oldAttributes = getMarkAttributes(state, type)
|
|
22
|
-
const newAttributes = {
|
|
23
|
-
...oldAttributes,
|
|
24
|
-
...attributes,
|
|
25
|
-
}
|
|
26
22
|
|
|
27
23
|
if (dispatch) {
|
|
28
24
|
if (empty) {
|
|
29
|
-
|
|
25
|
+
const oldAttributes = getMarkAttributes(state, type)
|
|
26
|
+
|
|
27
|
+
tr.addStoredMark(type.create({
|
|
28
|
+
...oldAttributes,
|
|
29
|
+
...attributes,
|
|
30
|
+
}))
|
|
30
31
|
} else {
|
|
31
32
|
ranges.forEach(range => {
|
|
32
|
-
|
|
33
|
+
const from = range.$from.pos
|
|
34
|
+
const to = range.$to.pos
|
|
35
|
+
|
|
36
|
+
state.doc.nodesBetween(from, to, (node, pos) => {
|
|
37
|
+
const trimmedFrom = Math.max(pos, from)
|
|
38
|
+
const trimmedTo = Math.min(pos + node.nodeSize, to)
|
|
39
|
+
const someHasMark = node.marks.find(mark => mark.type === type)
|
|
40
|
+
|
|
41
|
+
// if there is already a mark of this type
|
|
42
|
+
// we know that we have to merge its attributes
|
|
43
|
+
// otherwise we add a fresh new mark
|
|
44
|
+
if (someHasMark) {
|
|
45
|
+
node.marks.forEach(mark => {
|
|
46
|
+
if (type === mark.type) {
|
|
47
|
+
tr.addMark(trimmedFrom, trimmedTo, type.create({
|
|
48
|
+
...mark.attrs,
|
|
49
|
+
...attributes,
|
|
50
|
+
}))
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
} else {
|
|
54
|
+
tr.addMark(trimmedFrom, trimmedTo, type.create(attributes))
|
|
55
|
+
}
|
|
56
|
+
})
|
|
33
57
|
})
|
|
34
58
|
}
|
|
35
59
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RawCommands } from '../types'
|
|
2
|
+
|
|
3
|
+
declare module '@tiptap/core' {
|
|
4
|
+
interface Commands<ReturnType> {
|
|
5
|
+
setMeta: {
|
|
6
|
+
/**
|
|
7
|
+
* Store a metadata property in the current transaction.
|
|
8
|
+
*/
|
|
9
|
+
setMeta: (key: string, value: any) => ReturnType,
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const setMeta: RawCommands['setMeta'] = (key, value) => ({ tr }) => {
|
|
15
|
+
tr.setMeta(key, value)
|
|
16
|
+
|
|
17
|
+
return true
|
|
18
|
+
}
|
package/src/commands/setNode.ts
CHANGED
|
@@ -1,21 +1,43 @@
|
|
|
1
|
-
import { NodeType } from 'prosemirror-model'
|
|
2
1
|
import { setBlockType } from 'prosemirror-commands'
|
|
3
|
-
import {
|
|
4
|
-
|
|
2
|
+
import { NodeType } from 'prosemirror-model'
|
|
3
|
+
|
|
4
|
+
import { getNodeType } from '../helpers/getNodeType'
|
|
5
|
+
import { RawCommands } from '../types'
|
|
5
6
|
|
|
6
7
|
declare module '@tiptap/core' {
|
|
7
|
-
interface Commands {
|
|
8
|
+
interface Commands<ReturnType> {
|
|
8
9
|
setNode: {
|
|
9
10
|
/**
|
|
10
11
|
* Replace a given range with a node.
|
|
11
12
|
*/
|
|
12
|
-
setNode: (typeOrName: string | NodeType, attributes?:
|
|
13
|
+
setNode: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType,
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
}
|
|
16
17
|
|
|
17
|
-
export const setNode: RawCommands['setNode'] = (typeOrName, attributes = {}) => ({ state, dispatch }) => {
|
|
18
|
+
export const setNode: RawCommands['setNode'] = (typeOrName, attributes = {}) => ({ state, dispatch, chain }) => {
|
|
18
19
|
const type = getNodeType(typeOrName, state.schema)
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
// TODO: use a fallback like insertContent?
|
|
22
|
+
if (!type.isTextblock) {
|
|
23
|
+
console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.')
|
|
24
|
+
|
|
25
|
+
return false
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return chain()
|
|
29
|
+
// try to convert node to default node if needed
|
|
30
|
+
.command(({ commands }) => {
|
|
31
|
+
const canSetBlock = setBlockType(type, attributes)(state)
|
|
32
|
+
|
|
33
|
+
if (canSetBlock) {
|
|
34
|
+
return true
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return commands.clearNodes()
|
|
38
|
+
})
|
|
39
|
+
.command(({ state: updatedState }) => {
|
|
40
|
+
return setBlockType(type, attributes)(updatedState, dispatch)
|
|
41
|
+
})
|
|
42
|
+
.run()
|
|
21
43
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { NodeSelection } from 'prosemirror-state'
|
|
2
|
+
|
|
3
|
+
import { RawCommands } from '../types'
|
|
4
|
+
import { minMax } from '../utilities/minMax'
|
|
5
|
+
|
|
6
|
+
declare module '@tiptap/core' {
|
|
7
|
+
interface Commands<ReturnType> {
|
|
8
|
+
setNodeSelection: {
|
|
9
|
+
/**
|
|
10
|
+
* Creates a NodeSelection.
|
|
11
|
+
*/
|
|
12
|
+
setNodeSelection: (position: number) => ReturnType,
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const setNodeSelection: RawCommands['setNodeSelection'] = position => ({ tr, dispatch }) => {
|
|
18
|
+
if (dispatch) {
|
|
19
|
+
const { doc } = tr
|
|
20
|
+
const from = minMax(position, 0, doc.content.size)
|
|
21
|
+
const selection = NodeSelection.create(doc, from)
|
|
22
|
+
|
|
23
|
+
tr.setSelection(selection)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return true
|
|
27
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { TextSelection } from 'prosemirror-state'
|
|
2
|
+
|
|
3
|
+
import { Range, RawCommands } from '../types'
|
|
4
|
+
import { minMax } from '../utilities/minMax'
|
|
5
|
+
|
|
6
|
+
declare module '@tiptap/core' {
|
|
7
|
+
interface Commands<ReturnType> {
|
|
8
|
+
setTextSelection: {
|
|
9
|
+
/**
|
|
10
|
+
* Creates a TextSelection.
|
|
11
|
+
*/
|
|
12
|
+
setTextSelection: (position: number | Range) => ReturnType,
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const setTextSelection: RawCommands['setTextSelection'] = position => ({ tr, dispatch }) => {
|
|
18
|
+
if (dispatch) {
|
|
19
|
+
const { doc } = tr
|
|
20
|
+
const { from, to } = typeof position === 'number'
|
|
21
|
+
? { from: position, to: position }
|
|
22
|
+
: position
|
|
23
|
+
const minPos = TextSelection.atStart(doc).from
|
|
24
|
+
const maxPos = TextSelection.atEnd(doc).to
|
|
25
|
+
const resolvedFrom = minMax(from, minPos, maxPos)
|
|
26
|
+
const resolvedEnd = minMax(to, minPos, maxPos)
|
|
27
|
+
const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd)
|
|
28
|
+
|
|
29
|
+
tr.setSelection(selection)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return true
|
|
33
|
+
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { sinkListItem as originalSinkListItem } from 'prosemirror-schema-list'
|
|
2
1
|
import { NodeType } from 'prosemirror-model'
|
|
3
|
-
import {
|
|
4
|
-
|
|
2
|
+
import { sinkListItem as originalSinkListItem } from 'prosemirror-schema-list'
|
|
3
|
+
|
|
4
|
+
import { getNodeType } from '../helpers/getNodeType'
|
|
5
|
+
import { RawCommands } from '../types'
|
|
5
6
|
|
|
6
7
|
declare module '@tiptap/core' {
|
|
7
|
-
interface Commands {
|
|
8
|
+
interface Commands<ReturnType> {
|
|
8
9
|
sinkListItem: {
|
|
9
10
|
/**
|
|
10
11
|
* Sink the list item down into an inner list.
|
|
11
12
|
*/
|
|
12
|
-
sinkListItem: (typeOrName: string | NodeType) =>
|
|
13
|
+
sinkListItem: (typeOrName: string | NodeType) => ReturnType,
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
}
|
|
@@ -1,19 +1,9 @@
|
|
|
1
|
-
import { canSplit } from 'prosemirror-transform'
|
|
2
|
-
import { ContentMatch, Fragment } from 'prosemirror-model'
|
|
3
1
|
import { EditorState, NodeSelection, TextSelection } from 'prosemirror-state'
|
|
4
|
-
import {
|
|
5
|
-
import getSplittedAttributes from '../helpers/getSplittedAttributes'
|
|
2
|
+
import { canSplit } from 'prosemirror-transform'
|
|
6
3
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
if (type.isTextblock && !type.hasRequiredAttrs()) {
|
|
12
|
-
return type
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
return null
|
|
16
|
-
}
|
|
4
|
+
import { defaultBlockAt } from '../helpers/defaultBlockAt'
|
|
5
|
+
import { getSplittedAttributes } from '../helpers/getSplittedAttributes'
|
|
6
|
+
import { RawCommands } from '../types'
|
|
17
7
|
|
|
18
8
|
function ensureMarks(state: EditorState, splittableMarks?: string[]) {
|
|
19
9
|
const marks = state.storedMarks
|
|
@@ -27,12 +17,12 @@ function ensureMarks(state: EditorState, splittableMarks?: string[]) {
|
|
|
27
17
|
}
|
|
28
18
|
|
|
29
19
|
declare module '@tiptap/core' {
|
|
30
|
-
interface Commands {
|
|
20
|
+
interface Commands<ReturnType> {
|
|
31
21
|
splitBlock: {
|
|
32
22
|
/**
|
|
33
23
|
* Forks a new node from an existing node.
|
|
34
24
|
*/
|
|
35
|
-
splitBlock: (options?: { keepMarks?: boolean }) =>
|
|
25
|
+
splitBlock: (options?: { keepMarks?: boolean }) => ReturnType,
|
|
36
26
|
}
|
|
37
27
|
}
|
|
38
28
|
}
|
|
@@ -110,12 +100,17 @@ export const splitBlock: RawCommands['splitBlock'] = ({ keepMarks = true } = {})
|
|
|
110
100
|
tr.split(tr.mapping.map($from.pos), 1, types)
|
|
111
101
|
|
|
112
102
|
if (
|
|
113
|
-
|
|
103
|
+
deflt
|
|
104
|
+
&& !atEnd
|
|
114
105
|
&& !$from.parentOffset
|
|
115
106
|
&& $from.parent.type !== deflt
|
|
116
|
-
&& $from.node(-1).canReplace($from.index(-1), $from.indexAfter(-1), Fragment.from(deflt?.create()))
|
|
117
107
|
) {
|
|
118
|
-
tr.
|
|
108
|
+
const first = tr.mapping.map($from.before())
|
|
109
|
+
const $first = tr.doc.resolve(first)
|
|
110
|
+
|
|
111
|
+
if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) {
|
|
112
|
+
tr.setNodeMarkup(tr.mapping.map($from.before()), deflt)
|
|
113
|
+
}
|
|
119
114
|
}
|
|
120
115
|
}
|
|
121
116
|
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
|
-
NodeType,
|
|
3
|
-
Node as ProseMirrorNode,
|
|
4
2
|
Fragment,
|
|
3
|
+
Node as ProseMirrorNode,
|
|
4
|
+
NodeType,
|
|
5
5
|
Slice,
|
|
6
6
|
} from 'prosemirror-model'
|
|
7
|
-
import { canSplit } from 'prosemirror-transform'
|
|
8
7
|
import { TextSelection } from 'prosemirror-state'
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
import
|
|
8
|
+
import { canSplit } from 'prosemirror-transform'
|
|
9
|
+
|
|
10
|
+
import { getNodeType } from '../helpers/getNodeType'
|
|
11
|
+
import { getSplittedAttributes } from '../helpers/getSplittedAttributes'
|
|
12
|
+
import { RawCommands } from '../types'
|
|
12
13
|
|
|
13
14
|
declare module '@tiptap/core' {
|
|
14
|
-
interface Commands {
|
|
15
|
+
interface Commands<ReturnType> {
|
|
15
16
|
splitListItem: {
|
|
16
17
|
/**
|
|
17
18
|
* Splits one list item into two list items.
|
|
18
19
|
*/
|
|
19
|
-
splitListItem: (typeOrName: string | NodeType) =>
|
|
20
|
+
splitListItem: (typeOrName: string | NodeType) => ReturnType,
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
}
|
|
@@ -57,14 +58,26 @@ export const splitListItem: RawCommands['splitListItem'] = typeOrName => ({
|
|
|
57
58
|
|
|
58
59
|
if (dispatch) {
|
|
59
60
|
let wrap = Fragment.empty
|
|
60
|
-
|
|
61
|
+
// eslint-disable-next-line
|
|
62
|
+
const depthBefore = $from.index(-1)
|
|
63
|
+
? 1
|
|
64
|
+
: $from.index(-2)
|
|
65
|
+
? 2
|
|
66
|
+
: 3
|
|
61
67
|
|
|
62
68
|
// Build a fragment containing empty versions of the structure
|
|
63
69
|
// from the outer list item to the parent node of the cursor
|
|
64
|
-
for (let d = $from.depth -
|
|
70
|
+
for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d -= 1) {
|
|
65
71
|
wrap = Fragment.from($from.node(d).copy(wrap))
|
|
66
72
|
}
|
|
67
73
|
|
|
74
|
+
// eslint-disable-next-line
|
|
75
|
+
const depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount
|
|
76
|
+
? 1
|
|
77
|
+
: $from.indexAfter(-2) < $from.node(-3).childCount
|
|
78
|
+
? 2
|
|
79
|
+
: 3
|
|
80
|
+
|
|
68
81
|
// Add a second list item with an empty default start node
|
|
69
82
|
const newNextTypeAttributes = getSplittedAttributes(
|
|
70
83
|
extensionAttributes,
|
|
@@ -72,16 +85,30 @@ export const splitListItem: RawCommands['splitListItem'] = typeOrName => ({
|
|
|
72
85
|
$from.node().attrs,
|
|
73
86
|
)
|
|
74
87
|
const nextType = type.contentMatch.defaultType?.createAndFill(newNextTypeAttributes) || undefined
|
|
88
|
+
|
|
75
89
|
wrap = wrap.append(Fragment.from(type.createAndFill(null, nextType) || undefined))
|
|
76
90
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
91
|
+
const start = $from.before($from.depth - (depthBefore - 1))
|
|
92
|
+
|
|
93
|
+
tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0))
|
|
94
|
+
|
|
95
|
+
let sel = -1
|
|
96
|
+
|
|
97
|
+
tr.doc.nodesBetween(start, tr.doc.content.size, (n, pos) => {
|
|
98
|
+
if (sel > -1) {
|
|
99
|
+
return false
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (n.isTextblock && n.content.size === 0) {
|
|
103
|
+
sel = pos + 1
|
|
104
|
+
}
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
if (sel > -1) {
|
|
108
|
+
tr.setSelection(TextSelection.near(tr.doc.resolve(sel)))
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
tr.scrollIntoView()
|
|
85
112
|
}
|
|
86
113
|
|
|
87
114
|
return true
|