@tiptap/core 2.0.0-beta.22 → 2.0.0-beta.220
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/dist/index.cjs +4354 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +4264 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.js +4352 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/packages/core/src/CommandManager.d.ts +14 -7
- package/dist/packages/core/src/Editor.d.ts +27 -22
- package/dist/packages/core/src/EventEmitter.d.ts +8 -4
- package/dist/packages/core/src/Extension.d.ts +93 -21
- package/dist/packages/core/src/ExtensionManager.d.ts +8 -14
- package/dist/packages/core/src/InputRule.d.ts +42 -0
- package/dist/packages/core/src/Mark.d.ts +132 -24
- package/dist/packages/core/src/Node.d.ts +150 -26
- package/dist/packages/core/src/NodeView.d.ts +11 -15
- package/dist/packages/core/src/PasteRule.d.ts +42 -0
- package/dist/packages/core/src/Tracker.d.ts +11 -0
- package/dist/packages/core/src/commands/blur.d.ts +3 -3
- package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
- package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
- package/dist/packages/core/src/commands/command.d.ts +2 -2
- package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
- package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +12 -0
- package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
- package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
- package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
- package/dist/packages/core/src/commands/enter.d.ts +3 -3
- package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
- package/dist/packages/core/src/commands/extendMarkRange.d.ts +4 -4
- package/dist/packages/core/src/commands/first.d.ts +3 -3
- package/dist/packages/core/src/commands/focus.d.ts +5 -3
- package/dist/packages/core/src/commands/forEach.d.ts +14 -0
- package/dist/packages/core/src/commands/index.d.ts +50 -0
- package/dist/packages/core/src/commands/insertContent.d.ts +7 -3
- package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
- package/dist/packages/core/src/commands/join.d.ts +33 -0
- package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
- package/dist/packages/core/src/commands/lift.d.ts +4 -4
- package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
- package/dist/packages/core/src/commands/liftListItem.d.ts +4 -4
- package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
- package/dist/packages/core/src/commands/resetAttributes.d.ts +4 -4
- package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
- package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
- package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
- package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
- package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
- package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
- package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
- package/dist/packages/core/src/commands/setContent.d.ts +4 -3
- package/dist/packages/core/src/commands/setMark.d.ts +4 -4
- package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
- package/dist/packages/core/src/commands/setNode.d.ts +4 -4
- package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
- package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
- package/dist/packages/core/src/commands/sinkListItem.d.ts +4 -4
- package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
- package/dist/packages/core/src/commands/splitListItem.d.ts +4 -4
- package/dist/packages/core/src/commands/toggleList.d.ts +4 -4
- package/dist/packages/core/src/commands/toggleMark.d.ts +9 -4
- package/dist/packages/core/src/commands/toggleNode.d.ts +4 -4
- package/dist/packages/core/src/commands/toggleWrap.d.ts +4 -4
- package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
- package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
- package/dist/packages/core/src/commands/unsetMark.d.ts +9 -4
- package/dist/packages/core/src/commands/updateAttributes.d.ts +4 -4
- package/dist/packages/core/src/commands/wrapIn.d.ts +4 -4
- package/dist/packages/core/src/commands/wrapInList.d.ts +4 -4
- package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
- package/dist/packages/core/src/extensions/commands.d.ts +2 -99
- package/dist/packages/core/src/extensions/editable.d.ts +1 -1
- package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
- package/dist/packages/core/src/extensions/index.d.ts +1 -0
- package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
- package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
- package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
- package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
- package/dist/packages/core/src/helpers/createDocument.d.ts +3 -4
- package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +4 -5
- package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
- package/dist/packages/core/src/helpers/findChildren.d.ts +3 -8
- package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
- package/dist/packages/core/src/helpers/findParentNode.d.ts +3 -4
- package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +3 -3
- package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
- package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
- package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
- package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
- package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
- package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
- package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
- package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
- package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
- package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +3 -4
- package/dist/packages/core/src/helpers/getMarkRange.d.ts +2 -2
- package/dist/packages/core/src/helpers/getMarkType.d.ts +2 -2
- package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
- package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +3 -4
- package/dist/packages/core/src/helpers/getNodeType.d.ts +2 -2
- package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +3 -3
- package/dist/packages/core/src/helpers/getSchema.d.ts +2 -2
- package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
- package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +2 -2
- package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +2 -2
- package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
- package/dist/packages/core/src/helpers/getText.d.ts +6 -0
- package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
- package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
- package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
- package/dist/packages/core/src/helpers/index.d.ts +47 -0
- package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +2 -2
- package/dist/packages/core/src/helpers/isActive.d.ts +2 -3
- package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
- package/dist/packages/core/src/helpers/isList.d.ts +1 -1
- package/dist/packages/core/src/helpers/isMarkActive.d.ts +3 -4
- package/dist/packages/core/src/helpers/isNodeActive.d.ts +3 -4
- package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +2 -2
- package/dist/packages/core/src/helpers/isNodeSelection.d.ts +2 -2
- package/dist/packages/core/src/helpers/isTextSelection.d.ts +2 -2
- package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
- package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
- package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +2 -2
- package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
- package/dist/packages/core/src/index.d.ts +14 -23
- package/dist/packages/core/src/inputRules/index.d.ts +5 -0
- package/dist/packages/core/src/inputRules/markInputRule.d.ts +12 -3
- package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +12 -3
- package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
- package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
- package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +27 -0
- package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
- package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +12 -3
- package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +12 -0
- package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
- package/dist/packages/core/src/style.d.ts +1 -2
- package/dist/packages/core/src/types.d.ts +122 -62
- package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
- package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
- package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
- package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
- package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
- package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
- package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
- package/dist/packages/core/src/utilities/index.d.ts +20 -0
- package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
- package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
- package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
- package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
- package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
- package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
- package/dist/packages/core/src/utilities/isString.d.ts +1 -0
- package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
- package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
- package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
- package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
- package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
- package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
- package/package.json +29 -24
- package/src/CommandManager.ts +76 -86
- package/src/Editor.ts +121 -79
- package/src/EventEmitter.ts +14 -4
- package/src/Extension.ts +276 -112
- package/src/ExtensionManager.ts +252 -110
- package/src/InputRule.ts +260 -0
- package/src/Mark.ts +394 -152
- package/src/Node.ts +433 -176
- package/src/NodeView.ts +144 -67
- package/src/PasteRule.ts +240 -0
- package/src/Tracker.ts +38 -0
- package/src/commands/blur.ts +12 -6
- package/src/commands/clearContent.ts +3 -3
- package/src/commands/clearNodes.ts +31 -19
- package/src/commands/command.ts +2 -2
- package/src/commands/createParagraphNear.ts +5 -4
- package/src/commands/deleteCurrentNode.ts +41 -0
- package/src/commands/deleteNode.ts +37 -0
- package/src/commands/deleteRange.ts +3 -3
- package/src/commands/deleteSelection.ts +5 -4
- package/src/commands/enter.ts +3 -3
- package/src/commands/exitCode.ts +5 -4
- package/src/commands/extendMarkRange.ts +16 -12
- 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 +17 -24
- package/src/commands/insertContentAt.ts +102 -0
- package/src/commands/join.ts +53 -0
- package/src/commands/keyboardShortcut.ts +6 -6
- package/src/commands/lift.ts +8 -7
- package/src/commands/liftEmptyBlock.ts +5 -4
- package/src/commands/liftListItem.ts +7 -6
- package/src/commands/newlineInCode.ts +5 -4
- package/src/commands/resetAttributes.ts +18 -12
- package/src/commands/scrollIntoView.ts +3 -3
- package/src/commands/selectAll.ts +8 -6
- package/src/commands/selectNodeBackward.ts +5 -4
- package/src/commands/selectNodeForward.ts +5 -4
- package/src/commands/selectParentNode.ts +5 -4
- package/src/commands/selectTextblockEnd.ts +20 -0
- package/src/commands/selectTextblockStart.ts +20 -0
- package/src/commands/setContent.ts +9 -16
- package/src/commands/setMark.ts +90 -14
- package/src/commands/setMeta.ts +18 -0
- package/src/commands/setNode.ts +32 -8
- package/src/commands/setNodeSelection.ts +27 -0
- package/src/commands/setTextSelection.ts +31 -0
- package/src/commands/sinkListItem.ts +7 -6
- package/src/commands/splitBlock.ts +31 -41
- package/src/commands/splitListItem.ts +58 -29
- package/src/commands/toggleList.ts +109 -20
- package/src/commands/toggleMark.ts +19 -8
- package/src/commands/toggleNode.ts +11 -6
- package/src/commands/toggleWrap.ts +10 -10
- package/src/commands/undoInputRule.ts +34 -5
- package/src/commands/unsetAllMarks.ts +7 -11
- package/src/commands/unsetMark.ts +36 -23
- package/src/commands/updateAttributes.ts +27 -15
- package/src/commands/wrapIn.ts +7 -12
- package/src/commands/wrapInList.ts +7 -6
- package/src/extensions/clipboardTextSerializer.ts +15 -36
- package/src/extensions/commands.ts +3 -147
- package/src/extensions/editable.ts +2 -1
- package/src/extensions/focusEvents.ts +4 -6
- package/src/extensions/index.ts +1 -0
- package/src/extensions/keymap.ts +106 -13
- package/src/extensions/tabindex.ts +18 -0
- package/src/helpers/combineTransactionSteps.ts +21 -0
- package/src/helpers/createChainableState.ts +38 -0
- package/src/helpers/createDocument.ts +5 -6
- package/src/helpers/createNodeFromContent.ts +20 -28
- package/src/helpers/defaultBlockAt.ts +13 -0
- package/src/helpers/findChildren.ts +3 -7
- package/src/helpers/findChildrenInRange.ts +36 -0
- package/src/helpers/findParentNode.ts +4 -3
- package/src/helpers/findParentNodeClosestToPos.ts +13 -7
- package/src/helpers/generateHTML.ts +7 -6
- package/src/helpers/generateJSON.ts +12 -0
- package/src/helpers/generateText.ts +27 -0
- package/src/helpers/getAttributes.ts +26 -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 +5 -6
- package/src/helpers/getMarkAttributes.ts +18 -11
- package/src/helpers/getMarkRange.ts +41 -8
- package/src/helpers/getMarkType.ts +8 -2
- package/src/helpers/getMarksBetween.ts +34 -10
- package/src/helpers/getNodeAttributes.ts +14 -13
- package/src/helpers/getNodeType.ts +8 -2
- package/src/helpers/getRenderedAttributes.ts +9 -7
- package/src/helpers/getSchema.ts +7 -133
- package/src/helpers/getSchemaByResolvedExtensions.ts +192 -0
- package/src/helpers/getSchemaTypeByName.ts +3 -11
- package/src/helpers/getSchemaTypeNameByName.ts +2 -2
- package/src/helpers/getSplittedAttributes.ts +4 -4
- package/src/helpers/getText.ts +19 -0
- package/src/helpers/getTextBetween.ts +46 -0
- package/src/helpers/getTextContentFromNodes.ts +26 -0
- package/src/helpers/getTextSerializersFromSchema.ts +11 -0
- package/src/helpers/index.ts +47 -0
- package/src/helpers/injectExtensionAttributesToParseRule.ts +22 -23
- package/src/helpers/isActive.ts +10 -6
- package/src/helpers/isExtensionRulesEnabled.ts +15 -0
- package/src/helpers/isList.ts +14 -7
- package/src/helpers/isMarkActive.ts +49 -27
- package/src/helpers/isNodeActive.ts +29 -39
- package/src/helpers/isNodeEmpty.ts +2 -2
- package/src/helpers/isNodeSelection.ts +3 -4
- package/src/helpers/isTextSelection.ts +3 -4
- package/src/helpers/posToDOMRect.ts +35 -0
- package/src/helpers/resolveFocusPosition.ts +42 -0
- package/src/helpers/selectionToInsertionEnd.ts +3 -3
- package/src/helpers/splitExtensions.ts +3 -3
- package/src/index.ts +15 -26
- package/src/inputRules/index.ts +5 -0
- package/src/inputRules/markInputRule.ts +59 -40
- package/src/inputRules/nodeInputRule.ts +45 -12
- package/src/inputRules/textInputRule.ts +35 -0
- package/src/inputRules/textblockTypeInputRule.ts +37 -0
- package/src/inputRules/wrappingInputRule.ts +84 -0
- package/src/pasteRules/index.ts +3 -0
- package/src/pasteRules/markPasteRule.ts +61 -53
- package/src/pasteRules/nodePasteRule.ts +37 -0
- package/src/pasteRules/textPasteRule.ts +35 -0
- package/src/style.ts +16 -3
- package/src/types.ts +175 -97
- 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 +20 -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 -373
- package/LICENSE.md +0 -21
- 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/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/updateNodeAttributes.d.ts +0 -13
- package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
- package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
- 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 -3048
- package/dist/tiptap-core.cjs.js.map +0 -1
- package/dist/tiptap-core.esm.js +0 -3021
- package/dist/tiptap-core.esm.js.map +0 -1
- package/dist/tiptap-core.umd.js +0 -3045
- 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/joinBackward.ts +0 -17
- package/src/commands/joinForward.ts +0 -17
- package/src/commands/replace.ts +0 -20
- package/src/commands/replaceRange.ts +0 -36
- package/src/commands/resetNodeAttributes.ts +0 -33
- 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
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Fragment, Node as ProseMirrorNode, ParseOptions } from '@tiptap/pm/model'
|
|
2
|
+
|
|
3
|
+
import { createNodeFromContent } from '../helpers/createNodeFromContent'
|
|
4
|
+
import { selectionToInsertionEnd } from '../helpers/selectionToInsertionEnd'
|
|
5
|
+
import { Content, Range, RawCommands } from '../types'
|
|
6
|
+
|
|
7
|
+
declare module '@tiptap/core' {
|
|
8
|
+
interface Commands<ReturnType> {
|
|
9
|
+
insertContentAt: {
|
|
10
|
+
/**
|
|
11
|
+
* Insert a node or string of HTML at a specific position.
|
|
12
|
+
*/
|
|
13
|
+
insertContentAt: (
|
|
14
|
+
position: number | Range,
|
|
15
|
+
value: Content,
|
|
16
|
+
options?: {
|
|
17
|
+
parseOptions?: ParseOptions
|
|
18
|
+
updateSelection?: boolean
|
|
19
|
+
},
|
|
20
|
+
) => ReturnType
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const isFragment = (nodeOrFragment: ProseMirrorNode | Fragment): nodeOrFragment is Fragment => {
|
|
26
|
+
return nodeOrFragment.toString().startsWith('<')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const insertContentAt: RawCommands['insertContentAt'] = (position, value, options) => ({ tr, dispatch, editor }) => {
|
|
30
|
+
if (dispatch) {
|
|
31
|
+
options = {
|
|
32
|
+
parseOptions: {},
|
|
33
|
+
updateSelection: true,
|
|
34
|
+
...options,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const content = createNodeFromContent(value, editor.schema, {
|
|
38
|
+
parseOptions: {
|
|
39
|
+
preserveWhitespace: 'full',
|
|
40
|
+
...options.parseOptions,
|
|
41
|
+
},
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
// don’t dispatch an empty fragment because this can lead to strange errors
|
|
45
|
+
if (content.toString() === '<>') {
|
|
46
|
+
return true
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let { from, to } = typeof position === 'number' ? { from: position, to: position } : position
|
|
50
|
+
|
|
51
|
+
let isOnlyTextContent = true
|
|
52
|
+
let isOnlyBlockContent = true
|
|
53
|
+
const nodes = isFragment(content) ? content : [content]
|
|
54
|
+
|
|
55
|
+
nodes.forEach(node => {
|
|
56
|
+
// check if added node is valid
|
|
57
|
+
node.check()
|
|
58
|
+
|
|
59
|
+
isOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false
|
|
60
|
+
|
|
61
|
+
isOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
// check if we can replace the wrapping node by
|
|
65
|
+
// the newly inserted content
|
|
66
|
+
// example:
|
|
67
|
+
// replace an empty paragraph by an inserted image
|
|
68
|
+
// instead of inserting the image below the paragraph
|
|
69
|
+
if (from === to && isOnlyBlockContent) {
|
|
70
|
+
const { parent } = tr.doc.resolve(from)
|
|
71
|
+
const isEmptyTextBlock = parent.isTextblock && !parent.type.spec.code && !parent.childCount
|
|
72
|
+
|
|
73
|
+
if (isEmptyTextBlock) {
|
|
74
|
+
from -= 1
|
|
75
|
+
to += 1
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// if there is only plain text we have to use `insertText`
|
|
80
|
+
// because this will keep the current marks
|
|
81
|
+
if (isOnlyTextContent) {
|
|
82
|
+
// if value is string, we can use it directly
|
|
83
|
+
// otherwise if it is an array, we have to join it
|
|
84
|
+
if (Array.isArray(value)) {
|
|
85
|
+
tr.insertText(value.map(v => v.text || '').join(''), from, to)
|
|
86
|
+
} else if (typeof value === 'object' && !!value && !!value.text) {
|
|
87
|
+
tr.insertText(value.text, from, to)
|
|
88
|
+
} else {
|
|
89
|
+
tr.insertText(value as string, from, to)
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
tr.replaceWith(from, to, content)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// set cursor at end of inserted content
|
|
96
|
+
if (options.updateSelection) {
|
|
97
|
+
selectionToInsertionEnd(tr, tr.steps.length - 1, -1)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return true
|
|
102
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import {
|
|
2
|
+
joinBackward as originalJoinBackward,
|
|
3
|
+
joinDown as originalJoinDown,
|
|
4
|
+
joinForward as originalJoinForward,
|
|
5
|
+
joinUp as originalJoinUp,
|
|
6
|
+
} from '@tiptap/pm/commands'
|
|
7
|
+
|
|
8
|
+
import { RawCommands } from '../types'
|
|
9
|
+
|
|
10
|
+
declare module '@tiptap/core' {
|
|
11
|
+
interface Commands<ReturnType> {
|
|
12
|
+
joinUp: {
|
|
13
|
+
/**
|
|
14
|
+
* Join two nodes Up.
|
|
15
|
+
*/
|
|
16
|
+
joinUp: () => ReturnType
|
|
17
|
+
}
|
|
18
|
+
joinDown: {
|
|
19
|
+
/**
|
|
20
|
+
* Join two nodes Down.
|
|
21
|
+
*/
|
|
22
|
+
joinDown: () => ReturnType
|
|
23
|
+
}
|
|
24
|
+
joinBackward: {
|
|
25
|
+
/**
|
|
26
|
+
* Join two nodes Backwards.
|
|
27
|
+
*/
|
|
28
|
+
joinBackward: () => ReturnType
|
|
29
|
+
}
|
|
30
|
+
joinForward: {
|
|
31
|
+
/**
|
|
32
|
+
* Join two nodes Forwards.
|
|
33
|
+
*/
|
|
34
|
+
joinForward: () => ReturnType
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const joinUp: RawCommands['joinUp'] = () => ({ state, dispatch }) => {
|
|
40
|
+
return originalJoinUp(state, dispatch)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const joinDown: RawCommands['joinDown'] = () => ({ state, dispatch }) => {
|
|
44
|
+
return originalJoinDown(state, dispatch)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export const joinBackward: RawCommands['joinBackward'] = () => ({ state, dispatch }) => {
|
|
48
|
+
return originalJoinBackward(state, dispatch)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const joinForward: RawCommands['joinForward'] = () => ({ state, dispatch }) => {
|
|
52
|
+
return originalJoinForward(state, dispatch)
|
|
53
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { RawCommands } from '../types'
|
|
2
|
+
import { isiOS } from '../utilities/isiOS'
|
|
3
|
+
import { isMacOS } from '../utilities/isMacOS'
|
|
4
4
|
|
|
5
5
|
function normalizeKeyName(name: string) {
|
|
6
6
|
const parts = name.split(/-(?!$)/)
|
|
@@ -27,7 +27,7 @@ function normalizeKeyName(name: string) {
|
|
|
27
27
|
} else if (/^s(hift)?$/i.test(mod)) {
|
|
28
28
|
shift = true
|
|
29
29
|
} else if (/^mod$/i.test(mod)) {
|
|
30
|
-
if (
|
|
30
|
+
if (isiOS() || isMacOS()) {
|
|
31
31
|
meta = true
|
|
32
32
|
} else {
|
|
33
33
|
ctrl = true
|
|
@@ -57,12 +57,12 @@ function normalizeKeyName(name: string) {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
declare module '@tiptap/core' {
|
|
60
|
-
interface Commands {
|
|
60
|
+
interface Commands<ReturnType> {
|
|
61
61
|
keyboardShortcut: {
|
|
62
62
|
/**
|
|
63
63
|
* Trigger a keyboard shortcut.
|
|
64
64
|
*/
|
|
65
|
-
keyboardShortcut: (name: string) =>
|
|
65
|
+
keyboardShortcut: (name: string) => ReturnType,
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
}
|
package/src/commands/lift.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { lift as originalLift } from '
|
|
2
|
-
import { NodeType } from '
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import
|
|
1
|
+
import { lift as originalLift } from '@tiptap/pm/commands'
|
|
2
|
+
import { NodeType } from '@tiptap/pm/model'
|
|
3
|
+
|
|
4
|
+
import { getNodeType } from '../helpers/getNodeType'
|
|
5
|
+
import { isNodeActive } from '../helpers/isNodeActive'
|
|
6
|
+
import { RawCommands } from '../types'
|
|
6
7
|
|
|
7
8
|
declare module '@tiptap/core' {
|
|
8
|
-
interface Commands {
|
|
9
|
+
interface Commands<ReturnType> {
|
|
9
10
|
lift: {
|
|
10
11
|
/**
|
|
11
12
|
* Removes an existing wrap.
|
|
12
13
|
*/
|
|
13
|
-
lift: (typeOrName: string | NodeType, attributes?:
|
|
14
|
+
lift: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType
|
|
14
15
|
}
|
|
15
16
|
}
|
|
16
17
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { liftEmptyBlock as originalLiftEmptyBlock } from '
|
|
2
|
-
|
|
1
|
+
import { liftEmptyBlock as originalLiftEmptyBlock } from '@tiptap/pm/commands'
|
|
2
|
+
|
|
3
|
+
import { RawCommands } from '../types'
|
|
3
4
|
|
|
4
5
|
declare module '@tiptap/core' {
|
|
5
|
-
interface Commands {
|
|
6
|
+
interface Commands<ReturnType> {
|
|
6
7
|
liftEmptyBlock: {
|
|
7
8
|
/**
|
|
8
9
|
* Lift block if empty.
|
|
9
10
|
*/
|
|
10
|
-
liftEmptyBlock: () =>
|
|
11
|
+
liftEmptyBlock: () => ReturnType,
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
14
|
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import getNodeType from '../helpers/getNodeType'
|
|
1
|
+
import { NodeType } from '@tiptap/pm/model'
|
|
2
|
+
import { liftListItem as originalLiftListItem } from '@tiptap/pm/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
|
liftListItem: {
|
|
9
10
|
/**
|
|
10
11
|
* Lift the list item into a wrapping list.
|
|
11
12
|
*/
|
|
12
|
-
liftListItem: (typeOrName: string | NodeType) =>
|
|
13
|
+
liftListItem: (typeOrName: string | NodeType) => ReturnType
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { newlineInCode as originalNewlineInCode } from '
|
|
2
|
-
|
|
1
|
+
import { newlineInCode as originalNewlineInCode } from '@tiptap/pm/commands'
|
|
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
|
}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import getMarkType from '../helpers/getMarkType'
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
1
|
+
import { MarkType, NodeType } from '@tiptap/pm/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'
|
|
7
8
|
|
|
8
9
|
declare module '@tiptap/core' {
|
|
9
|
-
interface Commands {
|
|
10
|
+
interface Commands<ReturnType> {
|
|
10
11
|
resetAttributes: {
|
|
11
12
|
/**
|
|
12
13
|
* Resets some node attributes to the default value.
|
|
13
14
|
*/
|
|
14
|
-
resetAttributes: (
|
|
15
|
+
resetAttributes: (
|
|
16
|
+
typeOrName: string | NodeType | MarkType,
|
|
17
|
+
attributes: string | string[],
|
|
18
|
+
) => ReturnType
|
|
15
19
|
}
|
|
16
20
|
}
|
|
17
21
|
}
|
|
@@ -21,9 +25,7 @@ export const resetAttributes: RawCommands['resetAttributes'] = (typeOrName, attr
|
|
|
21
25
|
let markType: MarkType | null = null
|
|
22
26
|
|
|
23
27
|
const schemaType = getSchemaTypeNameByName(
|
|
24
|
-
typeof typeOrName === 'string'
|
|
25
|
-
? typeOrName
|
|
26
|
-
: typeOrName.name,
|
|
28
|
+
typeof typeOrName === 'string' ? typeOrName : typeOrName.name,
|
|
27
29
|
state.schema,
|
|
28
30
|
)
|
|
29
31
|
|
|
@@ -49,7 +51,11 @@ export const resetAttributes: RawCommands['resetAttributes'] = (typeOrName, attr
|
|
|
49
51
|
if (markType && node.marks.length) {
|
|
50
52
|
node.marks.forEach(mark => {
|
|
51
53
|
if (markType === mark.type) {
|
|
52
|
-
tr.addMark(
|
|
54
|
+
tr.addMark(
|
|
55
|
+
pos,
|
|
56
|
+
pos + node.nodeSize,
|
|
57
|
+
markType.create(deleteProps(mark.attrs, attributes)),
|
|
58
|
+
)
|
|
53
59
|
}
|
|
54
60
|
})
|
|
55
61
|
}
|
|
@@ -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
|
-
import { selectNodeBackward as originalSelectNodeBackward } from '
|
|
2
|
-
|
|
1
|
+
import { selectNodeBackward as originalSelectNodeBackward } from '@tiptap/pm/commands'
|
|
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
|
-
import { selectNodeForward as originalSelectNodeForward } from '
|
|
2
|
-
|
|
1
|
+
import { selectNodeForward as originalSelectNodeForward } from '@tiptap/pm/commands'
|
|
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
|
-
import { selectParentNode as originalSelectParentNode } from '
|
|
2
|
-
|
|
1
|
+
import { selectParentNode as originalSelectParentNode } from '@tiptap/pm/commands'
|
|
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 '@tiptap/pm/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 '@tiptap/pm/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 '@tiptap/pm/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,12 +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)
|
|
33
|
-
.setMeta('preventUpdate', !emitUpdate)
|
|
26
|
+
tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate)
|
|
34
27
|
}
|
|
35
28
|
|
|
36
29
|
return true
|
package/src/commands/setMark.ts
CHANGED
|
@@ -1,38 +1,114 @@
|
|
|
1
|
-
import { MarkType } from '
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import
|
|
1
|
+
import { MarkType, ResolvedPos } from '@tiptap/pm/model'
|
|
2
|
+
import { EditorState, Transaction } from '@tiptap/pm/state'
|
|
3
|
+
|
|
4
|
+
import { isTextSelection } from '../helpers'
|
|
5
|
+
import { getMarkAttributes } from '../helpers/getMarkAttributes'
|
|
6
|
+
import { getMarkType } from '../helpers/getMarkType'
|
|
7
|
+
import { RawCommands } from '../types'
|
|
5
8
|
|
|
6
9
|
declare module '@tiptap/core' {
|
|
7
|
-
interface Commands {
|
|
10
|
+
interface Commands<ReturnType> {
|
|
8
11
|
setMark: {
|
|
9
12
|
/**
|
|
10
13
|
* Add a mark with new attributes.
|
|
11
14
|
*/
|
|
12
|
-
setMark: (typeOrName: string | MarkType, attributes?:
|
|
15
|
+
setMark: (typeOrName: string | MarkType, attributes?: Record<string, any>) => ReturnType
|
|
13
16
|
}
|
|
14
17
|
}
|
|
15
18
|
}
|
|
16
19
|
|
|
20
|
+
function canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType) {
|
|
21
|
+
const { selection } = tr
|
|
22
|
+
let cursor: ResolvedPos | null = null
|
|
23
|
+
|
|
24
|
+
if (isTextSelection(selection)) {
|
|
25
|
+
cursor = selection.$cursor
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (cursor) {
|
|
29
|
+
const currentMarks = state.storedMarks ?? cursor.marks()
|
|
30
|
+
|
|
31
|
+
// There can be no current marks that exclude the new mark
|
|
32
|
+
return (
|
|
33
|
+
!!newMarkType.isInSet(currentMarks)
|
|
34
|
+
|| !currentMarks.some(mark => mark.type.excludes(newMarkType))
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const { ranges } = selection
|
|
39
|
+
|
|
40
|
+
return ranges.some(({ $from, $to }) => {
|
|
41
|
+
let someNodeSupportsMark = $from.depth === 0
|
|
42
|
+
? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType)
|
|
43
|
+
: false
|
|
44
|
+
|
|
45
|
+
state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {
|
|
46
|
+
// If we already found a mark that we can enable, return false to bypass the remaining search
|
|
47
|
+
if (someNodeSupportsMark) {
|
|
48
|
+
return false
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (node.isInline) {
|
|
52
|
+
const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType)
|
|
53
|
+
const currentMarksAllowMarkType = !!newMarkType.isInSet(node.marks)
|
|
54
|
+
|| !node.marks.some(otherMark => otherMark.type.excludes(newMarkType))
|
|
55
|
+
|
|
56
|
+
someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType
|
|
57
|
+
}
|
|
58
|
+
return !someNodeSupportsMark
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
return someNodeSupportsMark
|
|
62
|
+
})
|
|
63
|
+
}
|
|
17
64
|
export const setMark: RawCommands['setMark'] = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {
|
|
18
65
|
const { selection } = tr
|
|
19
66
|
const { empty, ranges } = selection
|
|
20
67
|
const type = getMarkType(typeOrName, state.schema)
|
|
21
|
-
const oldAttributes = getMarkAttributes(state, type)
|
|
22
|
-
const newAttributes = {
|
|
23
|
-
...oldAttributes,
|
|
24
|
-
...attributes,
|
|
25
|
-
}
|
|
26
68
|
|
|
27
69
|
if (dispatch) {
|
|
28
70
|
if (empty) {
|
|
29
|
-
|
|
71
|
+
const oldAttributes = getMarkAttributes(state, type)
|
|
72
|
+
|
|
73
|
+
tr.addStoredMark(
|
|
74
|
+
type.create({
|
|
75
|
+
...oldAttributes,
|
|
76
|
+
...attributes,
|
|
77
|
+
}),
|
|
78
|
+
)
|
|
30
79
|
} else {
|
|
31
80
|
ranges.forEach(range => {
|
|
32
|
-
|
|
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
|
+
})
|
|
33
109
|
})
|
|
34
110
|
}
|
|
35
111
|
}
|
|
36
112
|
|
|
37
|
-
return
|
|
113
|
+
return canSetMark(state, tr, type)
|
|
38
114
|
}
|
|
@@ -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
|
+
}
|