@tiptap/core 2.0.0-beta.217 → 2.0.0-beta.219
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 +90 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +77 -24
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +90 -23
- package/dist/index.umd.js.map +1 -1
- package/dist/packages/core/src/NodeView.d.ts +3 -3
- package/dist/packages/core/src/commands/toggleList.d.ts +1 -1
- package/dist/packages/core/src/helpers/index.d.ts +14 -0
- package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +4 -0
- package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +2 -2
- package/dist/packages/core/src/types.d.ts +5 -2
- package/package.json +2 -2
- package/src/Editor.ts +1 -1
- package/src/NodeView.ts +14 -6
- package/src/commands/insertContentAt.ts +9 -1
- package/src/commands/splitListItem.ts +12 -0
- package/src/commands/toggleList.ts +28 -7
- package/src/helpers/createNodeFromContent.ts +1 -1
- package/src/helpers/index.ts +14 -0
- package/src/inputRules/wrappingInputRule.ts +33 -8
- package/src/pasteRules/nodePasteRule.ts +2 -2
- package/src/types.ts +8 -2
package/dist/index.umd.js
CHANGED
|
@@ -1569,7 +1569,7 @@
|
|
|
1569
1569
|
};
|
|
1570
1570
|
if (typeof content === 'object' && content !== null) {
|
|
1571
1571
|
try {
|
|
1572
|
-
if (Array.isArray(content)) {
|
|
1572
|
+
if (Array.isArray(content) && content.length > 0) {
|
|
1573
1573
|
return model.Fragment.fromArray(content.map(item => schema.nodeFromJSON(item)));
|
|
1574
1574
|
}
|
|
1575
1575
|
return schema.nodeFromJSON(content);
|
|
@@ -1654,7 +1654,17 @@
|
|
|
1654
1654
|
// if there is only plain text we have to use `insertText`
|
|
1655
1655
|
// because this will keep the current marks
|
|
1656
1656
|
if (isOnlyTextContent) {
|
|
1657
|
-
|
|
1657
|
+
// if value is string, we can use it directly
|
|
1658
|
+
// otherwise if it is an array, we have to join it
|
|
1659
|
+
if (Array.isArray(value)) {
|
|
1660
|
+
tr.insertText(value.map(v => v.text || '').join(''), from, to);
|
|
1661
|
+
}
|
|
1662
|
+
else if (typeof value === 'object' && !!value && !!value.text) {
|
|
1663
|
+
tr.insertText(value.text, from, to);
|
|
1664
|
+
}
|
|
1665
|
+
else {
|
|
1666
|
+
tr.insertText(value, from, to);
|
|
1667
|
+
}
|
|
1658
1668
|
}
|
|
1659
1669
|
else {
|
|
1660
1670
|
tr.replaceWith(from, to, content);
|
|
@@ -2244,6 +2254,20 @@
|
|
|
2244
2254
|
return marks;
|
|
2245
2255
|
}
|
|
2246
2256
|
|
|
2257
|
+
function getSplittedAttributes(extensionAttributes, typeName, attributes) {
|
|
2258
|
+
return Object.fromEntries(Object
|
|
2259
|
+
.entries(attributes)
|
|
2260
|
+
.filter(([name]) => {
|
|
2261
|
+
const extensionAttribute = extensionAttributes.find(item => {
|
|
2262
|
+
return item.type === typeName && item.name === name;
|
|
2263
|
+
});
|
|
2264
|
+
if (!extensionAttribute) {
|
|
2265
|
+
return false;
|
|
2266
|
+
}
|
|
2267
|
+
return extensionAttribute.attribute.keepOnSplit;
|
|
2268
|
+
}));
|
|
2269
|
+
}
|
|
2270
|
+
|
|
2247
2271
|
function isMarkActive(state, typeOrName, attributes = {}) {
|
|
2248
2272
|
const { empty, ranges } = state.selection;
|
|
2249
2273
|
const type = typeOrName ? getMarkType(typeOrName, state.schema) : null;
|
|
@@ -2513,20 +2537,6 @@
|
|
|
2513
2537
|
return schemaList.sinkListItem(type)(state, dispatch);
|
|
2514
2538
|
};
|
|
2515
2539
|
|
|
2516
|
-
function getSplittedAttributes(extensionAttributes, typeName, attributes) {
|
|
2517
|
-
return Object.fromEntries(Object
|
|
2518
|
-
.entries(attributes)
|
|
2519
|
-
.filter(([name]) => {
|
|
2520
|
-
const extensionAttribute = extensionAttributes.find(item => {
|
|
2521
|
-
return item.type === typeName && item.name === name;
|
|
2522
|
-
});
|
|
2523
|
-
if (!extensionAttribute) {
|
|
2524
|
-
return false;
|
|
2525
|
-
}
|
|
2526
|
-
return extensionAttribute.attribute.keepOnSplit;
|
|
2527
|
-
}));
|
|
2528
|
-
}
|
|
2529
|
-
|
|
2530
2540
|
function ensureMarks(state, splittableMarks) {
|
|
2531
2541
|
const marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());
|
|
2532
2542
|
if (marks) {
|
|
@@ -2673,7 +2683,15 @@
|
|
|
2673
2683
|
return false;
|
|
2674
2684
|
}
|
|
2675
2685
|
if (dispatch) {
|
|
2686
|
+
const { selection, storedMarks } = state$1;
|
|
2687
|
+
const { splittableMarks } = editor.extensionManager;
|
|
2688
|
+
const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks());
|
|
2676
2689
|
tr.split($from.pos, 2, types).scrollIntoView();
|
|
2690
|
+
if (!marks || !dispatch) {
|
|
2691
|
+
return true;
|
|
2692
|
+
}
|
|
2693
|
+
const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name));
|
|
2694
|
+
tr.ensureMarks(filteredMarks);
|
|
2677
2695
|
}
|
|
2678
2696
|
return true;
|
|
2679
2697
|
};
|
|
@@ -2712,13 +2730,14 @@
|
|
|
2712
2730
|
tr.join(after);
|
|
2713
2731
|
return true;
|
|
2714
2732
|
};
|
|
2715
|
-
const toggleList = (listTypeOrName, itemTypeOrName) => ({ editor, tr, state, dispatch, chain, commands, can, }) => {
|
|
2716
|
-
const { extensions } = editor.extensionManager;
|
|
2733
|
+
const toggleList = (listTypeOrName, itemTypeOrName, keepMarks) => ({ editor, tr, state, dispatch, chain, commands, can, }) => {
|
|
2734
|
+
const { extensions, splittableMarks } = editor.extensionManager;
|
|
2717
2735
|
const listType = getNodeType(listTypeOrName, state.schema);
|
|
2718
2736
|
const itemType = getNodeType(itemTypeOrName, state.schema);
|
|
2719
|
-
const { selection } = state;
|
|
2737
|
+
const { selection, storedMarks } = state;
|
|
2720
2738
|
const { $from, $to } = selection;
|
|
2721
2739
|
const range = $from.blockRange($to);
|
|
2740
|
+
const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks());
|
|
2722
2741
|
if (!range) {
|
|
2723
2742
|
return false;
|
|
2724
2743
|
}
|
|
@@ -2742,10 +2761,27 @@
|
|
|
2742
2761
|
.run();
|
|
2743
2762
|
}
|
|
2744
2763
|
}
|
|
2764
|
+
if (!keepMarks || !marks || !dispatch) {
|
|
2765
|
+
return chain()
|
|
2766
|
+
// try to convert node to default node if needed
|
|
2767
|
+
.command(() => {
|
|
2768
|
+
const canWrapInList = can().wrapInList(listType);
|
|
2769
|
+
if (canWrapInList) {
|
|
2770
|
+
return true;
|
|
2771
|
+
}
|
|
2772
|
+
return commands.clearNodes();
|
|
2773
|
+
})
|
|
2774
|
+
.wrapInList(listType)
|
|
2775
|
+
.command(() => joinListBackwards(tr, listType))
|
|
2776
|
+
.command(() => joinListForwards(tr, listType))
|
|
2777
|
+
.run();
|
|
2778
|
+
}
|
|
2745
2779
|
return (chain()
|
|
2746
2780
|
// try to convert node to default node if needed
|
|
2747
2781
|
.command(() => {
|
|
2748
2782
|
const canWrapInList = can().wrapInList(listType);
|
|
2783
|
+
const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name));
|
|
2784
|
+
tr.ensureMarks(filteredMarks);
|
|
2749
2785
|
if (canWrapInList) {
|
|
2750
2786
|
return true;
|
|
2751
2787
|
}
|
|
@@ -3543,8 +3579,8 @@ img.ProseMirror-separator {
|
|
|
3543
3579
|
return getText(this.state.doc, {
|
|
3544
3580
|
blockSeparator,
|
|
3545
3581
|
textSerializers: {
|
|
3546
|
-
...textSerializers,
|
|
3547
3582
|
...getTextSerializersFromSchema(this.schema),
|
|
3583
|
+
...textSerializers,
|
|
3548
3584
|
},
|
|
3549
3585
|
});
|
|
3550
3586
|
}
|
|
@@ -3726,7 +3762,7 @@ img.ProseMirror-separator {
|
|
|
3726
3762
|
function wrappingInputRule(config) {
|
|
3727
3763
|
return new InputRule({
|
|
3728
3764
|
find: config.find,
|
|
3729
|
-
handler: ({ state, range, match }) => {
|
|
3765
|
+
handler: ({ state, range, match, chain, }) => {
|
|
3730
3766
|
const attributes = callOrReturn(config.getAttributes, undefined, match) || {};
|
|
3731
3767
|
const tr = state.tr.delete(range.from, range.to);
|
|
3732
3768
|
const $start = tr.doc.resolve(range.from);
|
|
@@ -3736,6 +3772,20 @@ img.ProseMirror-separator {
|
|
|
3736
3772
|
return null;
|
|
3737
3773
|
}
|
|
3738
3774
|
tr.wrap(blockRange, wrapping);
|
|
3775
|
+
if (config.keepMarks && config.editor) {
|
|
3776
|
+
const { selection, storedMarks } = state;
|
|
3777
|
+
const { splittableMarks } = config.editor.extensionManager;
|
|
3778
|
+
const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks());
|
|
3779
|
+
if (marks) {
|
|
3780
|
+
const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name));
|
|
3781
|
+
tr.ensureMarks(filteredMarks);
|
|
3782
|
+
}
|
|
3783
|
+
}
|
|
3784
|
+
if (config.keepAttributes) {
|
|
3785
|
+
/** If the nodeType is `bulletList` or `orderedList` set the `nodeType` as `listItem` */
|
|
3786
|
+
const nodeType = config.type.name === 'bulletList' || config.type.name === 'orderedList' ? 'listItem' : 'taskList';
|
|
3787
|
+
chain().updateAttributes(nodeType, attributes).run();
|
|
3788
|
+
}
|
|
3739
3789
|
const before = tr.doc.resolve(range.from - 1).nodeBefore;
|
|
3740
3790
|
if (before
|
|
3741
3791
|
&& before.type === config.type
|
|
@@ -3964,10 +4014,11 @@ img.ProseMirror-separator {
|
|
|
3964
4014
|
if (!isInElement) {
|
|
3965
4015
|
return false;
|
|
3966
4016
|
}
|
|
4017
|
+
const isDragEvent = event.type.startsWith('drag');
|
|
3967
4018
|
const isDropEvent = event.type === 'drop';
|
|
3968
4019
|
const isInput = ['INPUT', 'BUTTON', 'SELECT', 'TEXTAREA'].includes(target.tagName) || target.isContentEditable;
|
|
3969
4020
|
// any input event within node views should be ignored by ProseMirror
|
|
3970
|
-
if (isInput && !isDropEvent) {
|
|
4021
|
+
if (isInput && !isDropEvent && !isDragEvent) {
|
|
3971
4022
|
return true;
|
|
3972
4023
|
}
|
|
3973
4024
|
const { isEditable } = this.editor;
|
|
@@ -3978,7 +4029,6 @@ img.ProseMirror-separator {
|
|
|
3978
4029
|
const isPasteEvent = event.type === 'paste';
|
|
3979
4030
|
const isCutEvent = event.type === 'cut';
|
|
3980
4031
|
const isClickEvent = event.type === 'mousedown';
|
|
3981
|
-
const isDragEvent = event.type.startsWith('drag');
|
|
3982
4032
|
// ProseMirror tries to drag selectable nodes
|
|
3983
4033
|
// even if `draggable` is set to `false`
|
|
3984
4034
|
// this fix prevents that
|
|
@@ -3998,6 +4048,9 @@ img.ProseMirror-separator {
|
|
|
3998
4048
|
document.addEventListener('dragend', () => {
|
|
3999
4049
|
this.isDragging = false;
|
|
4000
4050
|
}, { once: true });
|
|
4051
|
+
document.addEventListener('drop', () => {
|
|
4052
|
+
this.isDragging = false;
|
|
4053
|
+
}, { once: true });
|
|
4001
4054
|
document.addEventListener('mouseup', () => {
|
|
4002
4055
|
this.isDragging = false;
|
|
4003
4056
|
}, { once: true });
|
|
@@ -4211,6 +4264,9 @@ img.ProseMirror-separator {
|
|
|
4211
4264
|
exports.Tracker = Tracker;
|
|
4212
4265
|
exports.callOrReturn = callOrReturn;
|
|
4213
4266
|
exports.combineTransactionSteps = combineTransactionSteps;
|
|
4267
|
+
exports.createChainableState = createChainableState;
|
|
4268
|
+
exports.createDocument = createDocument;
|
|
4269
|
+
exports.createNodeFromContent = createNodeFromContent;
|
|
4214
4270
|
exports.createStyleTag = createStyleTag;
|
|
4215
4271
|
exports.defaultBlockAt = defaultBlockAt;
|
|
4216
4272
|
exports.deleteProps = deleteProps;
|
|
@@ -4227,6 +4283,7 @@ img.ProseMirror-separator {
|
|
|
4227
4283
|
exports.generateJSON = generateJSON;
|
|
4228
4284
|
exports.generateText = generateText;
|
|
4229
4285
|
exports.getAttributes = getAttributes;
|
|
4286
|
+
exports.getAttributesFromExtensions = getAttributesFromExtensions;
|
|
4230
4287
|
exports.getChangedRanges = getChangedRanges;
|
|
4231
4288
|
exports.getDebugJSON = getDebugJSON;
|
|
4232
4289
|
exports.getExtensionField = getExtensionField;
|
|
@@ -4237,14 +4294,21 @@ img.ProseMirror-separator {
|
|
|
4237
4294
|
exports.getMarksBetween = getMarksBetween;
|
|
4238
4295
|
exports.getNodeAttributes = getNodeAttributes;
|
|
4239
4296
|
exports.getNodeType = getNodeType;
|
|
4297
|
+
exports.getRenderedAttributes = getRenderedAttributes;
|
|
4240
4298
|
exports.getSchema = getSchema;
|
|
4299
|
+
exports.getSchemaByResolvedExtensions = getSchemaByResolvedExtensions;
|
|
4300
|
+
exports.getSchemaTypeByName = getSchemaTypeByName;
|
|
4301
|
+
exports.getSchemaTypeNameByName = getSchemaTypeNameByName;
|
|
4302
|
+
exports.getSplittedAttributes = getSplittedAttributes;
|
|
4241
4303
|
exports.getText = getText;
|
|
4242
4304
|
exports.getTextBetween = getTextBetween;
|
|
4243
4305
|
exports.getTextContentFromNodes = getTextContentFromNodes;
|
|
4244
4306
|
exports.getTextSerializersFromSchema = getTextSerializersFromSchema;
|
|
4307
|
+
exports.injectExtensionAttributesToParseRule = injectExtensionAttributesToParseRule;
|
|
4245
4308
|
exports.inputRulesPlugin = inputRulesPlugin;
|
|
4246
4309
|
exports.isActive = isActive;
|
|
4247
4310
|
exports.isEmptyObject = isEmptyObject;
|
|
4311
|
+
exports.isExtensionRulesEnabled = isExtensionRulesEnabled;
|
|
4248
4312
|
exports.isFunction = isFunction;
|
|
4249
4313
|
exports.isList = isList;
|
|
4250
4314
|
exports.isMacOS = isMacOS;
|
|
@@ -4269,6 +4333,9 @@ img.ProseMirror-separator {
|
|
|
4269
4333
|
exports.pasteRulesPlugin = pasteRulesPlugin;
|
|
4270
4334
|
exports.posToDOMRect = posToDOMRect;
|
|
4271
4335
|
exports.removeDuplicates = removeDuplicates;
|
|
4336
|
+
exports.resolveFocusPosition = resolveFocusPosition;
|
|
4337
|
+
exports.selectionToInsertionEnd = selectionToInsertionEnd;
|
|
4338
|
+
exports.splitExtensions = splitExtensions;
|
|
4272
4339
|
exports.textInputRule = textInputRule;
|
|
4273
4340
|
exports.textPasteRule = textPasteRule;
|
|
4274
4341
|
exports.textblockTypeInputRule = textblockTypeInputRule;
|