@tiptap/core 2.3.2 → 2.4.0
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/dist/index.cjs +273 -64
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +273 -64
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +273 -64
- package/dist/index.umd.js.map +1 -1
- package/dist/packages/core/src/Extension.d.ts +129 -14
- package/dist/packages/core/src/ExtensionManager.d.ts +37 -0
- package/dist/packages/core/src/Mark.d.ts +129 -14
- package/dist/packages/core/src/Node.d.ts +226 -30
- package/dist/packages/core/src/NodeView.d.ts +4 -0
- package/dist/packages/core/src/PasteRule.d.ts +4 -0
- package/dist/packages/core/src/commands/blur.d.ts +1 -0
- package/dist/packages/core/src/commands/clearContent.d.ts +2 -0
- package/dist/packages/core/src/commands/clearNodes.d.ts +1 -0
- package/dist/packages/core/src/commands/command.d.ts +6 -0
- package/dist/packages/core/src/commands/createParagraphNear.d.ts +1 -0
- package/dist/packages/core/src/commands/cut.d.ts +5 -0
- package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +1 -0
- package/dist/packages/core/src/commands/deleteNode.d.ts +3 -1
- package/dist/packages/core/src/commands/deleteRange.d.ts +2 -0
- package/dist/packages/core/src/commands/deleteSelection.d.ts +1 -0
- package/dist/packages/core/src/commands/enter.d.ts +1 -0
- package/dist/packages/core/src/commands/exitCode.d.ts +1 -0
- package/dist/packages/core/src/commands/extendMarkRange.d.ts +14 -2
- package/dist/packages/core/src/commands/first.d.ts +2 -0
- package/dist/packages/core/src/commands/focus.d.ts +14 -1
- package/dist/packages/core/src/commands/insertContent.d.ts +17 -1
- package/dist/packages/core/src/commands/insertContentAt.d.ts +20 -1
- package/dist/packages/core/src/commands/join.d.ts +12 -4
- package/dist/packages/core/src/commands/joinItemBackward.d.ts +2 -1
- package/dist/packages/core/src/commands/joinItemForward.d.ts +2 -1
- package/dist/packages/core/src/commands/keyboardShortcut.d.ts +2 -0
- package/dist/packages/core/src/commands/lift.d.ts +5 -1
- package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +2 -1
- package/dist/packages/core/src/commands/liftListItem.d.ts +3 -1
- package/dist/packages/core/src/commands/newlineInCode.d.ts +1 -0
- package/dist/packages/core/src/commands/resetAttributes.d.ts +3 -0
- package/dist/packages/core/src/commands/scrollIntoView.d.ts +1 -0
- package/dist/packages/core/src/commands/selectAll.d.ts +1 -0
- package/dist/packages/core/src/commands/selectNodeBackward.d.ts +1 -0
- package/dist/packages/core/src/commands/selectNodeForward.d.ts +1 -0
- package/dist/packages/core/src/commands/selectParentNode.d.ts +1 -0
- package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +1 -0
- package/dist/packages/core/src/commands/selectTextblockStart.d.ts +1 -0
- package/dist/packages/core/src/commands/setContent.d.ts +19 -1
- package/dist/packages/core/src/commands/setMark.d.ts +2 -0
- package/dist/packages/core/src/commands/setMeta.d.ts +3 -0
- package/dist/packages/core/src/commands/setNode.d.ts +3 -0
- package/dist/packages/core/src/commands/setNodeSelection.d.ts +2 -0
- package/dist/packages/core/src/commands/setTextSelection.d.ts +2 -0
- package/dist/packages/core/src/commands/sinkListItem.d.ts +2 -0
- package/dist/packages/core/src/commands/splitBlock.d.ts +3 -0
- package/dist/packages/core/src/commands/splitListItem.d.ts +2 -0
- package/dist/packages/core/src/commands/toggleList.d.ts +5 -0
- package/dist/packages/core/src/commands/toggleMark.d.ts +13 -1
- package/dist/packages/core/src/commands/toggleNode.d.ts +4 -0
- package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -0
- package/dist/packages/core/src/commands/undoInputRule.d.ts +1 -0
- package/dist/packages/core/src/commands/unsetAllMarks.d.ts +1 -0
- package/dist/packages/core/src/commands/unsetMark.d.ts +8 -1
- package/dist/packages/core/src/commands/updateAttributes.d.ts +12 -1
- package/dist/packages/core/src/commands/wrapIn.d.ts +3 -0
- package/dist/packages/core/src/commands/wrapInList.d.ts +3 -0
- package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +3 -0
- package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
- package/dist/packages/core/src/helpers/createDocument.d.ts +7 -0
- package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +7 -0
- package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +5 -0
- package/dist/packages/core/src/helpers/findChildren.d.ts +6 -0
- package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +4 -0
- package/dist/packages/core/src/helpers/findParentNode.d.ts +8 -0
- package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +9 -0
- package/dist/packages/core/src/helpers/generateHTML.d.ts +6 -0
- package/dist/packages/core/src/helpers/generateJSON.d.ts +6 -0
- package/dist/packages/core/src/helpers/generateText.d.ts +7 -0
- package/dist/packages/core/src/helpers/getAttributes.d.ts +6 -0
- package/dist/packages/core/src/helpers/getExtensionField.d.ts +7 -0
- package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +6 -0
- package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +6 -0
- package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +6 -0
- package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +7 -0
- package/dist/packages/core/src/helpers/getText.d.ts +9 -0
- package/dist/packages/core/src/helpers/getTextBetween.d.ts +8 -0
- package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +6 -0
- package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +5 -0
- package/dist/packages/core/src/inputRules/markInputRule.d.ts +1 -0
- package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +1 -0
- package/dist/packages/core/src/inputRules/textInputRule.d.ts +1 -0
- package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +1 -0
- package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +1 -0
- package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +1 -0
- package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +1 -0
- package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +1 -0
- package/package.json +2 -2
- package/src/Extension.ts +130 -14
- package/src/ExtensionManager.ts +117 -85
- package/src/Mark.ts +129 -14
- package/src/Node.ts +226 -30
- package/src/NodeView.ts +4 -0
- package/src/PasteRule.ts +4 -0
- package/src/commands/blur.ts +1 -0
- package/src/commands/clearContent.ts +2 -0
- package/src/commands/clearNodes.ts +1 -0
- package/src/commands/command.ts +6 -0
- package/src/commands/createParagraphNear.ts +1 -0
- package/src/commands/cut.ts +5 -0
- package/src/commands/deleteCurrentNode.ts +1 -0
- package/src/commands/deleteNode.ts +3 -1
- package/src/commands/deleteRange.ts +2 -0
- package/src/commands/deleteSelection.ts +1 -0
- package/src/commands/enter.ts +1 -0
- package/src/commands/exitCode.ts +1 -0
- package/src/commands/extendMarkRange.ts +12 -1
- package/src/commands/first.ts +2 -0
- package/src/commands/focus.ts +12 -0
- package/src/commands/insertContent.ts +16 -0
- package/src/commands/insertContentAt.ts +19 -0
- package/src/commands/join.ts +12 -4
- package/src/commands/joinItemBackward.ts +2 -1
- package/src/commands/joinItemForward.ts +2 -1
- package/src/commands/keyboardShortcut.ts +2 -0
- package/src/commands/lift.ts +5 -1
- package/src/commands/liftEmptyBlock.ts +2 -1
- package/src/commands/liftListItem.ts +3 -1
- package/src/commands/newlineInCode.ts +1 -0
- package/src/commands/resetAttributes.ts +3 -0
- package/src/commands/scrollIntoView.ts +1 -0
- package/src/commands/selectAll.ts +1 -0
- package/src/commands/selectNodeBackward.ts +1 -0
- package/src/commands/selectNodeForward.ts +1 -0
- package/src/commands/selectParentNode.ts +1 -0
- package/src/commands/selectTextblockEnd.ts +1 -0
- package/src/commands/selectTextblockStart.ts +1 -0
- package/src/commands/setContent.ts +17 -0
- package/src/commands/setMark.ts +2 -0
- package/src/commands/setMeta.ts +3 -0
- package/src/commands/setNode.ts +3 -0
- package/src/commands/setNodeSelection.ts +2 -0
- package/src/commands/setTextSelection.ts +2 -0
- package/src/commands/sinkListItem.ts +2 -0
- package/src/commands/splitBlock.ts +3 -0
- package/src/commands/splitListItem.ts +2 -0
- package/src/commands/toggleList.ts +5 -0
- package/src/commands/toggleMark.ts +12 -0
- package/src/commands/toggleNode.ts +4 -0
- package/src/commands/toggleWrap.ts +3 -0
- package/src/commands/undoInputRule.ts +1 -0
- package/src/commands/unsetAllMarks.ts +1 -0
- package/src/commands/unsetMark.ts +7 -0
- package/src/commands/updateAttributes.ts +10 -0
- package/src/commands/wrapIn.ts +3 -0
- package/src/commands/wrapInList.ts +3 -0
- package/src/extensions/keymap.ts +7 -1
- package/src/helpers/combineTransactionSteps.ts +3 -0
- package/src/helpers/createChainableState.ts +5 -0
- package/src/helpers/createDocument.ts +7 -0
- package/src/helpers/createNodeFromContent.ts +16 -3
- package/src/helpers/defaultBlockAt.ts +5 -0
- package/src/helpers/findChildren.ts +6 -0
- package/src/helpers/findChildrenInRange.ts +4 -0
- package/src/helpers/findParentNode.ts +8 -0
- package/src/helpers/findParentNodeClosestToPos.ts +9 -0
- package/src/helpers/generateHTML.ts +6 -0
- package/src/helpers/generateJSON.ts +6 -0
- package/src/helpers/generateText.ts +7 -0
- package/src/helpers/getAttributes.ts +6 -0
- package/src/helpers/getExtensionField.ts +7 -0
- package/src/helpers/getSchemaByResolvedExtensions.ts +6 -0
- package/src/helpers/getSchemaTypeByName.ts +6 -0
- package/src/helpers/getSchemaTypeNameByName.ts +6 -0
- package/src/helpers/getSplittedAttributes.ts +7 -0
- package/src/helpers/getText.ts +9 -0
- package/src/helpers/getTextBetween.ts +12 -10
- package/src/helpers/getTextContentFromNodes.ts +6 -0
- package/src/helpers/getTextSerializersFromSchema.ts +5 -0
- package/src/inputRules/markInputRule.ts +1 -0
- package/src/inputRules/nodeInputRule.ts +1 -0
- package/src/inputRules/textInputRule.ts +1 -0
- package/src/inputRules/textblockTypeInputRule.ts +1 -0
- package/src/inputRules/wrappingInputRule.ts +1 -0
- package/src/pasteRules/markPasteRule.ts +1 -0
- package/src/pasteRules/nodePasteRule.ts +1 -0
- package/src/pasteRules/textPasteRule.ts +1 -0
package/dist/index.js
CHANGED
|
@@ -6,6 +6,11 @@ import { liftTarget, ReplaceStep, ReplaceAroundStep, joinPoint, Transform, canSp
|
|
|
6
6
|
import { createParagraphNear as createParagraphNear$1, deleteSelection as deleteSelection$1, exitCode as exitCode$1, joinUp as joinUp$1, joinDown as joinDown$1, joinBackward as joinBackward$1, joinForward as joinForward$1, joinTextblockBackward as joinTextblockBackward$1, joinTextblockForward as joinTextblockForward$1, lift as lift$1, liftEmptyBlock as liftEmptyBlock$1, newlineInCode as newlineInCode$1, selectNodeBackward as selectNodeBackward$1, selectNodeForward as selectNodeForward$1, selectParentNode as selectParentNode$1, selectTextblockEnd as selectTextblockEnd$1, selectTextblockStart as selectTextblockStart$1, setBlockType, wrapIn as wrapIn$1 } from '@tiptap/pm/commands';
|
|
7
7
|
import { liftListItem as liftListItem$1, sinkListItem as sinkListItem$1, wrapInList as wrapInList$1 } from '@tiptap/pm/schema-list';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Takes a Transaction & Editor State and turns it into a chainable state object
|
|
11
|
+
* @param config The transaction and state to create the chainable state from
|
|
12
|
+
* @returns A chainable Editor state object
|
|
13
|
+
*/
|
|
9
14
|
function createChainableState(config) {
|
|
10
15
|
const { state, transaction } = config;
|
|
11
16
|
let { selection } = transaction;
|
|
@@ -172,6 +177,13 @@ class EventEmitter {
|
|
|
172
177
|
}
|
|
173
178
|
}
|
|
174
179
|
|
|
180
|
+
/**
|
|
181
|
+
* Returns a field from an extension
|
|
182
|
+
* @param extension The Tiptap extension
|
|
183
|
+
* @param field The field, for example `renderHTML` or `priority`
|
|
184
|
+
* @param context The context object that should be passed as `this` into the function
|
|
185
|
+
* @returns The field value
|
|
186
|
+
*/
|
|
175
187
|
function getExtensionField(extension, field, context) {
|
|
176
188
|
if (extension.config[field] === undefined && extension.parent) {
|
|
177
189
|
return getExtensionField(extension.parent, field, context);
|
|
@@ -416,6 +428,12 @@ function cleanUpSchemaItem(data) {
|
|
|
416
428
|
return value !== null && value !== undefined;
|
|
417
429
|
}));
|
|
418
430
|
}
|
|
431
|
+
/**
|
|
432
|
+
* Creates a new Prosemirror schema based on the given extensions.
|
|
433
|
+
* @param extensions An array of Tiptap extensions
|
|
434
|
+
* @param editor The editor instance
|
|
435
|
+
* @returns A Prosemirror schema
|
|
436
|
+
*/
|
|
419
437
|
function getSchemaByResolvedExtensions(extensions, editor) {
|
|
420
438
|
var _a;
|
|
421
439
|
const allAttributes = getAttributesFromExtensions(extensions);
|
|
@@ -517,6 +535,12 @@ function getSchemaByResolvedExtensions(extensions, editor) {
|
|
|
517
535
|
});
|
|
518
536
|
}
|
|
519
537
|
|
|
538
|
+
/**
|
|
539
|
+
* Tries to get a node or mark type by its name.
|
|
540
|
+
* @param name The name of the node or mark type
|
|
541
|
+
* @param schema The Prosemiror schema to search in
|
|
542
|
+
* @returns The node or mark type, or null if it doesn't exist
|
|
543
|
+
*/
|
|
520
544
|
function getSchemaTypeByName(name, schema) {
|
|
521
545
|
return schema.nodes[name] || schema.marks[name] || null;
|
|
522
546
|
}
|
|
@@ -533,6 +557,12 @@ function isExtensionRulesEnabled(extension, enabled) {
|
|
|
533
557
|
return enabled;
|
|
534
558
|
}
|
|
535
559
|
|
|
560
|
+
/**
|
|
561
|
+
* Returns the text content of a resolved prosemirror position
|
|
562
|
+
* @param $from The resolved position to get the text content from
|
|
563
|
+
* @param maxMatch The maximum number of characters to match
|
|
564
|
+
* @returns The text content
|
|
565
|
+
*/
|
|
536
566
|
const getTextContentFromNodes = ($from, maxMatch = 500) => {
|
|
537
567
|
let textBefore = '';
|
|
538
568
|
const sliceEndPos = $from.parentOffset;
|
|
@@ -740,6 +770,10 @@ function isNumber(value) {
|
|
|
740
770
|
return typeof value === 'number';
|
|
741
771
|
}
|
|
742
772
|
|
|
773
|
+
/**
|
|
774
|
+
* Paste rules are used to react to pasted content.
|
|
775
|
+
* @see https://tiptap.dev/guide/custom-extensions/#paste-rules
|
|
776
|
+
*/
|
|
743
777
|
class PasteRule {
|
|
744
778
|
constructor(config) {
|
|
745
779
|
this.find = config.find;
|
|
@@ -938,57 +972,14 @@ class ExtensionManager {
|
|
|
938
972
|
this.editor = editor;
|
|
939
973
|
this.extensions = ExtensionManager.resolve(extensions);
|
|
940
974
|
this.schema = getSchemaByResolvedExtensions(this.extensions, editor);
|
|
941
|
-
this.
|
|
942
|
-
var _a;
|
|
943
|
-
// store extension storage in editor
|
|
944
|
-
this.editor.extensionStorage[extension.name] = extension.storage;
|
|
945
|
-
const context = {
|
|
946
|
-
name: extension.name,
|
|
947
|
-
options: extension.options,
|
|
948
|
-
storage: extension.storage,
|
|
949
|
-
editor: this.editor,
|
|
950
|
-
type: getSchemaTypeByName(extension.name, this.schema),
|
|
951
|
-
};
|
|
952
|
-
if (extension.type === 'mark') {
|
|
953
|
-
const keepOnSplit = (_a = callOrReturn(getExtensionField(extension, 'keepOnSplit', context))) !== null && _a !== void 0 ? _a : true;
|
|
954
|
-
if (keepOnSplit) {
|
|
955
|
-
this.splittableMarks.push(extension.name);
|
|
956
|
-
}
|
|
957
|
-
}
|
|
958
|
-
const onBeforeCreate = getExtensionField(extension, 'onBeforeCreate', context);
|
|
959
|
-
if (onBeforeCreate) {
|
|
960
|
-
this.editor.on('beforeCreate', onBeforeCreate);
|
|
961
|
-
}
|
|
962
|
-
const onCreate = getExtensionField(extension, 'onCreate', context);
|
|
963
|
-
if (onCreate) {
|
|
964
|
-
this.editor.on('create', onCreate);
|
|
965
|
-
}
|
|
966
|
-
const onUpdate = getExtensionField(extension, 'onUpdate', context);
|
|
967
|
-
if (onUpdate) {
|
|
968
|
-
this.editor.on('update', onUpdate);
|
|
969
|
-
}
|
|
970
|
-
const onSelectionUpdate = getExtensionField(extension, 'onSelectionUpdate', context);
|
|
971
|
-
if (onSelectionUpdate) {
|
|
972
|
-
this.editor.on('selectionUpdate', onSelectionUpdate);
|
|
973
|
-
}
|
|
974
|
-
const onTransaction = getExtensionField(extension, 'onTransaction', context);
|
|
975
|
-
if (onTransaction) {
|
|
976
|
-
this.editor.on('transaction', onTransaction);
|
|
977
|
-
}
|
|
978
|
-
const onFocus = getExtensionField(extension, 'onFocus', context);
|
|
979
|
-
if (onFocus) {
|
|
980
|
-
this.editor.on('focus', onFocus);
|
|
981
|
-
}
|
|
982
|
-
const onBlur = getExtensionField(extension, 'onBlur', context);
|
|
983
|
-
if (onBlur) {
|
|
984
|
-
this.editor.on('blur', onBlur);
|
|
985
|
-
}
|
|
986
|
-
const onDestroy = getExtensionField(extension, 'onDestroy', context);
|
|
987
|
-
if (onDestroy) {
|
|
988
|
-
this.editor.on('destroy', onDestroy);
|
|
989
|
-
}
|
|
990
|
-
});
|
|
975
|
+
this.setupExtensions();
|
|
991
976
|
}
|
|
977
|
+
/**
|
|
978
|
+
* Returns a flattened and sorted extension list while
|
|
979
|
+
* also checking for duplicated extensions and warns the user.
|
|
980
|
+
* @param extensions An array of Tiptap extensions
|
|
981
|
+
* @returns An flattened and sorted array of Tiptap extensions
|
|
982
|
+
*/
|
|
992
983
|
static resolve(extensions) {
|
|
993
984
|
const resolvedExtensions = ExtensionManager.sort(ExtensionManager.flatten(extensions));
|
|
994
985
|
const duplicatedNames = findDuplicates(resolvedExtensions.map(extension => extension.name));
|
|
@@ -999,6 +990,11 @@ class ExtensionManager {
|
|
|
999
990
|
}
|
|
1000
991
|
return resolvedExtensions;
|
|
1001
992
|
}
|
|
993
|
+
/**
|
|
994
|
+
* Create a flattened array of extensions by traversing the `addExtensions` field.
|
|
995
|
+
* @param extensions An array of Tiptap extensions
|
|
996
|
+
* @returns A flattened array of Tiptap extensions
|
|
997
|
+
*/
|
|
1002
998
|
static flatten(extensions) {
|
|
1003
999
|
return (extensions
|
|
1004
1000
|
.map(extension => {
|
|
@@ -1016,6 +1012,11 @@ class ExtensionManager {
|
|
|
1016
1012
|
// `Infinity` will break TypeScript so we set a number that is probably high enough
|
|
1017
1013
|
.flat(10));
|
|
1018
1014
|
}
|
|
1015
|
+
/**
|
|
1016
|
+
* Sort extensions by priority.
|
|
1017
|
+
* @param extensions An array of Tiptap extensions
|
|
1018
|
+
* @returns A sorted array of Tiptap extensions by priority
|
|
1019
|
+
*/
|
|
1019
1020
|
static sort(extensions) {
|
|
1020
1021
|
const defaultPriority = 100;
|
|
1021
1022
|
return extensions.sort((a, b) => {
|
|
@@ -1030,6 +1031,10 @@ class ExtensionManager {
|
|
|
1030
1031
|
return 0;
|
|
1031
1032
|
});
|
|
1032
1033
|
}
|
|
1034
|
+
/**
|
|
1035
|
+
* Get all commands from the extensions.
|
|
1036
|
+
* @returns An object with all commands where the key is the command name and the value is the command function
|
|
1037
|
+
*/
|
|
1033
1038
|
get commands() {
|
|
1034
1039
|
return this.extensions.reduce((commands, extension) => {
|
|
1035
1040
|
const context = {
|
|
@@ -1049,6 +1054,10 @@ class ExtensionManager {
|
|
|
1049
1054
|
};
|
|
1050
1055
|
}, {});
|
|
1051
1056
|
}
|
|
1057
|
+
/**
|
|
1058
|
+
* Get all registered Prosemirror plugins from the extensions.
|
|
1059
|
+
* @returns An array of Prosemirror plugins
|
|
1060
|
+
*/
|
|
1052
1061
|
get plugins() {
|
|
1053
1062
|
const { editor } = this;
|
|
1054
1063
|
// With ProseMirror, first plugins within an array are executed first.
|
|
@@ -1111,9 +1120,17 @@ class ExtensionManager {
|
|
|
1111
1120
|
...allPlugins,
|
|
1112
1121
|
];
|
|
1113
1122
|
}
|
|
1123
|
+
/**
|
|
1124
|
+
* Get all attributes from the extensions.
|
|
1125
|
+
* @returns An array of attributes
|
|
1126
|
+
*/
|
|
1114
1127
|
get attributes() {
|
|
1115
1128
|
return getAttributesFromExtensions(this.extensions);
|
|
1116
1129
|
}
|
|
1130
|
+
/**
|
|
1131
|
+
* Get all node views from the extensions.
|
|
1132
|
+
* @returns An object with all node views where the key is the node name and the value is the node view function
|
|
1133
|
+
*/
|
|
1117
1134
|
get nodeViews() {
|
|
1118
1135
|
const { editor } = this;
|
|
1119
1136
|
const { nodeExtensions } = splitExtensions(this.extensions);
|
|
@@ -1146,6 +1163,62 @@ class ExtensionManager {
|
|
|
1146
1163
|
return [extension.name, nodeview];
|
|
1147
1164
|
}));
|
|
1148
1165
|
}
|
|
1166
|
+
/**
|
|
1167
|
+
* Go through all extensions, create extension storages & setup marks
|
|
1168
|
+
* & bind editor event listener.
|
|
1169
|
+
*/
|
|
1170
|
+
setupExtensions() {
|
|
1171
|
+
this.extensions.forEach(extension => {
|
|
1172
|
+
var _a;
|
|
1173
|
+
// store extension storage in editor
|
|
1174
|
+
this.editor.extensionStorage[extension.name] = extension.storage;
|
|
1175
|
+
const context = {
|
|
1176
|
+
name: extension.name,
|
|
1177
|
+
options: extension.options,
|
|
1178
|
+
storage: extension.storage,
|
|
1179
|
+
editor: this.editor,
|
|
1180
|
+
type: getSchemaTypeByName(extension.name, this.schema),
|
|
1181
|
+
};
|
|
1182
|
+
if (extension.type === 'mark') {
|
|
1183
|
+
const keepOnSplit = (_a = callOrReturn(getExtensionField(extension, 'keepOnSplit', context))) !== null && _a !== void 0 ? _a : true;
|
|
1184
|
+
if (keepOnSplit) {
|
|
1185
|
+
this.splittableMarks.push(extension.name);
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
const onBeforeCreate = getExtensionField(extension, 'onBeforeCreate', context);
|
|
1189
|
+
const onCreate = getExtensionField(extension, 'onCreate', context);
|
|
1190
|
+
const onUpdate = getExtensionField(extension, 'onUpdate', context);
|
|
1191
|
+
const onSelectionUpdate = getExtensionField(extension, 'onSelectionUpdate', context);
|
|
1192
|
+
const onTransaction = getExtensionField(extension, 'onTransaction', context);
|
|
1193
|
+
const onFocus = getExtensionField(extension, 'onFocus', context);
|
|
1194
|
+
const onBlur = getExtensionField(extension, 'onBlur', context);
|
|
1195
|
+
const onDestroy = getExtensionField(extension, 'onDestroy', context);
|
|
1196
|
+
if (onBeforeCreate) {
|
|
1197
|
+
this.editor.on('beforeCreate', onBeforeCreate);
|
|
1198
|
+
}
|
|
1199
|
+
if (onCreate) {
|
|
1200
|
+
this.editor.on('create', onCreate);
|
|
1201
|
+
}
|
|
1202
|
+
if (onUpdate) {
|
|
1203
|
+
this.editor.on('update', onUpdate);
|
|
1204
|
+
}
|
|
1205
|
+
if (onSelectionUpdate) {
|
|
1206
|
+
this.editor.on('selectionUpdate', onSelectionUpdate);
|
|
1207
|
+
}
|
|
1208
|
+
if (onTransaction) {
|
|
1209
|
+
this.editor.on('transaction', onTransaction);
|
|
1210
|
+
}
|
|
1211
|
+
if (onFocus) {
|
|
1212
|
+
this.editor.on('focus', onFocus);
|
|
1213
|
+
}
|
|
1214
|
+
if (onBlur) {
|
|
1215
|
+
this.editor.on('blur', onBlur);
|
|
1216
|
+
}
|
|
1217
|
+
if (onDestroy) {
|
|
1218
|
+
this.editor.on('destroy', onDestroy);
|
|
1219
|
+
}
|
|
1220
|
+
});
|
|
1221
|
+
}
|
|
1149
1222
|
}
|
|
1150
1223
|
|
|
1151
1224
|
// see: https://github.com/mesqueeb/is-what/blob/88d6e4ca92fb2baab6003c54e02eedf4e729e5ab/src/index.ts
|
|
@@ -1179,6 +1252,10 @@ function mergeDeep(target, source) {
|
|
|
1179
1252
|
return output;
|
|
1180
1253
|
}
|
|
1181
1254
|
|
|
1255
|
+
/**
|
|
1256
|
+
* The Extension class is the base class for all extensions.
|
|
1257
|
+
* @see https://tiptap.dev/api/extensions#create-a-new-extension
|
|
1258
|
+
*/
|
|
1182
1259
|
class Extension {
|
|
1183
1260
|
constructor(config = {}) {
|
|
1184
1261
|
this.type = 'extension';
|
|
@@ -1216,6 +1293,7 @@ class Extension {
|
|
|
1216
1293
|
// return a new instance so we can use the same extension
|
|
1217
1294
|
// with different calls of `configure`
|
|
1218
1295
|
const extension = this.extend();
|
|
1296
|
+
extension.parent = this.parent;
|
|
1219
1297
|
extension.options = mergeDeep(this.options, options);
|
|
1220
1298
|
extension.storage = callOrReturn(getExtensionField(extension, 'addStorage', {
|
|
1221
1299
|
name: extension.name,
|
|
@@ -1242,19 +1320,25 @@ class Extension {
|
|
|
1242
1320
|
}
|
|
1243
1321
|
}
|
|
1244
1322
|
|
|
1323
|
+
/**
|
|
1324
|
+
* Gets the text between two positions in a Prosemirror node
|
|
1325
|
+
* and serializes it using the given text serializers and block separator (see getText)
|
|
1326
|
+
* @param startNode The Prosemirror node to start from
|
|
1327
|
+
* @param range The range of the text to get
|
|
1328
|
+
* @param options Options for the text serializer & block separator
|
|
1329
|
+
* @returns The text between the two positions
|
|
1330
|
+
*/
|
|
1245
1331
|
function getTextBetween(startNode, range, options) {
|
|
1246
1332
|
const { from, to } = range;
|
|
1247
1333
|
const { blockSeparator = '\n\n', textSerializers = {} } = options || {};
|
|
1248
1334
|
let text = '';
|
|
1249
|
-
let separated = true;
|
|
1250
1335
|
startNode.nodesBetween(from, to, (node, pos, parent, index) => {
|
|
1251
1336
|
var _a;
|
|
1337
|
+
if (node.isBlock && pos > from) {
|
|
1338
|
+
text += blockSeparator;
|
|
1339
|
+
}
|
|
1252
1340
|
const textSerializer = textSerializers === null || textSerializers === void 0 ? void 0 : textSerializers[node.type.name];
|
|
1253
1341
|
if (textSerializer) {
|
|
1254
|
-
if (node.isBlock && !separated) {
|
|
1255
|
-
text += blockSeparator;
|
|
1256
|
-
separated = true;
|
|
1257
|
-
}
|
|
1258
1342
|
if (parent) {
|
|
1259
1343
|
text += textSerializer({
|
|
1260
1344
|
node,
|
|
@@ -1269,16 +1353,16 @@ function getTextBetween(startNode, range, options) {
|
|
|
1269
1353
|
}
|
|
1270
1354
|
if (node.isText) {
|
|
1271
1355
|
text += (_a = node === null || node === void 0 ? void 0 : node.text) === null || _a === void 0 ? void 0 : _a.slice(Math.max(from, pos) - pos, to - pos); // eslint-disable-line
|
|
1272
|
-
separated = false;
|
|
1273
|
-
}
|
|
1274
|
-
else if (node.isBlock && !separated) {
|
|
1275
|
-
text += blockSeparator;
|
|
1276
|
-
separated = true;
|
|
1277
1356
|
}
|
|
1278
1357
|
});
|
|
1279
1358
|
return text;
|
|
1280
1359
|
}
|
|
1281
1360
|
|
|
1361
|
+
/**
|
|
1362
|
+
* Find text serializers `toText` in a Prosemirror schema
|
|
1363
|
+
* @param schema The Prosemirror schema to search in
|
|
1364
|
+
* @returns A record of text serializers by node name
|
|
1365
|
+
*/
|
|
1282
1366
|
function getTextSerializersFromSchema(schema) {
|
|
1283
1367
|
return Object.fromEntries(Object.entries(schema.nodes)
|
|
1284
1368
|
.filter(([, node]) => node.spec.toText)
|
|
@@ -1661,15 +1745,26 @@ function elementFromString(value) {
|
|
|
1661
1745
|
return removeWhitespaces(html);
|
|
1662
1746
|
}
|
|
1663
1747
|
|
|
1748
|
+
/**
|
|
1749
|
+
* Takes a JSON or HTML content and creates a Prosemirror node or fragment from it.
|
|
1750
|
+
* @param content The JSON or HTML content to create the node from
|
|
1751
|
+
* @param schema The Prosemirror schema to use for the node
|
|
1752
|
+
* @param options Options for the parser
|
|
1753
|
+
* @returns The created Prosemirror node or fragment
|
|
1754
|
+
*/
|
|
1664
1755
|
function createNodeFromContent(content, schema, options) {
|
|
1665
1756
|
options = {
|
|
1666
1757
|
slice: true,
|
|
1667
1758
|
parseOptions: {},
|
|
1668
1759
|
...options,
|
|
1669
1760
|
};
|
|
1670
|
-
|
|
1761
|
+
const isJSONContent = typeof content === 'object' && content !== null;
|
|
1762
|
+
const isTextContent = typeof content === 'string';
|
|
1763
|
+
if (isJSONContent) {
|
|
1671
1764
|
try {
|
|
1672
|
-
|
|
1765
|
+
const isArrayContent = Array.isArray(content) && content.length > 0;
|
|
1766
|
+
// if the JSON Content is an array of nodes, create a fragment for each node
|
|
1767
|
+
if (isArrayContent) {
|
|
1673
1768
|
return Fragment.fromArray(content.map(item => schema.nodeFromJSON(item)));
|
|
1674
1769
|
}
|
|
1675
1770
|
return schema.nodeFromJSON(content);
|
|
@@ -1679,7 +1774,7 @@ function createNodeFromContent(content, schema, options) {
|
|
|
1679
1774
|
return createNodeFromContent('', schema, options);
|
|
1680
1775
|
}
|
|
1681
1776
|
}
|
|
1682
|
-
if (
|
|
1777
|
+
if (isTextContent) {
|
|
1683
1778
|
const parser = DOMParser.fromSchema(schema);
|
|
1684
1779
|
return options.slice
|
|
1685
1780
|
? parser.parseSlice(elementFromString(content), options.parseOptions).content
|
|
@@ -1979,6 +2074,12 @@ const newlineInCode = () => ({ state, dispatch }) => {
|
|
|
1979
2074
|
return newlineInCode$1(state, dispatch);
|
|
1980
2075
|
};
|
|
1981
2076
|
|
|
2077
|
+
/**
|
|
2078
|
+
* Get the type of a schema item by its name.
|
|
2079
|
+
* @param name The name of the schema item
|
|
2080
|
+
* @param schema The Prosemiror schema to search in
|
|
2081
|
+
* @returns The type of the schema item (`node` or `mark`), or null if it doesn't exist
|
|
2082
|
+
*/
|
|
1982
2083
|
function getSchemaTypeNameByName(name, schema) {
|
|
1983
2084
|
if (schema.nodes[name]) {
|
|
1984
2085
|
return 'node';
|
|
@@ -2076,6 +2177,13 @@ const selectTextblockStart = () => ({ state, dispatch }) => {
|
|
|
2076
2177
|
return selectTextblockStart$1(state, dispatch);
|
|
2077
2178
|
};
|
|
2078
2179
|
|
|
2180
|
+
/**
|
|
2181
|
+
* Create a new Prosemirror document node from content.
|
|
2182
|
+
* @param content The JSON or HTML content to create the document from
|
|
2183
|
+
* @param schema The Prosemirror schema to use for the document
|
|
2184
|
+
* @param parseOptions Options for the parser
|
|
2185
|
+
* @returns The created Prosemirror document node
|
|
2186
|
+
*/
|
|
2079
2187
|
function createDocument(content, schema, parseOptions = {}) {
|
|
2080
2188
|
return createNodeFromContent(content, schema, { slice: false, parseOptions });
|
|
2081
2189
|
}
|
|
@@ -2113,6 +2221,9 @@ function getMarkAttributes(state, typeOrName) {
|
|
|
2113
2221
|
|
|
2114
2222
|
/**
|
|
2115
2223
|
* Returns a new `Transform` based on all steps of the passed transactions.
|
|
2224
|
+
* @param oldDoc The Prosemirror node to start from
|
|
2225
|
+
* @param transactions The transactions to combine
|
|
2226
|
+
* @returns A new `Transform` with all steps of the passed transactions
|
|
2116
2227
|
*/
|
|
2117
2228
|
function combineTransactionSteps(oldDoc, transactions) {
|
|
2118
2229
|
const transform = new Transform(oldDoc);
|
|
@@ -2124,6 +2235,11 @@ function combineTransactionSteps(oldDoc, transactions) {
|
|
|
2124
2235
|
return transform;
|
|
2125
2236
|
}
|
|
2126
2237
|
|
|
2238
|
+
/**
|
|
2239
|
+
* Gets the default block type at a given match
|
|
2240
|
+
* @param match The content match to get the default block type from
|
|
2241
|
+
* @returns The default block type or null
|
|
2242
|
+
*/
|
|
2127
2243
|
function defaultBlockAt(match) {
|
|
2128
2244
|
for (let i = 0; i < match.edgeCount; i += 1) {
|
|
2129
2245
|
const { type } = match.edge(i);
|
|
@@ -2134,6 +2250,12 @@ function defaultBlockAt(match) {
|
|
|
2134
2250
|
return null;
|
|
2135
2251
|
}
|
|
2136
2252
|
|
|
2253
|
+
/**
|
|
2254
|
+
* Find children inside a Prosemirror node that match a predicate.
|
|
2255
|
+
* @param node The Prosemirror node to search in
|
|
2256
|
+
* @param predicate The predicate to match
|
|
2257
|
+
* @returns An array of nodes with their positions
|
|
2258
|
+
*/
|
|
2137
2259
|
function findChildren(node, predicate) {
|
|
2138
2260
|
const nodesWithPos = [];
|
|
2139
2261
|
node.descendants((child, pos) => {
|
|
@@ -2149,6 +2271,10 @@ function findChildren(node, predicate) {
|
|
|
2149
2271
|
|
|
2150
2272
|
/**
|
|
2151
2273
|
* Same as `findChildren` but searches only within a `range`.
|
|
2274
|
+
* @param node The Prosemirror node to search in
|
|
2275
|
+
* @param range The range to search in
|
|
2276
|
+
* @param predicate The predicate to match
|
|
2277
|
+
* @returns An array of nodes with their positions
|
|
2152
2278
|
*/
|
|
2153
2279
|
function findChildrenInRange(node, range, predicate) {
|
|
2154
2280
|
const nodesWithPos = [];
|
|
@@ -2172,6 +2298,15 @@ function findChildrenInRange(node, range, predicate) {
|
|
|
2172
2298
|
return nodesWithPos;
|
|
2173
2299
|
}
|
|
2174
2300
|
|
|
2301
|
+
/**
|
|
2302
|
+
* Finds the closest parent node to a resolved position that matches a predicate.
|
|
2303
|
+
* @param $pos The resolved position to search from
|
|
2304
|
+
* @param predicate The predicate to match
|
|
2305
|
+
* @returns The closest parent node to the resolved position that matches the predicate
|
|
2306
|
+
* @example ```js
|
|
2307
|
+
* findParentNodeClosestToPos($from, node => node.type.name === 'paragraph')
|
|
2308
|
+
* ```
|
|
2309
|
+
*/
|
|
2175
2310
|
function findParentNodeClosestToPos($pos, predicate) {
|
|
2176
2311
|
for (let i = $pos.depth; i > 0; i -= 1) {
|
|
2177
2312
|
const node = $pos.node(i);
|
|
@@ -2186,6 +2321,14 @@ function findParentNodeClosestToPos($pos, predicate) {
|
|
|
2186
2321
|
}
|
|
2187
2322
|
}
|
|
2188
2323
|
|
|
2324
|
+
/**
|
|
2325
|
+
* Finds the closest parent node to the current selection that matches a predicate.
|
|
2326
|
+
* @param predicate The predicate to match
|
|
2327
|
+
* @returns A command that finds the closest parent node to the current selection that matches the predicate
|
|
2328
|
+
* @example ```js
|
|
2329
|
+
* findParentNode(node => node.type.name === 'paragraph')
|
|
2330
|
+
* ```
|
|
2331
|
+
*/
|
|
2189
2332
|
function findParentNode(predicate) {
|
|
2190
2333
|
return (selection) => findParentNodeClosestToPos(selection.$from, predicate);
|
|
2191
2334
|
}
|
|
@@ -2203,18 +2346,39 @@ function getSchema(extensions, editor) {
|
|
|
2203
2346
|
return getSchemaByResolvedExtensions(resolvedExtensions, editor);
|
|
2204
2347
|
}
|
|
2205
2348
|
|
|
2349
|
+
/**
|
|
2350
|
+
* Generate HTML from a JSONContent
|
|
2351
|
+
* @param doc The JSONContent to generate HTML from
|
|
2352
|
+
* @param extensions The extensions to use for the schema
|
|
2353
|
+
* @returns The generated HTML
|
|
2354
|
+
*/
|
|
2206
2355
|
function generateHTML(doc, extensions) {
|
|
2207
2356
|
const schema = getSchema(extensions);
|
|
2208
2357
|
const contentNode = Node$1.fromJSON(schema, doc);
|
|
2209
2358
|
return getHTMLFromFragment(contentNode.content, schema);
|
|
2210
2359
|
}
|
|
2211
2360
|
|
|
2361
|
+
/**
|
|
2362
|
+
* Generate JSONContent from HTML
|
|
2363
|
+
* @param html The HTML to generate JSONContent from
|
|
2364
|
+
* @param extensions The extensions to use for the schema
|
|
2365
|
+
* @returns The generated JSONContent
|
|
2366
|
+
*/
|
|
2212
2367
|
function generateJSON(html, extensions) {
|
|
2213
2368
|
const schema = getSchema(extensions);
|
|
2214
2369
|
const dom = elementFromString(html);
|
|
2215
2370
|
return DOMParser.fromSchema(schema).parse(dom).toJSON();
|
|
2216
2371
|
}
|
|
2217
2372
|
|
|
2373
|
+
/**
|
|
2374
|
+
* Gets the text of a Prosemirror node
|
|
2375
|
+
* @param node The Prosemirror node
|
|
2376
|
+
* @param options Options for the text serializer & block separator
|
|
2377
|
+
* @returns The text of the node
|
|
2378
|
+
* @example ```js
|
|
2379
|
+
* const text = getText(node, { blockSeparator: '\n' })
|
|
2380
|
+
* ```
|
|
2381
|
+
*/
|
|
2218
2382
|
function getText(node, options) {
|
|
2219
2383
|
const range = {
|
|
2220
2384
|
from: 0,
|
|
@@ -2223,6 +2387,13 @@ function getText(node, options) {
|
|
|
2223
2387
|
return getTextBetween(node, range, options);
|
|
2224
2388
|
}
|
|
2225
2389
|
|
|
2390
|
+
/**
|
|
2391
|
+
* Generate raw text from a JSONContent
|
|
2392
|
+
* @param doc The JSONContent to generate text from
|
|
2393
|
+
* @param extensions The extensions to use for the schema
|
|
2394
|
+
* @param options Options for the text generation f.e. blockSeparator or textSerializers
|
|
2395
|
+
* @returns The generated text
|
|
2396
|
+
*/
|
|
2226
2397
|
function generateText(doc, extensions, options) {
|
|
2227
2398
|
const { blockSeparator = '\n\n', textSerializers = {} } = options || {};
|
|
2228
2399
|
const schema = getSchema(extensions);
|
|
@@ -2250,6 +2421,12 @@ function getNodeAttributes(state, typeOrName) {
|
|
|
2250
2421
|
return { ...node.attrs };
|
|
2251
2422
|
}
|
|
2252
2423
|
|
|
2424
|
+
/**
|
|
2425
|
+
* Get node or mark attributes by type or name on the current editor state
|
|
2426
|
+
* @param state The current editor state
|
|
2427
|
+
* @param typeOrName The node or mark type or name
|
|
2428
|
+
* @returns The attributes of the node or mark or an empty object
|
|
2429
|
+
*/
|
|
2253
2430
|
function getAttributes(state, typeOrName) {
|
|
2254
2431
|
const schemaType = getSchemaTypeNameByName(typeof typeOrName === 'string' ? typeOrName : typeOrName.name, state.schema);
|
|
2255
2432
|
if (schemaType === 'node') {
|
|
@@ -2434,6 +2611,13 @@ const getNodeAtPosition = (state, typeOrName, pos, maxDepth = 20) => {
|
|
|
2434
2611
|
return [node, currentDepth];
|
|
2435
2612
|
};
|
|
2436
2613
|
|
|
2614
|
+
/**
|
|
2615
|
+
* Return attributes of an extension that should be splitted by keepOnSplit flag
|
|
2616
|
+
* @param extensionAttributes Array of extension attributes
|
|
2617
|
+
* @param typeName The type of the extension
|
|
2618
|
+
* @param attributes The attributes of the extension
|
|
2619
|
+
* @returns The splitted attributes
|
|
2620
|
+
*/
|
|
2437
2621
|
function getSplittedAttributes(extensionAttributes, typeName, attributes) {
|
|
2438
2622
|
return Object.fromEntries(Object
|
|
2439
2623
|
.entries(attributes)
|
|
@@ -3284,7 +3468,12 @@ const Keymap = Extension.create({
|
|
|
3284
3468
|
const isAtStart = (parentIsIsolating && $parentPos.parent.childCount === 1)
|
|
3285
3469
|
? parentPos === $anchor.pos
|
|
3286
3470
|
: Selection.atStart(doc).from === pos;
|
|
3287
|
-
if (!empty
|
|
3471
|
+
if (!empty
|
|
3472
|
+
|| !parent.type.isTextblock
|
|
3473
|
+
|| parent.textContent.length
|
|
3474
|
+
|| !isAtStart
|
|
3475
|
+
|| (isAtStart && $anchor.parent.type.name === 'paragraph') // prevent clearNodes when no nodes to clear, otherwise history stack is appended
|
|
3476
|
+
) {
|
|
3288
3477
|
return false;
|
|
3289
3478
|
}
|
|
3290
3479
|
return commands.clearNodes();
|
|
@@ -4056,6 +4245,7 @@ class Editor extends EventEmitter {
|
|
|
4056
4245
|
/**
|
|
4057
4246
|
* Build an input rule that adds a mark when the
|
|
4058
4247
|
* matched text is typed into it.
|
|
4248
|
+
* @see https://tiptap.dev/guide/custom-extensions/#input-rules
|
|
4059
4249
|
*/
|
|
4060
4250
|
function markInputRule(config) {
|
|
4061
4251
|
return new InputRule({
|
|
@@ -4099,6 +4289,7 @@ function markInputRule(config) {
|
|
|
4099
4289
|
/**
|
|
4100
4290
|
* Build an input rule that adds a node when the
|
|
4101
4291
|
* matched text is typed into it.
|
|
4292
|
+
* @see https://tiptap.dev/guide/custom-extensions/#input-rules
|
|
4102
4293
|
*/
|
|
4103
4294
|
function nodeInputRule(config) {
|
|
4104
4295
|
return new InputRule({
|
|
@@ -4137,6 +4328,7 @@ function nodeInputRule(config) {
|
|
|
4137
4328
|
* matched text is typed into it. When using a regular expresion you’ll
|
|
4138
4329
|
* probably want the regexp to start with `^`, so that the pattern can
|
|
4139
4330
|
* only occur at the start of a textblock.
|
|
4331
|
+
* @see https://tiptap.dev/guide/custom-extensions/#input-rules
|
|
4140
4332
|
*/
|
|
4141
4333
|
function textblockTypeInputRule(config) {
|
|
4142
4334
|
return new InputRule({
|
|
@@ -4157,6 +4349,7 @@ function textblockTypeInputRule(config) {
|
|
|
4157
4349
|
/**
|
|
4158
4350
|
* Build an input rule that replaces text when the
|
|
4159
4351
|
* matched text is typed into it.
|
|
4352
|
+
* @see https://tiptap.dev/guide/custom-extensions/#input-rules
|
|
4160
4353
|
*/
|
|
4161
4354
|
function textInputRule(config) {
|
|
4162
4355
|
return new InputRule({
|
|
@@ -4193,6 +4386,7 @@ function textInputRule(config) {
|
|
|
4193
4386
|
* two nodes. You can pass a join predicate, which takes a regular
|
|
4194
4387
|
* expression match and the node before the wrapped node, and can
|
|
4195
4388
|
* return a boolean to indicate whether a join should happen.
|
|
4389
|
+
* @see https://tiptap.dev/guide/custom-extensions/#input-rules
|
|
4196
4390
|
*/
|
|
4197
4391
|
function wrappingInputRule(config) {
|
|
4198
4392
|
return new InputRule({
|
|
@@ -4232,6 +4426,10 @@ function wrappingInputRule(config) {
|
|
|
4232
4426
|
});
|
|
4233
4427
|
}
|
|
4234
4428
|
|
|
4429
|
+
/**
|
|
4430
|
+
* The Mark class is used to create custom mark extensions.
|
|
4431
|
+
* @see https://tiptap.dev/api/extensions#create-a-new-extension
|
|
4432
|
+
*/
|
|
4235
4433
|
class Mark {
|
|
4236
4434
|
constructor(config = {}) {
|
|
4237
4435
|
this.type = 'mark';
|
|
@@ -4315,6 +4513,10 @@ class Mark {
|
|
|
4315
4513
|
}
|
|
4316
4514
|
}
|
|
4317
4515
|
|
|
4516
|
+
/**
|
|
4517
|
+
* The Node class is used to create custom node extensions.
|
|
4518
|
+
* @see https://tiptap.dev/api/extensions#create-a-new-extension
|
|
4519
|
+
*/
|
|
4318
4520
|
class Node {
|
|
4319
4521
|
constructor(config = {}) {
|
|
4320
4522
|
this.type = 'node';
|
|
@@ -4382,6 +4584,10 @@ function isAndroid() {
|
|
|
4382
4584
|
return navigator.platform === 'Android' || /android/i.test(navigator.userAgent);
|
|
4383
4585
|
}
|
|
4384
4586
|
|
|
4587
|
+
/**
|
|
4588
|
+
* Node views are used to customize the rendered DOM structure of a node.
|
|
4589
|
+
* @see https://tiptap.dev/guide/node-views
|
|
4590
|
+
*/
|
|
4385
4591
|
class NodeView {
|
|
4386
4592
|
constructor(component, props, options) {
|
|
4387
4593
|
this.isDragging = false;
|
|
@@ -4572,6 +4778,7 @@ class NodeView {
|
|
|
4572
4778
|
/**
|
|
4573
4779
|
* Build an paste rule that adds a mark when the
|
|
4574
4780
|
* matched text is pasted into it.
|
|
4781
|
+
* @see https://tiptap.dev/guide/custom-extensions/#paste-rules
|
|
4575
4782
|
*/
|
|
4576
4783
|
function markPasteRule(config) {
|
|
4577
4784
|
return new PasteRule({
|
|
@@ -4625,6 +4832,7 @@ function isString(value) {
|
|
|
4625
4832
|
/**
|
|
4626
4833
|
* Build an paste rule that adds a node when the
|
|
4627
4834
|
* matched text is pasted into it.
|
|
4835
|
+
* @see https://tiptap.dev/guide/custom-extensions/#paste-rules
|
|
4628
4836
|
*/
|
|
4629
4837
|
function nodePasteRule(config) {
|
|
4630
4838
|
return new PasteRule({
|
|
@@ -4647,6 +4855,7 @@ function nodePasteRule(config) {
|
|
|
4647
4855
|
/**
|
|
4648
4856
|
* Build an paste rule that replaces text when the
|
|
4649
4857
|
* matched text is pasted into it.
|
|
4858
|
+
* @see https://tiptap.dev/guide/custom-extensions/#paste-rules
|
|
4650
4859
|
*/
|
|
4651
4860
|
function textPasteRule(config) {
|
|
4652
4861
|
return new PasteRule({
|