prosemirror-view 1.31.3 → 1.31.5
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/CHANGELOG.md +18 -0
- package/dist/index.cjs +25 -7
- package/dist/index.js +22 -6
- package/package.json +1 -1
- package/src/capturekeys.ts +1 -1
- package/src/domchange.ts +1 -1
- package/src/input.ts +6 -4
- package/src/viewdesc.ts +13 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
## 1.31.5 (2023-06-19)
|
|
2
|
+
|
|
3
|
+
### Bug fixes
|
|
4
|
+
|
|
5
|
+
Fix a bug where the editor accidentally blocked shift-delete when the whole document is selected.
|
|
6
|
+
|
|
7
|
+
Bring back workaround for an issue where Firefox draws the cursor in the wrong place in a code block.
|
|
8
|
+
|
|
9
|
+
Fix an issue where Shift-Insert pastes pasted plain text (because Shift was being held).
|
|
10
|
+
|
|
11
|
+
Fix an issue where selecting across paragraph and starting a composition would update the state as if Enter was pressed and disrupt the composition.
|
|
12
|
+
|
|
13
|
+
## 1.31.4 (2023-05-31)
|
|
14
|
+
|
|
15
|
+
### Bug fixes
|
|
16
|
+
|
|
17
|
+
Make sure `destroy` is called on node views that are replaced by changing a node's markup.
|
|
18
|
+
|
|
1
19
|
## 1.31.3 (2023-05-17)
|
|
2
20
|
|
|
3
21
|
### Bug fixes
|
package/dist/index.cjs
CHANGED
|
@@ -1134,6 +1134,21 @@ var ViewDesc = function () {
|
|
|
1134
1134
|
|
|
1135
1135
|
if (node.nodeType == 3) {
|
|
1136
1136
|
brKludge = !!(_offset && node.nodeValue[_offset - 1] == "\n");
|
|
1137
|
+
|
|
1138
|
+
if (brKludge && _offset == node.nodeValue.length) {
|
|
1139
|
+
for (var scan = node, after; scan; scan = scan.parentNode) {
|
|
1140
|
+
if (after = scan.nextSibling) {
|
|
1141
|
+
if (after.nodeName == "BR") anchorDOM = headDOM = {
|
|
1142
|
+
node: after.parentNode,
|
|
1143
|
+
offset: domIndex(after) + 1
|
|
1144
|
+
};
|
|
1145
|
+
break;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
var desc = scan.pmViewDesc;
|
|
1149
|
+
if (desc && desc.node && desc.node.isBlock) break;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1137
1152
|
} else {
|
|
1138
1153
|
var prev = node.childNodes[_offset - 1];
|
|
1139
1154
|
brKludge = prev && (prev.nodeName == "BR" || prev.contentEditable == "false");
|
|
@@ -1141,8 +1156,8 @@ var ViewDesc = function () {
|
|
|
1141
1156
|
}
|
|
1142
1157
|
|
|
1143
1158
|
if (gecko && domSel.focusNode && domSel.focusNode != headDOM.node && domSel.focusNode.nodeType == 1) {
|
|
1144
|
-
var
|
|
1145
|
-
if (
|
|
1159
|
+
var _after2 = domSel.focusNode.childNodes[domSel.focusOffset];
|
|
1160
|
+
if (_after2 && _after2.contentEditable == "false") force = true;
|
|
1146
1161
|
}
|
|
1147
1162
|
|
|
1148
1163
|
if (!(force || brKludge && safari) && isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) && isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset)) return;
|
|
@@ -2197,6 +2212,7 @@ var ViewTreeUpdater = function () {
|
|
|
2197
2212
|
if (!wrapper.contentDOM) return null;
|
|
2198
2213
|
wrapper.children = next.children;
|
|
2199
2214
|
next.children = [];
|
|
2215
|
+
next.destroy();
|
|
2200
2216
|
|
|
2201
2217
|
var _iterator = _createForOfIteratorHelper(wrapper.children),
|
|
2202
2218
|
_step;
|
|
@@ -2990,7 +3006,7 @@ function captureKeyDown(view, event) {
|
|
|
2990
3006
|
|
|
2991
3007
|
if (code == 8 || mac && code == 72 && mods == "c") {
|
|
2992
3008
|
return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);
|
|
2993
|
-
} else if (code == 46 || mac && code == 68 && mods == "c") {
|
|
3009
|
+
} else if (code == 46 && !event.shiftKey || mac && code == 68 && mods == "c") {
|
|
2994
3010
|
return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);
|
|
2995
3011
|
} else if (code == 13 || code == 27) {
|
|
2996
3012
|
return true;
|
|
@@ -3894,10 +3910,11 @@ function capturePaste(view, event) {
|
|
|
3894
3910
|
if (!plainText) target.contentEditable = "true";
|
|
3895
3911
|
target.style.cssText = "position: fixed; left: -10000px; top: 10px";
|
|
3896
3912
|
target.focus();
|
|
3913
|
+
var plain = view.input.shiftKey && view.input.lastKeyCode != 45;
|
|
3897
3914
|
setTimeout(function () {
|
|
3898
3915
|
view.focus();
|
|
3899
3916
|
if (target.parentNode) target.parentNode.removeChild(target);
|
|
3900
|
-
if (plainText) doPaste(view, target.value, null,
|
|
3917
|
+
if (plainText) doPaste(view, target.value, null, plain, event);else doPaste(view, target.textContent, target.innerHTML, plain, event);
|
|
3901
3918
|
}, 50);
|
|
3902
3919
|
}
|
|
3903
3920
|
|
|
@@ -3908,7 +3925,7 @@ function doPaste(view, text, html, preferPlain, event) {
|
|
|
3908
3925
|
})) return true;
|
|
3909
3926
|
if (!slice) return false;
|
|
3910
3927
|
var singleNode = sliceSingleNode(slice);
|
|
3911
|
-
var tr = singleNode ? view.state.tr.replaceSelectionWith(singleNode,
|
|
3928
|
+
var tr = singleNode ? view.state.tr.replaceSelectionWith(singleNode, preferPlain) : view.state.tr.replaceSelection(slice);
|
|
3912
3929
|
view.dispatch(tr.scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste"));
|
|
3913
3930
|
return true;
|
|
3914
3931
|
}
|
|
@@ -3917,7 +3934,8 @@ editHandlers.paste = function (view, _event) {
|
|
|
3917
3934
|
var event = _event;
|
|
3918
3935
|
if (view.composing && !android) return;
|
|
3919
3936
|
var data = brokenClipboardAPI ? null : event.clipboardData;
|
|
3920
|
-
|
|
3937
|
+
var plain = view.input.shiftKey && view.input.lastKeyCode != 45;
|
|
3938
|
+
if (data && doPaste(view, data.getData("text/plain"), data.getData("text/html"), plain, event)) event.preventDefault();else capturePaste(view, event);
|
|
3921
3939
|
};
|
|
3922
3940
|
|
|
3923
3941
|
var Dragging = _createClass(function Dragging(slice, move) {
|
|
@@ -5371,7 +5389,7 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
|
|
|
5371
5389
|
|
|
5372
5390
|
if ((ios && view.input.lastIOSEnter > Date.now() - 225 && (!inlineChange || addedNodes.some(function (n) {
|
|
5373
5391
|
return n.nodeName == "DIV" || n.nodeName == "P";
|
|
5374
|
-
})) || !inlineChange && $from.pos < parse.doc.content.size && (nextSel = prosemirrorState.Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head == $to.pos) && view.someProp("handleKeyDown", function (f) {
|
|
5392
|
+
})) || !inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) && (nextSel = prosemirrorState.Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head == $to.pos) && view.someProp("handleKeyDown", function (f) {
|
|
5375
5393
|
return f(view, keyEvent(13, "Enter"));
|
|
5376
5394
|
})) {
|
|
5377
5395
|
view.input.lastIOSEnter = 0;
|
package/dist/index.js
CHANGED
|
@@ -957,6 +957,19 @@ class ViewDesc {
|
|
|
957
957
|
let { node, offset } = anchorDOM;
|
|
958
958
|
if (node.nodeType == 3) {
|
|
959
959
|
brKludge = !!(offset && node.nodeValue[offset - 1] == "\n");
|
|
960
|
+
// Issue #1128
|
|
961
|
+
if (brKludge && offset == node.nodeValue.length) {
|
|
962
|
+
for (let scan = node, after; scan; scan = scan.parentNode) {
|
|
963
|
+
if (after = scan.nextSibling) {
|
|
964
|
+
if (after.nodeName == "BR")
|
|
965
|
+
anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };
|
|
966
|
+
break;
|
|
967
|
+
}
|
|
968
|
+
let desc = scan.pmViewDesc;
|
|
969
|
+
if (desc && desc.node && desc.node.isBlock)
|
|
970
|
+
break;
|
|
971
|
+
}
|
|
972
|
+
}
|
|
960
973
|
}
|
|
961
974
|
else {
|
|
962
975
|
let prev = node.childNodes[offset - 1];
|
|
@@ -1818,6 +1831,7 @@ class ViewTreeUpdater {
|
|
|
1818
1831
|
return null;
|
|
1819
1832
|
wrapper.children = next.children;
|
|
1820
1833
|
next.children = [];
|
|
1834
|
+
next.destroy();
|
|
1821
1835
|
for (let ch of wrapper.children)
|
|
1822
1836
|
ch.parent = wrapper;
|
|
1823
1837
|
return wrapper;
|
|
@@ -2585,7 +2599,7 @@ function captureKeyDown(view, event) {
|
|
|
2585
2599
|
if (code == 8 || (mac && code == 72 && mods == "c")) { // Backspace, Ctrl-h on Mac
|
|
2586
2600
|
return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);
|
|
2587
2601
|
}
|
|
2588
|
-
else if (code == 46 || (mac && code == 68 && mods == "c")) { // Delete, Ctrl-d on Mac
|
|
2602
|
+
else if ((code == 46 && !event.shiftKey) || (mac && code == 68 && mods == "c")) { // Delete, Ctrl-d on Mac
|
|
2589
2603
|
return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);
|
|
2590
2604
|
}
|
|
2591
2605
|
else if (code == 13 || code == 27) { // Enter, Esc
|
|
@@ -3413,14 +3427,15 @@ function capturePaste(view, event) {
|
|
|
3413
3427
|
target.contentEditable = "true";
|
|
3414
3428
|
target.style.cssText = "position: fixed; left: -10000px; top: 10px";
|
|
3415
3429
|
target.focus();
|
|
3430
|
+
let plain = view.input.shiftKey && view.input.lastKeyCode != 45;
|
|
3416
3431
|
setTimeout(() => {
|
|
3417
3432
|
view.focus();
|
|
3418
3433
|
if (target.parentNode)
|
|
3419
3434
|
target.parentNode.removeChild(target);
|
|
3420
3435
|
if (plainText)
|
|
3421
|
-
doPaste(view, target.value, null,
|
|
3436
|
+
doPaste(view, target.value, null, plain, event);
|
|
3422
3437
|
else
|
|
3423
|
-
doPaste(view, target.textContent, target.innerHTML,
|
|
3438
|
+
doPaste(view, target.textContent, target.innerHTML, plain, event);
|
|
3424
3439
|
}, 50);
|
|
3425
3440
|
}
|
|
3426
3441
|
function doPaste(view, text, html, preferPlain, event) {
|
|
@@ -3431,7 +3446,7 @@ function doPaste(view, text, html, preferPlain, event) {
|
|
|
3431
3446
|
return false;
|
|
3432
3447
|
let singleNode = sliceSingleNode(slice);
|
|
3433
3448
|
let tr = singleNode
|
|
3434
|
-
? view.state.tr.replaceSelectionWith(singleNode,
|
|
3449
|
+
? view.state.tr.replaceSelectionWith(singleNode, preferPlain)
|
|
3435
3450
|
: view.state.tr.replaceSelection(slice);
|
|
3436
3451
|
view.dispatch(tr.scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste"));
|
|
3437
3452
|
return true;
|
|
@@ -3445,7 +3460,8 @@ editHandlers.paste = (view, _event) => {
|
|
|
3445
3460
|
if (view.composing && !android)
|
|
3446
3461
|
return;
|
|
3447
3462
|
let data = brokenClipboardAPI ? null : event.clipboardData;
|
|
3448
|
-
|
|
3463
|
+
let plain = view.input.shiftKey && view.input.lastKeyCode != 45;
|
|
3464
|
+
if (data && doPaste(view, data.getData("text/plain"), data.getData("text/html"), plain, event))
|
|
3449
3465
|
event.preventDefault();
|
|
3450
3466
|
else
|
|
3451
3467
|
capturePaste(view, event);
|
|
@@ -4751,7 +4767,7 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
|
|
|
4751
4767
|
// as being an iOS enter press), just dispatch an Enter key instead.
|
|
4752
4768
|
if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&
|
|
4753
4769
|
(!inlineChange || addedNodes.some(n => n.nodeName == "DIV" || n.nodeName == "P"))) ||
|
|
4754
|
-
(!inlineChange && $from.pos < parse.doc.content.size &&
|
|
4770
|
+
(!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&
|
|
4755
4771
|
(nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&
|
|
4756
4772
|
nextSel.head == $to.pos)) &&
|
|
4757
4773
|
view.someProp("handleKeyDown", f => f(view, keyEvent(13, "Enter")))) {
|
package/package.json
CHANGED
package/src/capturekeys.ts
CHANGED
|
@@ -278,7 +278,7 @@ export function captureKeyDown(view: EditorView, event: KeyboardEvent) {
|
|
|
278
278
|
let code = event.keyCode, mods = getMods(event)
|
|
279
279
|
if (code == 8 || (browser.mac && code == 72 && mods == "c")) { // Backspace, Ctrl-h on Mac
|
|
280
280
|
return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1)
|
|
281
|
-
} else if (code == 46 || (browser.mac && code == 68 && mods == "c")) { // Delete, Ctrl-d on Mac
|
|
281
|
+
} else if ((code == 46 && !event.shiftKey) || (browser.mac && code == 68 && mods == "c")) { // Delete, Ctrl-d on Mac
|
|
282
282
|
return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1)
|
|
283
283
|
} else if (code == 13 || code == 27) { // Enter, Esc
|
|
284
284
|
return true
|
package/src/domchange.ts
CHANGED
|
@@ -185,7 +185,7 @@ export function readDOMChange(view: EditorView, from: number, to: number, typeOv
|
|
|
185
185
|
// as being an iOS enter press), just dispatch an Enter key instead.
|
|
186
186
|
if (((browser.ios && view.input.lastIOSEnter > Date.now() - 225 &&
|
|
187
187
|
(!inlineChange || addedNodes.some(n => n.nodeName == "DIV" || n.nodeName == "P"))) ||
|
|
188
|
-
(!inlineChange && $from.pos < parse.doc.content.size &&
|
|
188
|
+
(!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&
|
|
189
189
|
(nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&
|
|
190
190
|
nextSel.head == $to.pos)) &&
|
|
191
191
|
view.someProp("handleKeyDown", f => f(view, keyEvent(13, "Enter")))) {
|
package/src/input.ts
CHANGED
|
@@ -582,11 +582,12 @@ function capturePaste(view: EditorView, event: ClipboardEvent) {
|
|
|
582
582
|
if (!plainText) target.contentEditable = "true"
|
|
583
583
|
target.style.cssText = "position: fixed; left: -10000px; top: 10px"
|
|
584
584
|
target.focus()
|
|
585
|
+
let plain = view.input.shiftKey && view.input.lastKeyCode != 45
|
|
585
586
|
setTimeout(() => {
|
|
586
587
|
view.focus()
|
|
587
588
|
if (target.parentNode) target.parentNode.removeChild(target)
|
|
588
|
-
if (plainText) doPaste(view, (target as HTMLTextAreaElement).value, null,
|
|
589
|
-
else doPaste(view, target.textContent!, target.innerHTML,
|
|
589
|
+
if (plainText) doPaste(view, (target as HTMLTextAreaElement).value, null, plain, event)
|
|
590
|
+
else doPaste(view, target.textContent!, target.innerHTML, plain, event)
|
|
590
591
|
}, 50)
|
|
591
592
|
}
|
|
592
593
|
|
|
@@ -597,7 +598,7 @@ export function doPaste(view: EditorView, text: string, html: string | null, pre
|
|
|
597
598
|
|
|
598
599
|
let singleNode = sliceSingleNode(slice)
|
|
599
600
|
let tr = singleNode
|
|
600
|
-
? view.state.tr.replaceSelectionWith(singleNode,
|
|
601
|
+
? view.state.tr.replaceSelectionWith(singleNode, preferPlain)
|
|
601
602
|
: view.state.tr.replaceSelection(slice)
|
|
602
603
|
view.dispatch(tr.scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste"))
|
|
603
604
|
return true
|
|
@@ -611,7 +612,8 @@ editHandlers.paste = (view, _event) => {
|
|
|
611
612
|
// where the editor is almost always composing.
|
|
612
613
|
if (view.composing && !browser.android) return
|
|
613
614
|
let data = brokenClipboardAPI ? null : event.clipboardData
|
|
614
|
-
|
|
615
|
+
let plain = view.input.shiftKey && view.input.lastKeyCode != 45
|
|
616
|
+
if (data && doPaste(view, data.getData("text/plain"), data.getData("text/html"), plain, event))
|
|
615
617
|
event.preventDefault()
|
|
616
618
|
else
|
|
617
619
|
capturePaste(view, event)
|
package/src/viewdesc.ts
CHANGED
|
@@ -385,6 +385,18 @@ export class ViewDesc {
|
|
|
385
385
|
let {node, offset} = anchorDOM
|
|
386
386
|
if (node.nodeType == 3) {
|
|
387
387
|
brKludge = !!(offset && node.nodeValue![offset - 1] == "\n")
|
|
388
|
+
// Issue #1128
|
|
389
|
+
if (brKludge && offset == node.nodeValue!.length) {
|
|
390
|
+
for (let scan: DOMNode | null = node, after; scan; scan = scan.parentNode) {
|
|
391
|
+
if (after = scan.nextSibling) {
|
|
392
|
+
if (after.nodeName == "BR")
|
|
393
|
+
anchorDOM = headDOM = {node: after.parentNode!, offset: domIndex(after) + 1}
|
|
394
|
+
break
|
|
395
|
+
}
|
|
396
|
+
let desc = scan.pmViewDesc
|
|
397
|
+
if (desc && desc.node && desc.node.isBlock) break
|
|
398
|
+
}
|
|
399
|
+
}
|
|
388
400
|
} else {
|
|
389
401
|
let prev = node.childNodes[offset - 1]
|
|
390
402
|
brKludge = prev && (prev.nodeName == "BR" || (prev as HTMLElement).contentEditable == "false")
|
|
@@ -1255,6 +1267,7 @@ class ViewTreeUpdater {
|
|
|
1255
1267
|
if (!wrapper.contentDOM) return null
|
|
1256
1268
|
wrapper.children = next.children
|
|
1257
1269
|
next.children = []
|
|
1270
|
+
next.destroy()
|
|
1258
1271
|
for (let ch of wrapper.children) ch.parent = wrapper
|
|
1259
1272
|
|
|
1260
1273
|
return wrapper
|