codemirror-rails 5.0 → 5.1
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/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +104 -64
- data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +144 -121
- data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +4 -2
- data/vendor/assets/javascripts/codemirror/addons/hint/css-hint.js +4 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +13 -8
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +2 -0
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +40 -0
- data/vendor/assets/javascripts/codemirror/addons/mode/multiplex_test.js +33 -0
- data/vendor/assets/javascripts/codemirror/addons/scroll/simplescrollbars.js +8 -2
- data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +1 -1
- data/vendor/assets/javascripts/codemirror/keymaps/sublime.js +13 -0
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +43 -54
- data/vendor/assets/javascripts/codemirror/modes/asciiarmor.js +73 -0
- data/vendor/assets/javascripts/codemirror/modes/clike.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/clojure.js +1 -0
- data/vendor/assets/javascripts/codemirror/modes/cmake.js +97 -0
- data/vendor/assets/javascripts/codemirror/modes/commonlisp.js +1 -0
- data/vendor/assets/javascripts/codemirror/modes/css.js +1 -0
- data/vendor/assets/javascripts/codemirror/modes/groovy.js +1 -0
- data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +18 -76
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +5 -0
- data/vendor/assets/javascripts/codemirror/modes/kotlin.js +1 -0
- data/vendor/assets/javascripts/codemirror/modes/less_test.js +51 -0
- data/vendor/assets/javascripts/codemirror/modes/mllike.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/properties.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/python.js +1 -0
- data/vendor/assets/javascripts/codemirror/modes/sass.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/scheme.js +1 -0
- data/vendor/assets/javascripts/codemirror/modes/scss_test.js +110 -0
- data/vendor/assets/javascripts/codemirror/modes/smarty.js +100 -107
- data/vendor/assets/javascripts/codemirror/modes/stylus.js +651 -332
- data/vendor/assets/javascripts/codemirror/modes/test.js +67 -0
- data/vendor/assets/javascripts/codemirror/modes/troff.js +82 -0
- data/vendor/assets/javascripts/codemirror/modes/vb.js +6 -5
- data/vendor/assets/javascripts/codemirror/modes/verilog.js +53 -53
- data/vendor/assets/stylesheets/codemirror.css +11 -8
- data/vendor/assets/stylesheets/codemirror/themes/mdn-like.css +1 -1
- metadata +9 -3
- data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +0 -197
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb8e0f584aeb96820145217fba9658635664ce33
|
4
|
+
data.tar.gz: 91c2ff5b741853b45e908e33b5c940e5f1d8bc3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c779e40abb5943d41d80f957e9e311d2fe4e191a2ad56e007f6225771c9bc0189d5b22fca1885289fd0ab01af7224777230b4533e21a3df5c4c69323aaf01c2c
|
7
|
+
data.tar.gz: 154d437fc78cbfdd03e7bdde74a734a54b098edc1bce1ac4c4cd2c742a8c02135ded6af0731bd91fe2a2f819bc47a5231964e0a58ca3378f12b28c8c74450a3e
|
@@ -82,12 +82,15 @@
|
|
82
82
|
keyMaps: [], // stores maps added by addKeyMap
|
83
83
|
overlays: [], // highlighting overlays, as added by addOverlay
|
84
84
|
modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info
|
85
|
-
overwrite: false,
|
85
|
+
overwrite: false,
|
86
|
+
delayingBlurEvent: false,
|
87
|
+
focused: false,
|
86
88
|
suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
|
87
89
|
pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll
|
88
90
|
draggingText: false,
|
89
91
|
highlight: new Delayed(), // stores highlight worker timeout
|
90
|
-
keySeq: null // Unfinished key sequence
|
92
|
+
keySeq: null, // Unfinished key sequence
|
93
|
+
specialChars: null
|
91
94
|
};
|
92
95
|
|
93
96
|
var cm = this;
|
@@ -591,7 +594,7 @@
|
|
591
594
|
"CodeMirror-linenumber CodeMirror-gutter-elt"));
|
592
595
|
var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
|
593
596
|
display.lineGutter.style.width = "";
|
594
|
-
display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);
|
597
|
+
display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;
|
595
598
|
display.lineNumWidth = display.lineNumInnerWidth + padding;
|
596
599
|
display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
|
597
600
|
display.lineGutter.style.width = display.lineNumWidth + "px";
|
@@ -1381,8 +1384,14 @@
|
|
1381
1384
|
return false;
|
1382
1385
|
}
|
1383
1386
|
|
1384
|
-
if (
|
1385
|
-
|
1387
|
+
if (cm.doc.sel == cm.display.selForContextMenu) {
|
1388
|
+
if (text.charCodeAt(0) == 0x200b) {
|
1389
|
+
if (!prevInput) prevInput = "\u200b";
|
1390
|
+
} else if (prevInput == "\u200b") {
|
1391
|
+
text = text.slice(1);
|
1392
|
+
prevInput = "";
|
1393
|
+
}
|
1394
|
+
}
|
1386
1395
|
// Find the part of the input that is actually new
|
1387
1396
|
var same = 0, l = Math.min(prevInput.length, text.length);
|
1388
1397
|
while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
|
@@ -1458,7 +1467,7 @@
|
|
1458
1467
|
if (te.selectionStart != null) {
|
1459
1468
|
if (!ie || (ie && ie_version < 9)) prepareSelectAllHack();
|
1460
1469
|
var i = 0, poll = function() {
|
1461
|
-
if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0)
|
1470
|
+
if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && input.prevInput == "\u200b")
|
1462
1471
|
operation(cm, commands.selectAll)(cm);
|
1463
1472
|
else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);
|
1464
1473
|
else display.input.reset();
|
@@ -1491,6 +1500,7 @@
|
|
1491
1500
|
this.cm = cm;
|
1492
1501
|
this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;
|
1493
1502
|
this.polling = new Delayed();
|
1503
|
+
this.gracePeriod = false;
|
1494
1504
|
}
|
1495
1505
|
|
1496
1506
|
ContentEditableInput.prototype = copyObj({
|
@@ -1625,10 +1635,21 @@
|
|
1625
1635
|
sel.removeAllRanges();
|
1626
1636
|
sel.addRange(rng);
|
1627
1637
|
if (old && sel.anchorNode == null) sel.addRange(old);
|
1638
|
+
else if (gecko) this.startGracePeriod();
|
1628
1639
|
}
|
1629
1640
|
this.rememberSelection();
|
1630
1641
|
},
|
1631
1642
|
|
1643
|
+
startGracePeriod: function() {
|
1644
|
+
var input = this;
|
1645
|
+
clearTimeout(this.gracePeriod);
|
1646
|
+
this.gracePeriod = setTimeout(function() {
|
1647
|
+
input.gracePeriod = false;
|
1648
|
+
if (input.selectionChanged())
|
1649
|
+
input.cm.operation(function() { input.cm.curOp.selectionChanged = true; });
|
1650
|
+
}, 20);
|
1651
|
+
},
|
1652
|
+
|
1632
1653
|
showMultipleSelections: function(info) {
|
1633
1654
|
removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);
|
1634
1655
|
removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);
|
@@ -1671,12 +1692,15 @@
|
|
1671
1692
|
this.polling.set(this.cm.options.pollInterval, poll);
|
1672
1693
|
},
|
1673
1694
|
|
1674
|
-
|
1675
|
-
|
1695
|
+
selectionChanged: function() {
|
1696
|
+
var sel = window.getSelection();
|
1697
|
+
return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
|
1698
|
+
sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset;
|
1699
|
+
},
|
1676
1700
|
|
1677
|
-
|
1678
|
-
if (
|
1679
|
-
|
1701
|
+
pollSelection: function() {
|
1702
|
+
if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
|
1703
|
+
var sel = window.getSelection(), cm = this.cm;
|
1680
1704
|
this.rememberSelection();
|
1681
1705
|
var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
|
1682
1706
|
var head = domToPos(cm, sel.focusNode, sel.focusOffset);
|
@@ -3475,6 +3499,7 @@
|
|
3475
3499
|
break;
|
3476
3500
|
case 3:
|
3477
3501
|
if (captureRightClick) onContextMenu(cm, e);
|
3502
|
+
else delayBlurEvent(cm);
|
3478
3503
|
break;
|
3479
3504
|
}
|
3480
3505
|
}
|
@@ -3517,10 +3542,11 @@
|
|
3517
3542
|
e_preventDefault(e2);
|
3518
3543
|
if (!modifier)
|
3519
3544
|
extendSelection(cm.doc, start);
|
3520
|
-
|
3521
|
-
|
3522
|
-
if (ie && ie_version == 9)
|
3545
|
+
// Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
|
3546
|
+
if (webkit || ie && ie_version == 9)
|
3523
3547
|
setTimeout(function() {document.body.focus(); display.input.focus();}, 20);
|
3548
|
+
else
|
3549
|
+
display.input.focus();
|
3524
3550
|
}
|
3525
3551
|
});
|
3526
3552
|
// Let the drag handler handle this.
|
@@ -3546,6 +3572,7 @@
|
|
3546
3572
|
ourRange = new Range(start, start);
|
3547
3573
|
} else {
|
3548
3574
|
ourRange = doc.sel.primary();
|
3575
|
+
ourIndex = doc.sel.primIndex;
|
3549
3576
|
}
|
3550
3577
|
|
3551
3578
|
if (e.altKey) {
|
@@ -3577,7 +3604,7 @@
|
|
3577
3604
|
ourIndex = ranges.length;
|
3578
3605
|
setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex),
|
3579
3606
|
{scroll: false, origin: "*mouse"});
|
3580
|
-
} else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single") {
|
3607
|
+
} else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single" && !e.shiftKey) {
|
3581
3608
|
setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0));
|
3582
3609
|
startSel = doc.sel;
|
3583
3610
|
} else {
|
@@ -4050,7 +4077,19 @@
|
|
4050
4077
|
|
4051
4078
|
// FOCUS/BLUR EVENTS
|
4052
4079
|
|
4080
|
+
function delayBlurEvent(cm) {
|
4081
|
+
cm.state.delayingBlurEvent = true;
|
4082
|
+
setTimeout(function() {
|
4083
|
+
if (cm.state.delayingBlurEvent) {
|
4084
|
+
cm.state.delayingBlurEvent = false;
|
4085
|
+
onBlur(cm);
|
4086
|
+
}
|
4087
|
+
}, 100);
|
4088
|
+
}
|
4089
|
+
|
4053
4090
|
function onFocus(cm) {
|
4091
|
+
if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false;
|
4092
|
+
|
4054
4093
|
if (cm.options.readOnly == "nocursor") return;
|
4055
4094
|
if (!cm.state.focused) {
|
4056
4095
|
signal(cm, "focus", cm);
|
@@ -4068,6 +4107,8 @@
|
|
4068
4107
|
restartBlink(cm);
|
4069
4108
|
}
|
4070
4109
|
function onBlur(cm) {
|
4110
|
+
if (cm.state.delayingBlurEvent) return;
|
4111
|
+
|
4071
4112
|
if (cm.state.focused) {
|
4072
4113
|
signal(cm, "blur", cm);
|
4073
4114
|
cm.state.focused = false;
|
@@ -4824,7 +4865,7 @@
|
|
4824
4865
|
|
4825
4866
|
getHelpers: function(pos, type) {
|
4826
4867
|
var found = [];
|
4827
|
-
if (!helpers.hasOwnProperty(type)) return
|
4868
|
+
if (!helpers.hasOwnProperty(type)) return found;
|
4828
4869
|
var help = helpers[type], mode = this.getModeAt(pos);
|
4829
4870
|
if (typeof mode[type] == "string") {
|
4830
4871
|
if (help[mode[type]]) found.push(help[mode[type]]);
|
@@ -4906,12 +4947,6 @@
|
|
4906
4947
|
});
|
4907
4948
|
}),
|
4908
4949
|
|
4909
|
-
addLineWidget: methodOp(function(handle, node, options) {
|
4910
|
-
return addLineWidget(this, handle, node, options);
|
4911
|
-
}),
|
4912
|
-
|
4913
|
-
removeLineWidget: function(widget) { widget.clear(); },
|
4914
|
-
|
4915
4950
|
lineInfo: function(line) {
|
4916
4951
|
if (typeof line == "number") {
|
4917
4952
|
if (!isLine(this.doc, line)) return null;
|
@@ -5186,10 +5221,10 @@
|
|
5186
5221
|
clearCaches(cm);
|
5187
5222
|
regChange(cm);
|
5188
5223
|
}, true);
|
5189
|
-
option("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val) {
|
5190
|
-
cm.
|
5191
|
-
cm.refresh();
|
5192
|
-
}
|
5224
|
+
option("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val, old) {
|
5225
|
+
cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
|
5226
|
+
if (old != CodeMirror.Init) cm.refresh();
|
5227
|
+
});
|
5193
5228
|
option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);
|
5194
5229
|
option("electricChars", true);
|
5195
5230
|
option("inputStyle", mobile ? "contenteditable" : "textarea", function() {
|
@@ -6431,10 +6466,10 @@
|
|
6431
6466
|
|
6432
6467
|
// Line widgets are block elements displayed above or below a line.
|
6433
6468
|
|
6434
|
-
var LineWidget = CodeMirror.LineWidget = function(
|
6469
|
+
var LineWidget = CodeMirror.LineWidget = function(doc, node, options) {
|
6435
6470
|
if (options) for (var opt in options) if (options.hasOwnProperty(opt))
|
6436
6471
|
this[opt] = options[opt];
|
6437
|
-
this.
|
6472
|
+
this.doc = doc;
|
6438
6473
|
this.node = node;
|
6439
6474
|
};
|
6440
6475
|
eventMixin(LineWidget);
|
@@ -6445,52 +6480,55 @@
|
|
6445
6480
|
}
|
6446
6481
|
|
6447
6482
|
LineWidget.prototype.clear = function() {
|
6448
|
-
var cm = this.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
|
6483
|
+
var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
|
6449
6484
|
if (no == null || !ws) return;
|
6450
6485
|
for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);
|
6451
6486
|
if (!ws.length) line.widgets = null;
|
6452
6487
|
var height = widgetHeight(this);
|
6453
|
-
|
6488
|
+
updateLineHeight(line, Math.max(0, line.height - height));
|
6489
|
+
if (cm) runInOp(cm, function() {
|
6454
6490
|
adjustScrollWhenAboveVisible(cm, line, -height);
|
6455
6491
|
regLineChange(cm, no, "widget");
|
6456
|
-
updateLineHeight(line, Math.max(0, line.height - height));
|
6457
6492
|
});
|
6458
6493
|
};
|
6459
6494
|
LineWidget.prototype.changed = function() {
|
6460
|
-
var oldH = this.height, cm = this.cm, line = this.line;
|
6495
|
+
var oldH = this.height, cm = this.doc.cm, line = this.line;
|
6461
6496
|
this.height = null;
|
6462
6497
|
var diff = widgetHeight(this) - oldH;
|
6463
6498
|
if (!diff) return;
|
6464
|
-
|
6499
|
+
updateLineHeight(line, line.height + diff);
|
6500
|
+
if (cm) runInOp(cm, function() {
|
6465
6501
|
cm.curOp.forceUpdate = true;
|
6466
6502
|
adjustScrollWhenAboveVisible(cm, line, diff);
|
6467
|
-
updateLineHeight(line, line.height + diff);
|
6468
6503
|
});
|
6469
6504
|
};
|
6470
6505
|
|
6471
6506
|
function widgetHeight(widget) {
|
6472
6507
|
if (widget.height != null) return widget.height;
|
6508
|
+
var cm = widget.doc.cm;
|
6509
|
+
if (!cm) return 0;
|
6473
6510
|
if (!contains(document.body, widget.node)) {
|
6474
6511
|
var parentStyle = "position: relative;";
|
6475
6512
|
if (widget.coverGutter)
|
6476
|
-
parentStyle += "margin-left: -" +
|
6513
|
+
parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;";
|
6477
6514
|
if (widget.noHScroll)
|
6478
|
-
parentStyle += "width: " +
|
6479
|
-
removeChildrenAndAdd(
|
6515
|
+
parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;";
|
6516
|
+
removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
|
6480
6517
|
}
|
6481
6518
|
return widget.height = widget.node.offsetHeight;
|
6482
6519
|
}
|
6483
6520
|
|
6484
|
-
function addLineWidget(
|
6485
|
-
var widget = new LineWidget(
|
6486
|
-
|
6487
|
-
|
6521
|
+
function addLineWidget(doc, handle, node, options) {
|
6522
|
+
var widget = new LineWidget(doc, node, options);
|
6523
|
+
var cm = doc.cm;
|
6524
|
+
if (cm && widget.noHScroll) cm.display.alignWidgets = true;
|
6525
|
+
changeLine(doc, handle, "widget", function(line) {
|
6488
6526
|
var widgets = line.widgets || (line.widgets = []);
|
6489
6527
|
if (widget.insertAt == null) widgets.push(widget);
|
6490
6528
|
else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);
|
6491
6529
|
widget.line = line;
|
6492
|
-
if (!lineIsHidden(
|
6493
|
-
var aboveVisible = heightAtLine(line) <
|
6530
|
+
if (cm && !lineIsHidden(doc, line)) {
|
6531
|
+
var aboveVisible = heightAtLine(line) < doc.scrollTop;
|
6494
6532
|
updateLineHeight(line, line.height + widgetHeight(widget));
|
6495
6533
|
if (aboveVisible) addToScrollPos(cm, null, widget.height);
|
6496
6534
|
cm.curOp.forceUpdate = true;
|
@@ -6710,7 +6748,9 @@
|
|
6710
6748
|
// is needed on Webkit to be able to get line-level bounding
|
6711
6749
|
// rectangles for it (in measureChar).
|
6712
6750
|
var content = elt("span", null, null, webkit ? "padding-right: .1px" : null);
|
6713
|
-
var builder = {pre: elt("pre", [content]), content: content,
|
6751
|
+
var builder = {pre: elt("pre", [content]), content: content,
|
6752
|
+
col: 0, pos: 0, cm: cm,
|
6753
|
+
splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")};
|
6714
6754
|
lineView.measure = {};
|
6715
6755
|
|
6716
6756
|
// Iterate over the logical lines that make up this visual line.
|
@@ -6720,8 +6760,6 @@
|
|
6720
6760
|
builder.addToken = buildToken;
|
6721
6761
|
// Optionally wire in some hacks into the token-rendering
|
6722
6762
|
// algorithm, to deal with browser quirks.
|
6723
|
-
if ((ie || webkit) && cm.getOption("lineWrapping"))
|
6724
|
-
builder.addToken = buildTokenSplitSpaces(builder.addToken);
|
6725
6763
|
if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))
|
6726
6764
|
builder.addToken = buildTokenBadBidi(builder.addToken, order);
|
6727
6765
|
builder.map = [];
|
@@ -6770,10 +6808,11 @@
|
|
6770
6808
|
// the line map. Takes care to render special characters separately.
|
6771
6809
|
function buildToken(builder, text, style, startStyle, endStyle, title, css) {
|
6772
6810
|
if (!text) return;
|
6773
|
-
var
|
6811
|
+
var displayText = builder.splitSpaces ? text.replace(/ {3,}/g, splitSpaces) : text;
|
6812
|
+
var special = builder.cm.state.specialChars, mustWrap = false;
|
6774
6813
|
if (!special.test(text)) {
|
6775
6814
|
builder.col += text.length;
|
6776
|
-
var content = document.createTextNode(
|
6815
|
+
var content = document.createTextNode(displayText);
|
6777
6816
|
builder.map.push(builder.pos, builder.pos + text.length, content);
|
6778
6817
|
if (ie && ie_version < 9) mustWrap = true;
|
6779
6818
|
builder.pos += text.length;
|
@@ -6784,7 +6823,7 @@
|
|
6784
6823
|
var m = special.exec(text);
|
6785
6824
|
var skipped = m ? m.index - pos : text.length - pos;
|
6786
6825
|
if (skipped) {
|
6787
|
-
var txt = document.createTextNode(
|
6826
|
+
var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
|
6788
6827
|
if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
|
6789
6828
|
else content.appendChild(txt);
|
6790
6829
|
builder.map.push(builder.pos, builder.pos + skipped, txt);
|
@@ -6821,22 +6860,17 @@
|
|
6821
6860
|
builder.content.appendChild(content);
|
6822
6861
|
}
|
6823
6862
|
|
6824
|
-
function
|
6825
|
-
|
6826
|
-
|
6827
|
-
|
6828
|
-
|
6829
|
-
return out;
|
6830
|
-
}
|
6831
|
-
return function(builder, text, style, startStyle, endStyle, title) {
|
6832
|
-
inner(builder, text.replace(/ {3,}/g, split), style, startStyle, endStyle, title);
|
6833
|
-
};
|
6863
|
+
function splitSpaces(old) {
|
6864
|
+
var out = " ";
|
6865
|
+
for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0";
|
6866
|
+
out += " ";
|
6867
|
+
return out;
|
6834
6868
|
}
|
6835
6869
|
|
6836
6870
|
// Work around nonsense dimensions being reported for stretches of
|
6837
6871
|
// right-to-left text.
|
6838
6872
|
function buildTokenBadBidi(inner, order) {
|
6839
|
-
return function(builder, text, style, startStyle, endStyle, title) {
|
6873
|
+
return function(builder, text, style, startStyle, endStyle, title, css) {
|
6840
6874
|
style = style ? style + " cm-force-border" : "cm-force-border";
|
6841
6875
|
var start = builder.pos, end = start + text.length;
|
6842
6876
|
for (;;) {
|
@@ -6845,8 +6879,8 @@
|
|
6845
6879
|
var part = order[i];
|
6846
6880
|
if (part.to > start && part.from <= start) break;
|
6847
6881
|
}
|
6848
|
-
if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title);
|
6849
|
-
inner(builder, text.slice(0, part.to - start), style, startStyle, null, title);
|
6882
|
+
if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title, css);
|
6883
|
+
inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css);
|
6850
6884
|
startStyle = null;
|
6851
6885
|
text = text.slice(part.to - start);
|
6852
6886
|
start = part.to;
|
@@ -7368,13 +7402,19 @@
|
|
7368
7402
|
});
|
7369
7403
|
}),
|
7370
7404
|
|
7405
|
+
addLineWidget: docMethodOp(function(handle, node, options) {
|
7406
|
+
return addLineWidget(this, handle, node, options);
|
7407
|
+
}),
|
7408
|
+
removeLineWidget: function(widget) { widget.clear(); },
|
7409
|
+
|
7371
7410
|
markText: function(from, to, options) {
|
7372
7411
|
return markText(this, clipPos(this, from), clipPos(this, to), options, "range");
|
7373
7412
|
},
|
7374
7413
|
setBookmark: function(pos, options) {
|
7375
7414
|
var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
|
7376
7415
|
insertLeft: options && options.insertLeft,
|
7377
|
-
clearWhenEmpty: false, shared: options && options.shared
|
7416
|
+
clearWhenEmpty: false, shared: options && options.shared,
|
7417
|
+
handleMouseEvents: options && options.handleMouseEvents};
|
7378
7418
|
pos = clipPos(this, pos);
|
7379
7419
|
return markText(this, pos, pos, realOpts, "bookmark");
|
7380
7420
|
},
|
@@ -8639,7 +8679,7 @@
|
|
8639
8679
|
|
8640
8680
|
// THE END
|
8641
8681
|
|
8642
|
-
CodeMirror.version = "5.
|
8682
|
+
CodeMirror.version = "5.1.0";
|
8643
8683
|
|
8644
8684
|
return CodeMirror;
|
8645
8685
|
});
|
@@ -9,29 +9,157 @@
|
|
9
9
|
else // Plain browser env
|
10
10
|
mod(CodeMirror);
|
11
11
|
})(function(CodeMirror) {
|
12
|
-
var
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
var defaults = {
|
13
|
+
pairs: "()[]{}''\"\"",
|
14
|
+
triples: "",
|
15
|
+
explode: "[]{}"
|
16
|
+
};
|
16
17
|
|
17
18
|
var Pos = CodeMirror.Pos;
|
18
19
|
|
19
20
|
CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {
|
20
|
-
if (old != CodeMirror.Init
|
21
|
-
cm.removeKeyMap(
|
22
|
-
|
23
|
-
|
24
|
-
if (
|
25
|
-
|
26
|
-
|
27
|
-
if (val.triples != null) triples = val.triples;
|
28
|
-
if (val.explode != null) explode = val.explode;
|
21
|
+
if (old && old != CodeMirror.Init) {
|
22
|
+
cm.removeKeyMap(keyMap);
|
23
|
+
cm.state.closeBrackets = null;
|
24
|
+
}
|
25
|
+
if (val) {
|
26
|
+
cm.state.closeBrackets = val;
|
27
|
+
cm.addKeyMap(keyMap);
|
29
28
|
}
|
30
|
-
var map = buildKeymap(pairs, triples);
|
31
|
-
if (explode) map.Enter = buildExplodeHandler(explode);
|
32
|
-
cm.addKeyMap(map);
|
33
29
|
});
|
34
30
|
|
31
|
+
function getOption(conf, name) {
|
32
|
+
if (name == "pairs" && typeof conf == "string") return conf;
|
33
|
+
if (typeof conf == "object" && conf[name] != null) return conf[name];
|
34
|
+
return defaults[name];
|
35
|
+
}
|
36
|
+
|
37
|
+
var bind = defaults.pairs + "`";
|
38
|
+
var keyMap = {Backspace: handleBackspace, Enter: handleEnter};
|
39
|
+
for (var i = 0; i < bind.length; i++)
|
40
|
+
keyMap["'" + bind.charAt(i) + "'"] = handler(bind.charAt(i));
|
41
|
+
|
42
|
+
function handler(ch) {
|
43
|
+
return function(cm) { return handleChar(cm, ch); };
|
44
|
+
}
|
45
|
+
|
46
|
+
function getConfig(cm) {
|
47
|
+
var deflt = cm.state.closeBrackets;
|
48
|
+
if (!deflt) return null;
|
49
|
+
var mode = cm.getModeAt(cm.getCursor());
|
50
|
+
return mode.closeBrackets || deflt;
|
51
|
+
}
|
52
|
+
|
53
|
+
function handleBackspace(cm) {
|
54
|
+
var conf = getConfig(cm);
|
55
|
+
if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
|
56
|
+
|
57
|
+
var pairs = getOption(conf, "pairs");
|
58
|
+
var ranges = cm.listSelections();
|
59
|
+
for (var i = 0; i < ranges.length; i++) {
|
60
|
+
if (!ranges[i].empty()) return CodeMirror.Pass;
|
61
|
+
var around = charsAround(cm, ranges[i].head);
|
62
|
+
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
|
63
|
+
}
|
64
|
+
for (var i = ranges.length - 1; i >= 0; i--) {
|
65
|
+
var cur = ranges[i].head;
|
66
|
+
cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1));
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
function handleEnter(cm) {
|
71
|
+
var conf = getConfig(cm);
|
72
|
+
var explode = conf && getOption(conf, "explode");
|
73
|
+
if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass;
|
74
|
+
|
75
|
+
var ranges = cm.listSelections();
|
76
|
+
for (var i = 0; i < ranges.length; i++) {
|
77
|
+
if (!ranges[i].empty()) return CodeMirror.Pass;
|
78
|
+
var around = charsAround(cm, ranges[i].head);
|
79
|
+
if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;
|
80
|
+
}
|
81
|
+
cm.operation(function() {
|
82
|
+
cm.replaceSelection("\n\n", null);
|
83
|
+
cm.execCommand("goCharLeft");
|
84
|
+
ranges = cm.listSelections();
|
85
|
+
for (var i = 0; i < ranges.length; i++) {
|
86
|
+
var line = ranges[i].head.line;
|
87
|
+
cm.indentLine(line, null, true);
|
88
|
+
cm.indentLine(line + 1, null, true);
|
89
|
+
}
|
90
|
+
});
|
91
|
+
}
|
92
|
+
|
93
|
+
function handleChar(cm, ch) {
|
94
|
+
var conf = getConfig(cm);
|
95
|
+
if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
|
96
|
+
|
97
|
+
var pairs = getOption(conf, "pairs");
|
98
|
+
var pos = pairs.indexOf(ch);
|
99
|
+
if (pos == -1) return CodeMirror.Pass;
|
100
|
+
var triples = getOption(conf, "triples");
|
101
|
+
|
102
|
+
var identical = pairs.charAt(pos + 1) == ch;
|
103
|
+
var ranges = cm.listSelections();
|
104
|
+
var opening = pos % 2 == 0;
|
105
|
+
|
106
|
+
var type, next;
|
107
|
+
for (var i = 0; i < ranges.length; i++) {
|
108
|
+
var range = ranges[i], cur = range.head, curType;
|
109
|
+
var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
|
110
|
+
if (opening && !range.empty()) {
|
111
|
+
curType = "surround";
|
112
|
+
} else if ((identical || !opening) && next == ch) {
|
113
|
+
if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch)
|
114
|
+
curType = "skipThree";
|
115
|
+
else
|
116
|
+
curType = "skip";
|
117
|
+
} else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 &&
|
118
|
+
cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch &&
|
119
|
+
(cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != ch)) {
|
120
|
+
curType = "addFour";
|
121
|
+
} else if (identical) {
|
122
|
+
if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, ch)) curType = "both";
|
123
|
+
else return CodeMirror.Pass;
|
124
|
+
} else if (opening && (cm.getLine(cur.line).length == cur.ch ||
|
125
|
+
isClosingBracket(next, pairs) ||
|
126
|
+
/\s/.test(next))) {
|
127
|
+
curType = "both";
|
128
|
+
} else {
|
129
|
+
return CodeMirror.Pass;
|
130
|
+
}
|
131
|
+
if (!type) type = curType;
|
132
|
+
else if (type != curType) return CodeMirror.Pass;
|
133
|
+
}
|
134
|
+
|
135
|
+
var left = pos % 2 ? pairs.charAt(pos - 1) : ch;
|
136
|
+
var right = pos % 2 ? ch : pairs.charAt(pos + 1);
|
137
|
+
cm.operation(function() {
|
138
|
+
if (type == "skip") {
|
139
|
+
cm.execCommand("goCharRight");
|
140
|
+
} else if (type == "skipThree") {
|
141
|
+
for (var i = 0; i < 3; i++)
|
142
|
+
cm.execCommand("goCharRight");
|
143
|
+
} else if (type == "surround") {
|
144
|
+
var sels = cm.getSelections();
|
145
|
+
for (var i = 0; i < sels.length; i++)
|
146
|
+
sels[i] = left + sels[i] + right;
|
147
|
+
cm.replaceSelections(sels, "around");
|
148
|
+
} else if (type == "both") {
|
149
|
+
cm.replaceSelection(left + right, null);
|
150
|
+
cm.execCommand("goCharLeft");
|
151
|
+
} else if (type == "addFour") {
|
152
|
+
cm.replaceSelection(left + left + left + left, "before");
|
153
|
+
cm.execCommand("goCharRight");
|
154
|
+
}
|
155
|
+
});
|
156
|
+
}
|
157
|
+
|
158
|
+
function isClosingBracket(ch, pairs) {
|
159
|
+
var pos = pairs.lastIndexOf(ch);
|
160
|
+
return pos > -1 && pos % 2 == 1;
|
161
|
+
}
|
162
|
+
|
35
163
|
function charsAround(cm, pos) {
|
36
164
|
var str = cm.getRange(Pos(pos.line, pos.ch - 1),
|
37
165
|
Pos(pos.line, pos.ch + 1));
|
@@ -53,109 +181,4 @@
|
|
53
181
|
stream.start = stream.pos;
|
54
182
|
}
|
55
183
|
}
|
56
|
-
|
57
|
-
function buildKeymap(pairs, triples) {
|
58
|
-
var map = {
|
59
|
-
name : "autoCloseBrackets",
|
60
|
-
Backspace: function(cm) {
|
61
|
-
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
62
|
-
var ranges = cm.listSelections();
|
63
|
-
for (var i = 0; i < ranges.length; i++) {
|
64
|
-
if (!ranges[i].empty()) return CodeMirror.Pass;
|
65
|
-
var around = charsAround(cm, ranges[i].head);
|
66
|
-
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
|
67
|
-
}
|
68
|
-
for (var i = ranges.length - 1; i >= 0; i--) {
|
69
|
-
var cur = ranges[i].head;
|
70
|
-
cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1));
|
71
|
-
}
|
72
|
-
}
|
73
|
-
};
|
74
|
-
var closingBrackets = "";
|
75
|
-
for (var i = 0; i < pairs.length; i += 2) (function(left, right) {
|
76
|
-
closingBrackets += right;
|
77
|
-
map["'" + left + "'"] = function(cm) {
|
78
|
-
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
79
|
-
var ranges = cm.listSelections(), type, next;
|
80
|
-
for (var i = 0; i < ranges.length; i++) {
|
81
|
-
var range = ranges[i], cur = range.head, curType;
|
82
|
-
var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
|
83
|
-
if (!range.empty()) {
|
84
|
-
curType = "surround";
|
85
|
-
} else if (left == right && next == right) {
|
86
|
-
if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left)
|
87
|
-
curType = "skipThree";
|
88
|
-
else
|
89
|
-
curType = "skip";
|
90
|
-
} else if (left == right && cur.ch > 1 && triples.indexOf(left) >= 0 &&
|
91
|
-
cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left &&
|
92
|
-
(cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) {
|
93
|
-
curType = "addFour";
|
94
|
-
} else if (left == '"' || left == "'") {
|
95
|
-
if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both";
|
96
|
-
else return CodeMirror.Pass;
|
97
|
-
} else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next)) {
|
98
|
-
curType = "both";
|
99
|
-
} else {
|
100
|
-
return CodeMirror.Pass;
|
101
|
-
}
|
102
|
-
if (!type) type = curType;
|
103
|
-
else if (type != curType) return CodeMirror.Pass;
|
104
|
-
}
|
105
|
-
|
106
|
-
cm.operation(function() {
|
107
|
-
if (type == "skip") {
|
108
|
-
cm.execCommand("goCharRight");
|
109
|
-
} else if (type == "skipThree") {
|
110
|
-
for (var i = 0; i < 3; i++)
|
111
|
-
cm.execCommand("goCharRight");
|
112
|
-
} else if (type == "surround") {
|
113
|
-
var sels = cm.getSelections();
|
114
|
-
for (var i = 0; i < sels.length; i++)
|
115
|
-
sels[i] = left + sels[i] + right;
|
116
|
-
cm.replaceSelections(sels, "around");
|
117
|
-
} else if (type == "both") {
|
118
|
-
cm.replaceSelection(left + right, null);
|
119
|
-
cm.execCommand("goCharLeft");
|
120
|
-
} else if (type == "addFour") {
|
121
|
-
cm.replaceSelection(left + left + left + left, "before");
|
122
|
-
cm.execCommand("goCharRight");
|
123
|
-
}
|
124
|
-
});
|
125
|
-
};
|
126
|
-
if (left != right) map["'" + right + "'"] = function(cm) {
|
127
|
-
var ranges = cm.listSelections();
|
128
|
-
for (var i = 0; i < ranges.length; i++) {
|
129
|
-
var range = ranges[i];
|
130
|
-
if (!range.empty() ||
|
131
|
-
cm.getRange(range.head, Pos(range.head.line, range.head.ch + 1)) != right)
|
132
|
-
return CodeMirror.Pass;
|
133
|
-
}
|
134
|
-
cm.execCommand("goCharRight");
|
135
|
-
};
|
136
|
-
})(pairs.charAt(i), pairs.charAt(i + 1));
|
137
|
-
return map;
|
138
|
-
}
|
139
|
-
|
140
|
-
function buildExplodeHandler(pairs) {
|
141
|
-
return function(cm) {
|
142
|
-
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
143
|
-
var ranges = cm.listSelections();
|
144
|
-
for (var i = 0; i < ranges.length; i++) {
|
145
|
-
if (!ranges[i].empty()) return CodeMirror.Pass;
|
146
|
-
var around = charsAround(cm, ranges[i].head);
|
147
|
-
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
|
148
|
-
}
|
149
|
-
cm.operation(function() {
|
150
|
-
cm.replaceSelection("\n\n", null);
|
151
|
-
cm.execCommand("goCharLeft");
|
152
|
-
ranges = cm.listSelections();
|
153
|
-
for (var i = 0; i < ranges.length; i++) {
|
154
|
-
var line = ranges[i].head.line;
|
155
|
-
cm.indentLine(line, null, true);
|
156
|
-
cm.indentLine(line + 1, null, true);
|
157
|
-
}
|
158
|
-
});
|
159
|
-
};
|
160
|
-
}
|
161
184
|
});
|