sqlui 0.1.76 → 0.1.77
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.
- checksums.yaml +4 -4
- data/.release-version +1 -1
- data/app/github/tree_client.rb +4 -8
- data/app/server.rb +42 -7
- data/app/sqlui.rb +1 -29
- data/client/resources/sqlui.js +1152 -741
- metadata +2 -114
data/client/resources/sqlui.js
CHANGED
@@ -5,10 +5,6 @@
|
|
5
5
|
The data structure for documents. @nonabstract
|
6
6
|
*/
|
7
7
|
class Text {
|
8
|
-
/**
|
9
|
-
@internal
|
10
|
-
*/
|
11
|
-
constructor() { }
|
12
8
|
/**
|
13
9
|
Get the line description around the given position.
|
14
10
|
*/
|
@@ -103,7 +99,8 @@
|
|
103
99
|
return new LineCursor(inner);
|
104
100
|
}
|
105
101
|
/**
|
106
|
-
|
102
|
+
Return the document as a string, using newline characters to
|
103
|
+
separate lines.
|
107
104
|
*/
|
108
105
|
toString() { return this.sliceString(0); }
|
109
106
|
/**
|
@@ -116,6 +113,10 @@
|
|
116
113
|
return lines;
|
117
114
|
}
|
118
115
|
/**
|
116
|
+
@internal
|
117
|
+
*/
|
118
|
+
constructor() { }
|
119
|
+
/**
|
119
120
|
Create a `Text` instance for the given array of lines.
|
120
121
|
*/
|
121
122
|
static of(text) {
|
@@ -2159,7 +2160,10 @@
|
|
2159
2160
|
is(type) { return this.type == type; }
|
2160
2161
|
/**
|
2161
2162
|
Define a new effect type. The type parameter indicates the type
|
2162
|
-
of values that his effect holds.
|
2163
|
+
of values that his effect holds. It should be a type that
|
2164
|
+
doesn't include `undefined`, since that is used in
|
2165
|
+
[mapping](https://codemirror.net/6/docs/ref/#state.StateEffect.map) to indicate that an effect is
|
2166
|
+
removed.
|
2163
2167
|
*/
|
2164
2168
|
static define(spec = {}) {
|
2165
2169
|
return new StateEffectType(spec.map || (v => v));
|
@@ -3302,8 +3306,7 @@
|
|
3302
3306
|
static compare(oldSets, newSets,
|
3303
3307
|
/**
|
3304
3308
|
This indicates how the underlying data changed between these
|
3305
|
-
ranges, and is needed to synchronize the iteration.
|
3306
|
-
`to` are coordinates in the _new_ space, after these changes.
|
3309
|
+
ranges, and is needed to synchronize the iteration.
|
3307
3310
|
*/
|
3308
3311
|
textDiff, comparator,
|
3309
3312
|
/**
|
@@ -3414,6 +3417,18 @@
|
|
3414
3417
|
an array of [`Range`](https://codemirror.net/6/docs/ref/#state.Range) objects.
|
3415
3418
|
*/
|
3416
3419
|
class RangeSetBuilder {
|
3420
|
+
finishChunk(newArrays) {
|
3421
|
+
this.chunks.push(new Chunk(this.from, this.to, this.value, this.maxPoint));
|
3422
|
+
this.chunkPos.push(this.chunkStart);
|
3423
|
+
this.chunkStart = -1;
|
3424
|
+
this.setMaxPoint = Math.max(this.setMaxPoint, this.maxPoint);
|
3425
|
+
this.maxPoint = -1;
|
3426
|
+
if (newArrays) {
|
3427
|
+
this.from = [];
|
3428
|
+
this.to = [];
|
3429
|
+
this.value = [];
|
3430
|
+
}
|
3431
|
+
}
|
3417
3432
|
/**
|
3418
3433
|
Create an empty builder.
|
3419
3434
|
*/
|
@@ -3431,18 +3446,6 @@
|
|
3431
3446
|
this.setMaxPoint = -1;
|
3432
3447
|
this.nextLayer = null;
|
3433
3448
|
}
|
3434
|
-
finishChunk(newArrays) {
|
3435
|
-
this.chunks.push(new Chunk(this.from, this.to, this.value, this.maxPoint));
|
3436
|
-
this.chunkPos.push(this.chunkStart);
|
3437
|
-
this.chunkStart = -1;
|
3438
|
-
this.setMaxPoint = Math.max(this.setMaxPoint, this.maxPoint);
|
3439
|
-
this.maxPoint = -1;
|
3440
|
-
if (newArrays) {
|
3441
|
-
this.from = [];
|
3442
|
-
this.to = [];
|
3443
|
-
this.value = [];
|
3444
|
-
}
|
3445
|
-
}
|
3446
3449
|
/**
|
3447
3450
|
Add a range. Ranges should be added in sorted (by `from` and
|
3448
3451
|
`value.startSide`) order.
|
@@ -3802,7 +3805,7 @@
|
|
3802
3805
|
let end = diff < 0 ? a.to + dPos : b.to, clipEnd = Math.min(end, endB);
|
3803
3806
|
if (a.point || b.point) {
|
3804
3807
|
if (!(a.point && b.point && (a.point == b.point || a.point.eq(b.point)) &&
|
3805
|
-
sameValues(a.activeForPoint(a.to
|
3808
|
+
sameValues(a.activeForPoint(a.to), b.activeForPoint(b.to))))
|
3806
3809
|
comparator.comparePoint(pos, clipEnd, a.point, b.point);
|
3807
3810
|
}
|
3808
3811
|
else {
|
@@ -3965,20 +3968,22 @@
|
|
3965
3968
|
}
|
3966
3969
|
}
|
3967
3970
|
|
3968
|
-
let adoptedSet =
|
3971
|
+
let adoptedSet = new Map; //<Document, StyleSet>
|
3969
3972
|
|
3970
3973
|
class StyleSet {
|
3971
3974
|
constructor(root) {
|
3972
|
-
|
3973
|
-
|
3974
|
-
|
3975
|
-
|
3975
|
+
let doc = root.ownerDocument || root, win = doc.defaultView;
|
3976
|
+
if (!root.head && root.adoptedStyleSheets && win.CSSStyleSheet) {
|
3977
|
+
let adopted = adoptedSet.get(doc);
|
3978
|
+
if (adopted) {
|
3979
|
+
root.adoptedStyleSheets = [adopted.sheet, ...root.adoptedStyleSheets];
|
3980
|
+
return root[SET] = adopted
|
3976
3981
|
}
|
3977
|
-
this.sheet = new CSSStyleSheet;
|
3982
|
+
this.sheet = new win.CSSStyleSheet;
|
3978
3983
|
root.adoptedStyleSheets = [this.sheet, ...root.adoptedStyleSheets];
|
3979
|
-
adoptedSet
|
3984
|
+
adoptedSet.set(doc, this);
|
3980
3985
|
} else {
|
3981
|
-
this.styleTag =
|
3986
|
+
this.styleTag = doc.createElement("style");
|
3982
3987
|
let target = root.head || root;
|
3983
3988
|
target.insertBefore(this.styleTag, target.firstChild);
|
3984
3989
|
}
|
@@ -4124,10 +4129,8 @@
|
|
4124
4129
|
222: "\""
|
4125
4130
|
};
|
4126
4131
|
|
4127
|
-
var chrome$1 = typeof navigator != "undefined" && /Chrome\/(\d+)/.exec(navigator.userAgent);
|
4128
4132
|
var mac = typeof navigator != "undefined" && /Mac/.test(navigator.platform);
|
4129
4133
|
var ie$1 = typeof navigator != "undefined" && /MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);
|
4130
|
-
var brokenModifierNames = mac || chrome$1 && +chrome$1[1] < 57;
|
4131
4134
|
|
4132
4135
|
// Fill in the digit keys
|
4133
4136
|
for (var i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i);
|
@@ -4145,9 +4148,11 @@
|
|
4145
4148
|
for (var code in base) if (!shift.hasOwnProperty(code)) shift[code] = base[code];
|
4146
4149
|
|
4147
4150
|
function keyName(event) {
|
4148
|
-
|
4149
|
-
|
4150
|
-
|
4151
|
+
// On macOS, keys held with Shift and Cmd don't reflect the effect of Shift in `.key`.
|
4152
|
+
// On IE, shift effect is never included in `.key`.
|
4153
|
+
var ignoreKey = mac && event.metaKey && event.shiftKey && !event.ctrlKey && !event.altKey ||
|
4154
|
+
ie$1 && event.shiftKey && event.key && event.key.length == 1 ||
|
4155
|
+
event.key == "Unidentified";
|
4151
4156
|
var name = (!ignoreKey && event.key) ||
|
4152
4157
|
(event.shiftKey ? shift : base)[event.keyCode] ||
|
4153
4158
|
event.key || "Unidentified";
|
@@ -4246,7 +4251,6 @@
|
|
4246
4251
|
function maxOffset(node) {
|
4247
4252
|
return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;
|
4248
4253
|
}
|
4249
|
-
const Rect0 = { left: 0, right: 0, top: 0, bottom: 0 };
|
4250
4254
|
function flattenRect(rect, left) {
|
4251
4255
|
let x = left ? rect.left : rect.right;
|
4252
4256
|
return { left: x, right: x, top: rect.top, bottom: rect.bottom };
|
@@ -4379,7 +4383,9 @@
|
|
4379
4383
|
this.focusNode == domSel.focusNode && this.focusOffset == domSel.focusOffset;
|
4380
4384
|
}
|
4381
4385
|
setRange(range) {
|
4382
|
-
|
4386
|
+
let { anchorNode, focusNode } = range;
|
4387
|
+
// Clip offsets to node size to avoid crashes when Safari reports bogus offsets (#1152)
|
4388
|
+
this.set(anchorNode, Math.min(range.anchorOffset, anchorNode ? maxOffset(anchorNode) : 0), focusNode, Math.min(range.focusOffset, focusNode ? maxOffset(focusNode) : 0));
|
4383
4389
|
}
|
4384
4390
|
set(anchorNode, anchorOffset, focusNode, focusOffset) {
|
4385
4391
|
this.anchorNode = anchorNode;
|
@@ -4452,6 +4458,8 @@
|
|
4452
4458
|
let node = selection.focusNode, offset = selection.focusOffset;
|
4453
4459
|
if (!node || selection.anchorNode != node || selection.anchorOffset != offset)
|
4454
4460
|
return false;
|
4461
|
+
// Safari can report bogus offsets (#1152)
|
4462
|
+
offset = Math.min(offset, maxOffset(node));
|
4455
4463
|
for (;;) {
|
4456
4464
|
if (offset) {
|
4457
4465
|
if (node.nodeType != 1)
|
@@ -4473,6 +4481,9 @@
|
|
4473
4481
|
}
|
4474
4482
|
}
|
4475
4483
|
}
|
4484
|
+
function isScrolledToBottom(elt) {
|
4485
|
+
return elt.scrollTop > Math.max(1, elt.scrollHeight - elt.clientHeight - 4);
|
4486
|
+
}
|
4476
4487
|
|
4477
4488
|
class DOMPos {
|
4478
4489
|
constructor(node, offset, precise = true) {
|
@@ -4488,7 +4499,7 @@
|
|
4488
4499
|
constructor() {
|
4489
4500
|
this.parent = null;
|
4490
4501
|
this.dom = null;
|
4491
|
-
this.dirty = 2 /*
|
4502
|
+
this.dirty = 2 /* Node */;
|
4492
4503
|
}
|
4493
4504
|
get overrideDOMText() { return null; }
|
4494
4505
|
get posAtStart() {
|
@@ -4509,23 +4520,19 @@
|
|
4509
4520
|
posAfter(view) {
|
4510
4521
|
return this.posBefore(view) + view.length;
|
4511
4522
|
}
|
4512
|
-
// Will return a rectangle directly before (when side < 0), after
|
4513
|
-
// (side > 0) or directly on (when the browser supports it) the
|
4514
|
-
// given position.
|
4515
|
-
coordsAt(_pos, _side) { return null; }
|
4516
4523
|
sync(view, track) {
|
4517
|
-
if (this.dirty & 2 /*
|
4524
|
+
if (this.dirty & 2 /* Node */) {
|
4518
4525
|
let parent = this.dom;
|
4519
4526
|
let prev = null, next;
|
4520
4527
|
for (let child of this.children) {
|
4521
4528
|
if (child.dirty) {
|
4522
|
-
if (!child.dom && (next = prev ? prev.nextSibling : parent.firstChild)) {
|
4529
|
+
if (!child.dom && (next = prev ? prev.nextSibling : parent.firstChild) && next != view.docView.compositionNode) {
|
4523
4530
|
let contentView = ContentView.get(next);
|
4524
4531
|
if (!contentView || !contentView.parent && contentView.canReuseDOM(child))
|
4525
4532
|
child.reuseDOM(next);
|
4526
4533
|
}
|
4527
4534
|
child.sync(view, track);
|
4528
|
-
child.dirty = 0 /*
|
4535
|
+
child.dirty = 0 /* Not */;
|
4529
4536
|
}
|
4530
4537
|
next = prev ? prev.nextSibling : parent.firstChild;
|
4531
4538
|
if (track && !track.written && track.node == parent && next != child.dom)
|
@@ -4545,11 +4552,11 @@
|
|
4545
4552
|
while (next)
|
4546
4553
|
next = rm$1(next);
|
4547
4554
|
}
|
4548
|
-
else if (this.dirty & 1 /*
|
4555
|
+
else if (this.dirty & 1 /* Child */) {
|
4549
4556
|
for (let child of this.children)
|
4550
4557
|
if (child.dirty) {
|
4551
4558
|
child.sync(view, track);
|
4552
|
-
child.dirty = 0 /*
|
4559
|
+
child.dirty = 0 /* Not */;
|
4553
4560
|
}
|
4554
4561
|
}
|
4555
4562
|
}
|
@@ -4614,16 +4621,16 @@
|
|
4614
4621
|
endDOM: toI < this.children.length && toI >= 0 ? this.children[toI].dom : null };
|
4615
4622
|
}
|
4616
4623
|
markDirty(andParent = false) {
|
4617
|
-
this.dirty |= 2 /*
|
4624
|
+
this.dirty |= 2 /* Node */;
|
4618
4625
|
this.markParentsDirty(andParent);
|
4619
4626
|
}
|
4620
4627
|
markParentsDirty(childList) {
|
4621
4628
|
for (let parent = this.parent; parent; parent = parent.parent) {
|
4622
4629
|
if (childList)
|
4623
|
-
parent.dirty |= 2 /*
|
4624
|
-
if (parent.dirty & 1 /*
|
4630
|
+
parent.dirty |= 2 /* Node */;
|
4631
|
+
if (parent.dirty & 1 /* Child */)
|
4625
4632
|
return;
|
4626
|
-
parent.dirty |= 1 /*
|
4633
|
+
parent.dirty |= 1 /* Child */;
|
4627
4634
|
childList = false;
|
4628
4635
|
}
|
4629
4636
|
}
|
@@ -4676,6 +4683,7 @@
|
|
4676
4683
|
static get(node) { return node.cmView; }
|
4677
4684
|
get isEditable() { return true; }
|
4678
4685
|
get isWidget() { return false; }
|
4686
|
+
get isHidden() { return false; }
|
4679
4687
|
merge(from, to, source, hasStart, openStart, openEnd) {
|
4680
4688
|
return false;
|
4681
4689
|
}
|
@@ -4901,13 +4909,13 @@
|
|
4901
4909
|
reuseDOM(node) {
|
4902
4910
|
if (node.nodeName == this.mark.tagName.toUpperCase()) {
|
4903
4911
|
this.setDOM(node);
|
4904
|
-
this.dirty |= 4 /*
|
4912
|
+
this.dirty |= 4 /* Attrs */ | 2 /* Node */;
|
4905
4913
|
}
|
4906
4914
|
}
|
4907
4915
|
sync(view, track) {
|
4908
4916
|
if (!this.dom)
|
4909
4917
|
this.setDOM(this.setAttrs(document.createElement(this.mark.tagName)));
|
4910
|
-
else if (this.dirty & 4 /*
|
4918
|
+
else if (this.dirty & 4 /* Attrs */)
|
4911
4919
|
this.setAttrs(this.dom);
|
4912
4920
|
super.sync(view, track);
|
4913
4921
|
}
|
@@ -4970,7 +4978,7 @@
|
|
4970
4978
|
}
|
4971
4979
|
let rects = textRange(text, from, to).getClientRects();
|
4972
4980
|
if (!rects.length)
|
4973
|
-
return
|
4981
|
+
return null;
|
4974
4982
|
let rect = rects[(flatten ? flatten < 0 : side >= 0) ? 0 : rects.length - 1];
|
4975
4983
|
if (browser.safari && !flatten && rect.width == 0)
|
4976
4984
|
rect = Array.prototype.find.call(rects, r => r.width) || rect;
|
@@ -5011,15 +5019,15 @@
|
|
5011
5019
|
return true;
|
5012
5020
|
}
|
5013
5021
|
become(other) {
|
5014
|
-
if (other
|
5015
|
-
|
5016
|
-
|
5017
|
-
|
5018
|
-
|
5019
|
-
|
5020
|
-
|
5021
|
-
|
5022
|
-
|
5022
|
+
if (other instanceof WidgetView && other.side == this.side &&
|
5023
|
+
this.widget.constructor == other.widget.constructor) {
|
5024
|
+
if (!this.widget.compare(other.widget))
|
5025
|
+
this.markDirty(true);
|
5026
|
+
if (this.dom && !this.prevWidget)
|
5027
|
+
this.prevWidget = this.widget;
|
5028
|
+
this.widget = other.widget;
|
5029
|
+
this.length = other.length;
|
5030
|
+
return true;
|
5023
5031
|
}
|
5024
5032
|
return false;
|
5025
5033
|
}
|
@@ -5035,22 +5043,29 @@
|
|
5035
5043
|
return text ? text.slice(start, start + this.length) : Text.empty;
|
5036
5044
|
}
|
5037
5045
|
domAtPos(pos) {
|
5038
|
-
return pos == 0
|
5046
|
+
return (this.length ? pos == 0 : this.side > 0)
|
5047
|
+
? DOMPos.before(this.dom)
|
5048
|
+
: DOMPos.after(this.dom, pos == this.length);
|
5039
5049
|
}
|
5040
5050
|
domBoundsAround() { return null; }
|
5041
5051
|
coordsAt(pos, side) {
|
5052
|
+
let custom = this.widget.coordsAt(this.dom, pos, side);
|
5053
|
+
if (custom)
|
5054
|
+
return custom;
|
5042
5055
|
let rects = this.dom.getClientRects(), rect = null;
|
5043
5056
|
if (!rects.length)
|
5044
|
-
return
|
5045
|
-
|
5057
|
+
return null;
|
5058
|
+
let fromBack = this.side ? this.side < 0 : pos > 0;
|
5059
|
+
for (let i = fromBack ? rects.length - 1 : 0;; i += (fromBack ? -1 : 1)) {
|
5046
5060
|
rect = rects[i];
|
5047
5061
|
if (pos > 0 ? i == 0 : i == rects.length - 1 || rect.top < rect.bottom)
|
5048
5062
|
break;
|
5049
5063
|
}
|
5050
|
-
return
|
5064
|
+
return flattenRect(rect, !fromBack);
|
5051
5065
|
}
|
5052
5066
|
get isEditable() { return false; }
|
5053
5067
|
get isWidget() { return true; }
|
5068
|
+
get isHidden() { return this.widget.isHidden; }
|
5054
5069
|
destroy() {
|
5055
5070
|
super.destroy();
|
5056
5071
|
if (this.dom)
|
@@ -5062,14 +5077,14 @@
|
|
5062
5077
|
let { topView, text } = this.widget;
|
5063
5078
|
if (!topView)
|
5064
5079
|
return new DOMPos(text, Math.min(pos, text.nodeValue.length));
|
5065
|
-
return scanCompositionTree(pos, 0, topView, text, (v, p) => v.domAtPos(p), p => new DOMPos(text, Math.min(p, text.nodeValue.length)));
|
5080
|
+
return scanCompositionTree(pos, 0, topView, text, this.length - topView.length, (v, p) => v.domAtPos(p), (text, p) => new DOMPos(text, Math.min(p, text.nodeValue.length)));
|
5066
5081
|
}
|
5067
5082
|
sync() { this.setDOM(this.widget.toDOM()); }
|
5068
5083
|
localPosFromDOM(node, offset) {
|
5069
5084
|
let { topView, text } = this.widget;
|
5070
5085
|
if (!topView)
|
5071
5086
|
return Math.min(offset, this.length);
|
5072
|
-
return posFromDOMInCompositionTree(node, offset, topView, text);
|
5087
|
+
return posFromDOMInCompositionTree(node, offset, topView, text, this.length - topView.length);
|
5073
5088
|
}
|
5074
5089
|
ignoreMutation() { return false; }
|
5075
5090
|
get overrideDOMText() { return null; }
|
@@ -5077,7 +5092,7 @@
|
|
5077
5092
|
let { topView, text } = this.widget;
|
5078
5093
|
if (!topView)
|
5079
5094
|
return textCoords(text, pos, side);
|
5080
|
-
return scanCompositionTree(pos, side, topView, text, (v, pos, side) => v.coordsAt(pos, side), (pos, side) => textCoords(text, pos, side));
|
5095
|
+
return scanCompositionTree(pos, side, topView, text, this.length - topView.length, (v, pos, side) => v.coordsAt(pos, side), (text, pos, side) => textCoords(text, pos, side));
|
5081
5096
|
}
|
5082
5097
|
destroy() {
|
5083
5098
|
var _a;
|
@@ -5090,35 +5105,68 @@
|
|
5090
5105
|
// Uses the old structure of a chunk of content view frozen for
|
5091
5106
|
// composition to try and find a reasonable DOM location for the given
|
5092
5107
|
// offset.
|
5093
|
-
function scanCompositionTree(pos, side, view, text, enterView, fromText) {
|
5108
|
+
function scanCompositionTree(pos, side, view, text, dLen, enterView, fromText) {
|
5094
5109
|
if (view instanceof MarkView) {
|
5095
5110
|
for (let child = view.dom.firstChild; child; child = child.nextSibling) {
|
5096
5111
|
let desc = ContentView.get(child);
|
5097
|
-
if (!desc)
|
5098
|
-
|
5099
|
-
|
5100
|
-
|
5101
|
-
|
5102
|
-
|
5103
|
-
|
5112
|
+
if (!desc) {
|
5113
|
+
let inner = scanCompositionNode(pos, side, child, fromText);
|
5114
|
+
if (typeof inner != "number")
|
5115
|
+
return inner;
|
5116
|
+
pos = inner;
|
5117
|
+
}
|
5118
|
+
else {
|
5119
|
+
let hasComp = contains(child, text);
|
5120
|
+
let len = desc.length + (hasComp ? dLen : 0);
|
5121
|
+
if (pos < len || pos == len && desc.getSide() <= 0)
|
5122
|
+
return hasComp ? scanCompositionTree(pos, side, desc, text, dLen, enterView, fromText) : enterView(desc, pos, side);
|
5123
|
+
pos -= len;
|
5124
|
+
}
|
5104
5125
|
}
|
5105
5126
|
return enterView(view, view.length, -1);
|
5106
5127
|
}
|
5107
5128
|
else if (view.dom == text) {
|
5108
|
-
return fromText(pos, side);
|
5129
|
+
return fromText(text, pos, side);
|
5109
5130
|
}
|
5110
5131
|
else {
|
5111
5132
|
return enterView(view, pos, side);
|
5112
5133
|
}
|
5113
5134
|
}
|
5114
|
-
function
|
5135
|
+
function scanCompositionNode(pos, side, node, fromText) {
|
5136
|
+
if (node.nodeType == 3) {
|
5137
|
+
let len = node.nodeValue.length;
|
5138
|
+
if (pos <= len)
|
5139
|
+
return fromText(node, pos, side);
|
5140
|
+
pos -= len;
|
5141
|
+
}
|
5142
|
+
else if (node.nodeType == 1 && node.contentEditable != "false") {
|
5143
|
+
for (let child = node.firstChild; child; child = child.nextSibling) {
|
5144
|
+
let inner = scanCompositionNode(pos, side, child, fromText);
|
5145
|
+
if (typeof inner != "number")
|
5146
|
+
return inner;
|
5147
|
+
pos = inner;
|
5148
|
+
}
|
5149
|
+
}
|
5150
|
+
return pos;
|
5151
|
+
}
|
5152
|
+
function posFromDOMInCompositionTree(node, offset, view, text, dLen) {
|
5115
5153
|
if (view instanceof MarkView) {
|
5116
5154
|
let pos = 0;
|
5117
|
-
for (let child
|
5118
|
-
let
|
5119
|
-
if (
|
5120
|
-
|
5121
|
-
|
5155
|
+
for (let child = view.dom.firstChild; child; child = child.nextSibling) {
|
5156
|
+
let childView = ContentView.get(child);
|
5157
|
+
if (childView) {
|
5158
|
+
let hasComp = contains(child, text);
|
5159
|
+
if (contains(child, node))
|
5160
|
+
return pos + (hasComp ? posFromDOMInCompositionTree(node, offset, childView, text, dLen)
|
5161
|
+
: childView.localPosFromDOM(node, offset));
|
5162
|
+
pos += childView.length + (hasComp ? dLen : 0);
|
5163
|
+
}
|
5164
|
+
else {
|
5165
|
+
let inner = posFromDOMInOpaqueNode(node, offset, child);
|
5166
|
+
if (inner.result != null)
|
5167
|
+
return pos + inner.result;
|
5168
|
+
pos += inner.size;
|
5169
|
+
}
|
5122
5170
|
}
|
5123
5171
|
}
|
5124
5172
|
else if (view.dom == text) {
|
@@ -5126,6 +5174,27 @@
|
|
5126
5174
|
}
|
5127
5175
|
return view.localPosFromDOM(node, offset);
|
5128
5176
|
}
|
5177
|
+
function posFromDOMInOpaqueNode(node, offset, target) {
|
5178
|
+
if (target.nodeType == 3) {
|
5179
|
+
return node == target ? { result: offset } : { size: target.nodeValue.length };
|
5180
|
+
}
|
5181
|
+
else if (target.nodeType == 1 && target.contentEditable != "false") {
|
5182
|
+
let pos = 0;
|
5183
|
+
for (let child = target.firstChild, i = 0;; child = child.nextSibling, i++) {
|
5184
|
+
if (node == target && i == offset)
|
5185
|
+
return { result: pos };
|
5186
|
+
if (!child)
|
5187
|
+
return { size: pos };
|
5188
|
+
let inner = posFromDOMInOpaqueNode(node, offset, child);
|
5189
|
+
if (inner.result != null)
|
5190
|
+
return { result: offset + inner.result };
|
5191
|
+
pos += inner.size;
|
5192
|
+
}
|
5193
|
+
}
|
5194
|
+
else {
|
5195
|
+
return target.contains(node) ? { result: 0 } : { size: 0 };
|
5196
|
+
}
|
5197
|
+
}
|
5129
5198
|
// These are drawn around uneditable widgets to avoid a number of
|
5130
5199
|
// browser bugs that show up when the cursor is directly next to
|
5131
5200
|
// uneditable inline content.
|
@@ -5153,43 +5222,14 @@
|
|
5153
5222
|
localPosFromDOM() { return 0; }
|
5154
5223
|
domBoundsAround() { return null; }
|
5155
5224
|
coordsAt(pos) {
|
5156
|
-
|
5157
|
-
// Since the <img> height doesn't correspond to text height, try
|
5158
|
-
// to borrow the height from some sibling node.
|
5159
|
-
let siblingRect = inlineSiblingRect(this, this.side > 0 ? -1 : 1);
|
5160
|
-
return siblingRect && siblingRect.top < imgRect.bottom && siblingRect.bottom > imgRect.top
|
5161
|
-
? { left: imgRect.left, right: imgRect.right, top: siblingRect.top, bottom: siblingRect.bottom } : imgRect;
|
5225
|
+
return this.dom.getBoundingClientRect();
|
5162
5226
|
}
|
5163
5227
|
get overrideDOMText() {
|
5164
5228
|
return Text.empty;
|
5165
5229
|
}
|
5230
|
+
get isHidden() { return true; }
|
5166
5231
|
}
|
5167
5232
|
TextView.prototype.children = WidgetView.prototype.children = WidgetBufferView.prototype.children = noChildren;
|
5168
|
-
function inlineSiblingRect(view, side) {
|
5169
|
-
let parent = view.parent, index = parent ? parent.children.indexOf(view) : -1;
|
5170
|
-
while (parent && index >= 0) {
|
5171
|
-
if (side < 0 ? index > 0 : index < parent.children.length) {
|
5172
|
-
let next = parent.children[index + side];
|
5173
|
-
if (next instanceof TextView) {
|
5174
|
-
let nextRect = next.coordsAt(side < 0 ? next.length : 0, side);
|
5175
|
-
if (nextRect)
|
5176
|
-
return nextRect;
|
5177
|
-
}
|
5178
|
-
index += side;
|
5179
|
-
}
|
5180
|
-
else if (parent instanceof MarkView && parent.parent) {
|
5181
|
-
index = parent.parent.children.indexOf(parent) + (side < 0 ? 0 : 1);
|
5182
|
-
parent = parent.parent;
|
5183
|
-
}
|
5184
|
-
else {
|
5185
|
-
let last = parent.dom.lastChild;
|
5186
|
-
if (last && last.nodeName == "BR")
|
5187
|
-
return last.getClientRects()[0];
|
5188
|
-
break;
|
5189
|
-
}
|
5190
|
-
}
|
5191
|
-
return undefined;
|
5192
|
-
}
|
5193
5233
|
function inlineDOMAtPos(parent, pos) {
|
5194
5234
|
let dom = parent.dom, { children } = parent, i = 0;
|
5195
5235
|
for (let off = 0; i < children.length; i++) {
|
@@ -5236,11 +5276,12 @@
|
|
5236
5276
|
if (child.children.length) {
|
5237
5277
|
scan(child, pos - off);
|
5238
5278
|
}
|
5239
|
-
else if (!after
|
5279
|
+
else if ((!after || after.isHidden && side > 0) &&
|
5280
|
+
(end > pos || off == end && child.getSide() > 0)) {
|
5240
5281
|
after = child;
|
5241
5282
|
afterPos = pos - off;
|
5242
5283
|
}
|
5243
|
-
else if (off < pos || (off == end && child.getSide() < 0)) {
|
5284
|
+
else if (off < pos || (off == end && child.getSide() < 0) && !child.isHidden) {
|
5244
5285
|
before = child;
|
5245
5286
|
beforePos = pos - off;
|
5246
5287
|
}
|
@@ -5340,16 +5381,35 @@
|
|
5340
5381
|
*/
|
5341
5382
|
get estimatedHeight() { return -1; }
|
5342
5383
|
/**
|
5384
|
+
For inline widgets that are displayed inline (as opposed to
|
5385
|
+
`inline-block`) and introduce line breaks (through `<br>` tags
|
5386
|
+
or textual newlines), this must indicate the amount of line
|
5387
|
+
breaks they introduce. Defaults to 0.
|
5388
|
+
*/
|
5389
|
+
get lineBreaks() { return 0; }
|
5390
|
+
/**
|
5343
5391
|
Can be used to configure which kinds of events inside the widget
|
5344
5392
|
should be ignored by the editor. The default is to ignore all
|
5345
5393
|
events.
|
5346
5394
|
*/
|
5347
5395
|
ignoreEvent(event) { return true; }
|
5348
5396
|
/**
|
5397
|
+
Override the way screen coordinates for positions at/in the
|
5398
|
+
widget are found. `pos` will be the offset into the widget, and
|
5399
|
+
`side` the side of the position that is being queried—less than
|
5400
|
+
zero for before, greater than zero for after, and zero for
|
5401
|
+
directly at that position.
|
5402
|
+
*/
|
5403
|
+
coordsAt(dom, pos, side) { return null; }
|
5404
|
+
/**
|
5349
5405
|
@internal
|
5350
5406
|
*/
|
5351
5407
|
get customView() { return null; }
|
5352
5408
|
/**
|
5409
|
+
@internal
|
5410
|
+
*/
|
5411
|
+
get isHidden() { return false; }
|
5412
|
+
/**
|
5353
5413
|
This is called when the an instance of the widget is removed
|
5354
5414
|
from the editor view.
|
5355
5415
|
*/
|
@@ -5429,8 +5489,10 @@
|
|
5429
5489
|
given position.
|
5430
5490
|
*/
|
5431
5491
|
static widget(spec) {
|
5432
|
-
let side = spec.side || 0, block = !!spec.block;
|
5433
|
-
side += block
|
5492
|
+
let side = Math.max(-10000, Math.min(10000, spec.side || 0)), block = !!spec.block;
|
5493
|
+
side += (block && !spec.inlineOrder)
|
5494
|
+
? (side > 0 ? 300000000 /* BlockAfter */ : -400000000 /* BlockBefore */)
|
5495
|
+
: (side > 0 ? 100000000 /* InlineAfter */ : -100000000 /* InlineBefore */);
|
5434
5496
|
return new PointDecoration(spec, side, side, block, spec.widget || null, false);
|
5435
5497
|
}
|
5436
5498
|
/**
|
@@ -5440,13 +5502,13 @@
|
|
5440
5502
|
static replace(spec) {
|
5441
5503
|
let block = !!spec.block, startSide, endSide;
|
5442
5504
|
if (spec.isBlockGap) {
|
5443
|
-
startSide = -500000000 /*
|
5444
|
-
endSide = 400000000 /*
|
5505
|
+
startSide = -500000000 /* GapStart */;
|
5506
|
+
endSide = 400000000 /* GapEnd */;
|
5445
5507
|
}
|
5446
5508
|
else {
|
5447
5509
|
let { start, end } = getInclusive(spec, block);
|
5448
|
-
startSide = (start ? (block ? -300000000 /*
|
5449
|
-
endSide = (end ? (block ? 200000000 /*
|
5510
|
+
startSide = (start ? (block ? -300000000 /* BlockIncStart */ : -1 /* InlineIncStart */) : 500000000 /* NonIncStart */) - 1;
|
5511
|
+
endSide = (end ? (block ? 200000000 /* BlockIncEnd */ : 1 /* InlineIncEnd */) : -600000000 /* NonIncEnd */) + 1;
|
5450
5512
|
}
|
5451
5513
|
return new PointDecoration(spec, startSide, endSide, block, spec.widget || null, true);
|
5452
5514
|
}
|
@@ -5477,7 +5539,7 @@
|
|
5477
5539
|
class MarkDecoration extends Decoration {
|
5478
5540
|
constructor(spec) {
|
5479
5541
|
let { start, end } = getInclusive(spec);
|
5480
|
-
super(start ? -1 /*
|
5542
|
+
super(start ? -1 /* InlineIncStart */ : 500000000 /* NonIncStart */, end ? 1 /* InlineIncEnd */ : -600000000 /* NonIncEnd */, null, spec);
|
5481
5543
|
this.tagName = spec.tagName || "span";
|
5482
5544
|
this.class = spec.class || "";
|
5483
5545
|
this.attrs = spec.attributes || null;
|
@@ -5498,7 +5560,7 @@
|
|
5498
5560
|
MarkDecoration.prototype.point = false;
|
5499
5561
|
class LineDecoration extends Decoration {
|
5500
5562
|
constructor(spec) {
|
5501
|
-
super(-200000000 /*
|
5563
|
+
super(-200000000 /* Line */, -200000000 /* Line */, null, spec);
|
5502
5564
|
}
|
5503
5565
|
eq(other) {
|
5504
5566
|
return other instanceof LineDecoration &&
|
@@ -5525,7 +5587,9 @@
|
|
5525
5587
|
return this.startSide < this.endSide ? BlockType.WidgetRange
|
5526
5588
|
: this.startSide <= 0 ? BlockType.WidgetBefore : BlockType.WidgetAfter;
|
5527
5589
|
}
|
5528
|
-
get heightRelevant() {
|
5590
|
+
get heightRelevant() {
|
5591
|
+
return this.block || !!this.widget && (this.widget.estimatedHeight >= 5 || this.widget.lineBreaks > 0);
|
5592
|
+
}
|
5529
5593
|
eq(other) {
|
5530
5594
|
return other instanceof PointDecoration &&
|
5531
5595
|
widgetsEq(this.widget, other.widget) &&
|
@@ -5637,7 +5701,7 @@
|
|
5637
5701
|
reuseDOM(node) {
|
5638
5702
|
if (node.nodeName == "DIV") {
|
5639
5703
|
this.setDOM(node);
|
5640
|
-
this.dirty |= 4 /*
|
5704
|
+
this.dirty |= 4 /* Attrs */ | 2 /* Node */;
|
5641
5705
|
}
|
5642
5706
|
}
|
5643
5707
|
sync(view, track) {
|
@@ -5647,7 +5711,7 @@
|
|
5647
5711
|
this.dom.className = "cm-line";
|
5648
5712
|
this.prevAttrs = this.attrs ? null : undefined;
|
5649
5713
|
}
|
5650
|
-
else if (this.dirty & 4 /*
|
5714
|
+
else if (this.dirty & 4 /* Attrs */) {
|
5651
5715
|
clearAttributes(this.dom);
|
5652
5716
|
this.dom.className = "cm-line";
|
5653
5717
|
this.prevAttrs = this.attrs ? null : undefined;
|
@@ -5758,14 +5822,15 @@
|
|
5758
5822
|
}
|
5759
5823
|
domBoundsAround() { return null; }
|
5760
5824
|
become(other) {
|
5761
|
-
if (other instanceof BlockWidgetView &&
|
5825
|
+
if (other instanceof BlockWidgetView &&
|
5762
5826
|
other.widget.constructor == this.widget.constructor) {
|
5763
|
-
if (!other.widget.
|
5827
|
+
if (!other.widget.compare(this.widget))
|
5764
5828
|
this.markDirty(true);
|
5765
5829
|
if (this.dom && !this.prevWidget)
|
5766
5830
|
this.prevWidget = this.widget;
|
5767
5831
|
this.widget = other.widget;
|
5768
5832
|
this.length = other.length;
|
5833
|
+
this.type = other.type;
|
5769
5834
|
this.breakAfter = other.breakAfter;
|
5770
5835
|
return true;
|
5771
5836
|
}
|
@@ -5775,6 +5840,9 @@
|
|
5775
5840
|
ignoreEvent(event) { return this.widget.ignoreEvent(event); }
|
5776
5841
|
get isEditable() { return false; }
|
5777
5842
|
get isWidget() { return true; }
|
5843
|
+
coordsAt(pos, side) {
|
5844
|
+
return this.widget.coordsAt(this.dom, pos, side);
|
5845
|
+
}
|
5778
5846
|
destroy() {
|
5779
5847
|
super.destroy();
|
5780
5848
|
if (this.dom)
|
@@ -5791,7 +5859,7 @@
|
|
5791
5859
|
this.content = [];
|
5792
5860
|
this.curLine = null;
|
5793
5861
|
this.breakAtStart = 0;
|
5794
|
-
this.pendingBuffer = 0 /*
|
5862
|
+
this.pendingBuffer = 0 /* No */;
|
5795
5863
|
this.bufferMarks = [];
|
5796
5864
|
// Set to false directly after a widget that covers the position after it
|
5797
5865
|
this.atCursorPos = true;
|
@@ -5818,7 +5886,7 @@
|
|
5818
5886
|
flushBuffer(active = this.bufferMarks) {
|
5819
5887
|
if (this.pendingBuffer) {
|
5820
5888
|
this.curLine.append(wrapMarks(new WidgetBufferView(-1), active), active.length);
|
5821
|
-
this.pendingBuffer = 0 /*
|
5889
|
+
this.pendingBuffer = 0 /* No */;
|
5822
5890
|
}
|
5823
5891
|
}
|
5824
5892
|
addBlockWidget(view) {
|
@@ -5830,7 +5898,7 @@
|
|
5830
5898
|
if (this.pendingBuffer && openEnd <= this.bufferMarks.length)
|
5831
5899
|
this.flushBuffer();
|
5832
5900
|
else
|
5833
|
-
this.pendingBuffer = 0 /*
|
5901
|
+
this.pendingBuffer = 0 /* No */;
|
5834
5902
|
if (!this.posCovered())
|
5835
5903
|
this.getLine();
|
5836
5904
|
}
|
@@ -5859,7 +5927,7 @@
|
|
5859
5927
|
this.textOff = 0;
|
5860
5928
|
}
|
5861
5929
|
}
|
5862
|
-
let take = Math.min(this.text.length - this.textOff, length, 512 /*
|
5930
|
+
let take = Math.min(this.text.length - this.textOff, length, 512 /* Chunk */);
|
5863
5931
|
this.flushBuffer(active.slice(active.length - openStart));
|
5864
5932
|
this.getLine().append(wrapMarks(new TextView(this.text.slice(this.textOff, this.textOff + take)), active), openStart);
|
5865
5933
|
this.atCursorPos = true;
|
@@ -5891,11 +5959,12 @@
|
|
5891
5959
|
}
|
5892
5960
|
else {
|
5893
5961
|
let view = WidgetView.create(deco.widget || new NullWidget("span"), len, len ? 0 : deco.startSide);
|
5894
|
-
let cursorBefore = this.atCursorPos && !view.isEditable && openStart <= active.length &&
|
5962
|
+
let cursorBefore = this.atCursorPos && !view.isEditable && openStart <= active.length &&
|
5963
|
+
(from < to || deco.startSide > 0);
|
5895
5964
|
let cursorAfter = !view.isEditable && (from < to || openStart > active.length || deco.startSide <= 0);
|
5896
5965
|
let line = this.getLine();
|
5897
|
-
if (this.pendingBuffer == 2 /*
|
5898
|
-
this.pendingBuffer = 0 /*
|
5966
|
+
if (this.pendingBuffer == 2 /* IfCursor */ && !cursorBefore && !view.isEditable)
|
5967
|
+
this.pendingBuffer = 0 /* No */;
|
5899
5968
|
this.flushBuffer(active);
|
5900
5969
|
if (cursorBefore) {
|
5901
5970
|
line.append(wrapMarks(new WidgetBufferView(1), active), openStart);
|
@@ -5903,7 +5972,7 @@
|
|
5903
5972
|
}
|
5904
5973
|
line.append(wrapMarks(view, active), openStart);
|
5905
5974
|
this.atCursorPos = cursorAfter;
|
5906
|
-
this.pendingBuffer = !cursorAfter ? 0 /*
|
5975
|
+
this.pendingBuffer = !cursorAfter ? 0 /* No */ : from < to || openStart > active.length ? 1 /* Yes */ : 2 /* IfCursor */;
|
5907
5976
|
if (this.pendingBuffer)
|
5908
5977
|
this.bufferMarks = active.slice();
|
5909
5978
|
}
|
@@ -5948,6 +6017,7 @@
|
|
5948
6017
|
eq(other) { return other.tag == this.tag; }
|
5949
6018
|
toDOM() { return document.createElement(this.tag); }
|
5950
6019
|
updateDOM(elt) { return elt.nodeName.toLowerCase() == this.tag; }
|
6020
|
+
get isHidden() { return true; }
|
5951
6021
|
}
|
5952
6022
|
|
5953
6023
|
const clickAddsSelectionRange = /*@__PURE__*/Facet.define();
|
@@ -6117,6 +6187,23 @@
|
|
6117
6187
|
const decorations = /*@__PURE__*/Facet.define();
|
6118
6188
|
const atomicRanges = /*@__PURE__*/Facet.define();
|
6119
6189
|
const scrollMargins = /*@__PURE__*/Facet.define();
|
6190
|
+
function getScrollMargins(view) {
|
6191
|
+
let left = 0, right = 0, top = 0, bottom = 0;
|
6192
|
+
for (let source of view.state.facet(scrollMargins)) {
|
6193
|
+
let m = source(view);
|
6194
|
+
if (m) {
|
6195
|
+
if (m.left != null)
|
6196
|
+
left = Math.max(left, m.left);
|
6197
|
+
if (m.right != null)
|
6198
|
+
right = Math.max(right, m.right);
|
6199
|
+
if (m.top != null)
|
6200
|
+
top = Math.max(top, m.top);
|
6201
|
+
if (m.bottom != null)
|
6202
|
+
bottom = Math.max(bottom, m.bottom);
|
6203
|
+
}
|
6204
|
+
}
|
6205
|
+
return { left, right, top, bottom };
|
6206
|
+
}
|
6120
6207
|
const styleModule = /*@__PURE__*/Facet.define();
|
6121
6208
|
class ChangedRange {
|
6122
6209
|
constructor(fromA, toA, fromB, toB) {
|
@@ -6212,27 +6299,27 @@
|
|
6212
6299
|
update.
|
6213
6300
|
*/
|
6214
6301
|
get viewportChanged() {
|
6215
|
-
return (this.flags & 4 /*
|
6302
|
+
return (this.flags & 4 /* Viewport */) > 0;
|
6216
6303
|
}
|
6217
6304
|
/**
|
6218
6305
|
Indicates whether the height of a block element in the editor
|
6219
6306
|
changed in this update.
|
6220
6307
|
*/
|
6221
6308
|
get heightChanged() {
|
6222
|
-
return (this.flags & 2 /*
|
6309
|
+
return (this.flags & 2 /* Height */) > 0;
|
6223
6310
|
}
|
6224
6311
|
/**
|
6225
6312
|
Returns true when the document was modified or the size of the
|
6226
6313
|
editor, or elements within the editor, changed.
|
6227
6314
|
*/
|
6228
6315
|
get geometryChanged() {
|
6229
|
-
return this.docChanged || (this.flags & (8 /*
|
6316
|
+
return this.docChanged || (this.flags & (8 /* Geometry */ | 2 /* Height */)) > 0;
|
6230
6317
|
}
|
6231
6318
|
/**
|
6232
6319
|
True when this update indicates a focus change.
|
6233
6320
|
*/
|
6234
6321
|
get focusChanged() {
|
6235
|
-
return (this.flags & 1 /*
|
6322
|
+
return (this.flags & 1 /* Focus */) > 0;
|
6236
6323
|
}
|
6237
6324
|
/**
|
6238
6325
|
Whether the document changed in this update.
|
@@ -6290,12 +6377,12 @@
|
|
6290
6377
|
}
|
6291
6378
|
function charType(ch) {
|
6292
6379
|
return ch <= 0xf7 ? LowTypes[ch] :
|
6293
|
-
0x590 <= ch && ch <= 0x5f4 ? 2 /*
|
6380
|
+
0x590 <= ch && ch <= 0x5f4 ? 2 /* R */ :
|
6294
6381
|
0x600 <= ch && ch <= 0x6f9 ? ArabicTypes[ch - 0x600] :
|
6295
|
-
0x6ee <= ch && ch <= 0x8ac ? 4 /*
|
6296
|
-
0x2000 <= ch && ch <= 0x200b ? 256 /*
|
6297
|
-
0xfb50 <= ch && ch <= 0xfdff ? 4 /*
|
6298
|
-
ch == 0x200c ? 256 /*
|
6382
|
+
0x6ee <= ch && ch <= 0x8ac ? 4 /* AL */ :
|
6383
|
+
0x2000 <= ch && ch <= 0x200b ? 256 /* NI */ :
|
6384
|
+
0xfb50 <= ch && ch <= 0xfdff ? 4 /* AL */ :
|
6385
|
+
ch == 0x200c ? 256 /* NI */ : 1 /* L */;
|
6299
6386
|
}
|
6300
6387
|
const BidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\ufb50-\ufdff]/;
|
6301
6388
|
/**
|
@@ -6360,8 +6447,8 @@
|
|
6360
6447
|
// Reused array of character types
|
6361
6448
|
const types = [];
|
6362
6449
|
function computeOrder(line, direction) {
|
6363
|
-
let len = line.length, outerType = direction == LTR ? 1 /*
|
6364
|
-
if (!line || outerType == 1 /*
|
6450
|
+
let len = line.length, outerType = direction == LTR ? 1 /* L */ : 2 /* R */, oppositeType = direction == LTR ? 2 /* R */ : 1 /* L */;
|
6451
|
+
if (!line || outerType == 1 /* L */ && !BidiRE.test(line))
|
6365
6452
|
return trivialOrder(len);
|
6366
6453
|
// W1. Examine each non-spacing mark (NSM) in the level run, and
|
6367
6454
|
// change the type of the NSM to the type of the previous
|
@@ -6375,12 +6462,12 @@
|
|
6375
6462
|
// (Left after this: L, R, EN, AN, ET, CS, NI)
|
6376
6463
|
for (let i = 0, prev = outerType, prevStrong = outerType; i < len; i++) {
|
6377
6464
|
let type = charType(line.charCodeAt(i));
|
6378
|
-
if (type == 512 /*
|
6465
|
+
if (type == 512 /* NSM */)
|
6379
6466
|
type = prev;
|
6380
|
-
else if (type == 8 /*
|
6381
|
-
type = 16 /*
|
6382
|
-
types[i] = type == 4 /*
|
6383
|
-
if (type & 7 /*
|
6467
|
+
else if (type == 8 /* EN */ && prevStrong == 4 /* AL */)
|
6468
|
+
type = 16 /* AN */;
|
6469
|
+
types[i] = type == 4 /* AL */ ? 2 /* R */ : type;
|
6470
|
+
if (type & 7 /* Strong */)
|
6384
6471
|
prevStrong = type;
|
6385
6472
|
prev = type;
|
6386
6473
|
}
|
@@ -6394,26 +6481,26 @@
|
|
6394
6481
|
// (Left after this: L, R, EN+AN, NI)
|
6395
6482
|
for (let i = 0, prev = outerType, prevStrong = outerType; i < len; i++) {
|
6396
6483
|
let type = types[i];
|
6397
|
-
if (type == 128 /*
|
6398
|
-
if (i < len - 1 && prev == types[i + 1] && (prev & 24 /*
|
6484
|
+
if (type == 128 /* CS */) {
|
6485
|
+
if (i < len - 1 && prev == types[i + 1] && (prev & 24 /* Num */))
|
6399
6486
|
type = types[i] = prev;
|
6400
6487
|
else
|
6401
|
-
types[i] = 256 /*
|
6488
|
+
types[i] = 256 /* NI */;
|
6402
6489
|
}
|
6403
|
-
else if (type == 64 /*
|
6490
|
+
else if (type == 64 /* ET */) {
|
6404
6491
|
let end = i + 1;
|
6405
|
-
while (end < len && types[end] == 64 /*
|
6492
|
+
while (end < len && types[end] == 64 /* ET */)
|
6406
6493
|
end++;
|
6407
|
-
let replace = (i && prev == 8 /*
|
6494
|
+
let replace = (i && prev == 8 /* EN */) || (end < len && types[end] == 8 /* EN */) ? (prevStrong == 1 /* L */ ? 1 /* L */ : 8 /* EN */) : 256 /* NI */;
|
6408
6495
|
for (let j = i; j < end; j++)
|
6409
6496
|
types[j] = replace;
|
6410
6497
|
i = end - 1;
|
6411
6498
|
}
|
6412
|
-
else if (type == 8 /*
|
6413
|
-
types[i] = 1 /*
|
6499
|
+
else if (type == 8 /* EN */ && prevStrong == 1 /* L */) {
|
6500
|
+
types[i] = 1 /* L */;
|
6414
6501
|
}
|
6415
6502
|
prev = type;
|
6416
|
-
if (type & 7 /*
|
6503
|
+
if (type & 7 /* Strong */)
|
6417
6504
|
prevStrong = type;
|
6418
6505
|
}
|
6419
6506
|
// N0. Process bracket pairs in an isolating run sequence
|
@@ -6428,9 +6515,9 @@
|
|
6428
6515
|
for (let sJ = sI - 3; sJ >= 0; sJ -= 3) {
|
6429
6516
|
if (BracketStack[sJ + 1] == -br) {
|
6430
6517
|
let flags = BracketStack[sJ + 2];
|
6431
|
-
let type = (flags & 2 /*
|
6432
|
-
!(flags & 4 /*
|
6433
|
-
(flags & 1 /*
|
6518
|
+
let type = (flags & 2 /* EmbedInside */) ? outerType :
|
6519
|
+
!(flags & 4 /* OppositeInside */) ? 0 :
|
6520
|
+
(flags & 1 /* OppositeBefore */) ? oppositeType : outerType;
|
6434
6521
|
if (type)
|
6435
6522
|
types[i] = types[BracketStack[sJ]] = type;
|
6436
6523
|
sI = sJ;
|
@@ -6438,7 +6525,7 @@
|
|
6438
6525
|
}
|
6439
6526
|
}
|
6440
6527
|
}
|
6441
|
-
else if (BracketStack.length == 189 /*
|
6528
|
+
else if (BracketStack.length == 189 /* MaxDepth */) {
|
6442
6529
|
break;
|
6443
6530
|
}
|
6444
6531
|
else {
|
@@ -6447,20 +6534,20 @@
|
|
6447
6534
|
BracketStack[sI++] = context;
|
6448
6535
|
}
|
6449
6536
|
}
|
6450
|
-
else if ((type = types[i]) == 2 /*
|
6537
|
+
else if ((type = types[i]) == 2 /* R */ || type == 1 /* L */) {
|
6451
6538
|
let embed = type == outerType;
|
6452
|
-
context = embed ? 0 : 1 /*
|
6539
|
+
context = embed ? 0 : 1 /* OppositeBefore */;
|
6453
6540
|
for (let sJ = sI - 3; sJ >= 0; sJ -= 3) {
|
6454
6541
|
let cur = BracketStack[sJ + 2];
|
6455
|
-
if (cur & 2 /*
|
6542
|
+
if (cur & 2 /* EmbedInside */)
|
6456
6543
|
break;
|
6457
6544
|
if (embed) {
|
6458
|
-
BracketStack[sJ + 2] |= 2 /*
|
6545
|
+
BracketStack[sJ + 2] |= 2 /* EmbedInside */;
|
6459
6546
|
}
|
6460
6547
|
else {
|
6461
|
-
if (cur & 4 /*
|
6548
|
+
if (cur & 4 /* OppositeInside */)
|
6462
6549
|
break;
|
6463
|
-
BracketStack[sJ + 2] |= 4 /*
|
6550
|
+
BracketStack[sJ + 2] |= 4 /* OppositeInside */;
|
6464
6551
|
}
|
6465
6552
|
}
|
6466
6553
|
}
|
@@ -6473,13 +6560,13 @@
|
|
6473
6560
|
// N2. Any remaining neutrals take the embedding direction.
|
6474
6561
|
// (Left after this: L, R, EN+AN)
|
6475
6562
|
for (let i = 0; i < len; i++) {
|
6476
|
-
if (types[i] == 256 /*
|
6563
|
+
if (types[i] == 256 /* NI */) {
|
6477
6564
|
let end = i + 1;
|
6478
|
-
while (end < len && types[end] == 256 /*
|
6565
|
+
while (end < len && types[end] == 256 /* NI */)
|
6479
6566
|
end++;
|
6480
|
-
let beforeL = (i ? types[i - 1] : outerType) == 1 /*
|
6481
|
-
let afterL = (end < len ? types[end] : outerType) == 1 /*
|
6482
|
-
let replace = beforeL == afterL ? (beforeL ? 1 /*
|
6567
|
+
let beforeL = (i ? types[i - 1] : outerType) == 1 /* L */;
|
6568
|
+
let afterL = (end < len ? types[end] : outerType) == 1 /* L */;
|
6569
|
+
let replace = beforeL == afterL ? (beforeL ? 1 /* L */ : 2 /* R */) : outerType;
|
6483
6570
|
for (let j = i; j < end; j++)
|
6484
6571
|
types[j] = replace;
|
6485
6572
|
i = end - 1;
|
@@ -6491,15 +6578,15 @@
|
|
6491
6578
|
// explicit embedding into account, we can build up the order on
|
6492
6579
|
// the fly, without following the level-based algorithm.
|
6493
6580
|
let order = [];
|
6494
|
-
if (outerType == 1 /*
|
6581
|
+
if (outerType == 1 /* L */) {
|
6495
6582
|
for (let i = 0; i < len;) {
|
6496
|
-
let start = i, rtl = types[i++] != 1 /*
|
6497
|
-
while (i < len && rtl == (types[i] != 1 /*
|
6583
|
+
let start = i, rtl = types[i++] != 1 /* L */;
|
6584
|
+
while (i < len && rtl == (types[i] != 1 /* L */))
|
6498
6585
|
i++;
|
6499
6586
|
if (rtl) {
|
6500
6587
|
for (let j = i; j > start;) {
|
6501
|
-
let end = j, l = types[--j] != 2 /*
|
6502
|
-
while (j > start && l == (types[j - 1] != 2 /*
|
6588
|
+
let end = j, l = types[--j] != 2 /* R */;
|
6589
|
+
while (j > start && l == (types[j - 1] != 2 /* R */))
|
6503
6590
|
j--;
|
6504
6591
|
order.push(new BidiSpan(j, end, l ? 2 : 1));
|
6505
6592
|
}
|
@@ -6511,8 +6598,8 @@
|
|
6511
6598
|
}
|
6512
6599
|
else {
|
6513
6600
|
for (let i = 0; i < len;) {
|
6514
|
-
let start = i, rtl = types[i++] == 2 /*
|
6515
|
-
while (i < len && rtl == (types[i] == 2 /*
|
6601
|
+
let start = i, rtl = types[i++] == 2 /* R */;
|
6602
|
+
while (i < len && rtl == (types[i] == 2 /* R */))
|
6516
6603
|
i++;
|
6517
6604
|
order.push(new BidiSpan(start, i, rtl ? 1 : 2));
|
6518
6605
|
}
|
@@ -6583,6 +6670,7 @@
|
|
6583
6670
|
let parent = start.parentNode;
|
6584
6671
|
for (let cur = start;;) {
|
6585
6672
|
this.findPointBefore(parent, cur);
|
6673
|
+
let oldLen = this.text.length;
|
6586
6674
|
this.readNode(cur);
|
6587
6675
|
let next = cur.nextSibling;
|
6588
6676
|
if (next == end)
|
@@ -6590,7 +6678,7 @@
|
|
6590
6678
|
let view = ContentView.get(cur), nextView = ContentView.get(next);
|
6591
6679
|
if (view && nextView ? view.breakAfter :
|
6592
6680
|
(view ? view.breakAfter : isBlockElement(cur)) ||
|
6593
|
-
(isBlockElement(next) && (cur.nodeName != "BR" || cur.cmIgnore)))
|
6681
|
+
(isBlockElement(next) && (cur.nodeName != "BR" || cur.cmIgnore) && this.text.length > oldLen))
|
6594
6682
|
this.lineBreak();
|
6595
6683
|
cur = next;
|
6596
6684
|
}
|
@@ -6675,6 +6763,7 @@
|
|
6675
6763
|
super();
|
6676
6764
|
this.view = view;
|
6677
6765
|
this.compositionDeco = Decoration.none;
|
6766
|
+
this.compositionNode = null;
|
6678
6767
|
this.decorations = [];
|
6679
6768
|
this.dynamicDecorationMap = [];
|
6680
6769
|
// Track a minimum width for the editor. When measuring sizes in
|
@@ -6702,10 +6791,7 @@
|
|
6702
6791
|
this.updateInner([new ChangedRange(0, 0, 0, view.state.doc.length)], 0);
|
6703
6792
|
}
|
6704
6793
|
get length() { return this.view.state.doc.length; }
|
6705
|
-
// Update the document view to a given state.
|
6706
|
-
// used as a hint to compute a new viewport that includes that
|
6707
|
-
// position, if we know the editor is going to scroll that position
|
6708
|
-
// into view.
|
6794
|
+
// Update the document view to a given state.
|
6709
6795
|
update(update) {
|
6710
6796
|
let changedRanges = update.changedRanges;
|
6711
6797
|
if (this.minWidth > 0 && changedRanges.length) {
|
@@ -6717,10 +6803,8 @@
|
|
6717
6803
|
this.minWidthTo = update.changes.mapPos(this.minWidthTo, 1);
|
6718
6804
|
}
|
6719
6805
|
}
|
6720
|
-
|
6721
|
-
this.
|
6722
|
-
else if (update.transactions.length || this.dirty)
|
6723
|
-
this.compositionDeco = computeCompositionDeco(this.view, update.changes);
|
6806
|
+
({ deco: this.compositionDeco, node: this.compositionNode } =
|
6807
|
+
this.view.inputState.composing < 0 ? noComp : computeCompositionDeco(this.view, update.changes));
|
6724
6808
|
// When the DOM nodes around the selection are moved to another
|
6725
6809
|
// parent, Chrome sometimes reports a different selection through
|
6726
6810
|
// getSelection than the one that it actually shows to the user.
|
@@ -6732,7 +6816,7 @@
|
|
6732
6816
|
let prevDeco = this.decorations, deco = this.updateDeco();
|
6733
6817
|
let decoDiff = findChangedDeco(prevDeco, deco, update.changes);
|
6734
6818
|
changedRanges = ChangedRange.extendWithRanges(changedRanges, decoDiff);
|
6735
|
-
if (this.dirty == 0 /*
|
6819
|
+
if (this.dirty == 0 /* Not */ && changedRanges.length == 0) {
|
6736
6820
|
return false;
|
6737
6821
|
}
|
6738
6822
|
else {
|
@@ -6761,7 +6845,7 @@
|
|
6761
6845
|
// to detect that situation.
|
6762
6846
|
let track = browser.chrome || browser.ios ? { node: observer.selectionRange.focusNode, written: false } : undefined;
|
6763
6847
|
this.sync(this.view, track);
|
6764
|
-
this.dirty = 0 /*
|
6848
|
+
this.dirty = 0 /* Not */;
|
6765
6849
|
if (track && (track.written || observer.selectionRange.focusNode != track.node))
|
6766
6850
|
this.forceSelection = true;
|
6767
6851
|
this.dom.style.height = "";
|
@@ -6790,7 +6874,10 @@
|
|
6790
6874
|
updateSelection(mustRead = false, fromPointer = false) {
|
6791
6875
|
if (mustRead || !this.view.observer.selectionRange.focusNode)
|
6792
6876
|
this.view.observer.readSelectionRange();
|
6793
|
-
|
6877
|
+
let activeElt = this.view.root.activeElement, focused = activeElt == this.dom;
|
6878
|
+
let selectionNotFocus = !focused &&
|
6879
|
+
hasSelection(this.dom, this.view.observer.selectionRange) && !(activeElt && this.dom.contains(activeElt));
|
6880
|
+
if (!(focused || fromPointer || selectionNotFocus))
|
6794
6881
|
return;
|
6795
6882
|
let force = this.forceSelection;
|
6796
6883
|
this.forceSelection = false;
|
@@ -6800,7 +6887,7 @@
|
|
6800
6887
|
let head = main.empty ? anchor : this.domAtPos(main.head);
|
6801
6888
|
// Always reset on Firefox when next to an uneditable node to
|
6802
6889
|
// avoid invisible cursor bugs (#111)
|
6803
|
-
if (browser.gecko && main.empty && betweenUneditable(anchor)) {
|
6890
|
+
if (browser.gecko && main.empty && !this.compositionDeco.size && betweenUneditable(anchor)) {
|
6804
6891
|
let dummy = document.createTextNode("");
|
6805
6892
|
this.view.observer.ignore(() => anchor.node.insertBefore(dummy, anchor.node.childNodes[anchor.offset] || null));
|
6806
6893
|
anchor = head = new DOMPos(dummy, 0);
|
@@ -6827,10 +6914,10 @@
|
|
6827
6914
|
// Work around https://bugzilla.mozilla.org/show_bug.cgi?id=1612076
|
6828
6915
|
if (browser.gecko) {
|
6829
6916
|
let nextTo = nextToUneditable(anchor.node, anchor.offset);
|
6830
|
-
if (nextTo && nextTo != (1 /*
|
6831
|
-
let text = nearbyTextNode(anchor.node, anchor.offset, nextTo == 1 /*
|
6917
|
+
if (nextTo && nextTo != (1 /* Before */ | 2 /* After */)) {
|
6918
|
+
let text = nearbyTextNode(anchor.node, anchor.offset, nextTo == 1 /* Before */ ? 1 : -1);
|
6832
6919
|
if (text)
|
6833
|
-
anchor = new DOMPos(text, nextTo == 1 /*
|
6920
|
+
anchor = new DOMPos(text, nextTo == 1 /* Before */ ? 0 : text.nodeValue.length);
|
6834
6921
|
}
|
6835
6922
|
}
|
6836
6923
|
rawSel.collapse(anchor.node, anchor.offset);
|
@@ -6860,6 +6947,11 @@
|
|
6860
6947
|
rawSel.removeAllRanges();
|
6861
6948
|
rawSel.addRange(range);
|
6862
6949
|
}
|
6950
|
+
if (selectionNotFocus && this.view.root.activeElement == this.dom) {
|
6951
|
+
this.dom.blur();
|
6952
|
+
if (activeElt)
|
6953
|
+
activeElt.focus();
|
6954
|
+
}
|
6863
6955
|
});
|
6864
6956
|
this.view.observer.setSelectionRange(anchor, head);
|
6865
6957
|
}
|
@@ -6893,11 +6985,6 @@
|
|
6893
6985
|
if (view.docView.posFromDOM(newRange.anchorNode, newRange.anchorOffset) != cursor.from)
|
6894
6986
|
sel.collapse(anchorNode, anchorOffset);
|
6895
6987
|
}
|
6896
|
-
mayControlSelection() {
|
6897
|
-
let active = this.view.root.activeElement;
|
6898
|
-
return active == this.dom ||
|
6899
|
-
hasSelection(this.dom, this.view.observer.selectionRange) && !(active && this.dom.contains(active));
|
6900
|
-
}
|
6901
6988
|
nearest(dom) {
|
6902
6989
|
for (let cur = dom; cur;) {
|
6903
6990
|
let domView = ContentView.get(cur);
|
@@ -7044,22 +7131,10 @@
|
|
7044
7131
|
if (!range.empty && (other = this.coordsAt(range.anchor, range.anchor > range.head ? -1 : 1)))
|
7045
7132
|
rect = { left: Math.min(rect.left, other.left), top: Math.min(rect.top, other.top),
|
7046
7133
|
right: Math.max(rect.right, other.right), bottom: Math.max(rect.bottom, other.bottom) };
|
7047
|
-
let
|
7048
|
-
for (let margins of this.view.state.facet(scrollMargins).map(f => f(this.view)))
|
7049
|
-
if (margins) {
|
7050
|
-
let { left, right, top, bottom } = margins;
|
7051
|
-
if (left != null)
|
7052
|
-
mLeft = Math.max(mLeft, left);
|
7053
|
-
if (right != null)
|
7054
|
-
mRight = Math.max(mRight, right);
|
7055
|
-
if (top != null)
|
7056
|
-
mTop = Math.max(mTop, top);
|
7057
|
-
if (bottom != null)
|
7058
|
-
mBottom = Math.max(mBottom, bottom);
|
7059
|
-
}
|
7134
|
+
let margins = getScrollMargins(this.view);
|
7060
7135
|
let targetRect = {
|
7061
|
-
left: rect.left -
|
7062
|
-
right: rect.right +
|
7136
|
+
left: rect.left - margins.left, top: rect.top - margins.top,
|
7137
|
+
right: rect.right + margins.right, bottom: rect.bottom + margins.bottom
|
7063
7138
|
};
|
7064
7139
|
scrollRectIntoView(this.view.scrollDOM, targetRect, range.head < range.anchor ? -1 : 1, target.x, target.y, target.xMargin, target.yMargin, this.view.textDirection == Direction.LTR);
|
7065
7140
|
}
|
@@ -7117,32 +7192,40 @@
|
|
7117
7192
|
return { from, to: from + cView.length, node: cView.dom, text: textNode };
|
7118
7193
|
}
|
7119
7194
|
}
|
7195
|
+
const noComp = { deco: Decoration.none, node: null };
|
7120
7196
|
function computeCompositionDeco(view, changes) {
|
7121
7197
|
let surrounding = compositionSurroundingNode(view);
|
7122
7198
|
if (!surrounding)
|
7123
|
-
return
|
7199
|
+
return noComp;
|
7124
7200
|
let { from, to, node, text: textNode } = surrounding;
|
7125
7201
|
let newFrom = changes.mapPos(from, 1), newTo = Math.max(newFrom, changes.mapPos(to, -1));
|
7126
|
-
let { state } = view,
|
7127
|
-
|
7202
|
+
let { state } = view, reader = new DOMReader([], state);
|
7203
|
+
if (node.nodeType == 3)
|
7204
|
+
reader.readTextNode(node);
|
7205
|
+
else
|
7206
|
+
reader.readRange(node.firstChild, null);
|
7207
|
+
let { text } = reader;
|
7208
|
+
if (text.indexOf(LineBreakPlaceholder) > -1)
|
7209
|
+
return noComp; // Don't try to preserve multi-line compositions
|
7128
7210
|
if (newTo - newFrom < text.length) {
|
7129
|
-
if (state.doc.sliceString(newFrom, Math.min(state.doc.length, newFrom + text.length)
|
7211
|
+
if (state.doc.sliceString(newFrom, Math.min(state.doc.length, newFrom + text.length)) == text)
|
7130
7212
|
newTo = newFrom + text.length;
|
7131
|
-
else if (state.doc.sliceString(Math.max(0, newTo - text.length), newTo
|
7213
|
+
else if (state.doc.sliceString(Math.max(0, newTo - text.length), newTo) == text)
|
7132
7214
|
newFrom = newTo - text.length;
|
7133
7215
|
else
|
7134
|
-
return
|
7216
|
+
return noComp;
|
7135
7217
|
}
|
7136
|
-
else if (state.doc.sliceString(newFrom, newTo
|
7137
|
-
return
|
7218
|
+
else if (state.doc.sliceString(newFrom, newTo) != text) {
|
7219
|
+
return noComp;
|
7138
7220
|
}
|
7139
7221
|
let topView = ContentView.get(node);
|
7140
7222
|
if (topView instanceof CompositionView)
|
7141
7223
|
topView = topView.widget.topView;
|
7142
7224
|
else if (topView)
|
7143
7225
|
topView.parent = null;
|
7144
|
-
|
7226
|
+
let deco = Decoration.set(Decoration.replace({ widget: new CompositionWidget(node, textNode, topView), inclusive: true })
|
7145
7227
|
.range(newFrom, newTo));
|
7228
|
+
return { deco, node };
|
7146
7229
|
}
|
7147
7230
|
class CompositionWidget extends WidgetType {
|
7148
7231
|
constructor(top, text, topView) {
|
@@ -7186,8 +7269,8 @@
|
|
7186
7269
|
function nextToUneditable(node, offset) {
|
7187
7270
|
if (node.nodeType != 1)
|
7188
7271
|
return 0;
|
7189
|
-
return (offset && node.childNodes[offset - 1].contentEditable == "false" ? 1 /*
|
7190
|
-
(offset < node.childNodes.length && node.childNodes[offset].contentEditable == "false" ? 2 /*
|
7272
|
+
return (offset && node.childNodes[offset - 1].contentEditable == "false" ? 1 /* Before */ : 0) |
|
7273
|
+
(offset < node.childNodes.length && node.childNodes[offset].contentEditable == "false" ? 2 /* After */ : 0);
|
7191
7274
|
}
|
7192
7275
|
class DecorationComparator$1 {
|
7193
7276
|
constructor() {
|
@@ -7354,7 +7437,7 @@
|
|
7354
7437
|
if (yOffset > docHeight)
|
7355
7438
|
return view.state.doc.length;
|
7356
7439
|
// Scan for a text block near the queried y position
|
7357
|
-
for (let halfLine = view.
|
7440
|
+
for (let halfLine = view.viewState.heightOracle.textHeight / 2, bounced = false;;) {
|
7358
7441
|
block = view.elementAtHeight(yOffset);
|
7359
7442
|
if (block.type == BlockType.Text)
|
7360
7443
|
break;
|
@@ -7434,7 +7517,8 @@
|
|
7434
7517
|
function posAtCoordsImprecise(view, contentRect, block, x, y) {
|
7435
7518
|
let into = Math.round((x - contentRect.left) * view.defaultCharacterWidth);
|
7436
7519
|
if (view.lineWrapping && block.height > view.defaultLineHeight * 1.5) {
|
7437
|
-
let
|
7520
|
+
let textHeight = view.viewState.heightOracle.textHeight;
|
7521
|
+
let line = Math.floor((y - block.top - (view.defaultLineHeight - textHeight) * 0.5) / textHeight);
|
7438
7522
|
into += line * view.viewState.heightOracle.lineLength;
|
7439
7523
|
}
|
7440
7524
|
let content = view.state.sliceDoc(block.from, block.to);
|
@@ -7469,9 +7553,18 @@
|
|
7469
7553
|
: textRange(node, 0, Math.max(node.nodeValue.length, 1)).getBoundingClientRect();
|
7470
7554
|
return x - rect.left > 5;
|
7471
7555
|
}
|
7556
|
+
function blockAt(view, pos) {
|
7557
|
+
let line = view.lineBlockAt(pos);
|
7558
|
+
if (Array.isArray(line.type))
|
7559
|
+
for (let l of line.type) {
|
7560
|
+
if (l.to > pos || l.to == pos && (l.to == line.to || l.type == BlockType.Text))
|
7561
|
+
return l;
|
7562
|
+
}
|
7563
|
+
return line;
|
7564
|
+
}
|
7472
7565
|
function moveToLineBoundary(view, start, forward, includeWrap) {
|
7473
|
-
let line = view
|
7474
|
-
let coords = !includeWrap || !view.lineWrapping ? null
|
7566
|
+
let line = blockAt(view, start.head);
|
7567
|
+
let coords = !includeWrap || line.type != BlockType.Text || !(view.lineWrapping || line.widgetLineBreaks) ? null
|
7475
7568
|
: view.coordsAtPos(start.assoc < 0 && start.head > line.from ? start.head - 1 : start.head);
|
7476
7569
|
if (coords) {
|
7477
7570
|
let editorRect = view.dom.getBoundingClientRect();
|
@@ -7481,9 +7574,7 @@
|
|
7481
7574
|
if (pos != null)
|
7482
7575
|
return EditorSelection.cursor(pos, forward ? -1 : 1);
|
7483
7576
|
}
|
7484
|
-
|
7485
|
-
let end = lineView ? (forward ? lineView.posAtEnd : lineView.posAtStart) : (forward ? line.to : line.from);
|
7486
|
-
return EditorSelection.cursor(end, forward ? -1 : 1);
|
7577
|
+
return EditorSelection.cursor(forward ? line.to : line.from, forward ? -1 : 1);
|
7487
7578
|
}
|
7488
7579
|
function moveByChar(view, start, forward, by) {
|
7489
7580
|
let line = view.state.doc.lineAt(start.head), spans = view.bidiSpans(line);
|
@@ -7538,7 +7629,7 @@
|
|
7538
7629
|
startY = (dir < 0 ? line.top : line.bottom) + docTop;
|
7539
7630
|
}
|
7540
7631
|
let resolvedGoal = rect.left + goal;
|
7541
|
-
let dist = distance !== null && distance !== void 0 ? distance : (view.
|
7632
|
+
let dist = distance !== null && distance !== void 0 ? distance : (view.viewState.heightOracle.textHeight >> 1);
|
7542
7633
|
for (let extra = 0;; extra += 10) {
|
7543
7634
|
let curY = startY + (dist + extra) * dir;
|
7544
7635
|
let pos = posAtCoords(view, { x: resolvedGoal, y: curY }, false, dir);
|
@@ -7546,15 +7637,15 @@
|
|
7546
7637
|
return EditorSelection.cursor(pos, start.assoc, undefined, goal);
|
7547
7638
|
}
|
7548
7639
|
}
|
7549
|
-
function
|
7550
|
-
let atoms = view.state.facet(atomicRanges).map(f => f(view));
|
7640
|
+
function skipAtomicRanges(atoms, pos, bias) {
|
7551
7641
|
for (;;) {
|
7552
|
-
let moved =
|
7642
|
+
let moved = 0;
|
7553
7643
|
for (let set of atoms) {
|
7554
|
-
set.between(pos
|
7555
|
-
if (pos
|
7556
|
-
|
7557
|
-
|
7644
|
+
set.between(pos - 1, pos + 1, (from, to, value) => {
|
7645
|
+
if (pos > from && pos < to) {
|
7646
|
+
let side = moved || bias || (pos - from < to - pos ? -1 : 1);
|
7647
|
+
pos = side < 0 ? from : to;
|
7648
|
+
moved = side;
|
7558
7649
|
}
|
7559
7650
|
});
|
7560
7651
|
}
|
@@ -7562,6 +7653,10 @@
|
|
7562
7653
|
return pos;
|
7563
7654
|
}
|
7564
7655
|
}
|
7656
|
+
function skipAtoms(view, oldPos, pos) {
|
7657
|
+
let newPos = skipAtomicRanges(view.state.facet(atomicRanges).map(f => f(view)), pos.from, oldPos.head > pos.from ? -1 : 1);
|
7658
|
+
return newPos == pos.from ? pos : EditorSelection.cursor(newPos, newPos < pos.from ? 1 : -1);
|
7659
|
+
}
|
7565
7660
|
|
7566
7661
|
// This will also be where dragging info and such goes
|
7567
7662
|
class InputState {
|
@@ -7594,7 +7689,15 @@
|
|
7594
7689
|
// first, false means first has already been marked for this
|
7595
7690
|
// composition)
|
7596
7691
|
this.compositionFirstChange = null;
|
7692
|
+
// End time of the previous composition
|
7597
7693
|
this.compositionEndedAt = 0;
|
7694
|
+
// Used in a kludge to detect when an Enter keypress should be
|
7695
|
+
// considered part of the composition on Safari, which fires events
|
7696
|
+
// in the wrong order
|
7697
|
+
this.compositionPendingKey = false;
|
7698
|
+
// Used to categorize changes as part of a composition, even when
|
7699
|
+
// the mutation events fire shortly after the compositionend event
|
7700
|
+
this.compositionPendingChange = false;
|
7598
7701
|
this.mouseSelection = null;
|
7599
7702
|
let handleEvent = (handler, event) => {
|
7600
7703
|
if (this.ignoreDuringComposition(event))
|
@@ -7628,6 +7731,10 @@
|
|
7628
7731
|
}
|
7629
7732
|
}
|
7630
7733
|
});
|
7734
|
+
view.scrollDOM.addEventListener("drop", (event) => {
|
7735
|
+
if (event.target == view.scrollDOM && event.clientY > view.contentDOM.getBoundingClientRect().bottom)
|
7736
|
+
handleEvent(handlers.drop, event);
|
7737
|
+
});
|
7631
7738
|
if (browser.chrome && browser.chrome_version == 102) { // FIXME remove at some point
|
7632
7739
|
// On Chrome 102, viewport updates somehow stop wheel-based
|
7633
7740
|
// scrolling. Turning off pointer events during the scroll seems
|
@@ -7708,6 +7815,8 @@
|
|
7708
7815
|
this.lastKeyTime = Date.now();
|
7709
7816
|
if (event.keyCode == 9 && Date.now() < this.lastEscPress + 2000)
|
7710
7817
|
return true;
|
7818
|
+
if (event.keyCode != 27 && modifierCodes.indexOf(event.keyCode) < 0)
|
7819
|
+
view.inputState.lastEscPress = 0;
|
7711
7820
|
// Chrome for Android usually doesn't fire proper key events, but
|
7712
7821
|
// occasionally does, usually surrounded by a bunch of complicated
|
7713
7822
|
// composition changes. When an enter or backspace key event is
|
@@ -7751,8 +7860,8 @@
|
|
7751
7860
|
// compositionend and keydown events are sometimes emitted in the
|
7752
7861
|
// wrong order. The key event should still be ignored, even when
|
7753
7862
|
// it happens after the compositionend event.
|
7754
|
-
if (browser.safari && !browser.ios && Date.now() - this.compositionEndedAt < 100) {
|
7755
|
-
this.
|
7863
|
+
if (browser.safari && !browser.ios && this.compositionPendingKey && Date.now() - this.compositionEndedAt < 100) {
|
7864
|
+
this.compositionPendingKey = false;
|
7756
7865
|
return true;
|
7757
7866
|
}
|
7758
7867
|
return false;
|
@@ -7779,13 +7888,15 @@
|
|
7779
7888
|
const PendingKeys = [
|
7780
7889
|
{ key: "Backspace", keyCode: 8, inputType: "deleteContentBackward" },
|
7781
7890
|
{ key: "Enter", keyCode: 13, inputType: "insertParagraph" },
|
7891
|
+
{ key: "Enter", keyCode: 13, inputType: "insertLineBreak" },
|
7782
7892
|
{ key: "Delete", keyCode: 46, inputType: "deleteContentForward" }
|
7783
7893
|
];
|
7784
7894
|
const EmacsyPendingKeys = "dthko";
|
7785
7895
|
// Key codes for modifier keys
|
7786
7896
|
const modifierCodes = [16, 17, 18, 20, 91, 92, 224, 225];
|
7897
|
+
const dragScrollMargin = 6;
|
7787
7898
|
function dragScrollSpeed(dist) {
|
7788
|
-
return dist * 0.7 + 8;
|
7899
|
+
return Math.max(0, dist) * 0.7 + 8;
|
7789
7900
|
}
|
7790
7901
|
class MouseSelection {
|
7791
7902
|
constructor(view, startEvent, style, mustSelect) {
|
@@ -7796,12 +7907,12 @@
|
|
7796
7907
|
this.scrolling = -1;
|
7797
7908
|
this.lastEvent = startEvent;
|
7798
7909
|
this.scrollParent = scrollableParent(view.contentDOM);
|
7910
|
+
this.atoms = view.state.facet(atomicRanges).map(f => f(view));
|
7799
7911
|
let doc = view.contentDOM.ownerDocument;
|
7800
7912
|
doc.addEventListener("mousemove", this.move = this.move.bind(this));
|
7801
7913
|
doc.addEventListener("mouseup", this.up = this.up.bind(this));
|
7802
7914
|
this.extend = startEvent.shiftKey;
|
7803
7915
|
this.multiple = view.state.facet(EditorState.allowMultipleSelections) && addsSelectionRange(view, startEvent);
|
7804
|
-
this.dragMove = dragMovesSelection(view, startEvent);
|
7805
7916
|
this.dragging = isInPrimarySelection(view, startEvent) && getClickType(startEvent) == 1 ? null : false;
|
7806
7917
|
}
|
7807
7918
|
start(event) {
|
@@ -7822,13 +7933,14 @@
|
|
7822
7933
|
let sx = 0, sy = 0;
|
7823
7934
|
let rect = ((_a = this.scrollParent) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect())
|
7824
7935
|
|| { left: 0, top: 0, right: this.view.win.innerWidth, bottom: this.view.win.innerHeight };
|
7825
|
-
|
7936
|
+
let margins = getScrollMargins(this.view);
|
7937
|
+
if (event.clientX - margins.left <= rect.left + dragScrollMargin)
|
7826
7938
|
sx = -dragScrollSpeed(rect.left - event.clientX);
|
7827
|
-
else if (event.clientX >= rect.right)
|
7939
|
+
else if (event.clientX + margins.right >= rect.right - dragScrollMargin)
|
7828
7940
|
sx = dragScrollSpeed(event.clientX - rect.right);
|
7829
|
-
if (event.clientY <= rect.top)
|
7941
|
+
if (event.clientY - margins.top <= rect.top + dragScrollMargin)
|
7830
7942
|
sy = -dragScrollSpeed(rect.top - event.clientY);
|
7831
|
-
else if (event.clientY >= rect.bottom)
|
7943
|
+
else if (event.clientY + margins.bottom >= rect.bottom - dragScrollMargin)
|
7832
7944
|
sy = dragScrollSpeed(event.clientY - rect.bottom);
|
7833
7945
|
this.setScrollSpeed(sx, sy);
|
7834
7946
|
}
|
@@ -7868,10 +7980,33 @@
|
|
7868
7980
|
if (this.dragging === false)
|
7869
7981
|
this.select(this.lastEvent);
|
7870
7982
|
}
|
7983
|
+
skipAtoms(sel) {
|
7984
|
+
let ranges = null;
|
7985
|
+
for (let i = 0; i < sel.ranges.length; i++) {
|
7986
|
+
let range = sel.ranges[i], updated = null;
|
7987
|
+
if (range.empty) {
|
7988
|
+
let pos = skipAtomicRanges(this.atoms, range.from, 0);
|
7989
|
+
if (pos != range.from)
|
7990
|
+
updated = EditorSelection.cursor(pos, -1);
|
7991
|
+
}
|
7992
|
+
else {
|
7993
|
+
let from = skipAtomicRanges(this.atoms, range.from, -1);
|
7994
|
+
let to = skipAtomicRanges(this.atoms, range.to, 1);
|
7995
|
+
if (from != range.from || to != range.to)
|
7996
|
+
updated = EditorSelection.range(range.from == range.anchor ? from : to, range.from == range.head ? from : to);
|
7997
|
+
}
|
7998
|
+
if (updated) {
|
7999
|
+
if (!ranges)
|
8000
|
+
ranges = sel.ranges.slice();
|
8001
|
+
ranges[i] = updated;
|
8002
|
+
}
|
8003
|
+
}
|
8004
|
+
return ranges ? EditorSelection.create(ranges, sel.mainIndex) : sel;
|
8005
|
+
}
|
7871
8006
|
select(event) {
|
7872
|
-
let selection = this.style.get(event, this.extend, this.multiple);
|
7873
|
-
if (this.mustSelect || !selection.eq(
|
7874
|
-
selection.main.assoc !=
|
8007
|
+
let { view } = this, selection = this.skipAtoms(this.style.get(event, this.extend, this.multiple));
|
8008
|
+
if (this.mustSelect || !selection.eq(view.state.selection) ||
|
8009
|
+
selection.main.assoc != view.state.selection.main.assoc)
|
7875
8010
|
this.view.dispatch({
|
7876
8011
|
selection,
|
7877
8012
|
userEvent: "select.pointer"
|
@@ -7976,8 +8111,6 @@
|
|
7976
8111
|
view.inputState.setSelectionOrigin("select");
|
7977
8112
|
if (event.keyCode == 27)
|
7978
8113
|
view.inputState.lastEscPress = Date.now();
|
7979
|
-
else if (modifierCodes.indexOf(event.keyCode) < 0)
|
7980
|
-
view.inputState.lastEscPress = 0;
|
7981
8114
|
};
|
7982
8115
|
handlers.touchstart = (view, e) => {
|
7983
8116
|
view.inputState.lastTouchTime = Date.now();
|
@@ -8000,7 +8133,7 @@
|
|
8000
8133
|
if (!style && event.button == 0)
|
8001
8134
|
style = basicMouseSelection(view, event);
|
8002
8135
|
if (style) {
|
8003
|
-
let mustFocus = view.
|
8136
|
+
let mustFocus = !view.hasFocus;
|
8004
8137
|
view.inputState.startMouseSelection(new MouseSelection(view, event, style, mustFocus));
|
8005
8138
|
if (mustFocus)
|
8006
8139
|
view.observer.ignore(() => focusPreventScroll(view.contentDOM));
|
@@ -8075,7 +8208,7 @@
|
|
8075
8208
|
}
|
8076
8209
|
},
|
8077
8210
|
get(event, extend, multiple) {
|
8078
|
-
let cur = queryPos(view, event);
|
8211
|
+
let cur = queryPos(view, event), removed;
|
8079
8212
|
let range = rangeForClick(view, cur.pos, cur.bias, type);
|
8080
8213
|
if (start.pos != cur.pos && !extend) {
|
8081
8214
|
let startRange = rangeForClick(view, start.pos, start.bias, type);
|
@@ -8084,8 +8217,8 @@
|
|
8084
8217
|
}
|
8085
8218
|
if (extend)
|
8086
8219
|
return startSel.replaceRange(startSel.main.extend(range.from, range.to));
|
8087
|
-
else if (multiple && startSel.ranges.length > 1 &&
|
8088
|
-
return
|
8220
|
+
else if (multiple && type == 1 && startSel.ranges.length > 1 && (removed = removeRangeAround(startSel, cur.pos)))
|
8221
|
+
return removed;
|
8089
8222
|
else if (multiple)
|
8090
8223
|
return startSel.addRange(range);
|
8091
8224
|
else
|
@@ -8093,11 +8226,13 @@
|
|
8093
8226
|
}
|
8094
8227
|
};
|
8095
8228
|
}
|
8096
|
-
function
|
8097
|
-
for (let i = 0
|
8098
|
-
|
8229
|
+
function removeRangeAround(sel, pos) {
|
8230
|
+
for (let i = 0; i < sel.ranges.length; i++) {
|
8231
|
+
let { from, to } = sel.ranges[i];
|
8232
|
+
if (from <= pos && to >= pos)
|
8099
8233
|
return EditorSelection.create(sel.ranges.slice(0, i).concat(sel.ranges.slice(i + 1)), sel.mainIndex == i ? 0 : sel.mainIndex - (sel.mainIndex > i ? 1 : 0));
|
8100
8234
|
}
|
8235
|
+
return null;
|
8101
8236
|
}
|
8102
8237
|
handlers.dragstart = (view, event) => {
|
8103
8238
|
let { selection: { main } } = view.state;
|
@@ -8115,7 +8250,7 @@
|
|
8115
8250
|
let dropPos = view.posAtCoords({ x: event.clientX, y: event.clientY }, false);
|
8116
8251
|
event.preventDefault();
|
8117
8252
|
let { mouseSelection } = view.inputState;
|
8118
|
-
let del = direct && mouseSelection && mouseSelection.dragging &&
|
8253
|
+
let del = direct && mouseSelection && mouseSelection.dragging && dragMovesSelection(view, event) ?
|
8119
8254
|
{ from: mouseSelection.dragging.from, to: mouseSelection.dragging.to } : null;
|
8120
8255
|
let ins = { from: dropPos, insert: text };
|
8121
8256
|
let changes = view.state.changes(del ? [del, ins] : ins);
|
@@ -8274,14 +8409,26 @@
|
|
8274
8409
|
handlers.compositionend = view => {
|
8275
8410
|
view.inputState.composing = -1;
|
8276
8411
|
view.inputState.compositionEndedAt = Date.now();
|
8412
|
+
view.inputState.compositionPendingKey = true;
|
8413
|
+
view.inputState.compositionPendingChange = view.observer.pendingRecords().length > 0;
|
8277
8414
|
view.inputState.compositionFirstChange = null;
|
8278
|
-
if (browser.chrome && browser.android)
|
8415
|
+
if (browser.chrome && browser.android) {
|
8416
|
+
// Delay flushing for a bit on Android because it'll often fire a
|
8417
|
+
// bunch of contradictory changes in a row at end of compositon
|
8279
8418
|
view.observer.flushSoon();
|
8280
|
-
|
8281
|
-
|
8282
|
-
|
8283
|
-
|
8284
|
-
}
|
8419
|
+
}
|
8420
|
+
else if (view.inputState.compositionPendingChange) {
|
8421
|
+
// If we found pending records, schedule a flush.
|
8422
|
+
Promise.resolve().then(() => view.observer.flush());
|
8423
|
+
}
|
8424
|
+
else {
|
8425
|
+
// Otherwise, make sure that, if no changes come in soon, the
|
8426
|
+
// composition view is cleared.
|
8427
|
+
setTimeout(() => {
|
8428
|
+
if (view.inputState.composing < 0 && view.docView.compositionDeco.size)
|
8429
|
+
view.update([]);
|
8430
|
+
}, 50);
|
8431
|
+
}
|
8285
8432
|
};
|
8286
8433
|
handlers.contextmenu = view => {
|
8287
8434
|
view.inputState.lastContextMenu = Date.now();
|
@@ -8416,15 +8563,25 @@
|
|
8416
8563
|
*/
|
8417
8564
|
height,
|
8418
8565
|
/**
|
8419
|
-
|
8420
|
-
|
8566
|
+
@internal Weird packed field that holds an array of children
|
8567
|
+
for composite blocks, a decoration for block widgets, and a
|
8568
|
+
number indicating the amount of widget-create line breaks for
|
8569
|
+
text blocks.
|
8421
8570
|
*/
|
8422
|
-
|
8571
|
+
_content) {
|
8423
8572
|
this.from = from;
|
8424
8573
|
this.length = length;
|
8425
8574
|
this.top = top;
|
8426
8575
|
this.height = height;
|
8427
|
-
this.
|
8576
|
+
this._content = _content;
|
8577
|
+
}
|
8578
|
+
/**
|
8579
|
+
The type of element this is. When querying lines, this may be
|
8580
|
+
an array of all the blocks that make up the line.
|
8581
|
+
*/
|
8582
|
+
get type() {
|
8583
|
+
return typeof this._content == "number" ? BlockType.Text :
|
8584
|
+
Array.isArray(this._content) ? this._content : this._content.type;
|
8428
8585
|
}
|
8429
8586
|
/**
|
8430
8587
|
The end of the element as a document position.
|
@@ -8435,12 +8592,26 @@
|
|
8435
8592
|
*/
|
8436
8593
|
get bottom() { return this.top + this.height; }
|
8437
8594
|
/**
|
8595
|
+
If this is a widget block, this will return the widget
|
8596
|
+
associated with it.
|
8597
|
+
*/
|
8598
|
+
get widget() {
|
8599
|
+
return this._content instanceof PointDecoration ? this._content.widget : null;
|
8600
|
+
}
|
8601
|
+
/**
|
8602
|
+
If this is a textblock, this holds the number of line breaks
|
8603
|
+
that appear in widgets inside the block.
|
8604
|
+
*/
|
8605
|
+
get widgetLineBreaks() {
|
8606
|
+
return typeof this._content == "number" ? this._content : 0;
|
8607
|
+
}
|
8608
|
+
/**
|
8438
8609
|
@internal
|
8439
8610
|
*/
|
8440
8611
|
join(other) {
|
8441
|
-
let
|
8442
|
-
.concat(Array.isArray(other.
|
8443
|
-
return new BlockInfo(this.from, this.length + other.length, this.top, this.height + other.height,
|
8612
|
+
let content = (Array.isArray(this._content) ? this._content : [this])
|
8613
|
+
.concat(Array.isArray(other._content) ? other._content : [other]);
|
8614
|
+
return new BlockInfo(this.from, this.length + other.length, this.top, this.height + other.height, content);
|
8444
8615
|
}
|
8445
8616
|
}
|
8446
8617
|
var QueryType$1 = /*@__PURE__*/(function (QueryType) {
|
@@ -8452,13 +8623,13 @@
|
|
8452
8623
|
class HeightMap {
|
8453
8624
|
constructor(length, // The number of characters covered
|
8454
8625
|
height, // Height of this part of the document
|
8455
|
-
flags = 2 /*
|
8626
|
+
flags = 2 /* Outdated */) {
|
8456
8627
|
this.length = length;
|
8457
8628
|
this.height = height;
|
8458
8629
|
this.flags = flags;
|
8459
8630
|
}
|
8460
|
-
get outdated() { return (this.flags & 2 /*
|
8461
|
-
set outdated(value) { this.flags = (value ? 2 /*
|
8631
|
+
get outdated() { return (this.flags & 2 /* Outdated */) > 0; }
|
8632
|
+
set outdated(value) { this.flags = (value ? 2 /* Outdated */ : 0) | (this.flags & ~2 /* Outdated */); }
|
8462
8633
|
setHeight(oracle, height) {
|
8463
8634
|
if (this.height != height) {
|
8464
8635
|
if (Math.abs(this.height - height) > Epsilon)
|
@@ -8555,12 +8726,12 @@
|
|
8555
8726
|
}
|
8556
8727
|
HeightMap.prototype.size = 1;
|
8557
8728
|
class HeightMapBlock extends HeightMap {
|
8558
|
-
constructor(length, height,
|
8729
|
+
constructor(length, height, deco) {
|
8559
8730
|
super(length, height);
|
8560
|
-
this.
|
8731
|
+
this.deco = deco;
|
8561
8732
|
}
|
8562
8733
|
blockAt(_height, _oracle, top, offset) {
|
8563
|
-
return new BlockInfo(offset, this.length, top, this.height, this.
|
8734
|
+
return new BlockInfo(offset, this.length, top, this.height, this.deco || 0);
|
8564
8735
|
}
|
8565
8736
|
lineAt(_value, _type, oracle, top, offset) {
|
8566
8737
|
return this.blockAt(0, oracle, top, offset);
|
@@ -8579,13 +8750,17 @@
|
|
8579
8750
|
}
|
8580
8751
|
class HeightMapText extends HeightMapBlock {
|
8581
8752
|
constructor(length, height) {
|
8582
|
-
super(length, height,
|
8753
|
+
super(length, height, null);
|
8583
8754
|
this.collapsed = 0; // Amount of collapsed content in the line
|
8584
8755
|
this.widgetHeight = 0; // Maximum inline widget height
|
8756
|
+
this.breaks = 0; // Number of widget-introduced line breaks on the line
|
8757
|
+
}
|
8758
|
+
blockAt(_height, _oracle, top, offset) {
|
8759
|
+
return new BlockInfo(offset, this.length, top, this.height, this.breaks);
|
8585
8760
|
}
|
8586
8761
|
replace(_from, _to, nodes) {
|
8587
8762
|
let node = nodes[0];
|
8588
|
-
if (nodes.length == 1 && (node instanceof HeightMapText || node instanceof HeightMapGap && (node.flags & 4 /*
|
8763
|
+
if (nodes.length == 1 && (node instanceof HeightMapText || node instanceof HeightMapGap && (node.flags & 4 /* SingleLine */)) &&
|
8589
8764
|
Math.abs(this.length - node.length) < 10) {
|
8590
8765
|
if (node instanceof HeightMapGap)
|
8591
8766
|
node = new HeightMapText(node.length, this.height);
|
@@ -8603,7 +8778,8 @@
|
|
8603
8778
|
if (measured && measured.from <= offset && measured.more)
|
8604
8779
|
this.setHeight(oracle, measured.heights[measured.index++]);
|
8605
8780
|
else if (force || this.outdated)
|
8606
|
-
this.setHeight(oracle, Math.max(this.widgetHeight, oracle.heightForLine(this.length - this.collapsed))
|
8781
|
+
this.setHeight(oracle, Math.max(this.widgetHeight, oracle.heightForLine(this.length - this.collapsed)) +
|
8782
|
+
this.breaks * oracle.lineHeight);
|
8607
8783
|
this.outdated = false;
|
8608
8784
|
return this;
|
8609
8785
|
}
|
@@ -8620,7 +8796,8 @@
|
|
8620
8796
|
if (oracle.lineWrapping) {
|
8621
8797
|
let totalPerLine = Math.min(this.height, oracle.lineHeight * lines);
|
8622
8798
|
perLine = totalPerLine / lines;
|
8623
|
-
|
8799
|
+
if (this.length > lines + 1)
|
8800
|
+
perChar = (this.height - totalPerLine) / (this.length - lines - 1);
|
8624
8801
|
}
|
8625
8802
|
else {
|
8626
8803
|
perLine = this.height / lines;
|
@@ -8633,12 +8810,12 @@
|
|
8633
8810
|
let guess = offset + Math.round(Math.max(0, Math.min(1, (height - top) / this.height)) * this.length);
|
8634
8811
|
let line = oracle.doc.lineAt(guess), lineHeight = perLine + line.length * perChar;
|
8635
8812
|
let lineTop = Math.max(top, height - lineHeight / 2);
|
8636
|
-
return new BlockInfo(line.from, line.length, lineTop, lineHeight,
|
8813
|
+
return new BlockInfo(line.from, line.length, lineTop, lineHeight, 0);
|
8637
8814
|
}
|
8638
8815
|
else {
|
8639
8816
|
let line = Math.max(0, Math.min(lastLine - firstLine, Math.floor((height - top) / perLine)));
|
8640
8817
|
let { from, length } = oracle.doc.line(firstLine + line);
|
8641
|
-
return new BlockInfo(from, length, top + perLine * line, perLine,
|
8818
|
+
return new BlockInfo(from, length, top + perLine * line, perLine, 0);
|
8642
8819
|
}
|
8643
8820
|
}
|
8644
8821
|
lineAt(value, type, oracle, top, offset) {
|
@@ -8646,13 +8823,13 @@
|
|
8646
8823
|
return this.blockAt(value, oracle, top, offset);
|
8647
8824
|
if (type == QueryType$1.ByPosNoHeight) {
|
8648
8825
|
let { from, to } = oracle.doc.lineAt(value);
|
8649
|
-
return new BlockInfo(from, to - from, 0, 0,
|
8826
|
+
return new BlockInfo(from, to - from, 0, 0, 0);
|
8650
8827
|
}
|
8651
8828
|
let { firstLine, perLine, perChar } = this.heightMetrics(oracle, offset);
|
8652
8829
|
let line = oracle.doc.lineAt(value), lineHeight = perLine + line.length * perChar;
|
8653
8830
|
let linesAbove = line.number - firstLine;
|
8654
8831
|
let lineTop = top + perLine * linesAbove + perChar * (line.from - offset - linesAbove);
|
8655
|
-
return new BlockInfo(line.from, line.length, Math.max(top, Math.min(lineTop, top + this.height - lineHeight)), lineHeight,
|
8832
|
+
return new BlockInfo(line.from, line.length, Math.max(top, Math.min(lineTop, top + this.height - lineHeight)), lineHeight, 0);
|
8656
8833
|
}
|
8657
8834
|
forEachLine(from, to, oracle, top, offset, f) {
|
8658
8835
|
from = Math.max(from, offset);
|
@@ -8665,7 +8842,7 @@
|
|
8665
8842
|
lineTop += perLine * linesAbove + perChar * (from - offset - linesAbove);
|
8666
8843
|
}
|
8667
8844
|
let lineHeight = perLine + perChar * line.length;
|
8668
|
-
f(new BlockInfo(line.from, line.length, lineTop, lineHeight,
|
8845
|
+
f(new BlockInfo(line.from, line.length, lineTop, lineHeight, 0));
|
8669
8846
|
lineTop += lineHeight;
|
8670
8847
|
pos = line.to + 1;
|
8671
8848
|
}
|
@@ -8736,12 +8913,12 @@
|
|
8736
8913
|
}
|
8737
8914
|
class HeightMapBranch extends HeightMap {
|
8738
8915
|
constructor(left, brk, right) {
|
8739
|
-
super(left.length + brk + right.length, left.height + right.height, brk | (left.outdated || right.outdated ? 2 /*
|
8916
|
+
super(left.length + brk + right.length, left.height + right.height, brk | (left.outdated || right.outdated ? 2 /* Outdated */ : 0));
|
8740
8917
|
this.left = left;
|
8741
8918
|
this.right = right;
|
8742
8919
|
this.size = left.size + right.size;
|
8743
8920
|
}
|
8744
|
-
get break() { return this.flags & 1 /*
|
8921
|
+
get break() { return this.flags & 1 /* Break */; }
|
8745
8922
|
blockAt(height, oracle, top, offset) {
|
8746
8923
|
let mid = top + this.left.height;
|
8747
8924
|
return height < mid ? this.left.blockAt(height, oracle, top, offset)
|
@@ -8891,14 +9068,15 @@
|
|
8891
9068
|
point(from, to, deco) {
|
8892
9069
|
if (from < to || deco.heightRelevant) {
|
8893
9070
|
let height = deco.widget ? deco.widget.estimatedHeight : 0;
|
9071
|
+
let breaks = deco.widget ? deco.widget.lineBreaks : 0;
|
8894
9072
|
if (height < 0)
|
8895
9073
|
height = this.oracle.lineHeight;
|
8896
9074
|
let len = to - from;
|
8897
9075
|
if (deco.block) {
|
8898
|
-
this.addBlock(new HeightMapBlock(len, height, deco
|
9076
|
+
this.addBlock(new HeightMapBlock(len, height, deco));
|
8899
9077
|
}
|
8900
|
-
else if (len || height >= relevantWidgetHeight) {
|
8901
|
-
this.addLineDeco(height, len);
|
9078
|
+
else if (len || breaks || height >= relevantWidgetHeight) {
|
9079
|
+
this.addLineDeco(height, breaks, len);
|
8902
9080
|
}
|
8903
9081
|
}
|
8904
9082
|
else if (to > from) {
|
@@ -8925,7 +9103,7 @@
|
|
8925
9103
|
blankContent(from, to) {
|
8926
9104
|
let gap = new HeightMapGap(to - from);
|
8927
9105
|
if (this.oracle.doc.lineAt(from).to == to)
|
8928
|
-
gap.flags |= 4 /*
|
9106
|
+
gap.flags |= 4 /* SingleLine */;
|
8929
9107
|
return gap;
|
8930
9108
|
}
|
8931
9109
|
ensureLine() {
|
@@ -8938,19 +9116,22 @@
|
|
8938
9116
|
return line;
|
8939
9117
|
}
|
8940
9118
|
addBlock(block) {
|
9119
|
+
var _a;
|
8941
9120
|
this.enterLine();
|
8942
|
-
|
9121
|
+
let type = (_a = block.deco) === null || _a === void 0 ? void 0 : _a.type;
|
9122
|
+
if (type == BlockType.WidgetAfter && !this.isCovered)
|
8943
9123
|
this.ensureLine();
|
8944
9124
|
this.nodes.push(block);
|
8945
9125
|
this.writtenTo = this.pos = this.pos + block.length;
|
8946
|
-
if (
|
9126
|
+
if (type != BlockType.WidgetBefore)
|
8947
9127
|
this.covering = block;
|
8948
9128
|
}
|
8949
|
-
addLineDeco(height, length) {
|
9129
|
+
addLineDeco(height, breaks, length) {
|
8950
9130
|
let line = this.ensureLine();
|
8951
9131
|
line.length += length;
|
8952
9132
|
line.collapsed += length;
|
8953
9133
|
line.widgetHeight = Math.max(line.widgetHeight, height);
|
9134
|
+
line.breaks += breaks;
|
8954
9135
|
this.writtenTo = this.pos = this.pos + length;
|
8955
9136
|
}
|
8956
9137
|
finish(from) {
|
@@ -9084,6 +9265,14 @@
|
|
9084
9265
|
this.contentDOMHeight = 0;
|
9085
9266
|
this.editorHeight = 0;
|
9086
9267
|
this.editorWidth = 0;
|
9268
|
+
this.scrollTop = 0;
|
9269
|
+
this.scrolledToBottom = true;
|
9270
|
+
// The vertical position (document-relative) to which to anchor the
|
9271
|
+
// scroll position. -1 means anchor to the end of the document.
|
9272
|
+
this.scrollAnchorPos = 0;
|
9273
|
+
// The height at the anchor position. Set by the DOM update phase.
|
9274
|
+
// -1 means no height available.
|
9275
|
+
this.scrollAnchorHeight = -1;
|
9087
9276
|
// See VP.MaxDOMHeight
|
9088
9277
|
this.scaler = IdScaler;
|
9089
9278
|
this.scrollTarget = null;
|
@@ -9124,7 +9313,7 @@
|
|
9124
9313
|
}
|
9125
9314
|
}
|
9126
9315
|
this.viewports = viewports.sort((a, b) => a.from - b.from);
|
9127
|
-
this.scaler = this.heightMap.height <= 7000000 /*
|
9316
|
+
this.scaler = this.heightMap.height <= 7000000 /* MaxDOMHeight */ ? IdScaler :
|
9128
9317
|
new BigScaler(this.heightOracle, this.heightMap, this.viewports);
|
9129
9318
|
}
|
9130
9319
|
updateViewportLines() {
|
@@ -9140,20 +9329,29 @@
|
|
9140
9329
|
let contentChanges = update.changedRanges;
|
9141
9330
|
let heightChanges = ChangedRange.extendWithRanges(contentChanges, heightRelevantDecoChanges(prevDeco, this.stateDeco, update ? update.changes : ChangeSet.empty(this.state.doc.length)));
|
9142
9331
|
let prevHeight = this.heightMap.height;
|
9332
|
+
let scrollAnchor = this.scrolledToBottom ? null : this.scrollAnchorAt(this.scrollTop);
|
9143
9333
|
this.heightMap = this.heightMap.applyChanges(this.stateDeco, update.startState.doc, this.heightOracle.setDoc(this.state.doc), heightChanges);
|
9144
9334
|
if (this.heightMap.height != prevHeight)
|
9145
|
-
update.flags |= 2 /*
|
9335
|
+
update.flags |= 2 /* Height */;
|
9336
|
+
if (scrollAnchor) {
|
9337
|
+
this.scrollAnchorPos = update.changes.mapPos(scrollAnchor.from, -1);
|
9338
|
+
this.scrollAnchorHeight = scrollAnchor.top;
|
9339
|
+
}
|
9340
|
+
else {
|
9341
|
+
this.scrollAnchorPos = -1;
|
9342
|
+
this.scrollAnchorHeight = this.heightMap.height;
|
9343
|
+
}
|
9146
9344
|
let viewport = heightChanges.length ? this.mapViewport(this.viewport, update.changes) : this.viewport;
|
9147
9345
|
if (scrollTarget && (scrollTarget.range.head < viewport.from || scrollTarget.range.head > viewport.to) ||
|
9148
9346
|
!this.viewportIsAppropriate(viewport))
|
9149
9347
|
viewport = this.getViewport(0, scrollTarget);
|
9150
|
-
let updateLines = !update.changes.empty || (update.flags & 2 /*
|
9348
|
+
let updateLines = !update.changes.empty || (update.flags & 2 /* Height */) ||
|
9151
9349
|
viewport.from != this.viewport.from || viewport.to != this.viewport.to;
|
9152
9350
|
this.viewport = viewport;
|
9153
9351
|
this.updateForViewport();
|
9154
9352
|
if (updateLines)
|
9155
9353
|
this.updateViewportLines();
|
9156
|
-
if (this.lineGaps.length || this.viewport.to - this.viewport.from > (2000 /*
|
9354
|
+
if (this.lineGaps.length || this.viewport.to - this.viewport.from > (2000 /* Margin */ << 1))
|
9157
9355
|
this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps, update.changes)));
|
9158
9356
|
update.flags |= this.computeVisibleRanges();
|
9159
9357
|
if (scrollTarget)
|
@@ -9179,14 +9377,19 @@
|
|
9179
9377
|
if (this.paddingTop != paddingTop || this.paddingBottom != paddingBottom) {
|
9180
9378
|
this.paddingTop = paddingTop;
|
9181
9379
|
this.paddingBottom = paddingBottom;
|
9182
|
-
result |= 8 /*
|
9380
|
+
result |= 8 /* Geometry */ | 2 /* Height */;
|
9183
9381
|
}
|
9184
9382
|
if (this.editorWidth != view.scrollDOM.clientWidth) {
|
9185
9383
|
if (oracle.lineWrapping)
|
9186
9384
|
measureContent = true;
|
9187
9385
|
this.editorWidth = view.scrollDOM.clientWidth;
|
9188
|
-
result |= 8 /*
|
9386
|
+
result |= 8 /* Geometry */;
|
9387
|
+
}
|
9388
|
+
if (this.scrollTop != view.scrollDOM.scrollTop) {
|
9389
|
+
this.scrollAnchorHeight = -1;
|
9390
|
+
this.scrollTop = view.scrollDOM.scrollTop;
|
9189
9391
|
}
|
9392
|
+
this.scrolledToBottom = isScrolledToBottom(view.scrollDOM);
|
9190
9393
|
// Pixel viewport
|
9191
9394
|
let pixelViewport = (this.printing ? fullPixelRange : visiblePixelRange)(dom, this.paddingTop);
|
9192
9395
|
let dTop = pixelViewport.top - this.pixelViewport.top, dBottom = pixelViewport.bottom - this.pixelViewport.bottom;
|
@@ -9203,7 +9406,7 @@
|
|
9203
9406
|
if (this.contentDOMWidth != contentWidth || this.editorHeight != view.scrollDOM.clientHeight) {
|
9204
9407
|
this.contentDOMWidth = domRect.width;
|
9205
9408
|
this.editorHeight = view.scrollDOM.clientHeight;
|
9206
|
-
result |= 8 /*
|
9409
|
+
result |= 8 /* Geometry */;
|
9207
9410
|
}
|
9208
9411
|
if (measureContent) {
|
9209
9412
|
let lineHeights = view.docView.measureVisibleLineHeights(this.viewport);
|
@@ -9214,7 +9417,7 @@
|
|
9214
9417
|
refresh = lineHeight > 0 && oracle.refresh(whiteSpace, lineHeight, charWidth, textHeight, contentWidth / charWidth, lineHeights);
|
9215
9418
|
if (refresh) {
|
9216
9419
|
view.docView.minWidth = 0;
|
9217
|
-
result |= 8 /*
|
9420
|
+
result |= 8 /* Geometry */;
|
9218
9421
|
}
|
9219
9422
|
}
|
9220
9423
|
if (dTop > 0 && dBottom > 0)
|
@@ -9227,7 +9430,7 @@
|
|
9227
9430
|
this.heightMap = (refresh ? HeightMap.empty().applyChanges(this.stateDeco, Text.empty, this.heightOracle, [new ChangedRange(0, 0, 0, view.state.doc.length)]) : this.heightMap).updateHeight(oracle, 0, refresh, new MeasuredHeights(vp.from, heights));
|
9228
9431
|
}
|
9229
9432
|
if (oracle.heightChanged)
|
9230
|
-
result |= 2 /*
|
9433
|
+
result |= 2 /* Height */;
|
9231
9434
|
}
|
9232
9435
|
let viewportChange = !this.viewportIsAppropriate(this.viewport, bias) ||
|
9233
9436
|
this.scrollTarget && (this.scrollTarget.range.head < this.viewport.from ||
|
@@ -9235,9 +9438,9 @@
|
|
9235
9438
|
if (viewportChange)
|
9236
9439
|
this.viewport = this.getViewport(bias, this.scrollTarget);
|
9237
9440
|
this.updateForViewport();
|
9238
|
-
if ((result & 2 /*
|
9441
|
+
if ((result & 2 /* Height */) || viewportChange)
|
9239
9442
|
this.updateViewportLines();
|
9240
|
-
if (this.lineGaps.length || this.viewport.to - this.viewport.from > (2000 /*
|
9443
|
+
if (this.lineGaps.length || this.viewport.to - this.viewport.from > (2000 /* Margin */ << 1))
|
9241
9444
|
this.updateLineGaps(this.ensureLineGaps(refresh ? [] : this.lineGaps, view));
|
9242
9445
|
result |= this.computeVisibleRanges();
|
9243
9446
|
if (this.mustEnforceCursorAssoc) {
|
@@ -9256,10 +9459,10 @@
|
|
9256
9459
|
// This will divide VP.Margin between the top and the
|
9257
9460
|
// bottom, depending on the bias (the change in viewport position
|
9258
9461
|
// since the last update). It'll hold a number between 0 and 1
|
9259
|
-
let marginTop = 0.5 - Math.max(-0.5, Math.min(0.5, bias / 1000 /*
|
9462
|
+
let marginTop = 0.5 - Math.max(-0.5, Math.min(0.5, bias / 1000 /* Margin */ / 2));
|
9260
9463
|
let map = this.heightMap, oracle = this.heightOracle;
|
9261
9464
|
let { visibleTop, visibleBottom } = this;
|
9262
|
-
let viewport = new Viewport(map.lineAt(visibleTop - marginTop * 1000 /*
|
9465
|
+
let viewport = new Viewport(map.lineAt(visibleTop - marginTop * 1000 /* Margin */, QueryType$1.ByHeight, oracle, 0, 0).from, map.lineAt(visibleBottom + (1 - marginTop) * 1000 /* Margin */, QueryType$1.ByHeight, oracle, 0, 0).to);
|
9263
9466
|
// If scrollTarget is given, make sure the viewport includes that position
|
9264
9467
|
if (scrollTarget) {
|
9265
9468
|
let { head } = scrollTarget.range;
|
@@ -9272,7 +9475,7 @@
|
|
9272
9475
|
topPos = block.top;
|
9273
9476
|
else
|
9274
9477
|
topPos = block.bottom - viewHeight;
|
9275
|
-
viewport = new Viewport(map.lineAt(topPos - 1000 /*
|
9478
|
+
viewport = new Viewport(map.lineAt(topPos - 1000 /* Margin */ / 2, QueryType$1.ByHeight, oracle, 0, 0).from, map.lineAt(topPos + viewHeight + 1000 /* Margin */ / 2, QueryType$1.ByHeight, oracle, 0, 0).to);
|
9276
9479
|
}
|
9277
9480
|
}
|
9278
9481
|
return viewport;
|
@@ -9289,10 +9492,10 @@
|
|
9289
9492
|
let { top } = this.heightMap.lineAt(from, QueryType$1.ByPos, this.heightOracle, 0, 0);
|
9290
9493
|
let { bottom } = this.heightMap.lineAt(to, QueryType$1.ByPos, this.heightOracle, 0, 0);
|
9291
9494
|
let { visibleTop, visibleBottom } = this;
|
9292
|
-
return (from == 0 || top <= visibleTop - Math.max(10 /*
|
9495
|
+
return (from == 0 || top <= visibleTop - Math.max(10 /* MinCoverMargin */, Math.min(-bias, 250 /* MaxCoverMargin */))) &&
|
9293
9496
|
(to == this.state.doc.length ||
|
9294
|
-
bottom >= visibleBottom + Math.max(10 /*
|
9295
|
-
(top > visibleTop - 2 * 1000 /*
|
9497
|
+
bottom >= visibleBottom + Math.max(10 /* MinCoverMargin */, Math.min(bias, 250 /* MaxCoverMargin */))) &&
|
9498
|
+
(top > visibleTop - 2 * 1000 /* Margin */ && bottom < visibleBottom + 2 * 1000 /* Margin */);
|
9296
9499
|
}
|
9297
9500
|
mapLineGaps(gaps, changes) {
|
9298
9501
|
if (!gaps.length || changes.empty)
|
@@ -9312,7 +9515,7 @@
|
|
9312
9515
|
// the artifacts this might produce from the user.
|
9313
9516
|
ensureLineGaps(current, mayMeasure) {
|
9314
9517
|
let wrapping = this.heightOracle.lineWrapping;
|
9315
|
-
let margin = wrapping ? 10000 /*
|
9518
|
+
let margin = wrapping ? 10000 /* MarginWrap */ : 2000 /* Margin */, halfMargin = margin >> 1, doubleMargin = margin << 1;
|
9316
9519
|
// The non-wrapping logic won't work at all in predominantly right-to-left text.
|
9317
9520
|
if (this.defaultTextDirection != Direction.LTR && !wrapping)
|
9318
9521
|
return [];
|
@@ -9325,8 +9528,8 @@
|
|
9325
9528
|
avoid.push(sel.to);
|
9326
9529
|
for (let pos of avoid) {
|
9327
9530
|
if (pos > from && pos < to) {
|
9328
|
-
addGap(from, pos - 10 /*
|
9329
|
-
addGap(pos + 10 /*
|
9531
|
+
addGap(from, pos - 10 /* SelectionMargin */, line, structure);
|
9532
|
+
addGap(pos + 10 /* SelectionMargin */, to, line, structure);
|
9330
9533
|
return;
|
9331
9534
|
}
|
9332
9535
|
}
|
@@ -9420,7 +9623,7 @@
|
|
9420
9623
|
let changed = ranges.length != this.visibleRanges.length ||
|
9421
9624
|
this.visibleRanges.some((r, i) => r.from != ranges[i].from || r.to != ranges[i].to);
|
9422
9625
|
this.visibleRanges = ranges;
|
9423
|
-
return changed ? 4 /*
|
9626
|
+
return changed ? 4 /* Viewport */ : 0;
|
9424
9627
|
}
|
9425
9628
|
lineBlockAt(pos) {
|
9426
9629
|
return (pos >= this.viewport.from && pos <= this.viewport.to && this.viewportLines.find(b => b.from <= pos && b.to >= pos)) ||
|
@@ -9429,6 +9632,10 @@
|
|
9429
9632
|
lineBlockAtHeight(height) {
|
9430
9633
|
return scaleBlock(this.heightMap.lineAt(this.scaler.fromDOM(height), QueryType$1.ByHeight, this.heightOracle, 0, 0), this.scaler);
|
9431
9634
|
}
|
9635
|
+
scrollAnchorAt(scrollTop) {
|
9636
|
+
let block = this.lineBlockAtHeight(scrollTop + 8);
|
9637
|
+
return block.from >= this.viewport.from || this.viewportLines[0].top - scrollTop > 200 ? block : this.viewportLines[0];
|
9638
|
+
}
|
9432
9639
|
elementAtHeight(height) {
|
9433
9640
|
return scaleBlock(this.heightMap.blockAt(this.scaler.fromDOM(height), this.heightOracle, 0, 0), this.scaler);
|
9434
9641
|
}
|
@@ -9512,7 +9719,7 @@
|
|
9512
9719
|
vpHeight += bottom - top;
|
9513
9720
|
return { from, to, top, bottom, domTop: 0, domBottom: 0 };
|
9514
9721
|
});
|
9515
|
-
this.scale = (7000000 /*
|
9722
|
+
this.scale = (7000000 /* MaxDOMHeight */ - vpHeight) / (heightMap.height - vpHeight);
|
9516
9723
|
for (let obj of this.viewports) {
|
9517
9724
|
obj.domTop = domBase + (obj.top - base) * this.scale;
|
9518
9725
|
domBase = obj.domBottom = obj.domTop + (obj.bottom - obj.top);
|
@@ -9546,7 +9753,7 @@
|
|
9546
9753
|
if (scaler.scale == 1)
|
9547
9754
|
return block;
|
9548
9755
|
let bTop = scaler.toDOM(block.top), bBottom = scaler.toDOM(block.bottom);
|
9549
|
-
return new BlockInfo(block.from, block.length, bTop, bBottom - bTop, Array.isArray(block.
|
9756
|
+
return new BlockInfo(block.from, block.length, bTop, bBottom - bTop, Array.isArray(block._content) ? block._content.map(b => scaleBlock(b, scaler)) : block._content);
|
9550
9757
|
}
|
9551
9758
|
|
9552
9759
|
const theme = /*@__PURE__*/Facet.define({ combine: strs => strs.join(" ") });
|
@@ -9636,16 +9843,16 @@
|
|
9636
9843
|
"&dark .cm-selectionBackground": {
|
9637
9844
|
background: "#222"
|
9638
9845
|
},
|
9639
|
-
"&light.cm-focused .cm-selectionBackground": {
|
9846
|
+
"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground": {
|
9640
9847
|
background: "#d7d4f0"
|
9641
9848
|
},
|
9642
|
-
"&dark.cm-focused .cm-selectionBackground": {
|
9849
|
+
"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground": {
|
9643
9850
|
background: "#233"
|
9644
9851
|
},
|
9645
9852
|
".cm-cursorLayer": {
|
9646
9853
|
pointerEvents: "none"
|
9647
9854
|
},
|
9648
|
-
"&.cm-focused .cm-cursorLayer": {
|
9855
|
+
"&.cm-focused > .cm-scroller > .cm-cursorLayer": {
|
9649
9856
|
animation: "steps(1) cm-blink 1.2s infinite"
|
9650
9857
|
},
|
9651
9858
|
// Two animations defined so that we can switch between them to
|
@@ -9667,7 +9874,7 @@
|
|
9667
9874
|
".cm-dropCursor": {
|
9668
9875
|
position: "absolute"
|
9669
9876
|
},
|
9670
|
-
"&.cm-focused .cm-cursor": {
|
9877
|
+
"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor": {
|
9671
9878
|
display: "block"
|
9672
9879
|
},
|
9673
9880
|
"&light .cm-activeLine": { backgroundColor: "#cceeff44" },
|
@@ -9836,13 +10043,13 @@
|
|
9836
10043
|
function applyDOMChange(view, domChange) {
|
9837
10044
|
let change;
|
9838
10045
|
let { newSel } = domChange, sel = view.state.selection.main;
|
10046
|
+
let lastKey = view.inputState.lastKeyTime > Date.now() - 100 ? view.inputState.lastKeyCode : -1;
|
9839
10047
|
if (domChange.bounds) {
|
9840
10048
|
let { from, to } = domChange.bounds;
|
9841
10049
|
let preferredPos = sel.from, preferredSide = null;
|
9842
10050
|
// Prefer anchoring to end when Backspace is pressed (or, on
|
9843
10051
|
// Android, when something was deleted)
|
9844
|
-
if (
|
9845
|
-
browser.android && domChange.text.length < to - from) {
|
10052
|
+
if (lastKey === 8 || browser.android && domChange.text.length < to - from) {
|
9846
10053
|
preferredPos = sel.to;
|
9847
10054
|
preferredSide = "end";
|
9848
10055
|
}
|
@@ -9850,7 +10057,7 @@
|
|
9850
10057
|
if (diff) {
|
9851
10058
|
// Chrome inserts two newlines when pressing shift-enter at the
|
9852
10059
|
// end of a line. DomChange drops one of those.
|
9853
|
-
if (browser.chrome &&
|
10060
|
+
if (browser.chrome && lastKey == 13 &&
|
9854
10061
|
diff.toB == diff.from + 2 && domChange.text.slice(diff.from, diff.toB) == LineBreakPlaceholder + LineBreakPlaceholder)
|
9855
10062
|
diff.toB--;
|
9856
10063
|
change = { from: from + diff.from, to: from + diff.toA,
|
@@ -9908,7 +10115,8 @@
|
|
9908
10115
|
((change.from == sel.from && change.to == sel.to &&
|
9909
10116
|
change.insert.length == 1 && change.insert.lines == 2 &&
|
9910
10117
|
dispatchKey(view.contentDOM, "Enter", 13)) ||
|
9911
|
-
(change.from == sel.from - 1 && change.to == sel.to && change.insert.length == 0
|
10118
|
+
((change.from == sel.from - 1 && change.to == sel.to && change.insert.length == 0 ||
|
10119
|
+
lastKey == 8 && change.insert.length < change.to - change.from) &&
|
9912
10120
|
dispatchKey(view.contentDOM, "Backspace", 8)) ||
|
9913
10121
|
(change.from == sel.from && change.to == sel.to + 1 && change.insert.length == 0 &&
|
9914
10122
|
dispatchKey(view.contentDOM, "Delete", 46))))
|
@@ -9928,8 +10136,7 @@
|
|
9928
10136
|
}
|
9929
10137
|
else {
|
9930
10138
|
let changes = startState.changes(change);
|
9931
|
-
let mainSel = newSel &&
|
9932
|
-
? newSel.main : undefined;
|
10139
|
+
let mainSel = newSel && newSel.main.to <= changes.newLength ? newSel.main : undefined;
|
9933
10140
|
// Try to apply a composition change to all cursors
|
9934
10141
|
if (startState.selection.ranges.length > 1 && view.inputState.composing >= 0 &&
|
9935
10142
|
change.to <= sel.to && change.to >= sel.to - 10) {
|
@@ -9963,7 +10170,9 @@
|
|
9963
10170
|
}
|
9964
10171
|
}
|
9965
10172
|
let userEvent = "input.type";
|
9966
|
-
if (view.composing
|
10173
|
+
if (view.composing ||
|
10174
|
+
view.inputState.compositionPendingChange && view.inputState.compositionEndedAt > Date.now() - 50) {
|
10175
|
+
view.inputState.compositionPendingChange = false;
|
9967
10176
|
userEvent += ".compose";
|
9968
10177
|
if (view.inputState.compositionFirstChange) {
|
9969
10178
|
userEvent += ".start";
|
@@ -10126,7 +10335,7 @@
|
|
10126
10335
|
if (this.intersecting != this.view.inView)
|
10127
10336
|
this.onScrollChanged(document.createEvent("Event"));
|
10128
10337
|
}
|
10129
|
-
}, {});
|
10338
|
+
}, { threshold: [0, .001] });
|
10130
10339
|
this.intersection.observe(this.dom);
|
10131
10340
|
this.gapIntersection = new IntersectionObserver(entries => {
|
10132
10341
|
if (entries.length > 0 && entries[entries.length - 1].intersectionRatio > 0)
|
@@ -10305,7 +10514,10 @@
|
|
10305
10514
|
let key = this.delayedAndroidKey;
|
10306
10515
|
if (key) {
|
10307
10516
|
this.clearDelayedAndroidKey();
|
10308
|
-
|
10517
|
+
this.view.inputState.lastKeyCode = key.keyCode;
|
10518
|
+
this.view.inputState.lastKeyTime = Date.now();
|
10519
|
+
let flushed = this.flush();
|
10520
|
+
if (!flushed && key.force)
|
10309
10521
|
dispatchKey(this.dom, key.key, key.keyCode);
|
10310
10522
|
}
|
10311
10523
|
};
|
@@ -10339,10 +10551,13 @@
|
|
10339
10551
|
}
|
10340
10552
|
this.flush();
|
10341
10553
|
}
|
10342
|
-
|
10343
|
-
let records = this.queue;
|
10554
|
+
pendingRecords() {
|
10344
10555
|
for (let mut of this.observer.takeRecords())
|
10345
|
-
|
10556
|
+
this.queue.push(mut);
|
10557
|
+
return this.queue;
|
10558
|
+
}
|
10559
|
+
processRecords() {
|
10560
|
+
let records = this.pendingRecords();
|
10346
10561
|
if (records.length)
|
10347
10562
|
this.queue = [];
|
10348
10563
|
let from = -1, to = -1, typeOver = false;
|
@@ -10398,7 +10613,7 @@
|
|
10398
10613
|
return null;
|
10399
10614
|
cView.markDirty(rec.type == "attributes");
|
10400
10615
|
if (rec.type == "attributes")
|
10401
|
-
cView.dirty |= 4 /*
|
10616
|
+
cView.dirty |= 4 /* Attrs */;
|
10402
10617
|
if (rec.type == "childList") {
|
10403
10618
|
let childBefore = findChild(cView, rec.previousSibling || rec.target.previousSibling, -1);
|
10404
10619
|
let childAfter = findChild(cView, rec.nextSibling || rec.target.nextSibling, 1);
|
@@ -10521,7 +10736,7 @@
|
|
10521
10736
|
/**
|
10522
10737
|
@internal
|
10523
10738
|
*/
|
10524
|
-
this.updateState = 2 /*
|
10739
|
+
this.updateState = 2 /* Updating */;
|
10525
10740
|
/**
|
10526
10741
|
@internal
|
10527
10742
|
*/
|
@@ -10554,7 +10769,7 @@
|
|
10554
10769
|
this.docView = new DocView(this);
|
10555
10770
|
this.mountStyles();
|
10556
10771
|
this.updateAttrs();
|
10557
|
-
this.updateState = 0 /*
|
10772
|
+
this.updateState = 0 /* Idle */;
|
10558
10773
|
this.requestMeasure();
|
10559
10774
|
if (config.parent)
|
10560
10775
|
config.parent.appendChild(this.dom);
|
@@ -10607,8 +10822,9 @@
|
|
10607
10822
|
*/
|
10608
10823
|
get win() { return this.dom.ownerDocument.defaultView || window; }
|
10609
10824
|
dispatch(...input) {
|
10610
|
-
|
10611
|
-
: this.state.update(...input)
|
10825
|
+
let tr = input.length == 1 && input[0] instanceof Transaction ? input[0]
|
10826
|
+
: this.state.update(...input);
|
10827
|
+
this._dispatch(tr, this);
|
10612
10828
|
}
|
10613
10829
|
/**
|
10614
10830
|
Update the view for the given array of transactions. This will
|
@@ -10619,7 +10835,7 @@
|
|
10619
10835
|
as a primitive.
|
10620
10836
|
*/
|
10621
10837
|
update(transactions) {
|
10622
|
-
if (this.updateState != 0 /*
|
10838
|
+
if (this.updateState != 0 /* Idle */)
|
10623
10839
|
throw new Error("Calls to EditorView.update are not allowed while an update is in progress");
|
10624
10840
|
let redrawn = false, attrsChanged = false, update;
|
10625
10841
|
let state = this.state;
|
@@ -10636,7 +10852,7 @@
|
|
10636
10852
|
if (transactions.some(tr => tr.annotation(isFocusChange))) {
|
10637
10853
|
this.inputState.notifiedFocused = focus;
|
10638
10854
|
// If a focus-change transaction is being dispatched, set this update flag.
|
10639
|
-
focusFlag = 1 /*
|
10855
|
+
focusFlag = 1 /* Focus */;
|
10640
10856
|
}
|
10641
10857
|
else if (focus != this.inputState.notifiedFocused) {
|
10642
10858
|
this.inputState.notifiedFocused = focus;
|
@@ -10644,7 +10860,7 @@
|
|
10644
10860
|
// add a flag to this update
|
10645
10861
|
dispatchFocus = focusChangeTransaction(state, focus);
|
10646
10862
|
if (!dispatchFocus)
|
10647
|
-
focusFlag = 1 /*
|
10863
|
+
focusFlag = 1 /* Focus */;
|
10648
10864
|
}
|
10649
10865
|
// If there was a pending DOM change, eagerly read it and try to
|
10650
10866
|
// apply it after the given transactions.
|
@@ -10667,7 +10883,7 @@
|
|
10667
10883
|
update.flags |= focusFlag;
|
10668
10884
|
let scrollTarget = this.viewState.scrollTarget;
|
10669
10885
|
try {
|
10670
|
-
this.updateState = 2 /*
|
10886
|
+
this.updateState = 2 /* Updating */;
|
10671
10887
|
for (let tr of transactions) {
|
10672
10888
|
if (scrollTarget)
|
10673
10889
|
scrollTarget = scrollTarget.map(tr.changes);
|
@@ -10693,7 +10909,7 @@
|
|
10693
10909
|
this.docView.updateSelection(redrawn, transactions.some(tr => tr.isUserEvent("select.pointer")));
|
10694
10910
|
}
|
10695
10911
|
finally {
|
10696
|
-
this.updateState = 0 /*
|
10912
|
+
this.updateState = 0 /* Idle */;
|
10697
10913
|
}
|
10698
10914
|
if (update.startState.facet(theme) != update.state.facet(theme))
|
10699
10915
|
this.viewState.mustMeasureContent = true;
|
@@ -10720,13 +10936,13 @@
|
|
10720
10936
|
[`dispatch`](https://codemirror.net/6/docs/ref/#view.EditorView.dispatch) instead.)
|
10721
10937
|
*/
|
10722
10938
|
setState(newState) {
|
10723
|
-
if (this.updateState != 0 /*
|
10939
|
+
if (this.updateState != 0 /* Idle */)
|
10724
10940
|
throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");
|
10725
10941
|
if (this.destroyed) {
|
10726
10942
|
this.viewState.state = newState;
|
10727
10943
|
return;
|
10728
10944
|
}
|
10729
|
-
this.updateState = 2 /*
|
10945
|
+
this.updateState = 2 /* Updating */;
|
10730
10946
|
let hadFocus = this.hasFocus;
|
10731
10947
|
try {
|
10732
10948
|
for (let plugin of this.plugins)
|
@@ -10743,7 +10959,7 @@
|
|
10743
10959
|
this.bidiCache = [];
|
10744
10960
|
}
|
10745
10961
|
finally {
|
10746
|
-
this.updateState = 0 /*
|
10962
|
+
this.updateState = 0 /* Idle */;
|
10747
10963
|
}
|
10748
10964
|
if (hadFocus)
|
10749
10965
|
this.focus();
|
@@ -10790,13 +11006,25 @@
|
|
10790
11006
|
if (flush)
|
10791
11007
|
this.observer.forceFlush();
|
10792
11008
|
let updated = null;
|
10793
|
-
let
|
10794
|
-
let
|
11009
|
+
let sDOM = this.scrollDOM, { scrollTop } = sDOM;
|
11010
|
+
let { scrollAnchorPos, scrollAnchorHeight } = this.viewState;
|
11011
|
+
if (scrollTop != this.viewState.scrollTop)
|
11012
|
+
scrollAnchorHeight = -1;
|
11013
|
+
this.viewState.scrollAnchorHeight = -1;
|
10795
11014
|
try {
|
10796
11015
|
for (let i = 0;; i++) {
|
10797
|
-
|
10798
|
-
|
10799
|
-
|
11016
|
+
if (scrollAnchorHeight < 0) {
|
11017
|
+
if (isScrolledToBottom(sDOM)) {
|
11018
|
+
scrollAnchorPos = -1;
|
11019
|
+
scrollAnchorHeight = this.viewState.heightMap.height;
|
11020
|
+
}
|
11021
|
+
else {
|
11022
|
+
let block = this.viewState.scrollAnchorAt(scrollTop);
|
11023
|
+
scrollAnchorPos = block.from;
|
11024
|
+
scrollAnchorHeight = block.top;
|
11025
|
+
}
|
11026
|
+
}
|
11027
|
+
this.updateState = 1 /* Measuring */;
|
10800
11028
|
let changed = this.viewState.measure(this);
|
10801
11029
|
if (!changed && !this.measureRequests.length && this.viewState.scrollTarget == null)
|
10802
11030
|
break;
|
@@ -10808,7 +11036,7 @@
|
|
10808
11036
|
}
|
10809
11037
|
let measuring = [];
|
10810
11038
|
// Only run measure requests in this cycle when the viewport didn't change
|
10811
|
-
if (!(changed & 4 /*
|
11039
|
+
if (!(changed & 4 /* Viewport */))
|
10812
11040
|
[this.measureRequests, measuring] = [measuring, this.measureRequests];
|
10813
11041
|
let measured = measuring.map(m => {
|
10814
11042
|
try {
|
@@ -10819,13 +11047,13 @@
|
|
10819
11047
|
return BadMeasure;
|
10820
11048
|
}
|
10821
11049
|
});
|
10822
|
-
let update = ViewUpdate.create(this, this.state, []), redrawn = false
|
11050
|
+
let update = ViewUpdate.create(this, this.state, []), redrawn = false;
|
10823
11051
|
update.flags |= changed;
|
10824
11052
|
if (!updated)
|
10825
11053
|
updated = update;
|
10826
11054
|
else
|
10827
11055
|
updated.flags |= changed;
|
10828
|
-
this.updateState = 2 /*
|
11056
|
+
this.updateState = 2 /* Updating */;
|
10829
11057
|
if (!update.empty) {
|
10830
11058
|
this.updatePlugins(update);
|
10831
11059
|
this.inputState.update(update);
|
@@ -10843,29 +11071,32 @@
|
|
10843
11071
|
logException(this.state, e);
|
10844
11072
|
}
|
10845
11073
|
}
|
10846
|
-
if (this.viewState.editorHeight) {
|
10847
|
-
if (this.viewState.scrollTarget) {
|
10848
|
-
this.docView.scrollIntoView(this.viewState.scrollTarget);
|
10849
|
-
this.viewState.scrollTarget = null;
|
10850
|
-
scrolled = true;
|
10851
|
-
}
|
10852
|
-
else {
|
10853
|
-
let diff = this.viewState.lineBlockAt(refBlock.from).top - refBlock.top;
|
10854
|
-
if (diff > 1 || diff < -1) {
|
10855
|
-
this.scrollDOM.scrollTop += diff;
|
10856
|
-
scrolled = true;
|
10857
|
-
}
|
10858
|
-
}
|
10859
|
-
}
|
10860
11074
|
if (redrawn)
|
10861
11075
|
this.docView.updateSelection(true);
|
10862
|
-
if (
|
10863
|
-
|
11076
|
+
if (!update.viewportChanged && this.measureRequests.length == 0) {
|
11077
|
+
if (this.viewState.editorHeight) {
|
11078
|
+
if (this.viewState.scrollTarget) {
|
11079
|
+
this.docView.scrollIntoView(this.viewState.scrollTarget);
|
11080
|
+
this.viewState.scrollTarget = null;
|
11081
|
+
continue;
|
11082
|
+
}
|
11083
|
+
else {
|
11084
|
+
let newAnchorHeight = scrollAnchorPos < 0 ? this.viewState.heightMap.height :
|
11085
|
+
this.viewState.lineBlockAt(scrollAnchorPos).top;
|
11086
|
+
let diff = newAnchorHeight - scrollAnchorHeight;
|
11087
|
+
if (diff > 1 || diff < -1) {
|
11088
|
+
scrollTop = sDOM.scrollTop = scrollTop + diff;
|
11089
|
+
scrollAnchorHeight = -1;
|
11090
|
+
continue;
|
11091
|
+
}
|
11092
|
+
}
|
11093
|
+
}
|
10864
11094
|
break;
|
11095
|
+
}
|
10865
11096
|
}
|
10866
11097
|
}
|
10867
11098
|
finally {
|
10868
|
-
this.updateState = 0 /*
|
11099
|
+
this.updateState = 0 /* Idle */;
|
10869
11100
|
this.measureScheduled = -1;
|
10870
11101
|
}
|
10871
11102
|
if (updated && !updated.empty)
|
@@ -10924,9 +11155,9 @@
|
|
10924
11155
|
StyleModule.mount(this.root, this.styleModules.concat(baseTheme$1$2).reverse());
|
10925
11156
|
}
|
10926
11157
|
readMeasured() {
|
10927
|
-
if (this.updateState == 2 /*
|
11158
|
+
if (this.updateState == 2 /* Updating */)
|
10928
11159
|
throw new Error("Reading the editor layout isn't allowed during an update");
|
10929
|
-
if (this.updateState == 0 /*
|
11160
|
+
if (this.updateState == 0 /* Idle */ && this.measureScheduled > -1)
|
10930
11161
|
this.measure(false);
|
10931
11162
|
}
|
10932
11163
|
/**
|
@@ -11720,15 +11951,6 @@
|
|
11720
11951
|
to: Math.min(inside.to, view.moveToLineBoundary(range, true, true).from),
|
11721
11952
|
type: BlockType.Text };
|
11722
11953
|
}
|
11723
|
-
function blockAt(view, pos) {
|
11724
|
-
let line = view.lineBlockAt(pos);
|
11725
|
-
if (Array.isArray(line.type))
|
11726
|
-
for (let l of line.type) {
|
11727
|
-
if (l.to > pos || l.to == pos && (l.to == line.to || l.type == BlockType.Text))
|
11728
|
-
return l;
|
11729
|
-
}
|
11730
|
-
return line;
|
11731
|
-
}
|
11732
11954
|
function rectanglesForRange(view, className, range) {
|
11733
11955
|
if (range.to <= view.viewport.from || range.from >= view.viewport.to)
|
11734
11956
|
return [];
|
@@ -11742,12 +11964,10 @@
|
|
11742
11964
|
let startBlock = blockAt(view, from), endBlock = blockAt(view, to);
|
11743
11965
|
let visualStart = startBlock.type == BlockType.Text ? startBlock : null;
|
11744
11966
|
let visualEnd = endBlock.type == BlockType.Text ? endBlock : null;
|
11745
|
-
if (view.lineWrapping)
|
11746
|
-
|
11747
|
-
|
11748
|
-
|
11749
|
-
visualEnd = wrappedLine(view, to, visualEnd);
|
11750
|
-
}
|
11967
|
+
if (visualStart && (view.lineWrapping || startBlock.widgetLineBreaks))
|
11968
|
+
visualStart = wrappedLine(view, from, visualStart);
|
11969
|
+
if (visualEnd && (view.lineWrapping || endBlock.widgetLineBreaks))
|
11970
|
+
visualEnd = wrappedLine(view, to, visualEnd);
|
11751
11971
|
if (visualStart && visualEnd && visualStart.from == visualEnd.from) {
|
11752
11972
|
return pieces(drawForLine(range.from, range.to, visualStart));
|
11753
11973
|
}
|
@@ -11755,14 +11975,15 @@
|
|
11755
11975
|
let top = visualStart ? drawForLine(range.from, null, visualStart) : drawForWidget(startBlock, false);
|
11756
11976
|
let bottom = visualEnd ? drawForLine(null, range.to, visualEnd) : drawForWidget(endBlock, true);
|
11757
11977
|
let between = [];
|
11758
|
-
if ((visualStart || startBlock).to < (visualEnd || endBlock).from - 1)
|
11978
|
+
if ((visualStart || startBlock).to < (visualEnd || endBlock).from - (visualStart && visualEnd ? 1 : 0) ||
|
11979
|
+
startBlock.widgetLineBreaks > 1 && top.bottom + view.defaultLineHeight / 2 < bottom.top)
|
11759
11980
|
between.push(piece(leftSide, top.bottom, rightSide, bottom.top));
|
11760
11981
|
else if (top.bottom < bottom.top && view.elementAtHeight((top.bottom + bottom.top) / 2).type == BlockType.Text)
|
11761
11982
|
top.bottom = bottom.top = (top.bottom + bottom.top) / 2;
|
11762
11983
|
return pieces(top).concat(between).concat(pieces(bottom));
|
11763
11984
|
}
|
11764
11985
|
function piece(left, top, right, bottom) {
|
11765
|
-
return new RectangleMarker(className, left - base.left, top - base.top - 0.01 /*
|
11986
|
+
return new RectangleMarker(className, left - base.left, top - base.top - 0.01 /* Epsilon */, right - left, bottom - top + 0.01 /* Epsilon */);
|
11766
11987
|
}
|
11767
11988
|
function pieces({ top, bottom, horizontal }) {
|
11768
11989
|
let pieces = [];
|
@@ -11780,6 +12001,8 @@
|
|
11780
12001
|
// coordsAtPos queries, would break selection drawing.
|
11781
12002
|
let fromCoords = view.coordsAtPos(from, (from == line.to ? -2 : 2));
|
11782
12003
|
let toCoords = view.coordsAtPos(to, (to == line.from ? 2 : -2));
|
12004
|
+
if (!fromCoords || !toCoords)
|
12005
|
+
return;
|
11783
12006
|
top = Math.min(fromCoords.top, toCoords.top, top);
|
11784
12007
|
bottom = Math.max(fromCoords.bottom, toCoords.bottom, bottom);
|
11785
12008
|
if (dir == Direction.LTR)
|
@@ -12394,6 +12617,17 @@
|
|
12394
12617
|
wrap.setAttribute("aria-hidden", "true");
|
12395
12618
|
return wrap;
|
12396
12619
|
}
|
12620
|
+
coordsAt(dom) {
|
12621
|
+
let rects = dom.firstChild ? clientRectsFor(dom.firstChild) : [];
|
12622
|
+
if (!rects.length)
|
12623
|
+
return null;
|
12624
|
+
let style = window.getComputedStyle(dom.parentNode);
|
12625
|
+
let rect = flattenRect(rects[0], style.direction != "rtl");
|
12626
|
+
let lineHeight = parseInt(style.lineHeight);
|
12627
|
+
if (rect.bottom - rect.top > lineHeight * 1.5)
|
12628
|
+
return { left: rect.left, right: rect.right, top: rect.top, bottom: rect.top + lineHeight };
|
12629
|
+
return rect;
|
12630
|
+
}
|
12397
12631
|
ignoreEvent() { return false; }
|
12398
12632
|
}
|
12399
12633
|
/**
|
@@ -12491,10 +12725,10 @@
|
|
12491
12725
|
return EditorView.mouseSelectionStyle.of((view, event) => filter(event) ? rectangleSelectionStyle(view, event) : null);
|
12492
12726
|
}
|
12493
12727
|
const keys = {
|
12494
|
-
Alt: [18, e => e.altKey],
|
12495
|
-
Control: [17, e => e.ctrlKey],
|
12496
|
-
Shift: [16, e => e.shiftKey],
|
12497
|
-
Meta: [91, e => e.metaKey]
|
12728
|
+
Alt: [18, e => !!e.altKey],
|
12729
|
+
Control: [17, e => !!e.ctrlKey],
|
12730
|
+
Shift: [16, e => !!e.shiftKey],
|
12731
|
+
Meta: [91, e => !!e.metaKey]
|
12498
12732
|
};
|
12499
12733
|
const showCrosshair = { style: "cursor: crosshair" };
|
12500
12734
|
/**
|
@@ -12731,12 +12965,12 @@
|
|
12731
12965
|
continue;
|
12732
12966
|
}
|
12733
12967
|
let arrow = tooltip.arrow ? tView.dom.querySelector(".cm-tooltip-arrow") : null;
|
12734
|
-
let arrowHeight = arrow ? 7 /*
|
12968
|
+
let arrowHeight = arrow ? 7 /* Size */ : 0;
|
12735
12969
|
let width = size.right - size.left, height = (_a = knownHeight.get(tView)) !== null && _a !== void 0 ? _a : size.bottom - size.top;
|
12736
12970
|
let offset = tView.offset || noOffset, ltr = this.view.textDirection == Direction.LTR;
|
12737
12971
|
let left = size.width > space.right - space.left ? (ltr ? space.left : space.right - size.width)
|
12738
|
-
: ltr ? Math.min(pos.left - (arrow ? 14 /*
|
12739
|
-
: Math.max(space.left, pos.left - width + (arrow ? 14 /*
|
12972
|
+
: ltr ? Math.min(pos.left - (arrow ? 14 /* Offset */ : 0) + offset.x, space.right - width)
|
12973
|
+
: Math.max(space.left, pos.left - width + (arrow ? 14 /* Offset */ : 0) - offset.x);
|
12740
12974
|
let above = !!tooltip.above;
|
12741
12975
|
if (!tooltip.strictSide && (above
|
12742
12976
|
? pos.top - (size.bottom - size.top) - offset.y < space.top
|
@@ -12770,7 +13004,7 @@
|
|
12770
13004
|
dom.style.left = left + "px";
|
12771
13005
|
}
|
12772
13006
|
if (arrow)
|
12773
|
-
arrow.style.left = `${pos.left + (ltr ? offset.x : -offset.x) - (left + 14 /*
|
13007
|
+
arrow.style.left = `${pos.left + (ltr ? offset.x : -offset.x) - (left + 14 /* Offset */ - 7 /* Size */)}px`;
|
12774
13008
|
if (tView.overlap !== true)
|
12775
13009
|
others.push({ left, top, right, bottom: top + height });
|
12776
13010
|
dom.classList.toggle("cm-tooltip-above", above);
|
@@ -12813,8 +13047,8 @@
|
|
12813
13047
|
color: "white"
|
12814
13048
|
},
|
12815
13049
|
".cm-tooltip-arrow": {
|
12816
|
-
height: `${7 /*
|
12817
|
-
width: `${7 /*
|
13050
|
+
height: `${7 /* Size */}px`,
|
13051
|
+
width: `${7 /* Size */ * 2}px`,
|
12818
13052
|
position: "absolute",
|
12819
13053
|
zIndex: -1,
|
12820
13054
|
overflow: "hidden",
|
@@ -12823,26 +13057,26 @@
|
|
12823
13057
|
position: "absolute",
|
12824
13058
|
width: 0,
|
12825
13059
|
height: 0,
|
12826
|
-
borderLeft: `${7 /*
|
12827
|
-
borderRight: `${7 /*
|
13060
|
+
borderLeft: `${7 /* Size */}px solid transparent`,
|
13061
|
+
borderRight: `${7 /* Size */}px solid transparent`,
|
12828
13062
|
},
|
12829
13063
|
".cm-tooltip-above &": {
|
12830
|
-
bottom: `-${7 /*
|
13064
|
+
bottom: `-${7 /* Size */}px`,
|
12831
13065
|
"&:before": {
|
12832
|
-
borderTop: `${7 /*
|
13066
|
+
borderTop: `${7 /* Size */}px solid #bbb`,
|
12833
13067
|
},
|
12834
13068
|
"&:after": {
|
12835
|
-
borderTop: `${7 /*
|
13069
|
+
borderTop: `${7 /* Size */}px solid #f5f5f5`,
|
12836
13070
|
bottom: "1px"
|
12837
13071
|
}
|
12838
13072
|
},
|
12839
13073
|
".cm-tooltip-below &": {
|
12840
|
-
top: `-${7 /*
|
13074
|
+
top: `-${7 /* Size */}px`,
|
12841
13075
|
"&:before": {
|
12842
|
-
borderBottom: `${7 /*
|
13076
|
+
borderBottom: `${7 /* Size */}px solid #bbb`,
|
12843
13077
|
},
|
12844
13078
|
"&:after": {
|
12845
|
-
borderBottom: `${7 /*
|
13079
|
+
borderBottom: `${7 /* Size */}px solid #f5f5f5`,
|
12846
13080
|
top: "1px"
|
12847
13081
|
}
|
12848
13082
|
},
|
@@ -13086,6 +13320,7 @@
|
|
13086
13320
|
elementStyle: "",
|
13087
13321
|
markers: () => RangeSet.empty,
|
13088
13322
|
lineMarker: () => null,
|
13323
|
+
widgetMarker: () => null,
|
13089
13324
|
lineMarkerChange: null,
|
13090
13325
|
initialSpacer: null,
|
13091
13326
|
updateSpacer: null,
|
@@ -13166,24 +13401,28 @@
|
|
13166
13401
|
let classSet = [];
|
13167
13402
|
let contexts = this.gutters.map(gutter => new UpdateContext(gutter, this.view.viewport, -this.view.documentPadding.top));
|
13168
13403
|
for (let line of this.view.viewportLineBlocks) {
|
13169
|
-
|
13404
|
+
if (classSet.length)
|
13405
|
+
classSet = [];
|
13170
13406
|
if (Array.isArray(line.type)) {
|
13171
|
-
|
13172
|
-
|
13173
|
-
|
13174
|
-
|
13407
|
+
let first = true;
|
13408
|
+
for (let b of line.type) {
|
13409
|
+
if (b.type == BlockType.Text && first) {
|
13410
|
+
advanceCursor(lineClasses, classSet, b.from);
|
13411
|
+
for (let cx of contexts)
|
13412
|
+
cx.line(this.view, b, classSet);
|
13413
|
+
first = false;
|
13175
13414
|
}
|
13415
|
+
else if (b.widget) {
|
13416
|
+
for (let cx of contexts)
|
13417
|
+
cx.widget(this.view, b);
|
13418
|
+
}
|
13419
|
+
}
|
13176
13420
|
}
|
13177
|
-
else {
|
13178
|
-
|
13421
|
+
else if (line.type == BlockType.Text) {
|
13422
|
+
advanceCursor(lineClasses, classSet, line.from);
|
13423
|
+
for (let cx of contexts)
|
13424
|
+
cx.line(this.view, line, classSet);
|
13179
13425
|
}
|
13180
|
-
if (!text)
|
13181
|
-
continue;
|
13182
|
-
if (classSet.length)
|
13183
|
-
classSet = [];
|
13184
|
-
advanceCursor(lineClasses, classSet, line.from);
|
13185
|
-
for (let cx of contexts)
|
13186
|
-
cx.line(this.view, text, classSet);
|
13187
13426
|
}
|
13188
13427
|
for (let cx of contexts)
|
13189
13428
|
cx.finish();
|
@@ -13251,6 +13490,19 @@
|
|
13251
13490
|
this.i = 0;
|
13252
13491
|
this.cursor = RangeSet.iter(gutter.markers, viewport.from);
|
13253
13492
|
}
|
13493
|
+
addElement(view, block, markers) {
|
13494
|
+
let { gutter } = this, above = block.top - this.height;
|
13495
|
+
if (this.i == gutter.elements.length) {
|
13496
|
+
let newElt = new GutterElement(view, block.height, above, markers);
|
13497
|
+
gutter.elements.push(newElt);
|
13498
|
+
gutter.dom.appendChild(newElt.dom);
|
13499
|
+
}
|
13500
|
+
else {
|
13501
|
+
gutter.elements[this.i].update(view, block.height, above, markers);
|
13502
|
+
}
|
13503
|
+
this.height = block.bottom;
|
13504
|
+
this.i++;
|
13505
|
+
}
|
13254
13506
|
line(view, line, extraMarkers) {
|
13255
13507
|
let localMarkers = [];
|
13256
13508
|
advanceCursor(this.cursor, localMarkers, line.from);
|
@@ -13262,17 +13514,12 @@
|
|
13262
13514
|
let gutter = this.gutter;
|
13263
13515
|
if (localMarkers.length == 0 && !gutter.config.renderEmptyElements)
|
13264
13516
|
return;
|
13265
|
-
|
13266
|
-
|
13267
|
-
|
13268
|
-
|
13269
|
-
|
13270
|
-
|
13271
|
-
else {
|
13272
|
-
gutter.elements[this.i].update(view, line.height, above, localMarkers);
|
13273
|
-
}
|
13274
|
-
this.height = line.bottom;
|
13275
|
-
this.i++;
|
13517
|
+
this.addElement(view, line, localMarkers);
|
13518
|
+
}
|
13519
|
+
widget(view, block) {
|
13520
|
+
let marker = this.gutter.config.widgetMarker(view, block.widget, block);
|
13521
|
+
if (marker)
|
13522
|
+
this.addElement(view, block, [marker]);
|
13276
13523
|
}
|
13277
13524
|
finish() {
|
13278
13525
|
let gutter = this.gutter;
|
@@ -13440,6 +13687,7 @@
|
|
13440
13687
|
return null;
|
13441
13688
|
return new NumberMarker(formatNumber(view, view.state.doc.lineAt(line.from).number));
|
13442
13689
|
},
|
13690
|
+
widgetMarker: () => null,
|
13443
13691
|
lineMarkerChange: update => update.startState.facet(lineNumberConfig) != update.state.facet(lineNumberConfig),
|
13444
13692
|
initialSpacer(view) {
|
13445
13693
|
return new NumberMarker(formatNumber(view, maxLineNumber(view.state.doc.lines)));
|
@@ -13815,15 +14063,16 @@
|
|
13815
14063
|
/// not have its children iterated over (or `leave` called).
|
13816
14064
|
iterate(spec) {
|
13817
14065
|
let { enter, leave, from = 0, to = this.length } = spec;
|
13818
|
-
|
14066
|
+
let mode = spec.mode || 0, anon = (mode & IterMode.IncludeAnonymous) > 0;
|
14067
|
+
for (let c = this.cursor(mode | IterMode.IncludeAnonymous);;) {
|
13819
14068
|
let entered = false;
|
13820
|
-
if (c.from <= to && c.to >= from && (c.type.isAnonymous || enter(c) !== false)) {
|
14069
|
+
if (c.from <= to && c.to >= from && (!anon && c.type.isAnonymous || enter(c) !== false)) {
|
13821
14070
|
if (c.firstChild())
|
13822
14071
|
continue;
|
13823
14072
|
entered = true;
|
13824
14073
|
}
|
13825
14074
|
for (;;) {
|
13826
|
-
if (entered && leave && !c.type.isAnonymous)
|
14075
|
+
if (entered && leave && (anon || !c.type.isAnonymous))
|
13827
14076
|
leave(c);
|
13828
14077
|
if (c.nextSibling())
|
13829
14078
|
break;
|
@@ -15184,7 +15433,7 @@
|
|
15184
15433
|
if (rule.mode == 1 /* Inherit */)
|
15185
15434
|
inheritedClass += (inheritedClass ? " " : "") + tagCls;
|
15186
15435
|
}
|
15187
|
-
this.startSpan(
|
15436
|
+
this.startSpan(Math.max(from, start), cls);
|
15188
15437
|
if (rule.opaque)
|
15189
15438
|
return;
|
15190
15439
|
let mounted = cursor.tree && cursor.tree.prop(NodeProp.mounted);
|
@@ -15208,14 +15457,16 @@
|
|
15208
15457
|
break;
|
15209
15458
|
pos = next.to + start;
|
15210
15459
|
if (pos > from) {
|
15211
|
-
this.highlightRange(inner.cursor(), Math.max(from, next.from + start), Math.min(to, pos),
|
15212
|
-
this.startSpan(pos, cls);
|
15460
|
+
this.highlightRange(inner.cursor(), Math.max(from, next.from + start), Math.min(to, pos), "", innerHighlighters);
|
15461
|
+
this.startSpan(Math.min(to, pos), cls);
|
15213
15462
|
}
|
15214
15463
|
}
|
15215
15464
|
if (hasChild)
|
15216
15465
|
cursor.parent();
|
15217
15466
|
}
|
15218
15467
|
else if (cursor.firstChild()) {
|
15468
|
+
if (mounted)
|
15469
|
+
inheritedClass = "";
|
15219
15470
|
do {
|
15220
15471
|
if (cursor.to <= from)
|
15221
15472
|
continue;
|
@@ -15728,7 +15979,7 @@
|
|
15728
15979
|
});
|
15729
15980
|
}
|
15730
15981
|
/**
|
15731
|
-
Syntax node prop used to register
|
15982
|
+
Syntax node prop used to register sublanguages. Should be added to
|
15732
15983
|
the top level node type for the language.
|
15733
15984
|
*/
|
15734
15985
|
const sublanguageProp = /*@__PURE__*/new NodeProp();
|
@@ -15892,8 +16143,15 @@
|
|
15892
16143
|
let field = state.field(Language.state, false);
|
15893
16144
|
return field ? field.tree : Tree.empty;
|
15894
16145
|
}
|
15895
|
-
|
16146
|
+
/**
|
16147
|
+
Lezer-style
|
16148
|
+
[`Input`](https://lezer.codemirror.net/docs/ref#common.Input)
|
16149
|
+
object for a [`Text`](https://codemirror.net/6/docs/ref/#state.Text) object.
|
16150
|
+
*/
|
15896
16151
|
class DocInput {
|
16152
|
+
/**
|
16153
|
+
Create an input object for the given document.
|
16154
|
+
*/
|
15897
16155
|
constructor(doc) {
|
15898
16156
|
this.doc = doc;
|
15899
16157
|
this.cursorPos = 0;
|
@@ -16179,14 +16437,14 @@
|
|
16179
16437
|
// state updates with parse work beyond the viewport.
|
16180
16438
|
let upto = this.context.treeLen == tr.startState.doc.length ? undefined
|
16181
16439
|
: Math.max(tr.changes.mapPos(this.context.treeLen), newCx.viewport.to);
|
16182
|
-
if (!newCx.work(20 /*
|
16440
|
+
if (!newCx.work(20 /* Apply */, upto))
|
16183
16441
|
newCx.takeTree();
|
16184
16442
|
return new LanguageState(newCx);
|
16185
16443
|
}
|
16186
16444
|
static init(state) {
|
16187
|
-
let vpTo = Math.min(3000 /*
|
16445
|
+
let vpTo = Math.min(3000 /* InitViewport */, state.doc.length);
|
16188
16446
|
let parseState = ParseContext.create(state.facet(language).parser, state, { from: 0, to: vpTo });
|
16189
|
-
if (!parseState.work(20 /*
|
16447
|
+
if (!parseState.work(20 /* Apply */, vpTo))
|
16190
16448
|
parseState.takeTree();
|
16191
16449
|
return new LanguageState(parseState);
|
16192
16450
|
}
|
@@ -16203,14 +16461,14 @@
|
|
16203
16461
|
}
|
16204
16462
|
});
|
16205
16463
|
let requestIdle = (callback) => {
|
16206
|
-
let timeout = setTimeout(() => callback(), 500 /*
|
16464
|
+
let timeout = setTimeout(() => callback(), 500 /* MaxPause */);
|
16207
16465
|
return () => clearTimeout(timeout);
|
16208
16466
|
};
|
16209
16467
|
if (typeof requestIdleCallback != "undefined")
|
16210
16468
|
requestIdle = (callback) => {
|
16211
16469
|
let idle = -1, timeout = setTimeout(() => {
|
16212
|
-
idle = requestIdleCallback(callback, { timeout: 500 /*
|
16213
|
-
}, 100 /*
|
16470
|
+
idle = requestIdleCallback(callback, { timeout: 500 /* MaxPause */ - 100 /* MinPause */ });
|
16471
|
+
}, 100 /* MinPause */);
|
16214
16472
|
return () => idle < 0 ? clearTimeout(timeout) : cancelIdleCallback(idle);
|
16215
16473
|
};
|
16216
16474
|
const isInputPending = typeof navigator != "undefined" && ((_a = navigator.scheduling) === null || _a === void 0 ? void 0 : _a.isInputPending)
|
@@ -16233,7 +16491,7 @@
|
|
16233
16491
|
this.scheduleWork();
|
16234
16492
|
if (update.docChanged) {
|
16235
16493
|
if (this.view.hasFocus)
|
16236
|
-
this.chunkBudget += 50 /*
|
16494
|
+
this.chunkBudget += 50 /* ChangeBonus */;
|
16237
16495
|
this.scheduleWork();
|
16238
16496
|
}
|
16239
16497
|
this.checkAsyncSchedule(cx);
|
@@ -16249,19 +16507,19 @@
|
|
16249
16507
|
this.working = null;
|
16250
16508
|
let now = Date.now();
|
16251
16509
|
if (this.chunkEnd < now && (this.chunkEnd < 0 || this.view.hasFocus)) { // Start a new chunk
|
16252
|
-
this.chunkEnd = now + 30000 /*
|
16253
|
-
this.chunkBudget = 3000 /*
|
16510
|
+
this.chunkEnd = now + 30000 /* ChunkTime */;
|
16511
|
+
this.chunkBudget = 3000 /* ChunkBudget */;
|
16254
16512
|
}
|
16255
16513
|
if (this.chunkBudget <= 0)
|
16256
16514
|
return; // No more budget
|
16257
16515
|
let { state, viewport: { to: vpTo } } = this.view, field = state.field(Language.state);
|
16258
|
-
if (field.tree == field.context.tree && field.context.isDone(vpTo + 100000 /*
|
16516
|
+
if (field.tree == field.context.tree && field.context.isDone(vpTo + 100000 /* MaxParseAhead */))
|
16259
16517
|
return;
|
16260
|
-
let endTime = Date.now() + Math.min(this.chunkBudget, 100 /*
|
16518
|
+
let endTime = Date.now() + Math.min(this.chunkBudget, 100 /* Slice */, deadline && !isInputPending ? Math.max(25 /* MinSlice */, deadline.timeRemaining() - 5) : 1e9);
|
16261
16519
|
let viewportFirst = field.context.treeLen < vpTo && state.doc.length > vpTo + 1000;
|
16262
16520
|
let done = field.context.work(() => {
|
16263
16521
|
return isInputPending && isInputPending() || Date.now() > endTime;
|
16264
|
-
}, vpTo + (viewportFirst ? 0 : 100000 /*
|
16522
|
+
}, vpTo + (viewportFirst ? 0 : 100000 /* MaxParseAhead */));
|
16265
16523
|
this.chunkBudget -= Date.now() - now;
|
16266
16524
|
if (done || this.chunkBudget <= 0) {
|
16267
16525
|
field.context.takeTree();
|
@@ -16581,13 +16839,20 @@
|
|
16581
16839
|
on if it is covered by another such node.
|
16582
16840
|
*/
|
16583
16841
|
get baseIndent() {
|
16584
|
-
|
16842
|
+
return this.baseIndentFor(this.node);
|
16843
|
+
}
|
16844
|
+
/**
|
16845
|
+
Get the indentation for the reference line of the given node
|
16846
|
+
(see [`baseIndent`](https://codemirror.net/6/docs/ref/#language.TreeIndentContext.baseIndent)).
|
16847
|
+
*/
|
16848
|
+
baseIndentFor(node) {
|
16849
|
+
let line = this.state.doc.lineAt(node.from);
|
16585
16850
|
// Skip line starts that are covered by a sibling (or cousin, etc)
|
16586
16851
|
for (;;) {
|
16587
|
-
let atBreak =
|
16852
|
+
let atBreak = node.resolve(line.from);
|
16588
16853
|
while (atBreak.parent && atBreak.parent.from == atBreak.from)
|
16589
16854
|
atBreak = atBreak.parent;
|
16590
|
-
if (isParent(atBreak,
|
16855
|
+
if (isParent(atBreak, node))
|
16591
16856
|
break;
|
16592
16857
|
line = this.state.doc.lineAt(atBreak.from);
|
16593
16858
|
}
|
@@ -17521,7 +17786,7 @@
|
|
17521
17786
|
if (last >= 0 && ranges[last].to > fromLine.from)
|
17522
17787
|
ranges[last].to = toLine.to;
|
17523
17788
|
else
|
17524
|
-
ranges.push({ from: fromLine.from, to: toLine.to });
|
17789
|
+
ranges.push({ from: fromLine.from + /^\s*/.exec(fromLine.text)[0].length, to: toLine.to });
|
17525
17790
|
}
|
17526
17791
|
return ranges;
|
17527
17792
|
}
|
@@ -18799,7 +19064,7 @@
|
|
18799
19064
|
- Shift-Alt-ArrowUp: [`copyLineUp`](https://codemirror.net/6/docs/ref/#commands.copyLineUp)
|
18800
19065
|
- Shift-Alt-ArrowDown: [`copyLineDown`](https://codemirror.net/6/docs/ref/#commands.copyLineDown)
|
18801
19066
|
- Escape: [`simplifySelection`](https://codemirror.net/6/docs/ref/#commands.simplifySelection)
|
18802
|
-
- Ctrl-Enter (
|
19067
|
+
- Ctrl-Enter (Cmd-Enter on macOS): [`insertBlankLine`](https://codemirror.net/6/docs/ref/#commands.insertBlankLine)
|
18803
19068
|
- Alt-l (Ctrl-l on macOS): [`selectLine`](https://codemirror.net/6/docs/ref/#commands.selectLine)
|
18804
19069
|
- Ctrl-i (Cmd-i on macOS): [`selectParentSyntax`](https://codemirror.net/6/docs/ref/#commands.selectParentSyntax)
|
18805
19070
|
- Ctrl-[ (Cmd-[ on macOS): [`indentLess`](https://codemirror.net/6/docs/ref/#commands.indentLess)
|
@@ -19104,7 +19369,7 @@
|
|
19104
19369
|
this.matchPos = toCharEnd(text, from);
|
19105
19370
|
this.re = new RegExp(query, baseFlags + ((options === null || options === void 0 ? void 0 : options.ignoreCase) ? "i" : ""));
|
19106
19371
|
this.test = options === null || options === void 0 ? void 0 : options.test;
|
19107
|
-
this.flat = FlattenedDoc.get(text, from, this.chunkEnd(from + 5000 /*
|
19372
|
+
this.flat = FlattenedDoc.get(text, from, this.chunkEnd(from + 5000 /* Base */));
|
19108
19373
|
}
|
19109
19374
|
chunkEnd(pos) {
|
19110
19375
|
return pos >= this.to ? this.to : this.text.lineAt(pos).to;
|
@@ -19411,6 +19676,7 @@
|
|
19411
19676
|
top: false,
|
19412
19677
|
caseSensitive: false,
|
19413
19678
|
literal: false,
|
19679
|
+
regexp: false,
|
19414
19680
|
wholeWord: false,
|
19415
19681
|
createPanel: view => new SearchPanel(view),
|
19416
19682
|
scrollToMatch: range => EditorView.scrollIntoView(range)
|
@@ -19496,11 +19762,11 @@
|
|
19496
19762
|
cursor = stringCursor(this.spec, state, 0, curFrom).nextOverlapping();
|
19497
19763
|
return cursor.done ? null : cursor.value;
|
19498
19764
|
}
|
19499
|
-
// Searching in reverse is, rather than implementing inverted search
|
19765
|
+
// Searching in reverse is, rather than implementing an inverted search
|
19500
19766
|
// cursor, done by scanning chunk after chunk forward.
|
19501
19767
|
prevMatchInRange(state, from, to) {
|
19502
19768
|
for (let pos = to;;) {
|
19503
|
-
let start = Math.max(from, pos - 10000 /*
|
19769
|
+
let start = Math.max(from, pos - 10000 /* ChunkSize */ - this.spec.unquoted.length);
|
19504
19770
|
let cursor = stringCursor(this.spec, state, start, pos), range = null;
|
19505
19771
|
while (!cursor.nextOverlapping().done)
|
19506
19772
|
range = cursor.value;
|
@@ -19508,7 +19774,7 @@
|
|
19508
19774
|
return range;
|
19509
19775
|
if (start == from)
|
19510
19776
|
return null;
|
19511
|
-
pos -= 10000 /*
|
19777
|
+
pos -= 10000 /* ChunkSize */;
|
19512
19778
|
}
|
19513
19779
|
}
|
19514
19780
|
prevMatch(state, curFrom, curTo) {
|
@@ -19559,7 +19825,7 @@
|
|
19559
19825
|
}
|
19560
19826
|
prevMatchInRange(state, from, to) {
|
19561
19827
|
for (let size = 1;; size++) {
|
19562
|
-
let start = Math.max(from, to - size * 10000 /*
|
19828
|
+
let start = Math.max(from, to - size * 10000 /* ChunkSize */);
|
19563
19829
|
let cursor = regexpCursor(this.spec, state, start, to), range = null;
|
19564
19830
|
while (!cursor.next().done)
|
19565
19831
|
range = cursor.value;
|
@@ -19589,7 +19855,7 @@
|
|
19589
19855
|
return ranges;
|
19590
19856
|
}
|
19591
19857
|
highlight(state, from, to, add) {
|
19592
|
-
let cursor = regexpCursor(this.spec, state, Math.max(0, from - 250 /*
|
19858
|
+
let cursor = regexpCursor(this.spec, state, Math.max(0, from - 250 /* HighlightMargin */), Math.min(to + 250 /* HighlightMargin */, state.doc.length));
|
19593
19859
|
while (!cursor.next().done)
|
19594
19860
|
add(cursor.value.from, cursor.value.to);
|
19595
19861
|
}
|
@@ -19642,7 +19908,7 @@
|
|
19642
19908
|
let builder = new RangeSetBuilder();
|
19643
19909
|
for (let i = 0, ranges = view.visibleRanges, l = ranges.length; i < l; i++) {
|
19644
19910
|
let { from, to } = ranges[i];
|
19645
|
-
while (i < l - 1 && to > ranges[i + 1].from - 2 * 250 /*
|
19911
|
+
while (i < l - 1 && to > ranges[i + 1].from - 2 * 250 /* HighlightMargin */)
|
19646
19912
|
to = ranges[++i].to;
|
19647
19913
|
query.highlight(view.state, from, to, (from, to) => {
|
19648
19914
|
let selected = view.state.selection.ranges.some(r => r.from == from && r.to == to);
|
@@ -19675,9 +19941,10 @@
|
|
19675
19941
|
let config = view.state.facet(searchConfigFacet);
|
19676
19942
|
view.dispatch({
|
19677
19943
|
selection,
|
19678
|
-
effects: [announceMatch(view, next), config.scrollToMatch(selection.main)],
|
19944
|
+
effects: [announceMatch(view, next), config.scrollToMatch(selection.main, view)],
|
19679
19945
|
userEvent: "select.search"
|
19680
19946
|
});
|
19947
|
+
selectSearchInput(view);
|
19681
19948
|
return true;
|
19682
19949
|
});
|
19683
19950
|
/**
|
@@ -19694,9 +19961,10 @@
|
|
19694
19961
|
let config = view.state.facet(searchConfigFacet);
|
19695
19962
|
view.dispatch({
|
19696
19963
|
selection,
|
19697
|
-
effects: [announceMatch(view, prev), config.scrollToMatch(selection.main)],
|
19964
|
+
effects: [announceMatch(view, prev), config.scrollToMatch(selection.main, view)],
|
19698
19965
|
userEvent: "select.search"
|
19699
19966
|
});
|
19967
|
+
selectSearchInput(view);
|
19700
19968
|
return true;
|
19701
19969
|
});
|
19702
19970
|
/**
|
@@ -19756,7 +20024,7 @@
|
|
19756
20024
|
let off = changes.length == 0 || changes[0].from >= next.to ? 0 : next.to - next.from - replacement.length;
|
19757
20025
|
selection = EditorSelection.single(next.from - off, next.to - off);
|
19758
20026
|
effects.push(announceMatch(view, next));
|
19759
|
-
effects.push(state.facet(searchConfigFacet).scrollToMatch(selection.main));
|
20027
|
+
effects.push(state.facet(searchConfigFacet).scrollToMatch(selection.main, view));
|
19760
20028
|
}
|
19761
20029
|
view.dispatch({
|
19762
20030
|
changes, selection, effects,
|
@@ -19789,7 +20057,7 @@
|
|
19789
20057
|
return view.state.facet(searchConfigFacet).createPanel(view);
|
19790
20058
|
}
|
19791
20059
|
function defaultQuery(state, fallback) {
|
19792
|
-
var _a, _b, _c, _d;
|
20060
|
+
var _a, _b, _c, _d, _e;
|
19793
20061
|
let sel = state.selection.main;
|
19794
20062
|
let selText = sel.empty || sel.to > sel.from + 100 ? "" : state.sliceDoc(sel.from, sel.to);
|
19795
20063
|
if (fallback && !selText)
|
@@ -19799,19 +20067,26 @@
|
|
19799
20067
|
search: ((_a = fallback === null || fallback === void 0 ? void 0 : fallback.literal) !== null && _a !== void 0 ? _a : config.literal) ? selText : selText.replace(/\n/g, "\\n"),
|
19800
20068
|
caseSensitive: (_b = fallback === null || fallback === void 0 ? void 0 : fallback.caseSensitive) !== null && _b !== void 0 ? _b : config.caseSensitive,
|
19801
20069
|
literal: (_c = fallback === null || fallback === void 0 ? void 0 : fallback.literal) !== null && _c !== void 0 ? _c : config.literal,
|
19802
|
-
|
20070
|
+
regexp: (_d = fallback === null || fallback === void 0 ? void 0 : fallback.regexp) !== null && _d !== void 0 ? _d : config.regexp,
|
20071
|
+
wholeWord: (_e = fallback === null || fallback === void 0 ? void 0 : fallback.wholeWord) !== null && _e !== void 0 ? _e : config.wholeWord
|
19803
20072
|
});
|
19804
20073
|
}
|
20074
|
+
function getSearchInput(view) {
|
20075
|
+
let panel = getPanel(view, createSearchPanel);
|
20076
|
+
return panel && panel.dom.querySelector("[main-field]");
|
20077
|
+
}
|
20078
|
+
function selectSearchInput(view) {
|
20079
|
+
let input = getSearchInput(view);
|
20080
|
+
if (input && input == view.root.activeElement)
|
20081
|
+
input.select();
|
20082
|
+
}
|
19805
20083
|
/**
|
19806
20084
|
Make sure the search panel is open and focused.
|
19807
20085
|
*/
|
19808
20086
|
const openSearchPanel = view => {
|
19809
20087
|
let state = view.state.field(searchState, false);
|
19810
20088
|
if (state && state.panel) {
|
19811
|
-
let
|
19812
|
-
if (!panel)
|
19813
|
-
return false;
|
19814
|
-
let searchInput = panel.dom.querySelector("[main-field]");
|
20089
|
+
let searchInput = getSearchInput(view);
|
19815
20090
|
if (searchInput && searchInput != view.root.activeElement) {
|
19816
20091
|
let query = defaultQuery(view.state, state.query.spec);
|
19817
20092
|
if (query.valid)
|
@@ -20153,13 +20428,14 @@
|
|
20153
20428
|
};
|
20154
20429
|
}
|
20155
20430
|
class Option {
|
20156
|
-
constructor(completion, source, match) {
|
20431
|
+
constructor(completion, source, match, score) {
|
20157
20432
|
this.completion = completion;
|
20158
20433
|
this.source = source;
|
20159
20434
|
this.match = match;
|
20435
|
+
this.score = score;
|
20160
20436
|
}
|
20161
20437
|
}
|
20162
|
-
function cur(state) { return state.selection.main.
|
20438
|
+
function cur(state) { return state.selection.main.from; }
|
20163
20439
|
// Make sure the given regexp has a $ at its end and, if `start` is
|
20164
20440
|
// true, a ^ at its start.
|
20165
20441
|
function ensureAnchor(expr, start) {
|
@@ -20181,30 +20457,17 @@
|
|
20181
20457
|
selection range that has the same text in front of it.
|
20182
20458
|
*/
|
20183
20459
|
function insertCompletionText(state, text, from, to) {
|
20460
|
+
let { main } = state.selection, fromOff = from - main.from, toOff = to - main.from;
|
20184
20461
|
return Object.assign(Object.assign({}, state.changeByRange(range => {
|
20185
|
-
if (range
|
20186
|
-
|
20187
|
-
changes: { from: from, to: to, insert: text },
|
20188
|
-
range: EditorSelection.cursor(from + text.length)
|
20189
|
-
};
|
20190
|
-
let len = to - from;
|
20191
|
-
if (!range.empty ||
|
20192
|
-
len && state.sliceDoc(range.from - len, range.from) != state.sliceDoc(from, to))
|
20462
|
+
if (range != main && from != to &&
|
20463
|
+
state.sliceDoc(range.from + fromOff, range.from + toOff) != state.sliceDoc(from, to))
|
20193
20464
|
return { range };
|
20194
20465
|
return {
|
20195
|
-
changes: { from: range.from
|
20196
|
-
range: EditorSelection.cursor(range.from
|
20466
|
+
changes: { from: range.from + fromOff, to: to == main.from ? range.to : range.from + toOff, insert: text },
|
20467
|
+
range: EditorSelection.cursor(range.from + fromOff + text.length)
|
20197
20468
|
};
|
20198
20469
|
})), { userEvent: "input.complete" });
|
20199
20470
|
}
|
20200
|
-
function applyCompletion(view, option) {
|
20201
|
-
const apply = option.completion.apply || option.completion.label;
|
20202
|
-
let result = option.source;
|
20203
|
-
if (typeof apply == "string")
|
20204
|
-
view.dispatch(Object.assign(Object.assign({}, insertCompletionText(view.state, apply, result.from, result.to)), { annotations: pickedCompletion.of(option.completion) }));
|
20205
|
-
else
|
20206
|
-
apply(view, option.completion, result.from, result.to);
|
20207
|
-
}
|
20208
20471
|
const SourceCache = /*@__PURE__*/new WeakMap();
|
20209
20472
|
function asSource(source) {
|
20210
20473
|
if (!Array.isArray(source))
|
@@ -20214,6 +20477,8 @@
|
|
20214
20477
|
SourceCache.set(source, known = completeFromList(source));
|
20215
20478
|
return known;
|
20216
20479
|
}
|
20480
|
+
const startCompletionEffect = /*@__PURE__*/StateEffect.define();
|
20481
|
+
const closeCompletionEffect = /*@__PURE__*/StateEffect.define();
|
20217
20482
|
|
20218
20483
|
// A pattern matcher for fuzzy completion matching. Create an instance
|
20219
20484
|
// once for a pattern, and then use that to match any number of
|
@@ -20246,7 +20511,7 @@
|
|
20246
20511
|
// is. See `Penalty` above.
|
20247
20512
|
match(word) {
|
20248
20513
|
if (this.pattern.length == 0)
|
20249
|
-
return [
|
20514
|
+
return [-100 /* NotFull */];
|
20250
20515
|
if (word.length < this.pattern.length)
|
20251
20516
|
return null;
|
20252
20517
|
let { chars, folded, any, precise, byWord } = this;
|
@@ -20254,17 +20519,17 @@
|
|
20254
20519
|
// at the start
|
20255
20520
|
if (chars.length == 1) {
|
20256
20521
|
let first = codePointAt(word, 0), firstSize = codePointSize(first);
|
20257
|
-
let score = firstSize == word.length ? 0 : -100 /*
|
20522
|
+
let score = firstSize == word.length ? 0 : -100 /* NotFull */;
|
20258
20523
|
if (first == chars[0]) ;
|
20259
20524
|
else if (first == folded[0])
|
20260
|
-
score += -200 /*
|
20525
|
+
score += -200 /* CaseFold */;
|
20261
20526
|
else
|
20262
20527
|
return null;
|
20263
20528
|
return [score, 0, firstSize];
|
20264
20529
|
}
|
20265
20530
|
let direct = word.indexOf(this.pattern);
|
20266
20531
|
if (direct == 0)
|
20267
|
-
return [word.length == this.pattern.length ? 0 : -100 /*
|
20532
|
+
return [word.length == this.pattern.length ? 0 : -100 /* NotFull */, 0, this.pattern.length];
|
20268
20533
|
let len = chars.length, anyTo = 0;
|
20269
20534
|
if (direct < 0) {
|
20270
20535
|
for (let i = 0, e = Math.min(word.length, 200); i < e && anyTo < len;) {
|
@@ -20288,7 +20553,7 @@
|
|
20288
20553
|
let adjacentTo = 0, adjacentStart = -1, adjacentEnd = -1;
|
20289
20554
|
let hasLower = /[a-z]/.test(word), wordAdjacent = true;
|
20290
20555
|
// Go over the option's text, scanning for the various kinds of matches
|
20291
|
-
for (let i = 0, e = Math.min(word.length, 200), prevType = 0 /*
|
20556
|
+
for (let i = 0, e = Math.min(word.length, 200), prevType = 0 /* NonWord */; i < e && byWordTo < len;) {
|
20292
20557
|
let next = codePointAt(word, i);
|
20293
20558
|
if (direct < 0) {
|
20294
20559
|
if (preciseTo < len && next == chars[preciseTo])
|
@@ -20306,9 +20571,9 @@
|
|
20306
20571
|
}
|
20307
20572
|
}
|
20308
20573
|
let ch, type = next < 0xff
|
20309
|
-
? (next >= 48 && next <= 57 || next >= 97 && next <= 122 ? 2 /*
|
20310
|
-
: ((ch = fromCodePoint(next)) != ch.toLowerCase() ? 1 /*
|
20311
|
-
if (!i || type == 1 /*
|
20574
|
+
? (next >= 48 && next <= 57 || next >= 97 && next <= 122 ? 2 /* Lower */ : next >= 65 && next <= 90 ? 1 /* Upper */ : 0 /* NonWord */)
|
20575
|
+
: ((ch = fromCodePoint(next)) != ch.toLowerCase() ? 1 /* Upper */ : ch != ch.toUpperCase() ? 2 /* Lower */ : 0 /* NonWord */);
|
20576
|
+
if (!i || type == 1 /* Upper */ && hasLower || prevType == 0 /* NonWord */ && type != 0 /* NonWord */) {
|
20312
20577
|
if (chars[byWordTo] == next || (folded[byWordTo] == next && (byWordFolded = true)))
|
20313
20578
|
byWord[byWordTo++] = i;
|
20314
20579
|
else if (byWord.length)
|
@@ -20318,17 +20583,17 @@
|
|
20318
20583
|
i += codePointSize(next);
|
20319
20584
|
}
|
20320
20585
|
if (byWordTo == len && byWord[0] == 0 && wordAdjacent)
|
20321
|
-
return this.result(-100 /*
|
20586
|
+
return this.result(-100 /* ByWord */ + (byWordFolded ? -200 /* CaseFold */ : 0), byWord, word);
|
20322
20587
|
if (adjacentTo == len && adjacentStart == 0)
|
20323
|
-
return [-200 /*
|
20588
|
+
return [-200 /* CaseFold */ - word.length + (adjacentEnd == word.length ? 0 : -100 /* NotFull */), 0, adjacentEnd];
|
20324
20589
|
if (direct > -1)
|
20325
|
-
return [-700 /*
|
20590
|
+
return [-700 /* NotStart */ - word.length, direct, direct + this.pattern.length];
|
20326
20591
|
if (adjacentTo == len)
|
20327
|
-
return [-200 /*
|
20592
|
+
return [-200 /* CaseFold */ + -700 /* NotStart */ - word.length, adjacentStart, adjacentEnd];
|
20328
20593
|
if (byWordTo == len)
|
20329
|
-
return this.result(-100 /*
|
20330
|
-
(wordAdjacent ? 0 : -1100 /*
|
20331
|
-
return chars.length == 2 ? null : this.result((any[0] ? -700 /*
|
20594
|
+
return this.result(-100 /* ByWord */ + (byWordFolded ? -200 /* CaseFold */ : 0) + -700 /* NotStart */ +
|
20595
|
+
(wordAdjacent ? 0 : -1100 /* Gap */), byWord, word);
|
20596
|
+
return chars.length == 2 ? null : this.result((any[0] ? -700 /* NotStart */ : 0) + -200 /* CaseFold */ + -1100 /* Gap */, any, word);
|
20332
20597
|
}
|
20333
20598
|
result(score, positions, word) {
|
20334
20599
|
let result = [score - word.length], i = 1;
|
@@ -20359,6 +20624,7 @@
|
|
20359
20624
|
aboveCursor: false,
|
20360
20625
|
icons: true,
|
20361
20626
|
addToOptions: [],
|
20627
|
+
positionInfo: defaultPositionInfo,
|
20362
20628
|
compareCompletions: (a, b) => a.label.localeCompare(b.label),
|
20363
20629
|
interactionDelay: 75
|
20364
20630
|
}, {
|
@@ -20374,6 +20640,36 @@
|
|
20374
20640
|
function joinClass(a, b) {
|
20375
20641
|
return a ? b ? a + " " + b : a : b;
|
20376
20642
|
}
|
20643
|
+
function defaultPositionInfo(view, list, option, info, space) {
|
20644
|
+
let rtl = view.textDirection == Direction.RTL, left = rtl, narrow = false;
|
20645
|
+
let side = "top", offset, maxWidth;
|
20646
|
+
let spaceLeft = list.left - space.left, spaceRight = space.right - list.right;
|
20647
|
+
let infoWidth = info.right - info.left, infoHeight = info.bottom - info.top;
|
20648
|
+
if (left && spaceLeft < Math.min(infoWidth, spaceRight))
|
20649
|
+
left = false;
|
20650
|
+
else if (!left && spaceRight < Math.min(infoWidth, spaceLeft))
|
20651
|
+
left = true;
|
20652
|
+
if (infoWidth <= (left ? spaceLeft : spaceRight)) {
|
20653
|
+
offset = Math.max(space.top, Math.min(option.top, space.bottom - infoHeight)) - list.top;
|
20654
|
+
maxWidth = Math.min(400 /* Width */, left ? spaceLeft : spaceRight);
|
20655
|
+
}
|
20656
|
+
else {
|
20657
|
+
narrow = true;
|
20658
|
+
maxWidth = Math.min(400 /* Width */, (rtl ? list.right : space.right - list.left) - 30 /* Margin */);
|
20659
|
+
let spaceBelow = space.bottom - list.bottom;
|
20660
|
+
if (spaceBelow >= infoHeight || spaceBelow > list.top) { // Below the completion
|
20661
|
+
offset = option.bottom - list.top;
|
20662
|
+
}
|
20663
|
+
else { // Above it
|
20664
|
+
side = "bottom";
|
20665
|
+
offset = list.bottom - option.top;
|
20666
|
+
}
|
20667
|
+
}
|
20668
|
+
return {
|
20669
|
+
style: `${side}: ${offset}px; max-width: ${maxWidth}px`,
|
20670
|
+
class: "cm-completionInfo-" + (narrow ? (rtl ? "left-narrow" : "right-narrow") : left ? "left" : "right")
|
20671
|
+
};
|
20672
|
+
}
|
20377
20673
|
|
20378
20674
|
function optionContent(config) {
|
20379
20675
|
let content = config.addToOptions.slice();
|
@@ -20434,13 +20730,15 @@
|
|
20434
20730
|
return { from: total - (off + 1) * max, to: total - off * max };
|
20435
20731
|
}
|
20436
20732
|
class CompletionTooltip {
|
20437
|
-
constructor(view, stateField) {
|
20733
|
+
constructor(view, stateField, applyCompletion) {
|
20438
20734
|
this.view = view;
|
20439
20735
|
this.stateField = stateField;
|
20736
|
+
this.applyCompletion = applyCompletion;
|
20440
20737
|
this.info = null;
|
20441
|
-
this.
|
20738
|
+
this.infoDestroy = null;
|
20739
|
+
this.placeInfoReq = {
|
20442
20740
|
read: () => this.measureInfo(),
|
20443
|
-
write: (pos) => this.
|
20741
|
+
write: (pos) => this.placeInfo(pos),
|
20444
20742
|
key: this
|
20445
20743
|
};
|
20446
20744
|
this.space = null;
|
@@ -20458,16 +20756,22 @@
|
|
20458
20756
|
this.dom.addEventListener("mousedown", (e) => {
|
20459
20757
|
for (let dom = e.target, match; dom && dom != this.dom; dom = dom.parentNode) {
|
20460
20758
|
if (dom.nodeName == "LI" && (match = /-(\d+)$/.exec(dom.id)) && +match[1] < options.length) {
|
20461
|
-
applyCompletion(view, options[+match[1]]);
|
20759
|
+
this.applyCompletion(view, options[+match[1]]);
|
20462
20760
|
e.preventDefault();
|
20463
20761
|
return;
|
20464
20762
|
}
|
20465
20763
|
}
|
20466
20764
|
});
|
20765
|
+
this.dom.addEventListener("focusout", (e) => {
|
20766
|
+
let state = view.state.field(this.stateField, false);
|
20767
|
+
if (state && state.tooltip && view.state.facet(completionConfig).closeOnBlur &&
|
20768
|
+
e.relatedTarget != view.contentDOM)
|
20769
|
+
view.dispatch({ effects: closeCompletionEffect.of(null) });
|
20770
|
+
});
|
20467
20771
|
this.list = this.dom.appendChild(this.createListBox(options, cState.id, this.range));
|
20468
20772
|
this.list.addEventListener("scroll", () => {
|
20469
20773
|
if (this.info)
|
20470
|
-
this.view.requestMeasure(this.
|
20774
|
+
this.view.requestMeasure(this.placeInfoReq);
|
20471
20775
|
});
|
20472
20776
|
}
|
20473
20777
|
mount() { this.updateSel(); }
|
@@ -20497,7 +20801,7 @@
|
|
20497
20801
|
positioned(space) {
|
20498
20802
|
this.space = space;
|
20499
20803
|
if (this.info)
|
20500
|
-
this.view.requestMeasure(this.
|
20804
|
+
this.view.requestMeasure(this.placeInfoReq);
|
20501
20805
|
}
|
20502
20806
|
updateSel() {
|
20503
20807
|
let cState = this.view.state.field(this.stateField), open = cState.open;
|
@@ -20507,43 +20811,52 @@
|
|
20507
20811
|
this.list = this.dom.appendChild(this.createListBox(open.options, cState.id, this.range));
|
20508
20812
|
this.list.addEventListener("scroll", () => {
|
20509
20813
|
if (this.info)
|
20510
|
-
this.view.requestMeasure(this.
|
20814
|
+
this.view.requestMeasure(this.placeInfoReq);
|
20511
20815
|
});
|
20512
20816
|
}
|
20513
20817
|
if (this.updateSelectedOption(open.selected)) {
|
20514
|
-
|
20515
|
-
this.info.remove();
|
20516
|
-
this.info = null;
|
20517
|
-
}
|
20818
|
+
this.destroyInfo();
|
20518
20819
|
let { completion } = open.options[open.selected];
|
20519
20820
|
let { info } = completion;
|
20520
20821
|
if (!info)
|
20521
20822
|
return;
|
20522
|
-
let infoResult = typeof info ===
|
20823
|
+
let infoResult = typeof info === "string" ? document.createTextNode(info) : info(completion);
|
20523
20824
|
if (!infoResult)
|
20524
20825
|
return;
|
20525
|
-
if (
|
20526
|
-
infoResult.then(
|
20527
|
-
if (
|
20528
|
-
this.addInfoPane(
|
20826
|
+
if ("then" in infoResult) {
|
20827
|
+
infoResult.then(obj => {
|
20828
|
+
if (obj && this.view.state.field(this.stateField, false) == cState)
|
20829
|
+
this.addInfoPane(obj, completion);
|
20529
20830
|
}).catch(e => logException(this.view.state, e, "completion info"));
|
20530
20831
|
}
|
20531
20832
|
else {
|
20532
|
-
this.addInfoPane(infoResult);
|
20833
|
+
this.addInfoPane(infoResult, completion);
|
20533
20834
|
}
|
20534
20835
|
}
|
20535
20836
|
}
|
20536
|
-
addInfoPane(content) {
|
20537
|
-
|
20538
|
-
|
20539
|
-
|
20540
|
-
|
20541
|
-
|
20837
|
+
addInfoPane(content, completion) {
|
20838
|
+
this.destroyInfo();
|
20839
|
+
let wrap = this.info = document.createElement("div");
|
20840
|
+
wrap.className = "cm-tooltip cm-completionInfo";
|
20841
|
+
if (content.nodeType != null) {
|
20842
|
+
wrap.appendChild(content);
|
20843
|
+
this.infoDestroy = null;
|
20844
|
+
}
|
20845
|
+
else {
|
20846
|
+
let { dom, destroy } = content;
|
20847
|
+
wrap.appendChild(dom);
|
20848
|
+
this.infoDestroy = destroy || null;
|
20849
|
+
}
|
20850
|
+
this.dom.appendChild(wrap);
|
20851
|
+
this.view.requestMeasure(this.placeInfoReq);
|
20542
20852
|
}
|
20543
20853
|
updateSelectedOption(selected) {
|
20544
20854
|
let set = null;
|
20545
20855
|
for (let opt = this.list.firstChild, i = this.range.from; opt; opt = opt.nextSibling, i++) {
|
20546
|
-
if (
|
20856
|
+
if (opt.nodeName != "LI" || !opt.id) {
|
20857
|
+
i--; // A section header
|
20858
|
+
}
|
20859
|
+
else if (i == selected) {
|
20547
20860
|
if (!opt.hasAttribute("aria-selected")) {
|
20548
20861
|
opt.setAttribute("aria-selected", "true");
|
20549
20862
|
set = opt;
|
@@ -20573,41 +20886,17 @@
|
|
20573
20886
|
if (selRect.top > Math.min(space.bottom, listRect.bottom) - 10 ||
|
20574
20887
|
selRect.bottom < Math.max(space.top, listRect.top) + 10)
|
20575
20888
|
return null;
|
20576
|
-
|
20577
|
-
let top = "", bottom = "";
|
20578
|
-
let spaceLeft = listRect.left - space.left, spaceRight = space.right - listRect.right;
|
20579
|
-
if (left && spaceLeft < Math.min(infoRect.width, spaceRight))
|
20580
|
-
left = false;
|
20581
|
-
else if (!left && spaceRight < Math.min(infoRect.width, spaceLeft))
|
20582
|
-
left = true;
|
20583
|
-
if (infoRect.width <= (left ? spaceLeft : spaceRight)) {
|
20584
|
-
top = (Math.max(space.top, Math.min(selRect.top, space.bottom - infoRect.height)) - listRect.top) + "px";
|
20585
|
-
maxWidth = Math.min(400 /* Info.Width */, left ? spaceLeft : spaceRight) + "px";
|
20586
|
-
}
|
20587
|
-
else {
|
20588
|
-
narrow = true;
|
20589
|
-
maxWidth = Math.min(400 /* Info.Width */, (rtl ? listRect.right : space.right - listRect.left) - 30 /* Info.Margin */) + "px";
|
20590
|
-
let spaceBelow = space.bottom - listRect.bottom;
|
20591
|
-
if (spaceBelow >= infoRect.height || spaceBelow > listRect.top) // Below the completion
|
20592
|
-
top = (selRect.bottom - listRect.top) + "px";
|
20593
|
-
else // Above it
|
20594
|
-
bottom = (listRect.bottom - selRect.top) + "px";
|
20595
|
-
}
|
20596
|
-
return {
|
20597
|
-
top, bottom, maxWidth,
|
20598
|
-
class: narrow ? (rtl ? "left-narrow" : "right-narrow") : left ? "left" : "right",
|
20599
|
-
};
|
20889
|
+
return this.view.state.facet(completionConfig).positionInfo(this.view, listRect, selRect, infoRect, space);
|
20600
20890
|
}
|
20601
|
-
|
20891
|
+
placeInfo(pos) {
|
20602
20892
|
if (this.info) {
|
20603
20893
|
if (pos) {
|
20604
|
-
|
20605
|
-
|
20606
|
-
this.info.
|
20607
|
-
this.info.className = "cm-tooltip cm-completionInfo cm-completionInfo-" + pos.class;
|
20894
|
+
if (pos.style)
|
20895
|
+
this.info.style.cssText = pos.style;
|
20896
|
+
this.info.className = "cm-tooltip cm-completionInfo " + (pos.class || "");
|
20608
20897
|
}
|
20609
20898
|
else {
|
20610
|
-
this.info.style.
|
20899
|
+
this.info.style.cssText = "top: -1e6px";
|
20611
20900
|
}
|
20612
20901
|
}
|
20613
20902
|
}
|
@@ -20617,8 +20906,22 @@
|
|
20617
20906
|
ul.setAttribute("role", "listbox");
|
20618
20907
|
ul.setAttribute("aria-expanded", "true");
|
20619
20908
|
ul.setAttribute("aria-label", this.view.state.phrase("Completions"));
|
20909
|
+
let curSection = null;
|
20620
20910
|
for (let i = range.from; i < range.to; i++) {
|
20621
|
-
let { completion, match } = options[i];
|
20911
|
+
let { completion, match } = options[i], { section } = completion;
|
20912
|
+
if (section) {
|
20913
|
+
let name = typeof section == "string" ? section : section.name;
|
20914
|
+
if (name != curSection && (i > range.from || range.from == 0)) {
|
20915
|
+
curSection = name;
|
20916
|
+
if (typeof section != "string" && section.header) {
|
20917
|
+
ul.appendChild(section.header(section));
|
20918
|
+
}
|
20919
|
+
else {
|
20920
|
+
let header = ul.appendChild(document.createElement("completion-section"));
|
20921
|
+
header.textContent = name;
|
20922
|
+
}
|
20923
|
+
}
|
20924
|
+
}
|
20622
20925
|
const li = ul.appendChild(document.createElement("li"));
|
20623
20926
|
li.id = id + "-" + i;
|
20624
20927
|
li.setAttribute("role", "option");
|
@@ -20637,11 +20940,22 @@
|
|
20637
20940
|
ul.classList.add("cm-completionListIncompleteBottom");
|
20638
20941
|
return ul;
|
20639
20942
|
}
|
20943
|
+
destroyInfo() {
|
20944
|
+
if (this.info) {
|
20945
|
+
if (this.infoDestroy)
|
20946
|
+
this.infoDestroy();
|
20947
|
+
this.info.remove();
|
20948
|
+
this.info = null;
|
20949
|
+
}
|
20950
|
+
}
|
20951
|
+
destroy() {
|
20952
|
+
this.destroyInfo();
|
20953
|
+
}
|
20640
20954
|
}
|
20641
20955
|
// We allocate a new function instance every time the completion
|
20642
20956
|
// changes to force redrawing/repositioning of the tooltip
|
20643
|
-
function completionTooltip(stateField) {
|
20644
|
-
return (view) => new CompletionTooltip(view, stateField);
|
20957
|
+
function completionTooltip(stateField, applyCompletion) {
|
20958
|
+
return (view) => new CompletionTooltip(view, stateField, applyCompletion);
|
20645
20959
|
}
|
20646
20960
|
function scrollIntoView(container, element) {
|
20647
20961
|
let parent = container.getBoundingClientRect();
|
@@ -20659,35 +20973,59 @@
|
|
20659
20973
|
(option.type ? 1 : 0);
|
20660
20974
|
}
|
20661
20975
|
function sortOptions(active, state) {
|
20662
|
-
let options = []
|
20976
|
+
let options = [];
|
20977
|
+
let sections = null;
|
20978
|
+
let addOption = (option) => {
|
20979
|
+
options.push(option);
|
20980
|
+
let { section } = option.completion;
|
20981
|
+
if (section) {
|
20982
|
+
if (!sections)
|
20983
|
+
sections = [];
|
20984
|
+
let name = typeof section == "string" ? section : section.name;
|
20985
|
+
if (!sections.some(s => s.name == name))
|
20986
|
+
sections.push(typeof section == "string" ? { name } : section);
|
20987
|
+
}
|
20988
|
+
};
|
20663
20989
|
for (let a of active)
|
20664
20990
|
if (a.hasResult()) {
|
20665
20991
|
if (a.result.filter === false) {
|
20666
20992
|
let getMatch = a.result.getMatch;
|
20667
20993
|
for (let option of a.result.options) {
|
20668
|
-
let match = [1e9 -
|
20994
|
+
let match = [1e9 - options.length];
|
20669
20995
|
if (getMatch)
|
20670
20996
|
for (let n of getMatch(option))
|
20671
20997
|
match.push(n);
|
20672
|
-
|
20998
|
+
addOption(new Option(option, a.source, match, match[0]));
|
20673
20999
|
}
|
20674
21000
|
}
|
20675
21001
|
else {
|
20676
21002
|
let matcher = new FuzzyMatcher(state.sliceDoc(a.from, a.to)), match;
|
20677
21003
|
for (let option of a.result.options)
|
20678
21004
|
if (match = matcher.match(option.label)) {
|
20679
|
-
|
20680
|
-
match[0] += option.boost;
|
20681
|
-
options.push(new Option(option, a, match));
|
21005
|
+
addOption(new Option(option, a.source, match, match[0] + (option.boost || 0)));
|
20682
21006
|
}
|
20683
21007
|
}
|
20684
21008
|
}
|
21009
|
+
if (sections) {
|
21010
|
+
let sectionOrder = Object.create(null), pos = 0;
|
21011
|
+
let cmp = (a, b) => { var _a, _b; return ((_a = a.rank) !== null && _a !== void 0 ? _a : 1e9) - ((_b = b.rank) !== null && _b !== void 0 ? _b : 1e9) || (a.name < b.name ? -1 : 1); };
|
21012
|
+
for (let s of sections.sort(cmp)) {
|
21013
|
+
pos -= 1e5;
|
21014
|
+
sectionOrder[s.name] = pos;
|
21015
|
+
}
|
21016
|
+
for (let option of options) {
|
21017
|
+
let { section } = option.completion;
|
21018
|
+
if (section)
|
21019
|
+
option.score += sectionOrder[typeof section == "string" ? section : section.name];
|
21020
|
+
}
|
21021
|
+
}
|
20685
21022
|
let result = [], prev = null;
|
20686
21023
|
let compare = state.facet(completionConfig).compareCompletions;
|
20687
|
-
for (let opt of options.sort((a, b) => (b.
|
20688
|
-
|
20689
|
-
|
20690
|
-
prev.
|
21024
|
+
for (let opt of options.sort((a, b) => (b.score - a.score) || compare(a.completion, b.completion))) {
|
21025
|
+
let cur = opt.completion;
|
21026
|
+
if (!prev || prev.label != cur.label || prev.detail != cur.detail ||
|
21027
|
+
(prev.type != null && cur.type != null && prev.type != cur.type) ||
|
21028
|
+
prev.apply != cur.apply || prev.boost != cur.boost)
|
20691
21029
|
result.push(opt);
|
20692
21030
|
else if (score(opt.completion) > score(prev))
|
20693
21031
|
result[result.length - 1] = opt;
|
@@ -20711,7 +21049,7 @@
|
|
20711
21049
|
static build(active, state, id, prev, conf) {
|
20712
21050
|
let options = sortOptions(active, state);
|
20713
21051
|
if (!options.length) {
|
20714
|
-
return prev && active.some(a => a.state == 1 /*
|
21052
|
+
return prev && active.some(a => a.state == 1 /* Pending */) ?
|
20715
21053
|
new CompletionDialog(prev.options, prev.attrs, prev.tooltip, prev.timestamp, prev.selected, true) : null;
|
20716
21054
|
}
|
20717
21055
|
let selected = state.facet(completionConfig).selectOnOpen ? 0 : -1;
|
@@ -20725,7 +21063,7 @@
|
|
20725
21063
|
}
|
20726
21064
|
return new CompletionDialog(options, makeAttrs(id, selected), {
|
20727
21065
|
pos: active.reduce((a, b) => b.hasResult() ? Math.min(a, b.from) : a, 1e8),
|
20728
|
-
create: completionTooltip(completionState),
|
21066
|
+
create: completionTooltip(completionState, applyCompletion),
|
20729
21067
|
above: conf.aboveCursor,
|
20730
21068
|
}, prev ? prev.timestamp : Date.now(), selected, false);
|
20731
21069
|
}
|
@@ -20748,7 +21086,7 @@
|
|
20748
21086
|
state.languageDataAt("autocomplete", cur(state)).map(asSource);
|
20749
21087
|
let active = sources.map(source => {
|
20750
21088
|
let value = this.active.find(s => s.source == source) ||
|
20751
|
-
new ActiveSource(source, this.active.some(a => a.state != 0 /*
|
21089
|
+
new ActiveSource(source, this.active.some(a => a.state != 0 /* Inactive */) ? 1 /* Pending */ : 0 /* Inactive */);
|
20752
21090
|
return value.update(tr, conf);
|
20753
21091
|
});
|
20754
21092
|
if (active.length == this.active.length && active.every((a, i) => a == this.active[i]))
|
@@ -20759,10 +21097,10 @@
|
|
20759
21097
|
if (tr.selection || active.some(a => a.hasResult() && tr.changes.touchesRange(a.from, a.to)) ||
|
20760
21098
|
!sameResults(active, this.active))
|
20761
21099
|
open = CompletionDialog.build(active, state, this.id, open, conf);
|
20762
|
-
else if (open && open.disabled && !active.some(a => a.state == 1 /*
|
21100
|
+
else if (open && open.disabled && !active.some(a => a.state == 1 /* Pending */))
|
20763
21101
|
open = null;
|
20764
|
-
if (!open && active.every(a => a.state != 1 /*
|
20765
|
-
active = active.map(a => a.hasResult() ? new ActiveSource(a.source, 0 /*
|
21102
|
+
if (!open && active.every(a => a.state != 1 /* Pending */) && active.some(a => a.hasResult()))
|
21103
|
+
active = active.map(a => a.hasResult() ? new ActiveSource(a.source, 0 /* Inactive */) : a);
|
20766
21104
|
for (let effect of tr.effects)
|
20767
21105
|
if (effect.is(setSelectedEffect))
|
20768
21106
|
open = open && open.setSelected(effect.value, this.id);
|
@@ -20816,13 +21154,13 @@
|
|
20816
21154
|
value = value.handleUserEvent(tr, event, conf);
|
20817
21155
|
else if (tr.docChanged)
|
20818
21156
|
value = value.handleChange(tr);
|
20819
|
-
else if (tr.selection && value.state != 0 /*
|
20820
|
-
value = new ActiveSource(value.source, 0 /*
|
21157
|
+
else if (tr.selection && value.state != 0 /* Inactive */)
|
21158
|
+
value = new ActiveSource(value.source, 0 /* Inactive */);
|
20821
21159
|
for (let effect of tr.effects) {
|
20822
21160
|
if (effect.is(startCompletionEffect))
|
20823
|
-
value = new ActiveSource(value.source, 1 /*
|
21161
|
+
value = new ActiveSource(value.source, 1 /* Pending */, effect.value ? cur(tr.state) : -1);
|
20824
21162
|
else if (effect.is(closeCompletionEffect))
|
20825
|
-
value = new ActiveSource(value.source, 0 /*
|
21163
|
+
value = new ActiveSource(value.source, 0 /* Inactive */);
|
20826
21164
|
else if (effect.is(setActiveEffect))
|
20827
21165
|
for (let active of effect.value)
|
20828
21166
|
if (active.source == value.source)
|
@@ -20831,10 +21169,10 @@
|
|
20831
21169
|
return value;
|
20832
21170
|
}
|
20833
21171
|
handleUserEvent(tr, type, conf) {
|
20834
|
-
return type == "delete" || !conf.activateOnTyping ? this.map(tr.changes) : new ActiveSource(this.source, 1 /*
|
21172
|
+
return type == "delete" || !conf.activateOnTyping ? this.map(tr.changes) : new ActiveSource(this.source, 1 /* Pending */);
|
20835
21173
|
}
|
20836
21174
|
handleChange(tr) {
|
20837
|
-
return tr.changes.touchesRange(cur(tr.startState)) ? new ActiveSource(this.source, 0 /*
|
21175
|
+
return tr.changes.touchesRange(cur(tr.startState)) ? new ActiveSource(this.source, 0 /* Inactive */) : this.map(tr.changes);
|
20838
21176
|
}
|
20839
21177
|
map(changes) {
|
20840
21178
|
return changes.empty || this.explicitPos < 0 ? this : new ActiveSource(this.source, this.state, changes.mapPos(this.explicitPos));
|
@@ -20842,7 +21180,7 @@
|
|
20842
21180
|
}
|
20843
21181
|
class ActiveResult extends ActiveSource {
|
20844
21182
|
constructor(source, explicitPos, result, from, to) {
|
20845
|
-
super(source, 2 /*
|
21183
|
+
super(source, 2 /* Result */, explicitPos);
|
20846
21184
|
this.result = result;
|
20847
21185
|
this.from = from;
|
20848
21186
|
this.to = to;
|
@@ -20855,17 +21193,17 @@
|
|
20855
21193
|
if ((this.explicitPos < 0 ? pos <= from : pos < this.from) ||
|
20856
21194
|
pos > to ||
|
20857
21195
|
type == "delete" && cur(tr.startState) == this.from)
|
20858
|
-
return new ActiveSource(this.source, type == "input" && conf.activateOnTyping ? 1 /*
|
21196
|
+
return new ActiveSource(this.source, type == "input" && conf.activateOnTyping ? 1 /* Pending */ : 0 /* Inactive */);
|
20859
21197
|
let explicitPos = this.explicitPos < 0 ? -1 : tr.changes.mapPos(this.explicitPos), updated;
|
20860
21198
|
if (checkValid(this.result.validFor, tr.state, from, to))
|
20861
21199
|
return new ActiveResult(this.source, explicitPos, this.result, from, to);
|
20862
21200
|
if (this.result.update &&
|
20863
21201
|
(updated = this.result.update(this.result, from, to, new CompletionContext(tr.state, pos, explicitPos >= 0))))
|
20864
21202
|
return new ActiveResult(this.source, explicitPos, updated, updated.from, (_a = updated.to) !== null && _a !== void 0 ? _a : cur(tr.state));
|
20865
|
-
return new ActiveSource(this.source, 1 /*
|
21203
|
+
return new ActiveSource(this.source, 1 /* Pending */, explicitPos);
|
20866
21204
|
}
|
20867
21205
|
handleChange(tr) {
|
20868
|
-
return tr.changes.touchesRange(this.from, this.to) ? new ActiveSource(this.source, 0 /*
|
21206
|
+
return tr.changes.touchesRange(this.from, this.to) ? new ActiveSource(this.source, 0 /* Inactive */) : this.map(tr.changes);
|
20869
21207
|
}
|
20870
21208
|
map(mapping) {
|
20871
21209
|
return mapping.empty ? this :
|
@@ -20878,8 +21216,6 @@
|
|
20878
21216
|
let text = state.sliceDoc(from, to);
|
20879
21217
|
return typeof validFor == "function" ? validFor(text, from, to, state) : ensureAnchor(validFor, true).test(text);
|
20880
21218
|
}
|
20881
|
-
const startCompletionEffect = /*@__PURE__*/StateEffect.define();
|
20882
|
-
const closeCompletionEffect = /*@__PURE__*/StateEffect.define();
|
20883
21219
|
const setActiveEffect = /*@__PURE__*/StateEffect.define({
|
20884
21220
|
map(sources, mapping) { return sources.map(s => s.map(mapping)); }
|
20885
21221
|
});
|
@@ -20892,6 +21228,17 @@
|
|
20892
21228
|
EditorView.contentAttributes.from(f, state => state.attrs)
|
20893
21229
|
]
|
20894
21230
|
});
|
21231
|
+
function applyCompletion(view, option) {
|
21232
|
+
const apply = option.completion.apply || option.completion.label;
|
21233
|
+
let result = view.state.field(completionState).active.find(a => a.source == option.source);
|
21234
|
+
if (!(result instanceof ActiveResult))
|
21235
|
+
return false;
|
21236
|
+
if (typeof apply == "string")
|
21237
|
+
view.dispatch(Object.assign(Object.assign({}, insertCompletionText(view.state, apply, result.from, result.to)), { annotations: pickedCompletion.of(option.completion) }));
|
21238
|
+
else
|
21239
|
+
apply(view, option.completion, result.from, result.to);
|
21240
|
+
return true;
|
21241
|
+
}
|
20895
21242
|
|
20896
21243
|
/**
|
20897
21244
|
Returns a command that moves the completion selection forward or
|
@@ -20922,12 +21269,10 @@
|
|
20922
21269
|
*/
|
20923
21270
|
const acceptCompletion = (view) => {
|
20924
21271
|
let cState = view.state.field(completionState, false);
|
20925
|
-
if (view.state.readOnly || !cState || !cState.open || cState.open.selected < 0 ||
|
21272
|
+
if (view.state.readOnly || !cState || !cState.open || cState.open.selected < 0 || cState.open.disabled ||
|
20926
21273
|
Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay)
|
20927
21274
|
return false;
|
20928
|
-
|
20929
|
-
applyCompletion(view, cState.open.options[cState.open.selected]);
|
20930
|
-
return true;
|
21275
|
+
return applyCompletion(view, cState.open.options[cState.open.selected]);
|
20931
21276
|
};
|
20932
21277
|
/**
|
20933
21278
|
Explicitly start autocompletion.
|
@@ -20944,7 +21289,7 @@
|
|
20944
21289
|
*/
|
20945
21290
|
const closeCompletion = (view) => {
|
20946
21291
|
let cState = view.state.field(completionState, false);
|
20947
|
-
if (!cState || !cState.active.some(a => a.state != 0 /*
|
21292
|
+
if (!cState || !cState.active.some(a => a.state != 0 /* Inactive */))
|
20948
21293
|
return false;
|
20949
21294
|
view.dispatch({ effects: closeCompletionEffect.of(null) });
|
20950
21295
|
return true;
|
@@ -20967,9 +21312,9 @@
|
|
20967
21312
|
this.debounceUpdate = -1;
|
20968
21313
|
this.running = [];
|
20969
21314
|
this.debounceAccept = -1;
|
20970
|
-
this.composing = 0 /*
|
21315
|
+
this.composing = 0 /* None */;
|
20971
21316
|
for (let active of view.state.field(completionState).active)
|
20972
|
-
if (active.state == 1 /*
|
21317
|
+
if (active.state == 1 /* Pending */)
|
20973
21318
|
this.startQuery(active);
|
20974
21319
|
}
|
20975
21320
|
update(update) {
|
@@ -21000,21 +21345,21 @@
|
|
21000
21345
|
}
|
21001
21346
|
if (this.debounceUpdate > -1)
|
21002
21347
|
clearTimeout(this.debounceUpdate);
|
21003
|
-
this.debounceUpdate = cState.active.some(a => a.state == 1 /*
|
21348
|
+
this.debounceUpdate = cState.active.some(a => a.state == 1 /* Pending */ && !this.running.some(q => q.active.source == a.source))
|
21004
21349
|
? setTimeout(() => this.startUpdate(), DebounceTime) : -1;
|
21005
|
-
if (this.composing != 0 /*
|
21350
|
+
if (this.composing != 0 /* None */)
|
21006
21351
|
for (let tr of update.transactions) {
|
21007
21352
|
if (getUserEvent(tr) == "input")
|
21008
|
-
this.composing = 2 /*
|
21009
|
-
else if (this.composing == 2 /*
|
21010
|
-
this.composing = 3 /*
|
21353
|
+
this.composing = 2 /* Changed */;
|
21354
|
+
else if (this.composing == 2 /* Changed */ && tr.selection)
|
21355
|
+
this.composing = 3 /* ChangedAndMoved */;
|
21011
21356
|
}
|
21012
21357
|
}
|
21013
21358
|
startUpdate() {
|
21014
21359
|
this.debounceUpdate = -1;
|
21015
21360
|
let { state } = this.view, cState = state.field(completionState);
|
21016
21361
|
for (let active of cState.active) {
|
21017
|
-
if (active.state == 1 /*
|
21362
|
+
if (active.state == 1 /* Pending */ && !this.running.some(r => r.active.source == active.source))
|
21018
21363
|
this.startQuery(active);
|
21019
21364
|
}
|
21020
21365
|
}
|
@@ -21065,14 +21410,14 @@
|
|
21065
21410
|
}
|
21066
21411
|
}
|
21067
21412
|
let current = this.view.state.field(completionState).active.find(a => a.source == query.active.source);
|
21068
|
-
if (current && current.state == 1 /*
|
21413
|
+
if (current && current.state == 1 /* Pending */) {
|
21069
21414
|
if (query.done == null) {
|
21070
21415
|
// Explicitly failed. Should clear the pending status if it
|
21071
21416
|
// hasn't been re-set in the meantime.
|
21072
|
-
let active = new ActiveSource(query.active.source, 0 /*
|
21417
|
+
let active = new ActiveSource(query.active.source, 0 /* Inactive */);
|
21073
21418
|
for (let tr of query.updates)
|
21074
21419
|
active = active.update(tr, conf);
|
21075
|
-
if (active.state != 1 /*
|
21420
|
+
if (active.state != 1 /* Pending */)
|
21076
21421
|
updated.push(active);
|
21077
21422
|
}
|
21078
21423
|
else {
|
@@ -21086,21 +21431,24 @@
|
|
21086
21431
|
}
|
21087
21432
|
}, {
|
21088
21433
|
eventHandlers: {
|
21089
|
-
blur() {
|
21434
|
+
blur(event) {
|
21090
21435
|
let state = this.view.state.field(completionState, false);
|
21091
|
-
if (state && state.tooltip && this.view.state.facet(completionConfig).closeOnBlur)
|
21092
|
-
this.view
|
21436
|
+
if (state && state.tooltip && this.view.state.facet(completionConfig).closeOnBlur) {
|
21437
|
+
let dialog = state.open && getTooltip(this.view, state.open.tooltip);
|
21438
|
+
if (!dialog || !dialog.dom.contains(event.relatedTarget))
|
21439
|
+
this.view.dispatch({ effects: closeCompletionEffect.of(null) });
|
21440
|
+
}
|
21093
21441
|
},
|
21094
21442
|
compositionstart() {
|
21095
|
-
this.composing = 1 /*
|
21443
|
+
this.composing = 1 /* Started */;
|
21096
21444
|
},
|
21097
21445
|
compositionend() {
|
21098
|
-
if (this.composing == 3 /*
|
21446
|
+
if (this.composing == 3 /* ChangedAndMoved */) {
|
21099
21447
|
// Safari fires compositionend events synchronously, possibly
|
21100
21448
|
// from inside an update, so dispatch asynchronously to avoid reentrancy
|
21101
21449
|
setTimeout(() => this.view.dispatch({ effects: startCompletionEffect.of(false) }), 20);
|
21102
21450
|
}
|
21103
|
-
this.composing = 0 /*
|
21451
|
+
this.composing = 0 /* None */;
|
21104
21452
|
}
|
21105
21453
|
}
|
21106
21454
|
});
|
@@ -21119,13 +21467,21 @@
|
|
21119
21467
|
listStyle: "none",
|
21120
21468
|
margin: 0,
|
21121
21469
|
padding: 0,
|
21470
|
+
"& > li, & > completion-section": {
|
21471
|
+
padding: "1px 3px",
|
21472
|
+
lineHeight: 1.2
|
21473
|
+
},
|
21122
21474
|
"& > li": {
|
21123
21475
|
overflowX: "hidden",
|
21124
21476
|
textOverflow: "ellipsis",
|
21125
|
-
cursor: "pointer"
|
21126
|
-
padding: "1px 3px",
|
21127
|
-
lineHeight: 1.2
|
21477
|
+
cursor: "pointer"
|
21128
21478
|
},
|
21479
|
+
"& > completion-section": {
|
21480
|
+
display: "list-item",
|
21481
|
+
borderBottom: "1px solid silver",
|
21482
|
+
paddingLeft: "0.5em",
|
21483
|
+
opacity: 0.7
|
21484
|
+
}
|
21129
21485
|
}
|
21130
21486
|
},
|
21131
21487
|
"&light .cm-tooltip-autocomplete ul li[aria-selected]": {
|
@@ -21152,13 +21508,13 @@
|
|
21152
21508
|
position: "absolute",
|
21153
21509
|
padding: "3px 9px",
|
21154
21510
|
width: "max-content",
|
21155
|
-
maxWidth: `${400 /*
|
21511
|
+
maxWidth: `${400 /* Width */}px`,
|
21156
21512
|
boxSizing: "border-box"
|
21157
21513
|
},
|
21158
21514
|
".cm-completionInfo.cm-completionInfo-left": { right: "100%" },
|
21159
21515
|
".cm-completionInfo.cm-completionInfo-right": { left: "100%" },
|
21160
|
-
".cm-completionInfo.cm-completionInfo-left-narrow": { right: `${30 /*
|
21161
|
-
".cm-completionInfo.cm-completionInfo-right-narrow": { left: `${30 /*
|
21516
|
+
".cm-completionInfo.cm-completionInfo-left-narrow": { right: `${30 /* Margin */}px` },
|
21517
|
+
".cm-completionInfo.cm-completionInfo-right-narrow": { left: `${30 /* Margin */}px` },
|
21162
21518
|
"&light .cm-snippetField": { backgroundColor: "#00000022" },
|
21163
21519
|
"&dark .cm-snippetField": { backgroundColor: "#ffffff22" },
|
21164
21520
|
".cm-snippetFieldPosition": {
|
@@ -21231,9 +21587,6 @@
|
|
21231
21587
|
return mapped == null ? undefined : mapped;
|
21232
21588
|
}
|
21233
21589
|
});
|
21234
|
-
const skipBracketEffect = /*@__PURE__*/StateEffect.define({
|
21235
|
-
map(value, mapping) { return mapping.mapPos(value); }
|
21236
|
-
});
|
21237
21590
|
const closedBracket = /*@__PURE__*/new class extends RangeValue {
|
21238
21591
|
};
|
21239
21592
|
closedBracket.startSide = 1;
|
@@ -21248,12 +21601,9 @@
|
|
21248
21601
|
value = RangeSet.empty;
|
21249
21602
|
}
|
21250
21603
|
value = value.map(tr.changes);
|
21251
|
-
for (let effect of tr.effects)
|
21604
|
+
for (let effect of tr.effects)
|
21252
21605
|
if (effect.is(closeBracketEffect))
|
21253
21606
|
value = value.update({ add: [closedBracket.range(effect.value, effect.value + 1)] });
|
21254
|
-
else if (effect.is(skipBracketEffect))
|
21255
|
-
value = value.update({ filter: from => from != effect.value });
|
21256
|
-
}
|
21257
21607
|
return value;
|
21258
21608
|
}
|
21259
21609
|
});
|
@@ -21381,15 +21731,15 @@
|
|
21381
21731
|
});
|
21382
21732
|
}
|
21383
21733
|
function handleClose(state, _open, close) {
|
21384
|
-
let dont = null,
|
21734
|
+
let dont = null, changes = state.changeByRange(range => {
|
21385
21735
|
if (range.empty && nextChar(state.doc, range.head) == close)
|
21386
|
-
return
|
21387
|
-
|
21736
|
+
return { changes: { from: range.head, to: range.head + close.length, insert: close },
|
21737
|
+
range: EditorSelection.cursor(range.head + close.length) };
|
21738
|
+
return dont = { range };
|
21388
21739
|
});
|
21389
|
-
return dont ? null : state.update({
|
21390
|
-
selection: EditorSelection.create(moved, state.selection.mainIndex),
|
21740
|
+
return dont ? null : state.update(changes, {
|
21391
21741
|
scrollIntoView: true,
|
21392
|
-
|
21742
|
+
userEvent: "input.type"
|
21393
21743
|
});
|
21394
21744
|
}
|
21395
21745
|
// Handles cases where the open and close token are the same, and
|
@@ -21410,8 +21760,9 @@
|
|
21410
21760
|
}
|
21411
21761
|
else if (closedBracketAt(state, pos)) {
|
21412
21762
|
let isTriple = allowTriple && state.sliceDoc(pos, pos + token.length * 3) == token + token + token;
|
21413
|
-
|
21414
|
-
|
21763
|
+
let content = isTriple ? token + token + token : token;
|
21764
|
+
return { changes: { from: pos, to: pos + content.length, insert: content },
|
21765
|
+
range: EditorSelection.cursor(pos + content.length) };
|
21415
21766
|
}
|
21416
21767
|
}
|
21417
21768
|
else if (allowTriple && state.sliceDoc(pos - 2 * token.length, pos) == token + token &&
|
@@ -21869,22 +22220,54 @@
|
|
21869
22220
|
// be done.
|
21870
22221
|
/// @internal
|
21871
22222
|
forceReduce() {
|
21872
|
-
let
|
22223
|
+
let { parser } = this.p;
|
22224
|
+
let reduce = parser.stateSlot(this.state, 5 /* ParseState.ForcedReduce */);
|
21873
22225
|
if ((reduce & 65536 /* Action.ReduceFlag */) == 0)
|
21874
22226
|
return false;
|
21875
|
-
let { parser } = this.p;
|
21876
22227
|
if (!parser.validAction(this.state, reduce)) {
|
21877
22228
|
let depth = reduce >> 19 /* Action.ReduceDepthShift */, term = reduce & 65535 /* Action.ValueMask */;
|
21878
22229
|
let target = this.stack.length - depth * 3;
|
21879
|
-
if (target < 0 || parser.getGoto(this.stack[target], term, false) < 0)
|
21880
|
-
|
21881
|
-
|
22230
|
+
if (target < 0 || parser.getGoto(this.stack[target], term, false) < 0) {
|
22231
|
+
let backup = this.findForcedReduction();
|
22232
|
+
if (backup == null)
|
22233
|
+
return false;
|
22234
|
+
reduce = backup;
|
22235
|
+
}
|
22236
|
+
this.storeNode(0 /* Term.Err */, this.pos, this.pos, 4, true);
|
21882
22237
|
this.score -= 100 /* Recover.Reduce */;
|
21883
22238
|
}
|
21884
22239
|
this.reducePos = this.pos;
|
21885
22240
|
this.reduce(reduce);
|
21886
22241
|
return true;
|
21887
22242
|
}
|
22243
|
+
/// Try to scan through the automaton to find some kind of reduction
|
22244
|
+
/// that can be applied. Used when the regular ForcedReduce field
|
22245
|
+
/// isn't a valid action. @internal
|
22246
|
+
findForcedReduction() {
|
22247
|
+
let { parser } = this.p, seen = [];
|
22248
|
+
let explore = (state, depth) => {
|
22249
|
+
if (seen.includes(state))
|
22250
|
+
return;
|
22251
|
+
seen.push(state);
|
22252
|
+
return parser.allActions(state, (action) => {
|
22253
|
+
if (action & (262144 /* Action.StayFlag */ | 131072 /* Action.GotoFlag */)) ;
|
22254
|
+
else if (action & 65536 /* Action.ReduceFlag */) {
|
22255
|
+
let rDepth = (action >> 19 /* Action.ReduceDepthShift */) - depth;
|
22256
|
+
if (rDepth > 1) {
|
22257
|
+
let term = action & 65535 /* Action.ValueMask */, target = this.stack.length - rDepth * 3;
|
22258
|
+
if (target >= 0 && parser.getGoto(this.stack[target], term, false) >= 0)
|
22259
|
+
return (rDepth << 19 /* Action.ReduceDepthShift */) | 65536 /* Action.ReduceFlag */ | term;
|
22260
|
+
}
|
22261
|
+
}
|
22262
|
+
else {
|
22263
|
+
let found = explore(action, depth + 1);
|
22264
|
+
if (found != null)
|
22265
|
+
return found;
|
22266
|
+
}
|
22267
|
+
});
|
22268
|
+
};
|
22269
|
+
return explore(this.state, 0);
|
22270
|
+
}
|
21888
22271
|
/// @internal
|
21889
22272
|
forceAll() {
|
21890
22273
|
while (!this.p.parser.stateFlag(this.state, 2 /* StateFlag.Accepting */)) {
|
@@ -21938,13 +22321,13 @@
|
|
21938
22321
|
emitContext() {
|
21939
22322
|
let last = this.buffer.length - 1;
|
21940
22323
|
if (last < 0 || this.buffer[last] != -3)
|
21941
|
-
this.buffer.push(this.curContext.hash, this.
|
22324
|
+
this.buffer.push(this.curContext.hash, this.pos, this.pos, -3);
|
21942
22325
|
}
|
21943
22326
|
/// @internal
|
21944
22327
|
emitLookAhead() {
|
21945
22328
|
let last = this.buffer.length - 1;
|
21946
22329
|
if (last < 0 || this.buffer[last] != -4)
|
21947
|
-
this.buffer.push(this.lookAhead, this.
|
22330
|
+
this.buffer.push(this.lookAhead, this.pos, this.pos, -4);
|
21948
22331
|
}
|
21949
22332
|
updateContext(context) {
|
21950
22333
|
if (context != this.curContext.context) {
|
@@ -23060,18 +23443,22 @@
|
|
23060
23443
|
}
|
23061
23444
|
/// @internal
|
23062
23445
|
validAction(state, action) {
|
23063
|
-
|
23064
|
-
|
23065
|
-
|
23446
|
+
return !!this.allActions(state, a => a == action ? true : null);
|
23447
|
+
}
|
23448
|
+
/// @internal
|
23449
|
+
allActions(state, action) {
|
23450
|
+
let deflt = this.stateSlot(state, 4 /* ParseState.DefaultReduce */);
|
23451
|
+
let result = deflt ? action(deflt) : undefined;
|
23452
|
+
for (let i = this.stateSlot(state, 1 /* ParseState.Actions */); result == null; i += 3) {
|
23066
23453
|
if (this.data[i] == 65535 /* Seq.End */) {
|
23067
23454
|
if (this.data[i + 1] == 1 /* Seq.Next */)
|
23068
23455
|
i = pair(this.data, i + 2);
|
23069
23456
|
else
|
23070
|
-
|
23457
|
+
break;
|
23071
23458
|
}
|
23072
|
-
|
23073
|
-
return true;
|
23459
|
+
result = action(pair(this.data, i + 1));
|
23074
23460
|
}
|
23461
|
+
return result;
|
23075
23462
|
}
|
23076
23463
|
/// Get the states that can follow this one through shift actions or
|
23077
23464
|
/// goto jumps. @internal
|
@@ -23228,10 +23615,10 @@
|
|
23228
23615
|
Builtin = 24;
|
23229
23616
|
|
23230
23617
|
function isAlpha(ch) {
|
23231
|
-
return ch >= 65 /*
|
23618
|
+
return ch >= 65 /* A */ && ch <= 90 /* Z */ || ch >= 97 /* a */ && ch <= 122 /* z */ || ch >= 48 /* _0 */ && ch <= 57 /* _9 */;
|
23232
23619
|
}
|
23233
23620
|
function isHexDigit(ch) {
|
23234
|
-
return ch >= 48 /*
|
23621
|
+
return ch >= 48 /* _0 */ && ch <= 57 /* _9 */ || ch >= 97 /* a */ && ch <= 102 /* f */ || ch >= 65 /* A */ && ch <= 70 /* F */;
|
23235
23622
|
}
|
23236
23623
|
function readLiteral(input, endQuote, backslashEscapes) {
|
23237
23624
|
for (let escaped = false;;) {
|
@@ -23241,7 +23628,7 @@
|
|
23241
23628
|
input.advance();
|
23242
23629
|
return;
|
23243
23630
|
}
|
23244
|
-
escaped = backslashEscapes && !escaped && input.next == 92 /*
|
23631
|
+
escaped = backslashEscapes && !escaped && input.next == 92 /* Backslash */;
|
23245
23632
|
input.advance();
|
23246
23633
|
}
|
23247
23634
|
}
|
@@ -23249,7 +23636,7 @@
|
|
23249
23636
|
for (;;) {
|
23250
23637
|
if (input.next < 0 || input.peek(1) < 0)
|
23251
23638
|
return;
|
23252
|
-
if (input.next == 36 /*
|
23639
|
+
if (input.next == 36 /* Dollar */ && input.peek(1) == 36 /* Dollar */) {
|
23253
23640
|
input.advance(2);
|
23254
23641
|
return;
|
23255
23642
|
}
|
@@ -23258,7 +23645,7 @@
|
|
23258
23645
|
}
|
23259
23646
|
function readWord(input, result) {
|
23260
23647
|
for (;;) {
|
23261
|
-
if (input.next != 95 /*
|
23648
|
+
if (input.next != 95 /* Underscore */ && !isAlpha(input.next))
|
23262
23649
|
break;
|
23263
23650
|
if (result != null)
|
23264
23651
|
result += String.fromCharCode(input.next);
|
@@ -23267,7 +23654,7 @@
|
|
23267
23654
|
return result;
|
23268
23655
|
}
|
23269
23656
|
function readWordOrQuoted(input) {
|
23270
|
-
if (input.next == 39 /*
|
23657
|
+
if (input.next == 39 /* SingleQuote */ || input.next == 34 /* DoubleQuote */ || input.next == 96 /* Backtick */) {
|
23271
23658
|
let quote = input.next;
|
23272
23659
|
input.advance();
|
23273
23660
|
readLiteral(input, quote, false);
|
@@ -23277,33 +23664,33 @@
|
|
23277
23664
|
}
|
23278
23665
|
}
|
23279
23666
|
function readBits(input, endQuote) {
|
23280
|
-
while (input.next == 48 /*
|
23667
|
+
while (input.next == 48 /* _0 */ || input.next == 49 /* _1 */)
|
23281
23668
|
input.advance();
|
23282
23669
|
if (endQuote && input.next == endQuote)
|
23283
23670
|
input.advance();
|
23284
23671
|
}
|
23285
23672
|
function readNumber(input, sawDot) {
|
23286
23673
|
for (;;) {
|
23287
|
-
if (input.next == 46 /*
|
23674
|
+
if (input.next == 46 /* Dot */) {
|
23288
23675
|
if (sawDot)
|
23289
23676
|
break;
|
23290
23677
|
sawDot = true;
|
23291
23678
|
}
|
23292
|
-
else if (input.next < 48 /*
|
23679
|
+
else if (input.next < 48 /* _0 */ || input.next > 57 /* _9 */) {
|
23293
23680
|
break;
|
23294
23681
|
}
|
23295
23682
|
input.advance();
|
23296
23683
|
}
|
23297
|
-
if (input.next == 69 /*
|
23684
|
+
if (input.next == 69 /* E */ || input.next == 101 /* e */) {
|
23298
23685
|
input.advance();
|
23299
|
-
if (input.next == 43 /*
|
23686
|
+
if (input.next == 43 /* Plus */ || input.next == 45 /* Dash */)
|
23300
23687
|
input.advance();
|
23301
|
-
while (input.next >= 48 /*
|
23688
|
+
while (input.next >= 48 /* _0 */ && input.next <= 57 /* _9 */)
|
23302
23689
|
input.advance();
|
23303
23690
|
}
|
23304
23691
|
}
|
23305
23692
|
function eol(input) {
|
23306
|
-
while (!(input.next < 0 || input.next == 10 /*
|
23693
|
+
while (!(input.next < 0 || input.next == 10 /* Newline */))
|
23307
23694
|
input.advance();
|
23308
23695
|
}
|
23309
23696
|
function inString(ch, str) {
|
@@ -23363,63 +23750,59 @@
|
|
23363
23750
|
input.advance();
|
23364
23751
|
input.acceptToken(whitespace);
|
23365
23752
|
}
|
23366
|
-
else if (next == 36 /*
|
23753
|
+
else if (next == 36 /* Dollar */ && input.next == 36 /* Dollar */ && d.doubleDollarQuotedStrings) {
|
23367
23754
|
readDoubleDollarLiteral(input);
|
23368
23755
|
input.acceptToken(String$1);
|
23369
23756
|
}
|
23370
|
-
else if (next == 39 /*
|
23757
|
+
else if (next == 39 /* SingleQuote */ || next == 34 /* DoubleQuote */ && d.doubleQuotedStrings) {
|
23371
23758
|
readLiteral(input, next, d.backslashEscapes);
|
23372
23759
|
input.acceptToken(String$1);
|
23373
23760
|
}
|
23374
|
-
else if (next == 35 /*
|
23375
|
-
next == 47 /*
|
23761
|
+
else if (next == 35 /* Hash */ && d.hashComments ||
|
23762
|
+
next == 47 /* Slash */ && input.next == 47 /* Slash */ && d.slashComments) {
|
23376
23763
|
eol(input);
|
23377
23764
|
input.acceptToken(LineComment);
|
23378
23765
|
}
|
23379
|
-
else if (next == 45 /*
|
23380
|
-
(!d.spaceAfterDashes || input.peek(1) == 32 /*
|
23766
|
+
else if (next == 45 /* Dash */ && input.next == 45 /* Dash */ &&
|
23767
|
+
(!d.spaceAfterDashes || input.peek(1) == 32 /* Space */)) {
|
23381
23768
|
eol(input);
|
23382
23769
|
input.acceptToken(LineComment);
|
23383
23770
|
}
|
23384
|
-
else if (next == 47 /*
|
23771
|
+
else if (next == 47 /* Slash */ && input.next == 42 /* Star */) {
|
23385
23772
|
input.advance();
|
23386
|
-
for (let
|
23773
|
+
for (let depth = 1;;) {
|
23774
|
+
let cur = input.next;
|
23387
23775
|
if (input.next < 0)
|
23388
23776
|
break;
|
23389
23777
|
input.advance();
|
23390
|
-
if (
|
23778
|
+
if (cur == 42 /* Star */ && input.next == 47 /* Slash */) {
|
23391
23779
|
depth--;
|
23392
|
-
|
23393
|
-
|
23780
|
+
input.advance();
|
23781
|
+
if (!depth)
|
23394
23782
|
break;
|
23395
|
-
}
|
23396
|
-
prev = -1;
|
23397
23783
|
}
|
23398
|
-
else if (
|
23784
|
+
else if (cur == 47 /* Slash */ && input.next == 42 /* Star */) {
|
23399
23785
|
depth++;
|
23400
|
-
|
23401
|
-
}
|
23402
|
-
else {
|
23403
|
-
prev = input.next;
|
23786
|
+
input.advance();
|
23404
23787
|
}
|
23405
23788
|
}
|
23406
23789
|
input.acceptToken(BlockComment);
|
23407
23790
|
}
|
23408
|
-
else if ((next == 101 /*
|
23791
|
+
else if ((next == 101 /* e */ || next == 69 /* E */) && input.next == 39 /* SingleQuote */) {
|
23409
23792
|
input.advance();
|
23410
|
-
readLiteral(input, 39 /*
|
23793
|
+
readLiteral(input, 39 /* SingleQuote */, true);
|
23411
23794
|
}
|
23412
|
-
else if ((next == 110 /*
|
23795
|
+
else if ((next == 110 /* n */ || next == 78 /* N */) && input.next == 39 /* SingleQuote */ &&
|
23413
23796
|
d.charSetCasts) {
|
23414
23797
|
input.advance();
|
23415
|
-
readLiteral(input, 39 /*
|
23798
|
+
readLiteral(input, 39 /* SingleQuote */, d.backslashEscapes);
|
23416
23799
|
input.acceptToken(String$1);
|
23417
23800
|
}
|
23418
|
-
else if (next == 95 /*
|
23801
|
+
else if (next == 95 /* Underscore */ && d.charSetCasts) {
|
23419
23802
|
for (let i = 0;; i++) {
|
23420
|
-
if (input.next == 39 /*
|
23803
|
+
if (input.next == 39 /* SingleQuote */ && i > 1) {
|
23421
23804
|
input.advance();
|
23422
|
-
readLiteral(input, 39 /*
|
23805
|
+
readLiteral(input, 39 /* SingleQuote */, d.backslashEscapes);
|
23423
23806
|
input.acceptToken(String$1);
|
23424
23807
|
break;
|
23425
23808
|
}
|
@@ -23428,33 +23811,33 @@
|
|
23428
23811
|
input.advance();
|
23429
23812
|
}
|
23430
23813
|
}
|
23431
|
-
else if (next == 40 /*
|
23814
|
+
else if (next == 40 /* ParenL */) {
|
23432
23815
|
input.acceptToken(ParenL);
|
23433
23816
|
}
|
23434
|
-
else if (next == 41 /*
|
23817
|
+
else if (next == 41 /* ParenR */) {
|
23435
23818
|
input.acceptToken(ParenR);
|
23436
23819
|
}
|
23437
|
-
else if (next == 123 /*
|
23820
|
+
else if (next == 123 /* BraceL */) {
|
23438
23821
|
input.acceptToken(BraceL);
|
23439
23822
|
}
|
23440
|
-
else if (next == 125 /*
|
23823
|
+
else if (next == 125 /* BraceR */) {
|
23441
23824
|
input.acceptToken(BraceR);
|
23442
23825
|
}
|
23443
|
-
else if (next == 91 /*
|
23826
|
+
else if (next == 91 /* BracketL */) {
|
23444
23827
|
input.acceptToken(BracketL);
|
23445
23828
|
}
|
23446
|
-
else if (next == 93 /*
|
23829
|
+
else if (next == 93 /* BracketR */) {
|
23447
23830
|
input.acceptToken(BracketR);
|
23448
23831
|
}
|
23449
|
-
else if (next == 59 /*
|
23832
|
+
else if (next == 59 /* Semi */) {
|
23450
23833
|
input.acceptToken(Semi);
|
23451
23834
|
}
|
23452
|
-
else if (d.unquotedBitLiterals && next == 48 /*
|
23835
|
+
else if (d.unquotedBitLiterals && next == 48 /* _0 */ && input.next == 98 /* b */) {
|
23453
23836
|
input.advance();
|
23454
23837
|
readBits(input);
|
23455
23838
|
input.acceptToken(Bits);
|
23456
23839
|
}
|
23457
|
-
else if ((next == 98 /*
|
23840
|
+
else if ((next == 98 /* b */ || next == 66 /* B */) && (input.next == 39 /* SingleQuote */ || input.next == 34 /* DoubleQuote */)) {
|
23458
23841
|
const quoteStyle = input.next;
|
23459
23842
|
input.advance();
|
23460
23843
|
if (d.treatBitsAsBytes) {
|
@@ -23466,24 +23849,24 @@
|
|
23466
23849
|
input.acceptToken(Bits);
|
23467
23850
|
}
|
23468
23851
|
}
|
23469
|
-
else if (next == 48 /*
|
23470
|
-
(next == 120 /*
|
23471
|
-
let quoted = input.next == 39 /*
|
23852
|
+
else if (next == 48 /* _0 */ && (input.next == 120 /* x */ || input.next == 88 /* X */) ||
|
23853
|
+
(next == 120 /* x */ || next == 88 /* X */) && input.next == 39 /* SingleQuote */) {
|
23854
|
+
let quoted = input.next == 39 /* SingleQuote */;
|
23472
23855
|
input.advance();
|
23473
23856
|
while (isHexDigit(input.next))
|
23474
23857
|
input.advance();
|
23475
|
-
if (quoted && input.next == 39 /*
|
23858
|
+
if (quoted && input.next == 39 /* SingleQuote */)
|
23476
23859
|
input.advance();
|
23477
23860
|
input.acceptToken(Number$1);
|
23478
23861
|
}
|
23479
|
-
else if (next == 46 /*
|
23862
|
+
else if (next == 46 /* Dot */ && input.next >= 48 /* _0 */ && input.next <= 57 /* _9 */) {
|
23480
23863
|
readNumber(input, true);
|
23481
23864
|
input.acceptToken(Number$1);
|
23482
23865
|
}
|
23483
|
-
else if (next == 46 /*
|
23866
|
+
else if (next == 46 /* Dot */) {
|
23484
23867
|
input.acceptToken(Dot);
|
23485
23868
|
}
|
23486
|
-
else if (next >= 48 /*
|
23869
|
+
else if (next >= 48 /* _0 */ && next <= 57 /* _9 */) {
|
23487
23870
|
readNumber(input, false);
|
23488
23871
|
input.acceptToken(Number$1);
|
23489
23872
|
}
|
@@ -23502,12 +23885,12 @@
|
|
23502
23885
|
readLiteral(input, next, false);
|
23503
23886
|
input.acceptToken(QuotedIdentifier);
|
23504
23887
|
}
|
23505
|
-
else if (next == 58 /*
|
23888
|
+
else if (next == 58 /* Colon */ || next == 44 /* Comma */) {
|
23506
23889
|
input.acceptToken(Punctuation);
|
23507
23890
|
}
|
23508
23891
|
else if (isAlpha(next)) {
|
23509
23892
|
let word = readWord(input, String.fromCharCode(next));
|
23510
|
-
input.acceptToken(input.next == 46 /*
|
23893
|
+
input.acceptToken(input.next == 46 /* Dot */ ? Identifier : (_a = d.words[word.toLowerCase()]) !== null && _a !== void 0 ? _a : Identifier);
|
23511
23894
|
}
|
23512
23895
|
});
|
23513
23896
|
}
|
@@ -23625,31 +24008,50 @@
|
|
23625
24008
|
this.list = [];
|
23626
24009
|
this.children = undefined;
|
23627
24010
|
}
|
23628
|
-
child(name) {
|
24011
|
+
child(name, idQuote) {
|
23629
24012
|
let children = this.children || (this.children = Object.create(null));
|
23630
|
-
|
24013
|
+
let found = children[name];
|
24014
|
+
if (found)
|
24015
|
+
return found;
|
24016
|
+
if (name)
|
24017
|
+
this.list.push(nameCompletion(name, "type", idQuote));
|
24018
|
+
return (children[name] = new CompletionLevel);
|
23631
24019
|
}
|
23632
|
-
|
23633
|
-
|
24020
|
+
addCompletions(list) {
|
24021
|
+
for (let option of list) {
|
24022
|
+
let found = this.list.findIndex(o => o.label == option.label);
|
24023
|
+
if (found > -1)
|
24024
|
+
this.list[found] = option;
|
24025
|
+
else
|
24026
|
+
this.list.push(option);
|
24027
|
+
}
|
23634
24028
|
}
|
23635
24029
|
}
|
23636
|
-
function
|
24030
|
+
function nameCompletion(label, type, idQuote) {
|
24031
|
+
if (!/[^\w\xb5-\uffff]/.test(label))
|
24032
|
+
return { label, type };
|
24033
|
+
return { label, type, apply: idQuote + label + idQuote };
|
24034
|
+
}
|
24035
|
+
function completeFromSchema(schema, tables, schemas, defaultTableName, defaultSchemaName, dialect) {
|
24036
|
+
var _a;
|
23637
24037
|
let top = new CompletionLevel;
|
23638
|
-
let
|
24038
|
+
let idQuote = ((_a = dialect === null || dialect === void 0 ? void 0 : dialect.spec.identifierQuotes) === null || _a === void 0 ? void 0 : _a[0]) || '"';
|
24039
|
+
let defaultSchema = top.child(defaultSchemaName || "", idQuote);
|
23639
24040
|
for (let table in schema) {
|
23640
|
-
let
|
23641
|
-
let
|
23642
|
-
|
23643
|
-
|
23644
|
-
|
23645
|
-
|
23646
|
-
|
23647
|
-
|
23648
|
-
|
23649
|
-
|
23650
|
-
|
23651
|
-
|
23652
|
-
|
24041
|
+
let parts = table.split("."), base = parts.length == 1 ? defaultSchema : top;
|
24042
|
+
for (let part of parts)
|
24043
|
+
base = base.child(part, idQuote);
|
24044
|
+
for (let option of schema[table])
|
24045
|
+
if (option)
|
24046
|
+
base.list.push(typeof option == "string" ? nameCompletion(option, "property", idQuote) : option);
|
24047
|
+
}
|
24048
|
+
if (tables)
|
24049
|
+
defaultSchema.addCompletions(tables);
|
24050
|
+
if (schemas)
|
24051
|
+
top.addCompletions(schemas);
|
24052
|
+
top.addCompletions(defaultSchema.list);
|
24053
|
+
if (defaultTableName)
|
24054
|
+
top.addCompletions(defaultSchema.child(defaultTableName, idQuote).list);
|
23653
24055
|
return (context) => {
|
23654
24056
|
let { parents, from, quoted, empty, aliases } = sourceContext(context.state, context.pos);
|
23655
24057
|
if (empty && !context.explicit)
|
@@ -23662,11 +24064,11 @@
|
|
23662
24064
|
if (level == top)
|
23663
24065
|
level = defaultSchema;
|
23664
24066
|
else if (level == defaultSchema && defaultTableName)
|
23665
|
-
level = level.child(defaultTableName);
|
24067
|
+
level = level.child(defaultTableName, idQuote);
|
23666
24068
|
else
|
23667
24069
|
return null;
|
23668
24070
|
}
|
23669
|
-
level = level.child(name);
|
24071
|
+
level = level.child(name, idQuote);
|
23670
24072
|
}
|
23671
24073
|
let quoteAfter = quoted && context.state.sliceDoc(context.pos, context.pos + 1) == quoted;
|
23672
24074
|
let options = level.list;
|
@@ -23733,9 +24135,14 @@
|
|
23733
24135
|
/**
|
23734
24136
|
The language for this dialect.
|
23735
24137
|
*/
|
23736
|
-
language
|
24138
|
+
language,
|
24139
|
+
/**
|
24140
|
+
The spec used to define this dialect.
|
24141
|
+
*/
|
24142
|
+
spec) {
|
23737
24143
|
this.dialect = dialect;
|
23738
24144
|
this.language = language;
|
24145
|
+
this.spec = spec;
|
23739
24146
|
}
|
23740
24147
|
/**
|
23741
24148
|
Returns the language for this dialect as an extension.
|
@@ -23756,7 +24163,7 @@
|
|
23756
24163
|
closeBrackets: { brackets: ["(", "[", "{", "'", '"', "`"] }
|
23757
24164
|
}
|
23758
24165
|
});
|
23759
|
-
return new SQLDialect(d, language);
|
24166
|
+
return new SQLDialect(d, language, spec);
|
23760
24167
|
}
|
23761
24168
|
}
|
23762
24169
|
/**
|
@@ -23771,9 +24178,13 @@
|
|
23771
24178
|
for the given configuration.
|
23772
24179
|
*/
|
23773
24180
|
function schemaCompletionSource(config) {
|
23774
|
-
return config.schema ? completeFromSchema(config.schema, config.tables, config.schemas, config.defaultTable, config.defaultSchema)
|
24181
|
+
return config.schema ? completeFromSchema(config.schema, config.tables, config.schemas, config.defaultTable, config.defaultSchema, config.dialect || StandardSQL)
|
23775
24182
|
: () => null;
|
23776
24183
|
}
|
24184
|
+
/**
|
24185
|
+
The standard SQL dialect.
|
24186
|
+
*/
|
24187
|
+
const StandardSQL = /*@__PURE__*/SQLDialect.define({});
|
23777
24188
|
const MySQLKeywords = "accessible algorithm analyze asensitive authors auto_increment autocommit avg avg_row_length binlog btree cache catalog_name chain change changed checkpoint checksum class_origin client_statistics coalesce code collations columns comment committed completion concurrent consistent contains contributors convert database databases day_hour day_microsecond day_minute day_second delay_key_write delayed delimiter des_key_file dev_pop dev_samp deviance directory disable discard distinctrow div dual dumpfile enable enclosed ends engine engines enum errors escaped even event events every explain extended fast field fields flush force found_rows fulltext grants handler hash high_priority hosts hour_microsecond hour_minute hour_second ignore ignore_server_ids import index index_statistics infile innodb insensitive insert_method install invoker iterate keys kill linear lines list load lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modify mutex mysql_errno no_write_to_binlog offline offset one online optimize optionally outfile pack_keys parser partition partitions password phase plugin plugins prev processlist profile profiles purge query quick range read_write rebuild recover regexp relaylog remove rename reorganize repair repeatable replace require resume rlike row_format rtree schedule schema_name schemas second_microsecond security sensitive separator serializable server share show slave slow snapshot soname spatial sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result ssl starting starts std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace terminated triggers truncate uncommitted uninstall unlock upgrade use use_frm user_resources user_statistics utc_date utc_time utc_timestamp variables views warnings xa xor year_month zerofill";
|
23778
24189
|
const MySQLTypes = SQLTypes + "bool blob long longblob longtext medium mediumblob mediumint mediumtext tinyblob tinyint tinytext text bigint int1 int2 int3 int4 int8 float4 float8 varbinary varcharacter precision datetime unsigned signed";
|
23779
24190
|
const MySQLBuiltin = "charset clear edit ego help nopager notee nowarning pager print prompt quit rehash source status system tee";
|