@tiptap/core 2.0.0-beta.20 → 2.0.0-beta.200
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/packages/core/src/CommandManager.d.ts +13 -6
- package/dist/packages/core/src/Editor.d.ts +24 -19
- package/dist/packages/core/src/EventEmitter.d.ts +8 -4
- package/dist/packages/core/src/Extension.d.ts +99 -27
- package/dist/packages/core/src/ExtensionManager.d.ts +7 -13
- package/dist/packages/core/src/InputRule.d.ts +42 -0
- package/dist/packages/core/src/Mark.d.ts +139 -31
- package/dist/packages/core/src/Node.d.ts +157 -33
- package/dist/packages/core/src/NodeView.d.ts +8 -12
- 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/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 +3 -3
- 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/joinBackward.d.ts +3 -3
- package/dist/packages/core/src/commands/joinForward.d.ts +3 -3
- package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
- package/dist/packages/core/src/commands/lift.d.ts +3 -3
- package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
- package/dist/packages/core/src/commands/liftListItem.d.ts +3 -3
- 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 +3 -3
- package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
- package/dist/packages/core/src/commands/setNode.d.ts +3 -3
- 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 +3 -3
- package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
- package/dist/packages/core/src/commands/splitListItem.d.ts +3 -3
- package/dist/packages/core/src/commands/toggleList.d.ts +3 -3
- package/dist/packages/core/src/commands/toggleMark.d.ts +8 -3
- package/dist/packages/core/src/commands/toggleNode.d.ts +3 -3
- package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -3
- 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 +8 -3
- package/dist/packages/core/src/commands/updateAttributes.d.ts +4 -4
- package/dist/packages/core/src/commands/wrapIn.d.ts +3 -3
- package/dist/packages/core/src/commands/wrapInList.d.ts +3 -3
- 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 -0
- package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
- package/dist/packages/core/src/helpers/findParentNode.d.ts +2 -3
- package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +2 -2
- 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 +2 -3
- package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
- package/dist/packages/core/src/helpers/getMarkType.d.ts +1 -1
- package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
- package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +2 -3
- package/dist/packages/core/src/helpers/getNodeType.d.ts +1 -1
- package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +3 -3
- package/dist/packages/core/src/helpers/getSchema.d.ts +1 -1
- package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
- package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +1 -1
- package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +1 -1
- 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 +33 -0
- package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +1 -1
- package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
- 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 +2 -3
- package/dist/packages/core/src/helpers/isNodeActive.d.ts +2 -3
- package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +1 -1
- package/dist/packages/core/src/helpers/isNodeSelection.d.ts +1 -1
- package/dist/packages/core/src/helpers/isTextSelection.d.ts +1 -1
- 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 +1 -1
- package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
- package/dist/packages/core/src/index.d.ts +14 -21
- package/dist/packages/core/src/inputRules/index.d.ts +5 -0
- package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
- package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
- 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 +23 -0
- package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
- package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
- 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 +112 -56
- 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 +3 -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/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/dist/tiptap-core.cjs.js +2755 -1460
- package/dist/tiptap-core.cjs.js.map +1 -1
- package/dist/tiptap-core.esm.js +2709 -1448
- package/dist/tiptap-core.esm.js.map +1 -1
- package/dist/tiptap-core.umd.js +2731 -1435
- package/dist/tiptap-core.umd.js.map +1 -1
- 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 +280 -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 +9 -8
- 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 +80 -14
- 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 -147
- 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 +21 -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 -357
- 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/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/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 -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
package/src/NodeView.ts
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
|
-
import { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'
|
|
2
|
-
import { NodeSelection } from 'prosemirror-state'
|
|
3
1
|
import { Node as ProseMirrorNode } from 'prosemirror-model'
|
|
2
|
+
import { NodeSelection } from 'prosemirror-state'
|
|
3
|
+
import { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'
|
|
4
|
+
|
|
4
5
|
import { Editor as CoreEditor } from './Editor'
|
|
5
6
|
import { Node } from './Node'
|
|
6
|
-
import { NodeViewRendererProps } from './types'
|
|
7
|
-
|
|
8
|
-
interface NodeViewRendererOptions {
|
|
9
|
-
stopEvent: ((event: Event) => boolean) | null,
|
|
10
|
-
update: ((node: ProseMirrorNode, decorations: Decoration[]) => boolean) | null,
|
|
11
|
-
}
|
|
7
|
+
import { NodeViewRendererOptions, NodeViewRendererProps } from './types'
|
|
8
|
+
import { isiOS } from './utilities/isiOS'
|
|
12
9
|
|
|
13
|
-
export class NodeView<
|
|
10
|
+
export class NodeView<
|
|
11
|
+
Component,
|
|
12
|
+
Editor extends CoreEditor = CoreEditor,
|
|
13
|
+
Options extends NodeViewRendererOptions = NodeViewRendererOptions,
|
|
14
|
+
> implements ProseMirrorNodeView {
|
|
14
15
|
|
|
15
16
|
component: Component
|
|
16
17
|
|
|
17
18
|
editor: Editor
|
|
18
19
|
|
|
20
|
+
options: Options
|
|
21
|
+
|
|
19
22
|
extension: Node
|
|
20
23
|
|
|
21
24
|
node: ProseMirrorNode
|
|
@@ -26,15 +29,14 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
|
|
|
26
29
|
|
|
27
30
|
isDragging = false
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
stopEvent: null,
|
|
31
|
-
update: null,
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
constructor(component: Component, props: NodeViewRendererProps, options?: Partial<NodeViewRendererOptions>) {
|
|
32
|
+
constructor(component: Component, props: NodeViewRendererProps, options?: Partial<Options>) {
|
|
35
33
|
this.component = component
|
|
36
|
-
this.options = { ...this.options, ...options }
|
|
37
34
|
this.editor = props.editor as Editor
|
|
35
|
+
this.options = {
|
|
36
|
+
stopEvent: null,
|
|
37
|
+
ignoreMutation: null,
|
|
38
|
+
...options,
|
|
39
|
+
} as Options
|
|
38
40
|
this.extension = props.extension
|
|
39
41
|
this.node = props.node
|
|
40
42
|
this.decorations = props.decorations
|
|
@@ -47,29 +49,52 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
|
|
|
47
49
|
return
|
|
48
50
|
}
|
|
49
51
|
|
|
50
|
-
get dom():
|
|
51
|
-
return
|
|
52
|
+
get dom(): HTMLElement {
|
|
53
|
+
return this.editor.view.dom as HTMLElement
|
|
52
54
|
}
|
|
53
55
|
|
|
54
|
-
get contentDOM():
|
|
56
|
+
get contentDOM(): HTMLElement | null {
|
|
55
57
|
return null
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
onDragStart(event: DragEvent) {
|
|
59
|
-
if (!this.dom) {
|
|
60
|
-
return
|
|
61
|
-
}
|
|
62
|
-
|
|
63
61
|
const { view } = this.editor
|
|
64
62
|
const target = (event.target as HTMLElement)
|
|
65
63
|
|
|
66
|
-
|
|
64
|
+
// get the drag handle element
|
|
65
|
+
// `closest` is not available for text nodes so we may have to use its parent
|
|
66
|
+
const dragHandle = target.nodeType === 3
|
|
67
|
+
? target.parentElement?.closest('[data-drag-handle]')
|
|
68
|
+
: target.closest('[data-drag-handle]')
|
|
69
|
+
|
|
70
|
+
if (
|
|
71
|
+
!this.dom
|
|
72
|
+
|| this.contentDOM?.contains(target)
|
|
73
|
+
|| !dragHandle
|
|
74
|
+
) {
|
|
67
75
|
return
|
|
68
76
|
}
|
|
69
77
|
|
|
70
|
-
|
|
71
|
-
|
|
78
|
+
let x = 0
|
|
79
|
+
let y = 0
|
|
72
80
|
|
|
81
|
+
// calculate offset for drag element if we use a different drag handle element
|
|
82
|
+
if (this.dom !== dragHandle) {
|
|
83
|
+
const domBox = this.dom.getBoundingClientRect()
|
|
84
|
+
const handleBox = dragHandle.getBoundingClientRect()
|
|
85
|
+
|
|
86
|
+
// In React, we have to go through nativeEvent to reach offsetX/offsetY.
|
|
87
|
+
const offsetX = event.offsetX ?? (event as any).nativeEvent?.offsetX
|
|
88
|
+
const offsetY = event.offsetY ?? (event as any).nativeEvent?.offsetY
|
|
89
|
+
|
|
90
|
+
x = handleBox.x - domBox.x + offsetX
|
|
91
|
+
y = handleBox.y - domBox.y + offsetY
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
event.dataTransfer?.setDragImage(this.dom, x, y)
|
|
95
|
+
|
|
96
|
+
// we need to tell ProseMirror that we want to move the whole node
|
|
97
|
+
// so we create a NodeSelection
|
|
73
98
|
const selection = NodeSelection.create(view.state.doc, this.getPos())
|
|
74
99
|
const transaction = view.state.tr.setSelection(selection)
|
|
75
100
|
|
|
@@ -82,7 +107,7 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
|
|
|
82
107
|
}
|
|
83
108
|
|
|
84
109
|
if (typeof this.options.stopEvent === 'function') {
|
|
85
|
-
return this.options.stopEvent(event)
|
|
110
|
+
return this.options.stopEvent({ event })
|
|
86
111
|
}
|
|
87
112
|
|
|
88
113
|
const target = (event.target as HTMLElement)
|
|
@@ -93,11 +118,12 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
|
|
|
93
118
|
return false
|
|
94
119
|
}
|
|
95
120
|
|
|
121
|
+
const isDropEvent = event.type === 'drop'
|
|
96
122
|
const isInput = ['INPUT', 'BUTTON', 'SELECT', 'TEXTAREA'].includes(target.tagName)
|
|
97
123
|
|| target.isContentEditable
|
|
98
124
|
|
|
99
125
|
// any input event within node views should be ignored by ProseMirror
|
|
100
|
-
if (isInput) {
|
|
126
|
+
if (isInput && !isDropEvent) {
|
|
101
127
|
return true
|
|
102
128
|
}
|
|
103
129
|
|
|
@@ -109,7 +135,7 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
|
|
|
109
135
|
const isPasteEvent = event.type === 'paste'
|
|
110
136
|
const isCutEvent = event.type === 'cut'
|
|
111
137
|
const isClickEvent = event.type === 'mousedown'
|
|
112
|
-
const isDragEvent = event.type.startsWith('drag')
|
|
138
|
+
const isDragEvent = event.type.startsWith('drag')
|
|
113
139
|
|
|
114
140
|
// ProseMirror tries to drag selectable nodes
|
|
115
141
|
// even if `draggable` is set to `false`
|
|
@@ -145,6 +171,7 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
|
|
|
145
171
|
// these events are handled by prosemirror
|
|
146
172
|
if (
|
|
147
173
|
isDragging
|
|
174
|
+
|| isDropEvent
|
|
148
175
|
|| isCopyEvent
|
|
149
176
|
|| isPasteEvent
|
|
150
177
|
|| isCutEvent
|
|
@@ -157,37 +184,78 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
|
|
|
157
184
|
}
|
|
158
185
|
|
|
159
186
|
ignoreMutation(mutation: MutationRecord | { type: 'selection', target: Element }) {
|
|
160
|
-
if (
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
187
|
+
if (!this.dom || !this.contentDOM) {
|
|
188
|
+
return true
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (typeof this.options.ignoreMutation === 'function') {
|
|
192
|
+
return this.options.ignoreMutation({ mutation })
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// a leaf/atom node is like a black box for ProseMirror
|
|
196
|
+
// and should be fully handled by the node view
|
|
197
|
+
if (this.node.isLeaf || this.node.isAtom) {
|
|
198
|
+
return true
|
|
199
|
+
}
|
|
164
200
|
|
|
201
|
+
// ProseMirror should handle any selections
|
|
202
|
+
if (mutation.type === 'selection') {
|
|
165
203
|
return false
|
|
166
204
|
}
|
|
167
205
|
|
|
168
|
-
|
|
206
|
+
// try to prevent a bug on iOS that will break node views on enter
|
|
207
|
+
// this is because ProseMirror can’t preventDispatch on enter
|
|
208
|
+
// this will lead to a re-render of the node view on enter
|
|
209
|
+
// see: https://github.com/ueberdosis/tiptap/issues/1214
|
|
210
|
+
if (
|
|
211
|
+
this.dom.contains(mutation.target)
|
|
212
|
+
&& mutation.type === 'childList'
|
|
213
|
+
&& isiOS()
|
|
214
|
+
&& this.editor.isFocused
|
|
215
|
+
) {
|
|
216
|
+
const changedNodes = [
|
|
217
|
+
...Array.from(mutation.addedNodes),
|
|
218
|
+
...Array.from(mutation.removedNodes),
|
|
219
|
+
] as HTMLElement[]
|
|
220
|
+
|
|
221
|
+
// we’ll check if every changed node is contentEditable
|
|
222
|
+
// to make sure it’s probably mutated by ProseMirror
|
|
223
|
+
if (changedNodes.every(node => node.isContentEditable)) {
|
|
224
|
+
return false
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// we will allow mutation contentDOM with attributes
|
|
229
|
+
// so we can for example adding classes within our node view
|
|
230
|
+
if (this.contentDOM === mutation.target && mutation.type === 'attributes') {
|
|
169
231
|
return true
|
|
170
232
|
}
|
|
171
233
|
|
|
172
|
-
|
|
173
|
-
|
|
234
|
+
// ProseMirror should handle any changes within contentDOM
|
|
235
|
+
if (this.contentDOM.contains(mutation.target)) {
|
|
236
|
+
return false
|
|
237
|
+
}
|
|
174
238
|
|
|
175
|
-
return
|
|
239
|
+
return true
|
|
176
240
|
}
|
|
177
241
|
|
|
178
242
|
updateAttributes(attributes: {}) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
243
|
+
this.editor.commands.command(({ tr }) => {
|
|
244
|
+
const pos = this.getPos()
|
|
182
245
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
...attributes,
|
|
188
|
-
})
|
|
246
|
+
tr.setNodeMarkup(pos, undefined, {
|
|
247
|
+
...this.node.attrs,
|
|
248
|
+
...attributes,
|
|
249
|
+
})
|
|
189
250
|
|
|
190
|
-
|
|
251
|
+
return true
|
|
252
|
+
})
|
|
191
253
|
}
|
|
192
254
|
|
|
255
|
+
deleteNode(): void {
|
|
256
|
+
const from = this.getPos()
|
|
257
|
+
const to = from + this.node.nodeSize
|
|
258
|
+
|
|
259
|
+
this.editor.commands.deleteRange({ from, to })
|
|
260
|
+
}
|
|
193
261
|
}
|
package/src/PasteRule.ts
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { EditorState, Plugin } from 'prosemirror-state'
|
|
2
|
+
|
|
3
|
+
import { CommandManager } from './CommandManager'
|
|
4
|
+
import { Editor } from './Editor'
|
|
5
|
+
import { createChainableState } from './helpers/createChainableState'
|
|
6
|
+
import {
|
|
7
|
+
CanCommands,
|
|
8
|
+
ChainedCommands,
|
|
9
|
+
ExtendedRegExpMatchArray,
|
|
10
|
+
Range,
|
|
11
|
+
SingleCommands,
|
|
12
|
+
} from './types'
|
|
13
|
+
import { isNumber } from './utilities/isNumber'
|
|
14
|
+
import { isRegExp } from './utilities/isRegExp'
|
|
15
|
+
|
|
16
|
+
export type PasteRuleMatch = {
|
|
17
|
+
index: number,
|
|
18
|
+
text: string,
|
|
19
|
+
replaceWith?: string,
|
|
20
|
+
match?: RegExpMatchArray,
|
|
21
|
+
data?: Record<string, any>,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type PasteRuleFinder =
|
|
25
|
+
| RegExp
|
|
26
|
+
| ((text: string) => PasteRuleMatch[] | null | undefined)
|
|
27
|
+
|
|
28
|
+
export class PasteRule {
|
|
29
|
+
find: PasteRuleFinder
|
|
30
|
+
|
|
31
|
+
handler: (props: {
|
|
32
|
+
state: EditorState,
|
|
33
|
+
range: Range,
|
|
34
|
+
match: ExtendedRegExpMatchArray,
|
|
35
|
+
commands: SingleCommands,
|
|
36
|
+
chain: () => ChainedCommands,
|
|
37
|
+
can: () => CanCommands,
|
|
38
|
+
}) => void | null
|
|
39
|
+
|
|
40
|
+
constructor(config: {
|
|
41
|
+
find: PasteRuleFinder,
|
|
42
|
+
handler: (props: {
|
|
43
|
+
state: EditorState,
|
|
44
|
+
range: Range,
|
|
45
|
+
match: ExtendedRegExpMatchArray,
|
|
46
|
+
commands: SingleCommands,
|
|
47
|
+
chain: () => ChainedCommands,
|
|
48
|
+
can: () => CanCommands,
|
|
49
|
+
}) => void | null,
|
|
50
|
+
}) {
|
|
51
|
+
this.find = config.find
|
|
52
|
+
this.handler = config.handler
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const pasteRuleMatcherHandler = (text: string, find: PasteRuleFinder): ExtendedRegExpMatchArray[] => {
|
|
57
|
+
if (isRegExp(find)) {
|
|
58
|
+
return [...text.matchAll(find)]
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const matches = find(text)
|
|
62
|
+
|
|
63
|
+
if (!matches) {
|
|
64
|
+
return []
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return matches.map(pasteRuleMatch => {
|
|
68
|
+
const result: ExtendedRegExpMatchArray = []
|
|
69
|
+
|
|
70
|
+
result.push(pasteRuleMatch.text)
|
|
71
|
+
result.index = pasteRuleMatch.index
|
|
72
|
+
result.input = text
|
|
73
|
+
result.data = pasteRuleMatch.data
|
|
74
|
+
|
|
75
|
+
if (pasteRuleMatch.replaceWith) {
|
|
76
|
+
if (!pasteRuleMatch.text.includes(pasteRuleMatch.replaceWith)) {
|
|
77
|
+
console.warn('[tiptap warn]: "pasteRuleMatch.replaceWith" must be part of "pasteRuleMatch.text".')
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
result.push(pasteRuleMatch.replaceWith)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return result
|
|
84
|
+
})
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function run(config: {
|
|
88
|
+
editor: Editor,
|
|
89
|
+
state: EditorState,
|
|
90
|
+
from: number,
|
|
91
|
+
to: number,
|
|
92
|
+
rule: PasteRule,
|
|
93
|
+
}): boolean {
|
|
94
|
+
const {
|
|
95
|
+
editor,
|
|
96
|
+
state,
|
|
97
|
+
from,
|
|
98
|
+
to,
|
|
99
|
+
rule,
|
|
100
|
+
} = config
|
|
101
|
+
|
|
102
|
+
const { commands, chain, can } = new CommandManager({
|
|
103
|
+
editor,
|
|
104
|
+
state,
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
const handlers: (void | null)[] = []
|
|
108
|
+
|
|
109
|
+
state.doc.nodesBetween(from, to, (node, pos) => {
|
|
110
|
+
if (!node.isTextblock || node.type.spec.code) {
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const resolvedFrom = Math.max(from, pos)
|
|
115
|
+
const resolvedTo = Math.min(to, pos + node.content.size)
|
|
116
|
+
const textToMatch = node.textBetween(
|
|
117
|
+
resolvedFrom - pos,
|
|
118
|
+
resolvedTo - pos,
|
|
119
|
+
undefined,
|
|
120
|
+
'\ufffc',
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
const matches = pasteRuleMatcherHandler(textToMatch, rule.find)
|
|
124
|
+
|
|
125
|
+
matches.forEach(match => {
|
|
126
|
+
if (match.index === undefined) {
|
|
127
|
+
return
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const start = resolvedFrom + match.index + 1
|
|
131
|
+
const end = start + match[0].length
|
|
132
|
+
const range = {
|
|
133
|
+
from: state.tr.mapping.map(start),
|
|
134
|
+
to: state.tr.mapping.map(end),
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const handler = rule.handler({
|
|
138
|
+
state,
|
|
139
|
+
range,
|
|
140
|
+
match,
|
|
141
|
+
commands,
|
|
142
|
+
chain,
|
|
143
|
+
can,
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
handlers.push(handler)
|
|
147
|
+
})
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
const success = handlers.every(handler => handler !== null)
|
|
151
|
+
|
|
152
|
+
return success
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Create an paste rules plugin. When enabled, it will cause pasted
|
|
157
|
+
* text that matches any of the given rules to trigger the rule’s
|
|
158
|
+
* action.
|
|
159
|
+
*/
|
|
160
|
+
export function pasteRulesPlugin(props: { editor: Editor, rules: PasteRule[] }): Plugin[] {
|
|
161
|
+
const { editor, rules } = props
|
|
162
|
+
let dragSourceElement: Element | null = null
|
|
163
|
+
let draggedElement: any
|
|
164
|
+
let draggedText: Selection | null = null
|
|
165
|
+
let caretOffset: number | undefined
|
|
166
|
+
let isPastedFromProseMirror = false
|
|
167
|
+
let isDroppedFromProseMirror = false
|
|
168
|
+
|
|
169
|
+
const plugins = rules.map(rule => {
|
|
170
|
+
return new Plugin({
|
|
171
|
+
// we register a global drag handler to track the current drag source element
|
|
172
|
+
view(view) {
|
|
173
|
+
const handleDragstart = (event: DragEvent) => {
|
|
174
|
+
draggedElement = event.target
|
|
175
|
+
draggedText = window.getSelection()
|
|
176
|
+
event.dataTransfer?.setData('text/plain', draggedText?.toString() as string)
|
|
177
|
+
dragSourceElement = view.dom.parentElement?.contains(event.target as Element)
|
|
178
|
+
? view.dom.parentElement
|
|
179
|
+
: null
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const handleDragEnter = (event: DragEvent) => {
|
|
183
|
+
event.preventDefault()
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const handleDragOver = (event: DragEvent) => {
|
|
187
|
+
event.preventDefault()
|
|
188
|
+
let caretData
|
|
189
|
+
|
|
190
|
+
if (document.caretRangeFromPoint) {
|
|
191
|
+
caretData = document.caretRangeFromPoint(event.clientX, event.clientY)
|
|
192
|
+
}
|
|
193
|
+
caretOffset = caretData?.startOffset
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
window.addEventListener('dragstart', handleDragstart)
|
|
197
|
+
|
|
198
|
+
window.addEventListener('dragenter', handleDragEnter)
|
|
199
|
+
|
|
200
|
+
window.addEventListener('dragover', handleDragOver)
|
|
201
|
+
|
|
202
|
+
return {
|
|
203
|
+
destroy() {
|
|
204
|
+
window.removeEventListener('dragstart', handleDragstart)
|
|
205
|
+
window.removeEventListener('dragenter', handleDragEnter)
|
|
206
|
+
window.removeEventListener('dragover', handleDragOver)
|
|
207
|
+
},
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
|
|
211
|
+
props: {
|
|
212
|
+
handleDOMEvents: {
|
|
213
|
+
drop: (view, event: any) => {
|
|
214
|
+
isDroppedFromProseMirror = dragSourceElement === view.dom.parentElement
|
|
215
|
+
event.preventDefault()
|
|
216
|
+
|
|
217
|
+
const data = event.dataTransfer?.getData('text/plain')
|
|
218
|
+
|
|
219
|
+
if (event.target.parentElement.className === 'ProseMirror') {
|
|
220
|
+
draggedElement.textContent = draggedElement.textContent.replace(data, '')
|
|
221
|
+
event.target.textContent = event.target.textContent.slice(0, caretOffset) + data + event.target.textContent.slice(caretOffset)
|
|
222
|
+
}
|
|
223
|
+
return false
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
paste: (view, event: Event) => {
|
|
227
|
+
const html = (event as ClipboardEvent).clipboardData?.getData('text/html')
|
|
228
|
+
|
|
229
|
+
isPastedFromProseMirror = !!html?.includes('data-pm-slice')
|
|
230
|
+
|
|
231
|
+
return false
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
appendTransaction: (transactions, oldState, state) => {
|
|
237
|
+
const transaction = transactions[0]
|
|
238
|
+
const isPaste = transaction.getMeta('uiEvent') === 'paste' && !isPastedFromProseMirror
|
|
239
|
+
const isDrop = transaction.getMeta('uiEvent') === 'drop' && !isDroppedFromProseMirror
|
|
240
|
+
|
|
241
|
+
if (!isPaste && !isDrop) {
|
|
242
|
+
return
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// stop if there is no changed range
|
|
246
|
+
const from = oldState.doc.content.findDiffStart(state.doc.content)
|
|
247
|
+
const to = oldState.doc.content.findDiffEnd(state.doc.content)
|
|
248
|
+
|
|
249
|
+
if (!isNumber(from) || !to || from === to.b) {
|
|
250
|
+
return
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// build a chainable state
|
|
254
|
+
// so we can use a single transaction for all paste rules
|
|
255
|
+
const tr = state.tr
|
|
256
|
+
const chainableState = createChainableState({
|
|
257
|
+
state,
|
|
258
|
+
transaction: tr,
|
|
259
|
+
})
|
|
260
|
+
|
|
261
|
+
const handler = run({
|
|
262
|
+
editor,
|
|
263
|
+
state: chainableState,
|
|
264
|
+
from: Math.max(from - 1, 0),
|
|
265
|
+
to: to.b - 1,
|
|
266
|
+
rule,
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
// stop if there are no changes
|
|
270
|
+
if (!handler || !tr.steps.length) {
|
|
271
|
+
return
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return tr
|
|
275
|
+
},
|
|
276
|
+
})
|
|
277
|
+
})
|
|
278
|
+
|
|
279
|
+
return plugins
|
|
280
|
+
}
|
package/src/Tracker.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Transaction } from 'prosemirror-state'
|
|
2
|
+
|
|
3
|
+
export interface TrackerResult {
|
|
4
|
+
position: number,
|
|
5
|
+
deleted: boolean,
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class Tracker {
|
|
9
|
+
|
|
10
|
+
transaction: Transaction
|
|
11
|
+
|
|
12
|
+
currentStep: number
|
|
13
|
+
|
|
14
|
+
constructor(transaction: Transaction) {
|
|
15
|
+
this.transaction = transaction
|
|
16
|
+
this.currentStep = this.transaction.steps.length
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
map(position: number): TrackerResult {
|
|
20
|
+
let deleted = false
|
|
21
|
+
|
|
22
|
+
const mappedPosition = this.transaction.steps
|
|
23
|
+
.slice(this.currentStep)
|
|
24
|
+
.reduce((newPosition, step) => {
|
|
25
|
+
const mapResult = step
|
|
26
|
+
.getMap()
|
|
27
|
+
.mapResult(newPosition)
|
|
28
|
+
|
|
29
|
+
if (mapResult.deleted) {
|
|
30
|
+
deleted = true
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return mapResult.pos
|
|
34
|
+
}, position)
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
position: mappedPosition,
|
|
38
|
+
deleted,
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
}
|
package/src/commands/blur.ts
CHANGED
|
@@ -1,20 +1,26 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RawCommands } from '../types'
|
|
2
2
|
|
|
3
3
|
declare module '@tiptap/core' {
|
|
4
|
-
interface Commands {
|
|
4
|
+
interface Commands<ReturnType> {
|
|
5
5
|
blur: {
|
|
6
6
|
/**
|
|
7
7
|
* Removes focus from the editor.
|
|
8
8
|
*/
|
|
9
|
-
blur: () =>
|
|
9
|
+
blur: () => ReturnType,
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
export const blur: RawCommands['blur'] = () => ({ view }) => {
|
|
15
|
-
|
|
14
|
+
export const blur: RawCommands['blur'] = () => ({ editor, view }) => {
|
|
15
|
+
requestAnimationFrame(() => {
|
|
16
|
+
if (!editor.isDestroyed) {
|
|
17
|
+
(view.dom as HTMLElement).blur()
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
// Browsers should remove the caret on blur but safari does not.
|
|
20
|
+
// See: https://github.com/ueberdosis/tiptap/issues/2405
|
|
21
|
+
window?.getSelection()?.removeAllRanges()
|
|
22
|
+
}
|
|
23
|
+
})
|
|
18
24
|
|
|
19
25
|
return true
|
|
20
26
|
}
|
|
@@ -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
|
clearContent: {
|
|
6
6
|
/**
|
|
7
7
|
* Clear the whole document.
|
|
8
8
|
*/
|
|
9
|
-
clearContent: (emitUpdate
|
|
9
|
+
clearContent: (emitUpdate?: boolean) => ReturnType,
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { liftTarget } from 'prosemirror-transform'
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import { RawCommands } from '../types'
|
|
3
4
|
|
|
4
5
|
declare module '@tiptap/core' {
|
|
5
|
-
interface Commands {
|
|
6
|
+
interface Commands<ReturnType> {
|
|
6
7
|
clearNodes: {
|
|
7
8
|
/**
|
|
8
9
|
* Normalize nodes to a simple paragraph.
|
|
9
10
|
*/
|
|
10
|
-
clearNodes: () =>
|
|
11
|
+
clearNodes: () => ReturnType,
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
14
|
}
|
|
@@ -16,24 +17,35 @@ export const clearNodes: RawCommands['clearNodes'] = () => ({ state, tr, dispatc
|
|
|
16
17
|
const { selection } = tr
|
|
17
18
|
const { ranges } = selection
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const fromPos = tr.doc.resolve(tr.mapping.map(pos + 1))
|
|
23
|
-
const toPos = tr.doc.resolve(tr.mapping.map(pos + node.nodeSize - 1))
|
|
24
|
-
const nodeRange = fromPos.blockRange(toPos)
|
|
20
|
+
if (!dispatch) {
|
|
21
|
+
return true
|
|
22
|
+
}
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
ranges.forEach(({ $from, $to }) => {
|
|
25
|
+
state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {
|
|
26
|
+
if (node.type.isText) {
|
|
27
|
+
return
|
|
28
|
+
}
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
const { doc, mapping } = tr
|
|
31
|
+
const $mappedFrom = doc.resolve(mapping.map(pos))
|
|
32
|
+
const $mappedTo = doc.resolve(mapping.map(pos + node.nodeSize))
|
|
33
|
+
const nodeRange = $mappedFrom.blockRange($mappedTo)
|
|
34
|
+
|
|
35
|
+
if (!nodeRange) {
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const targetLiftDepth = liftTarget(nodeRange)
|
|
40
|
+
|
|
41
|
+
if (node.type.isTextblock) {
|
|
42
|
+
const { defaultType } = $mappedFrom.parent.contentMatchAt($mappedFrom.index())
|
|
43
|
+
|
|
44
|
+
tr.setNodeMarkup(nodeRange.start, defaultType)
|
|
45
|
+
}
|
|
32
46
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
}
|
|
47
|
+
if (targetLiftDepth || targetLiftDepth === 0) {
|
|
48
|
+
tr.lift(nodeRange, targetLiftDepth)
|
|
37
49
|
}
|
|
38
50
|
})
|
|
39
51
|
})
|