@tiptap/core 2.0.0-beta.21 → 2.0.0-beta.210
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 +4311 -0
- package/dist/index.d.ts +2330 -0
- package/dist/index.js +4311 -0
- package/package.json +39 -25
- package/src/CommandManager.ts +76 -86
- package/src/Editor.ts +120 -81
- package/src/EventEmitter.ts +14 -4
- package/src/Extension.ts +280 -108
- package/src/ExtensionManager.ts +254 -108
- package/src/InputRule.ts +260 -0
- package/src/Mark.ts +398 -147
- package/src/Node.ts +437 -171
- package/src/NodeView.ts +132 -63
- 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 +94 -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 +46 -29
- package/src/commands/toggleList.ts +88 -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 +18 -0
- 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 +33 -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 -24
- 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 +59 -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 +170 -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 -365
- 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 -148
- package/dist/packages/core/src/ExtensionManager.d.ts +0 -24
- package/dist/packages/core/src/Mark.d.ts +0 -211
- package/dist/packages/core/src/Node.d.ts +0 -265
- 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/resetAttributes.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 -100
- 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 -154
- 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 -3027
- package/dist/tiptap-core.cjs.js.map +0 -1
- package/dist/tiptap-core.esm.js +0 -3002
- package/dist/tiptap-core.esm.js.map +0 -1
- package/dist/tiptap-core.umd.js +0 -3024
- 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,26 @@
|
|
|
1
|
+
import { ResolvedPos } from '@tiptap/pm/model'
|
|
2
|
+
|
|
3
|
+
export const getTextContentFromNodes = ($from: ResolvedPos, maxMatch = 500) => {
|
|
4
|
+
let textBefore = ''
|
|
5
|
+
|
|
6
|
+
const sliceEndPos = $from.parentOffset
|
|
7
|
+
|
|
8
|
+
$from.parent.nodesBetween(
|
|
9
|
+
Math.max(0, sliceEndPos - maxMatch),
|
|
10
|
+
sliceEndPos,
|
|
11
|
+
(node, pos, parent, index) => {
|
|
12
|
+
const chunk = node.type.spec.toText?.({
|
|
13
|
+
node,
|
|
14
|
+
pos,
|
|
15
|
+
parent,
|
|
16
|
+
index,
|
|
17
|
+
})
|
|
18
|
+
|| node.textContent
|
|
19
|
+
|| '%leaf%'
|
|
20
|
+
|
|
21
|
+
textBefore += chunk.slice(0, Math.max(0, sliceEndPos - pos))
|
|
22
|
+
},
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
return textBefore
|
|
26
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Schema } from '@tiptap/pm/model'
|
|
2
|
+
|
|
3
|
+
import { TextSerializer } from '../types'
|
|
4
|
+
|
|
5
|
+
export function getTextSerializersFromSchema(schema: Schema): Record<string, TextSerializer> {
|
|
6
|
+
return Object.fromEntries(
|
|
7
|
+
Object.entries(schema.nodes)
|
|
8
|
+
.filter(([, node]) => node.spec.toText)
|
|
9
|
+
.map(([name, node]) => [name, node.spec.toText]),
|
|
10
|
+
)
|
|
11
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export * from './combineTransactionSteps'
|
|
2
|
+
export * from './defaultBlockAt'
|
|
3
|
+
export * from './findChildren'
|
|
4
|
+
export * from './findChildrenInRange'
|
|
5
|
+
export * from './findParentNode'
|
|
6
|
+
export * from './findParentNodeClosestToPos'
|
|
7
|
+
export * from './generateHTML'
|
|
8
|
+
export * from './generateJSON'
|
|
9
|
+
export * from './generateText'
|
|
10
|
+
export * from './getAttributes'
|
|
11
|
+
export * from './getChangedRanges'
|
|
12
|
+
export * from './getDebugJSON'
|
|
13
|
+
export * from './getExtensionField'
|
|
14
|
+
export * from './getHTMLFromFragment'
|
|
15
|
+
export * from './getMarkAttributes'
|
|
16
|
+
export * from './getMarkRange'
|
|
17
|
+
export * from './getMarksBetween'
|
|
18
|
+
export * from './getMarkType'
|
|
19
|
+
export * from './getNodeAttributes'
|
|
20
|
+
export * from './getNodeType'
|
|
21
|
+
export * from './getSchema'
|
|
22
|
+
export * from './getText'
|
|
23
|
+
export * from './getTextBetween'
|
|
24
|
+
export * from './getTextContentFromNodes'
|
|
25
|
+
export * from './getTextSerializersFromSchema'
|
|
26
|
+
export * from './isActive'
|
|
27
|
+
export * from './isList'
|
|
28
|
+
export * from './isMarkActive'
|
|
29
|
+
export * from './isNodeActive'
|
|
30
|
+
export * from './isNodeEmpty'
|
|
31
|
+
export * from './isNodeSelection'
|
|
32
|
+
export * from './isTextSelection'
|
|
33
|
+
export * from './posToDOMRect'
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { ParseRule } from '
|
|
1
|
+
import { ParseRule } from '@tiptap/pm/model'
|
|
2
|
+
|
|
2
3
|
import { ExtensionAttribute } from '../types'
|
|
3
|
-
import fromString from '../utilities/fromString'
|
|
4
|
+
import { fromString } from '../utilities/fromString'
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* This function merges extension attributes into parserule attributes (`attrs` or `getAttrs`).
|
|
@@ -8,7 +9,10 @@ import fromString from '../utilities/fromString'
|
|
|
8
9
|
* @param parseRule ProseMirror ParseRule
|
|
9
10
|
* @param extensionAttributes List of attributes to inject
|
|
10
11
|
*/
|
|
11
|
-
export
|
|
12
|
+
export function injectExtensionAttributesToParseRule(
|
|
13
|
+
parseRule: ParseRule,
|
|
14
|
+
extensionAttributes: ExtensionAttribute[],
|
|
15
|
+
): ParseRule {
|
|
12
16
|
if (parseRule.style) {
|
|
13
17
|
return parseRule
|
|
14
18
|
}
|
|
@@ -16,31 +20,26 @@ export default function injectExtensionAttributesToParseRule(parseRule: ParseRul
|
|
|
16
20
|
return {
|
|
17
21
|
...parseRule,
|
|
18
22
|
getAttrs: node => {
|
|
19
|
-
const oldAttributes = parseRule.getAttrs
|
|
20
|
-
? parseRule.getAttrs(node)
|
|
21
|
-
: parseRule.attrs
|
|
23
|
+
const oldAttributes = parseRule.getAttrs ? parseRule.getAttrs(node) : parseRule.attrs
|
|
22
24
|
|
|
23
25
|
if (oldAttributes === false) {
|
|
24
26
|
return false
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
const newAttributes = extensionAttributes
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
...filteredAttributes,
|
|
42
|
-
}
|
|
43
|
-
}, {})
|
|
29
|
+
const newAttributes = extensionAttributes.reduce((items, item) => {
|
|
30
|
+
const value = item.attribute.parseHTML
|
|
31
|
+
? item.attribute.parseHTML(node as HTMLElement)
|
|
32
|
+
: fromString((node as HTMLElement).getAttribute(item.name))
|
|
33
|
+
|
|
34
|
+
if (value === null || value === undefined) {
|
|
35
|
+
return items
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
...items,
|
|
40
|
+
[item.name]: value,
|
|
41
|
+
}
|
|
42
|
+
}, {})
|
|
44
43
|
|
|
45
44
|
return { ...oldAttributes, ...newAttributes }
|
|
46
45
|
},
|
package/src/helpers/isActive.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { EditorState } from '
|
|
2
|
-
import isNodeActive from './isNodeActive'
|
|
3
|
-
import isMarkActive from './isMarkActive'
|
|
4
|
-
import getSchemaTypeNameByName from './getSchemaTypeNameByName'
|
|
5
|
-
import { AnyObject } from '../types'
|
|
1
|
+
import { EditorState } from '@tiptap/pm/state'
|
|
6
2
|
|
|
7
|
-
|
|
3
|
+
import { getSchemaTypeNameByName } from './getSchemaTypeNameByName'
|
|
4
|
+
import { isMarkActive } from './isMarkActive'
|
|
5
|
+
import { isNodeActive } from './isNodeActive'
|
|
6
|
+
|
|
7
|
+
export function isActive(
|
|
8
|
+
state: EditorState,
|
|
9
|
+
name: string | null,
|
|
10
|
+
attributes: Record<string, any> = {},
|
|
11
|
+
): boolean {
|
|
8
12
|
if (!name) {
|
|
9
13
|
return isNodeActive(state, null, attributes) || isMarkActive(state, null, attributes)
|
|
10
14
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnyExtension, EnableRules } from '../types'
|
|
2
|
+
|
|
3
|
+
export function isExtensionRulesEnabled(extension: AnyExtension, enabled: EnableRules): boolean {
|
|
4
|
+
if (Array.isArray(enabled)) {
|
|
5
|
+
return enabled.some(enabledExtension => {
|
|
6
|
+
const name = typeof enabledExtension === 'string'
|
|
7
|
+
? enabledExtension
|
|
8
|
+
: enabledExtension.name
|
|
9
|
+
|
|
10
|
+
return name === extension.name
|
|
11
|
+
})
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return enabled
|
|
15
|
+
}
|
package/src/helpers/isList.ts
CHANGED
|
@@ -1,20 +1,27 @@
|
|
|
1
|
+
import { NodeConfig } from '..'
|
|
2
|
+
import { getExtensionField } from '../helpers/getExtensionField'
|
|
1
3
|
import { Extensions } from '../types'
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
+
import { callOrReturn } from '../utilities/callOrReturn'
|
|
5
|
+
import { splitExtensions } from './splitExtensions'
|
|
4
6
|
|
|
5
|
-
export
|
|
7
|
+
export function isList(name: string, extensions: Extensions): boolean {
|
|
6
8
|
const { nodeExtensions } = splitExtensions(extensions)
|
|
7
|
-
const extension = nodeExtensions.find(item => item.
|
|
9
|
+
const extension = nodeExtensions.find(item => item.name === name)
|
|
8
10
|
|
|
9
11
|
if (!extension) {
|
|
10
12
|
return false
|
|
11
13
|
}
|
|
12
14
|
|
|
13
|
-
const
|
|
15
|
+
const context = {
|
|
16
|
+
name: extension.name,
|
|
17
|
+
options: extension.options,
|
|
18
|
+
storage: extension.storage,
|
|
19
|
+
}
|
|
20
|
+
const group = callOrReturn(getExtensionField<NodeConfig['group']>(extension, 'group', context))
|
|
14
21
|
|
|
15
|
-
if (typeof
|
|
22
|
+
if (typeof group !== 'string') {
|
|
16
23
|
return false
|
|
17
24
|
}
|
|
18
25
|
|
|
19
|
-
return
|
|
26
|
+
return group.split(' ').includes('list')
|
|
20
27
|
}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import objectIncludes from '../utilities/objectIncludes'
|
|
4
|
-
import getMarkType from './getMarkType'
|
|
5
|
-
import { AnyObject, MarkRange } from '../types'
|
|
1
|
+
import { MarkType } from '@tiptap/pm/model'
|
|
2
|
+
import { EditorState } from '@tiptap/pm/state'
|
|
6
3
|
|
|
7
|
-
|
|
4
|
+
import { MarkRange } from '../types'
|
|
5
|
+
import { objectIncludes } from '../utilities/objectIncludes'
|
|
6
|
+
import { getMarkType } from './getMarkType'
|
|
7
|
+
|
|
8
|
+
export function isMarkActive(
|
|
8
9
|
state: EditorState,
|
|
9
10
|
typeOrName: MarkType | string | null,
|
|
10
|
-
attributes:
|
|
11
|
+
attributes: Record<string, any> = {},
|
|
11
12
|
): boolean {
|
|
12
|
-
const {
|
|
13
|
-
const type = typeOrName
|
|
14
|
-
? getMarkType(typeOrName, state.schema)
|
|
15
|
-
: null
|
|
13
|
+
const { empty, ranges } = state.selection
|
|
14
|
+
const type = typeOrName ? getMarkType(typeOrName, state.schema) : null
|
|
16
15
|
|
|
17
16
|
if (empty) {
|
|
18
17
|
return !!(state.storedMarks || state.selection.$from.marks())
|
|
@@ -23,33 +22,43 @@ export default function isMarkActive(
|
|
|
23
22
|
|
|
24
23
|
return type.name === mark.type.name
|
|
25
24
|
})
|
|
26
|
-
.find(mark => objectIncludes(mark.attrs, attributes))
|
|
25
|
+
.find(mark => objectIncludes(mark.attrs, attributes, { strict: false }))
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
let selectionRange = 0
|
|
30
|
-
|
|
29
|
+
const markRanges: MarkRange[] = []
|
|
30
|
+
|
|
31
|
+
ranges.forEach(({ $from, $to }) => {
|
|
32
|
+
const from = $from.pos
|
|
33
|
+
const to = $to.pos
|
|
34
|
+
|
|
35
|
+
state.doc.nodesBetween(from, to, (node, pos) => {
|
|
36
|
+
if (!node.isText && !node.marks.length) {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
31
39
|
|
|
32
|
-
state.doc.nodesBetween(from, to, (node, pos) => {
|
|
33
|
-
if (node.isText) {
|
|
34
40
|
const relativeFrom = Math.max(from, pos)
|
|
35
41
|
const relativeTo = Math.min(to, pos + node.nodeSize)
|
|
36
42
|
const range = relativeTo - relativeFrom
|
|
37
43
|
|
|
38
44
|
selectionRange += range
|
|
39
45
|
|
|
40
|
-
markRanges
|
|
41
|
-
mark
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
markRanges.push(
|
|
47
|
+
...node.marks.map(mark => ({
|
|
48
|
+
mark,
|
|
49
|
+
from: relativeFrom,
|
|
50
|
+
to: relativeTo,
|
|
51
|
+
})),
|
|
52
|
+
)
|
|
53
|
+
})
|
|
46
54
|
})
|
|
47
55
|
|
|
48
56
|
if (selectionRange === 0) {
|
|
49
57
|
return false
|
|
50
58
|
}
|
|
51
59
|
|
|
52
|
-
|
|
60
|
+
// calculate range of matched mark
|
|
61
|
+
const matchedRange = markRanges
|
|
53
62
|
.filter(markRange => {
|
|
54
63
|
if (!type) {
|
|
55
64
|
return true
|
|
@@ -57,11 +66,24 @@ export default function isMarkActive(
|
|
|
57
66
|
|
|
58
67
|
return type.name === markRange.mark.type.name
|
|
59
68
|
})
|
|
60
|
-
.filter(markRange => objectIncludes(markRange.mark.attrs, attributes))
|
|
61
|
-
.reduce((sum, markRange) =>
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
69
|
+
.filter(markRange => objectIncludes(markRange.mark.attrs, attributes, { strict: false }))
|
|
70
|
+
.reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)
|
|
71
|
+
|
|
72
|
+
// calculate range of marks that excludes the searched mark
|
|
73
|
+
// for example `code` doesn’t allow any other marks
|
|
74
|
+
const excludedRange = markRanges
|
|
75
|
+
.filter(markRange => {
|
|
76
|
+
if (!type) {
|
|
77
|
+
return true
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return markRange.mark.type !== type && markRange.mark.type.excludes(type)
|
|
81
|
+
})
|
|
82
|
+
.reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)
|
|
83
|
+
|
|
84
|
+
// we only include the result of `excludedRange`
|
|
85
|
+
// if there is a match at all
|
|
86
|
+
const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange
|
|
65
87
|
|
|
66
88
|
return range >= selectionRange
|
|
67
89
|
}
|
|
@@ -1,49 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import objectIncludes from '../utilities/objectIncludes'
|
|
4
|
-
import getNodeType from './getNodeType'
|
|
5
|
-
import { AnyObject, NodeRange } from '../types'
|
|
1
|
+
import { NodeType } from '@tiptap/pm/model'
|
|
2
|
+
import { EditorState } from '@tiptap/pm/state'
|
|
6
3
|
|
|
7
|
-
|
|
4
|
+
import { NodeRange } from '../types'
|
|
5
|
+
import { objectIncludes } from '../utilities/objectIncludes'
|
|
6
|
+
import { getNodeType } from './getNodeType'
|
|
7
|
+
|
|
8
|
+
export function isNodeActive(
|
|
8
9
|
state: EditorState,
|
|
9
10
|
typeOrName: NodeType | string | null,
|
|
10
|
-
attributes:
|
|
11
|
+
attributes: Record<string, any> = {},
|
|
11
12
|
): boolean {
|
|
12
13
|
const { from, to, empty } = state.selection
|
|
13
|
-
const type = typeOrName
|
|
14
|
-
? getNodeType(typeOrName, state.schema)
|
|
15
|
-
: null
|
|
14
|
+
const type = typeOrName ? getNodeType(typeOrName, state.schema) : null
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
const nodeRanges: NodeRange[] = []
|
|
18
17
|
|
|
19
18
|
state.doc.nodesBetween(from, to, (node, pos) => {
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
const relativeTo = Math.min(to, pos + node.nodeSize)
|
|
23
|
-
|
|
24
|
-
nodeRanges = [...nodeRanges, {
|
|
25
|
-
node,
|
|
26
|
-
from: relativeFrom,
|
|
27
|
-
to: relativeTo,
|
|
28
|
-
}]
|
|
19
|
+
if (node.isText) {
|
|
20
|
+
return
|
|
29
21
|
}
|
|
30
|
-
})
|
|
31
22
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
.filter(nodeRange => {
|
|
35
|
-
if (!type) {
|
|
36
|
-
return true
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return type.name === nodeRange.node.type.name
|
|
40
|
-
})
|
|
41
|
-
.find(nodeRange => objectIncludes(nodeRange.node.attrs, attributes))
|
|
42
|
-
}
|
|
23
|
+
const relativeFrom = Math.max(from, pos)
|
|
24
|
+
const relativeTo = Math.min(to, pos + node.nodeSize)
|
|
43
25
|
|
|
44
|
-
|
|
26
|
+
nodeRanges.push({
|
|
27
|
+
node,
|
|
28
|
+
from: relativeFrom,
|
|
29
|
+
to: relativeTo,
|
|
30
|
+
})
|
|
31
|
+
})
|
|
45
32
|
|
|
46
|
-
const
|
|
33
|
+
const selectionRange = to - from
|
|
34
|
+
const matchedNodeRanges = nodeRanges
|
|
47
35
|
.filter(nodeRange => {
|
|
48
36
|
if (!type) {
|
|
49
37
|
return true
|
|
@@ -51,11 +39,13 @@ export default function isNodeActive(
|
|
|
51
39
|
|
|
52
40
|
return type.name === nodeRange.node.type.name
|
|
53
41
|
})
|
|
54
|
-
.filter(nodeRange => objectIncludes(nodeRange.node.attrs, attributes))
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
42
|
+
.filter(nodeRange => objectIncludes(nodeRange.node.attrs, attributes, { strict: false }))
|
|
43
|
+
|
|
44
|
+
if (empty) {
|
|
45
|
+
return !!matchedNodeRanges.length
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const range = matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0)
|
|
59
49
|
|
|
60
50
|
return range >= selectionRange
|
|
61
51
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Node as ProseMirrorNode } from '
|
|
1
|
+
import { Node as ProseMirrorNode } from '@tiptap/pm/model'
|
|
2
2
|
|
|
3
|
-
export
|
|
3
|
+
export function isNodeEmpty(node: ProseMirrorNode): boolean {
|
|
4
4
|
const defaultContent = node.type.createAndFill()?.toJSON()
|
|
5
5
|
const content = node.toJSON()
|
|
6
6
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { NodeSelection } from '
|
|
2
|
-
import isObject from '../utilities/isObject'
|
|
1
|
+
import { NodeSelection } from '@tiptap/pm/state'
|
|
3
2
|
|
|
4
|
-
export
|
|
5
|
-
return
|
|
3
|
+
export function isNodeSelection(value: unknown): value is NodeSelection {
|
|
4
|
+
return value instanceof NodeSelection
|
|
6
5
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { TextSelection } from '
|
|
2
|
-
import isObject from '../utilities/isObject'
|
|
1
|
+
import { TextSelection } from '@tiptap/pm/state'
|
|
3
2
|
|
|
4
|
-
export
|
|
5
|
-
return
|
|
3
|
+
export function isTextSelection(value: unknown): value is TextSelection {
|
|
4
|
+
return value instanceof TextSelection
|
|
6
5
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { EditorView } from '@tiptap/pm/view'
|
|
2
|
+
|
|
3
|
+
import { minMax } from '../utilities/minMax'
|
|
4
|
+
|
|
5
|
+
export function posToDOMRect(view: EditorView, from: number, to: number): DOMRect {
|
|
6
|
+
const minPos = 0
|
|
7
|
+
const maxPos = view.state.doc.content.size
|
|
8
|
+
const resolvedFrom = minMax(from, minPos, maxPos)
|
|
9
|
+
const resolvedEnd = minMax(to, minPos, maxPos)
|
|
10
|
+
const start = view.coordsAtPos(resolvedFrom)
|
|
11
|
+
const end = view.coordsAtPos(resolvedEnd, -1)
|
|
12
|
+
const top = Math.min(start.top, end.top)
|
|
13
|
+
const bottom = Math.max(start.bottom, end.bottom)
|
|
14
|
+
const left = Math.min(start.left, end.left)
|
|
15
|
+
const right = Math.max(start.right, end.right)
|
|
16
|
+
const width = right - left
|
|
17
|
+
const height = bottom - top
|
|
18
|
+
const x = left
|
|
19
|
+
const y = top
|
|
20
|
+
const data = {
|
|
21
|
+
top,
|
|
22
|
+
bottom,
|
|
23
|
+
left,
|
|
24
|
+
right,
|
|
25
|
+
width,
|
|
26
|
+
height,
|
|
27
|
+
x,
|
|
28
|
+
y,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
...data,
|
|
33
|
+
toJSON: () => data,
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Node as ProseMirrorNode } from '@tiptap/pm/model'
|
|
2
|
+
import { Selection, TextSelection } from '@tiptap/pm/state'
|
|
3
|
+
|
|
4
|
+
import { FocusPosition } from '../types'
|
|
5
|
+
import { minMax } from '../utilities/minMax'
|
|
6
|
+
|
|
7
|
+
export function resolveFocusPosition(
|
|
8
|
+
doc: ProseMirrorNode,
|
|
9
|
+
position: FocusPosition = null,
|
|
10
|
+
): Selection | null {
|
|
11
|
+
if (!position) {
|
|
12
|
+
return null
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const selectionAtStart = Selection.atStart(doc)
|
|
16
|
+
const selectionAtEnd = Selection.atEnd(doc)
|
|
17
|
+
|
|
18
|
+
if (position === 'start' || position === true) {
|
|
19
|
+
return selectionAtStart
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (position === 'end') {
|
|
23
|
+
return selectionAtEnd
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const minPos = selectionAtStart.from
|
|
27
|
+
const maxPos = selectionAtEnd.to
|
|
28
|
+
|
|
29
|
+
if (position === 'all') {
|
|
30
|
+
return TextSelection.create(
|
|
31
|
+
doc,
|
|
32
|
+
minMax(0, minPos, maxPos),
|
|
33
|
+
minMax(doc.content.size, minPos, maxPos),
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return TextSelection.create(
|
|
38
|
+
doc,
|
|
39
|
+
minMax(position, minPos, maxPos),
|
|
40
|
+
minMax(position, minPos, maxPos),
|
|
41
|
+
)
|
|
42
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Selection, Transaction } from '
|
|
2
|
-
import {
|
|
1
|
+
import { Selection, Transaction } from '@tiptap/pm/state'
|
|
2
|
+
import { ReplaceAroundStep, ReplaceStep } from '@tiptap/pm/transform'
|
|
3
3
|
|
|
4
4
|
// source: https://github.com/ProseMirror/prosemirror-state/blob/master/src/selection.js#L466
|
|
5
|
-
export
|
|
5
|
+
export function selectionToInsertionEnd(tr: Transaction, startLen: number, bias: number) {
|
|
6
6
|
const last = tr.steps.length - 1
|
|
7
7
|
|
|
8
8
|
if (last < startLen) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Extensions } from '../types'
|
|
2
1
|
import { Extension } from '../Extension'
|
|
3
|
-
import { Node } from '../Node'
|
|
4
2
|
import { Mark } from '../Mark'
|
|
3
|
+
import { Node } from '../Node'
|
|
4
|
+
import { Extensions } from '../types'
|
|
5
5
|
|
|
6
|
-
export
|
|
6
|
+
export function splitExtensions(extensions: Extensions) {
|
|
7
7
|
const baseExtensions = extensions.filter(extension => extension.type === 'extension') as Extension[]
|
|
8
8
|
const nodeExtensions = extensions.filter(extension => extension.type === 'node') as Node[]
|
|
9
9
|
const markExtensions = extensions.filter(extension => extension.type === 'mark') as Mark[]
|
package/src/index.ts
CHANGED
|
@@ -1,36 +1,27 @@
|
|
|
1
|
+
export * from './CommandManager'
|
|
1
2
|
export * from './Editor'
|
|
2
3
|
export * from './Extension'
|
|
3
|
-
export * from './
|
|
4
|
+
export * as extensions from './extensions'
|
|
5
|
+
export * from './helpers'
|
|
6
|
+
export * from './InputRule'
|
|
7
|
+
export * from './inputRules'
|
|
4
8
|
export * from './Mark'
|
|
9
|
+
export * from './Node'
|
|
5
10
|
export * from './NodeView'
|
|
11
|
+
export * from './PasteRule'
|
|
12
|
+
export * from './pasteRules'
|
|
13
|
+
export * from './Tracker'
|
|
6
14
|
export * from './types'
|
|
15
|
+
export * from './utilities'
|
|
7
16
|
|
|
8
|
-
|
|
9
|
-
export
|
|
10
|
-
export { default as markPasteRule } from './pasteRules/markPasteRule'
|
|
11
|
-
|
|
12
|
-
export { default as callOrReturn } from './utilities/callOrReturn'
|
|
13
|
-
export { default as mergeAttributes } from './utilities/mergeAttributes'
|
|
14
|
-
|
|
15
|
-
export { default as generateHTML } from './helpers/generateHTML'
|
|
16
|
-
export { default as getSchema } from './helpers/getSchema'
|
|
17
|
-
export { default as getHTMLFromFragment } from './helpers/getHTMLFromFragment'
|
|
18
|
-
export { default as getMarkAttributes } from './helpers/getMarkAttributes'
|
|
19
|
-
export { default as isActive } from './helpers/isActive'
|
|
20
|
-
export { default as isMarkActive } from './helpers/isMarkActive'
|
|
21
|
-
export { default as isNodeActive } from './helpers/isNodeActive'
|
|
22
|
-
export { default as isNodeEmpty } from './helpers/isNodeEmpty'
|
|
23
|
-
export { default as isNodeSelection } from './helpers/isNodeSelection'
|
|
24
|
-
export { default as isTextSelection } from './helpers/isTextSelection'
|
|
25
|
-
export { default as findParentNodeClosestToPos } from './helpers/findParentNodeClosestToPos'
|
|
26
|
-
|
|
27
|
-
export interface Commands {}
|
|
17
|
+
// eslint-disable-next-line
|
|
18
|
+
export interface Commands<ReturnType = any> {}
|
|
28
19
|
|
|
29
20
|
// eslint-disable-next-line
|
|
30
|
-
export interface ExtensionConfig<Options = any> {}
|
|
21
|
+
export interface ExtensionConfig<Options = any, Storage = any> {}
|
|
31
22
|
|
|
32
23
|
// eslint-disable-next-line
|
|
33
|
-
export interface NodeConfig<Options = any> {}
|
|
24
|
+
export interface NodeConfig<Options = any, Storage = any> {}
|
|
34
25
|
|
|
35
26
|
// eslint-disable-next-line
|
|
36
|
-
export interface MarkConfig<Options = any> {}
|
|
27
|
+
export interface MarkConfig<Options = any, Storage = any> {}
|