codemirror-rails 5.13.2 → 5.15.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +55 -42
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +9 -2
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +8 -8
- data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +3 -3
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +25 -38
- data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +2 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +2 -1
- data/vendor/assets/javascripts/codemirror/addons/scroll/simplescrollbars.js +9 -6
- data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +24 -27
- data/vendor/assets/javascripts/codemirror/addons/search/search.js +5 -2
- data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +2 -2
- data/vendor/assets/javascripts/codemirror/keymaps/sublime.js +3 -21
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +24 -25
- data/vendor/assets/javascripts/codemirror/modes/clike.js +34 -29
- data/vendor/assets/javascripts/codemirror/modes/clojure.js +59 -3
- data/vendor/assets/javascripts/codemirror/modes/crystal.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/css.js +6 -6
- data/vendor/assets/javascripts/codemirror/modes/django.js +8 -8
- data/vendor/assets/javascripts/codemirror/modes/dtd.js +6 -6
- data/vendor/assets/javascripts/codemirror/modes/ebnf.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/haml.js +3 -3
- data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/jade.js +3 -3
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +15 -9
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +11 -21
- data/vendor/assets/javascripts/codemirror/modes/mathematica.js +1 -0
- data/vendor/assets/javascripts/codemirror/modes/mbox.js +129 -0
- data/vendor/assets/javascripts/codemirror/modes/pegjs.js +6 -6
- data/vendor/assets/javascripts/codemirror/modes/perl.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/php.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/powershell.js +396 -0
- data/vendor/assets/javascripts/codemirror/modes/properties.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/puppet.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/python.js +20 -28
- data/vendor/assets/javascripts/codemirror/modes/sas.js +315 -0
- data/vendor/assets/javascripts/codemirror/modes/slim.js +4 -4
- data/vendor/assets/javascripts/codemirror/modes/sparql.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/sql.js +10 -2
- data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +78 -128
- data/vendor/assets/javascripts/codemirror/modes/verilog.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/vhdl.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/webidl.js +195 -0
- data/vendor/assets/javascripts/codemirror/modes/xquery.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/yacas.js +204 -0
- data/vendor/assets/stylesheets/codemirror.css +1 -1
- data/vendor/assets/stylesheets/codemirror/addons/lint/lint.css +2 -2
- data/vendor/assets/stylesheets/codemirror/themes/icecoder.css +4 -4
- metadata +6 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8452d7d850f333131e02651f87171085c9373949
|
4
|
+
data.tar.gz: 41821f0945c79008b27dbe9a9da195f1998b4c9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6be7a3a6c3434c0f6ce75732429fabf3e73d19da666ec44f87503906076324c5848343bc1fd749564157dc875d33ed872ece373aadb119dea3ff1edeb3df7852
|
7
|
+
data.tar.gz: f7bc70b832ff41811db9cd0b0e34a3e62c346a520b83a95edd398261053bd0f536c18f9fa901eb9dd223636f2c25bd95df9d49259e2daa8c968994ddd766a058
|
@@ -41,6 +41,7 @@
|
|
41
41
|
// This is woefully incomplete. Suggestions for alternative methods welcome.
|
42
42
|
var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
|
43
43
|
var mac = ios || /Mac/.test(platform);
|
44
|
+
var chromeOS = /\bCrOS\b/.test(userAgent);
|
44
45
|
var windows = /win/i.test(platform);
|
45
46
|
|
46
47
|
var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
|
@@ -1095,9 +1096,9 @@
|
|
1095
1096
|
if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }
|
1096
1097
|
}
|
1097
1098
|
|
1098
|
-
// This will be set to
|
1099
|
-
// when pasting, we know what kind of selections the copied
|
1100
|
-
// was made out of.
|
1099
|
+
// This will be set to a {lineWise: bool, text: [string]} object, so
|
1100
|
+
// that, when pasting, we know what kind of selections the copied
|
1101
|
+
// text was made out of.
|
1101
1102
|
var lastCopied = null;
|
1102
1103
|
|
1103
1104
|
function applyTextInput(cm, inserted, deleted, sel, origin) {
|
@@ -1106,14 +1107,14 @@
|
|
1106
1107
|
if (!sel) sel = doc.sel;
|
1107
1108
|
|
1108
1109
|
var paste = cm.state.pasteIncoming || origin == "paste";
|
1109
|
-
var textLines = doc.splitLines(inserted), multiPaste = null
|
1110
|
+
var textLines = doc.splitLines(inserted), multiPaste = null
|
1110
1111
|
// When pasing N lines into N selections, insert one line per selection
|
1111
1112
|
if (paste && sel.ranges.length > 1) {
|
1112
|
-
if (lastCopied && lastCopied.join("\n") == inserted) {
|
1113
|
-
if (sel.ranges.length % lastCopied.length == 0) {
|
1113
|
+
if (lastCopied && lastCopied.text.join("\n") == inserted) {
|
1114
|
+
if (sel.ranges.length % lastCopied.text.length == 0) {
|
1114
1115
|
multiPaste = [];
|
1115
|
-
for (var i = 0; i < lastCopied.length; i++)
|
1116
|
-
multiPaste.push(doc.splitLines(lastCopied[i]));
|
1116
|
+
for (var i = 0; i < lastCopied.text.length; i++)
|
1117
|
+
multiPaste.push(doc.splitLines(lastCopied.text[i]));
|
1117
1118
|
}
|
1118
1119
|
} else if (textLines.length == sel.ranges.length) {
|
1119
1120
|
multiPaste = map(textLines, function(l) { return [l]; });
|
@@ -1129,6 +1130,8 @@
|
|
1129
1130
|
from = Pos(from.line, from.ch - deleted);
|
1130
1131
|
else if (cm.state.overwrite && !paste) // Handle overwrite
|
1131
1132
|
to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));
|
1133
|
+
else if (lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted)
|
1134
|
+
from = to = Pos(from.line, 0)
|
1132
1135
|
}
|
1133
1136
|
var updateInput = cm.curOp.updateInput;
|
1134
1137
|
var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,
|
@@ -1261,18 +1264,18 @@
|
|
1261
1264
|
function prepareCopyCut(e) {
|
1262
1265
|
if (signalDOMEvent(cm, e)) return
|
1263
1266
|
if (cm.somethingSelected()) {
|
1264
|
-
lastCopied = cm.getSelections();
|
1267
|
+
lastCopied = {lineWise: false, text: cm.getSelections()};
|
1265
1268
|
if (input.inaccurateSelection) {
|
1266
1269
|
input.prevInput = "";
|
1267
1270
|
input.inaccurateSelection = false;
|
1268
|
-
te.value = lastCopied.join("\n");
|
1271
|
+
te.value = lastCopied.text.join("\n");
|
1269
1272
|
selectInput(te);
|
1270
1273
|
}
|
1271
1274
|
} else if (!cm.options.lineWiseCopyCut) {
|
1272
1275
|
return;
|
1273
1276
|
} else {
|
1274
1277
|
var ranges = copyableRanges(cm);
|
1275
|
-
lastCopied = ranges.text;
|
1278
|
+
lastCopied = {lineWise: true, text: ranges.text};
|
1276
1279
|
if (e.type == "cut") {
|
1277
1280
|
cm.setSelections(ranges.ranges, null, sel_dontScroll);
|
1278
1281
|
} else {
|
@@ -1620,13 +1623,13 @@
|
|
1620
1623
|
function onCopyCut(e) {
|
1621
1624
|
if (signalDOMEvent(cm, e)) return
|
1622
1625
|
if (cm.somethingSelected()) {
|
1623
|
-
lastCopied = cm.getSelections();
|
1626
|
+
lastCopied = {lineWise: false, text: cm.getSelections()};
|
1624
1627
|
if (e.type == "cut") cm.replaceSelection("", null, "cut");
|
1625
1628
|
} else if (!cm.options.lineWiseCopyCut) {
|
1626
1629
|
return;
|
1627
1630
|
} else {
|
1628
1631
|
var ranges = copyableRanges(cm);
|
1629
|
-
lastCopied = ranges.text;
|
1632
|
+
lastCopied = {lineWise: true, text: ranges.text};
|
1630
1633
|
if (e.type == "cut") {
|
1631
1634
|
cm.operation(function() {
|
1632
1635
|
cm.setSelections(ranges.ranges, 0, sel_dontScroll);
|
@@ -1638,12 +1641,12 @@
|
|
1638
1641
|
if (e.clipboardData && !ios) {
|
1639
1642
|
e.preventDefault();
|
1640
1643
|
e.clipboardData.clearData();
|
1641
|
-
e.clipboardData.setData("text/plain", lastCopied.join("\n"));
|
1644
|
+
e.clipboardData.setData("text/plain", lastCopied.text.join("\n"));
|
1642
1645
|
} else {
|
1643
1646
|
// Old-fashioned briefly-focus-a-textarea hack
|
1644
1647
|
var kludge = hiddenTextarea(), te = kludge.firstChild;
|
1645
1648
|
cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
|
1646
|
-
te.value = lastCopied.join("\n");
|
1649
|
+
te.value = lastCopied.text.join("\n");
|
1647
1650
|
var hadFocus = document.activeElement;
|
1648
1651
|
selectInput(te);
|
1649
1652
|
setTimeout(function() {
|
@@ -1662,9 +1665,9 @@
|
|
1662
1665
|
return result;
|
1663
1666
|
},
|
1664
1667
|
|
1665
|
-
showSelection: function(info) {
|
1668
|
+
showSelection: function(info, takeFocus) {
|
1666
1669
|
if (!info || !this.cm.display.view.length) return;
|
1667
|
-
if (info.focus) this.showPrimarySelection();
|
1670
|
+
if (info.focus || takeFocus) this.showPrimarySelection();
|
1668
1671
|
this.showMultipleSelections(info);
|
1669
1672
|
},
|
1670
1673
|
|
@@ -3100,7 +3103,7 @@
|
|
3100
3103
|
}
|
3101
3104
|
|
3102
3105
|
if (op.updatedDisplay || op.selectionChanged)
|
3103
|
-
op.preparedSelection = display.input.prepareSelection();
|
3106
|
+
op.preparedSelection = display.input.prepareSelection(op.focus);
|
3104
3107
|
}
|
3105
3108
|
|
3106
3109
|
function endOperation_W2(op) {
|
@@ -3113,8 +3116,9 @@
|
|
3113
3116
|
cm.display.maxLineChanged = false;
|
3114
3117
|
}
|
3115
3118
|
|
3119
|
+
var takeFocus = op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus())
|
3116
3120
|
if (op.preparedSelection)
|
3117
|
-
cm.display.input.showSelection(op.preparedSelection);
|
3121
|
+
cm.display.input.showSelection(op.preparedSelection, takeFocus);
|
3118
3122
|
if (op.updatedDisplay || op.startHeight != cm.doc.height)
|
3119
3123
|
updateScrollbars(cm, op.barMeasure);
|
3120
3124
|
if (op.updatedDisplay)
|
@@ -3124,8 +3128,7 @@
|
|
3124
3128
|
|
3125
3129
|
if (cm.state.focused && op.updateInput)
|
3126
3130
|
cm.display.input.reset(op.typing);
|
3127
|
-
if (
|
3128
|
-
ensureFocus(op.cm);
|
3131
|
+
if (takeFocus) ensureFocus(op.cm);
|
3129
3132
|
}
|
3130
3133
|
|
3131
3134
|
function endOperation_finish(op) {
|
@@ -3680,7 +3683,7 @@
|
|
3680
3683
|
ourIndex = doc.sel.primIndex;
|
3681
3684
|
}
|
3682
3685
|
|
3683
|
-
if (e.altKey) {
|
3686
|
+
if (chromeOS ? e.shiftKey && e.metaKey : e.altKey) {
|
3684
3687
|
type = "rect";
|
3685
3688
|
if (!addNew) ourRange = new Range(start, start);
|
3686
3689
|
start = posFromMouse(cm, e, true, true);
|
@@ -3905,6 +3908,7 @@
|
|
3905
3908
|
if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
|
3906
3909
|
|
3907
3910
|
e.dataTransfer.setData("Text", cm.getSelection());
|
3911
|
+
e.dataTransfer.effectAllowed = "copyMove"
|
3908
3912
|
|
3909
3913
|
// Use dummy image instead of default browsers image.
|
3910
3914
|
// Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
|
@@ -5390,7 +5394,7 @@
|
|
5390
5394
|
for (var i = newBreaks.length - 1; i >= 0; i--)
|
5391
5395
|
replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length))
|
5392
5396
|
});
|
5393
|
-
option("specialChars", /[\
|
5397
|
+
option("specialChars", /[\u0000-\u001f\u007f\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val, old) {
|
5394
5398
|
cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
|
5395
5399
|
if (old != CodeMirror.Init) cm.refresh();
|
5396
5400
|
});
|
@@ -5719,7 +5723,7 @@
|
|
5719
5723
|
for (var i = 0; i < ranges.length; i++) {
|
5720
5724
|
var pos = ranges[i].from();
|
5721
5725
|
var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
|
5722
|
-
spaces.push(
|
5726
|
+
spaces.push(spaceStr(tabSize - col % tabSize));
|
5723
5727
|
}
|
5724
5728
|
cm.replaceSelections(spaces);
|
5725
5729
|
},
|
@@ -5762,6 +5766,7 @@
|
|
5762
5766
|
ensureCursorVisible(cm);
|
5763
5767
|
});
|
5764
5768
|
},
|
5769
|
+
openLine: function(cm) {cm.replaceSelection("\n", "start")},
|
5765
5770
|
toggleOverwrite: function(cm) {cm.toggleOverwrite();}
|
5766
5771
|
};
|
5767
5772
|
|
@@ -5796,7 +5801,8 @@
|
|
5796
5801
|
"Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
|
5797
5802
|
"Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
|
5798
5803
|
"Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
|
5799
|
-
"Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
|
5804
|
+
"Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars",
|
5805
|
+
"Ctrl-O": "openLine"
|
5800
5806
|
};
|
5801
5807
|
keyMap.macDefault = {
|
5802
5808
|
"Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
|
@@ -6558,8 +6564,8 @@
|
|
6558
6564
|
var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
|
6559
6565
|
var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
|
6560
6566
|
if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;
|
6561
|
-
if (fromCmp <= 0 && (cmp(found.to, from)
|
6562
|
-
fromCmp >= 0 && (cmp(found.from, to)
|
6567
|
+
if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||
|
6568
|
+
fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))
|
6563
6569
|
return true;
|
6564
6570
|
}
|
6565
6571
|
}
|
@@ -6961,8 +6967,11 @@
|
|
6961
6967
|
}
|
6962
6968
|
|
6963
6969
|
// See issue #2901
|
6964
|
-
if (webkit
|
6965
|
-
builder.content.
|
6970
|
+
if (webkit) {
|
6971
|
+
var last = builder.content.lastChild
|
6972
|
+
if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab")))
|
6973
|
+
builder.content.className = "cm-tab-wrap-hack";
|
6974
|
+
}
|
6966
6975
|
|
6967
6976
|
signal(cm, "renderLine", cm, lineView.line, builder.pre);
|
6968
6977
|
if (builder.pre.className)
|
@@ -7314,13 +7323,16 @@
|
|
7314
7323
|
if (at <= sz) {
|
7315
7324
|
child.insertInner(at, lines, height);
|
7316
7325
|
if (child.lines && child.lines.length > 50) {
|
7317
|
-
|
7318
|
-
|
7319
|
-
|
7320
|
-
|
7321
|
-
|
7322
|
-
|
7326
|
+
// To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.
|
7327
|
+
// Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.
|
7328
|
+
var remaining = child.lines.length % 25 + 25
|
7329
|
+
for (var pos = remaining; pos < child.lines.length;) {
|
7330
|
+
var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));
|
7331
|
+
child.height -= leaf.height;
|
7332
|
+
this.children.splice(++i, 0, leaf);
|
7333
|
+
leaf.parent = this;
|
7323
7334
|
}
|
7335
|
+
child.lines = child.lines.slice(0, remaining);
|
7324
7336
|
this.maybeSpill();
|
7325
7337
|
}
|
7326
7338
|
break;
|
@@ -7340,7 +7352,7 @@
|
|
7340
7352
|
copy.parent = me;
|
7341
7353
|
me.children = [copy, sibling];
|
7342
7354
|
me = copy;
|
7343
|
-
|
7355
|
+
} else {
|
7344
7356
|
me.size -= sibling.size;
|
7345
7357
|
me.height -= sibling.height;
|
7346
7358
|
var myIndex = indexOf(me.parent.children, me);
|
@@ -7625,9 +7637,9 @@
|
|
7625
7637
|
var spans = line.markedSpans;
|
7626
7638
|
if (spans) for (var i = 0; i < spans.length; i++) {
|
7627
7639
|
var span = spans[i];
|
7628
|
-
if (!(span.to != null && lineNo == from.line && from.ch
|
7640
|
+
if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||
|
7629
7641
|
span.from == null && lineNo != from.line ||
|
7630
|
-
span.from != null && lineNo == to.line && span.from
|
7642
|
+
span.from != null && lineNo == to.line && span.from >= to.ch) &&
|
7631
7643
|
(!filter || filter(span.marker)))
|
7632
7644
|
found.push(span.marker.parent || span.marker);
|
7633
7645
|
}
|
@@ -7646,9 +7658,9 @@
|
|
7646
7658
|
},
|
7647
7659
|
|
7648
7660
|
posFromIndex: function(off) {
|
7649
|
-
var ch, lineNo = this.first;
|
7661
|
+
var ch, lineNo = this.first, sepSize = this.lineSeparator().length;
|
7650
7662
|
this.iter(function(line) {
|
7651
|
-
var sz = line.text.length +
|
7663
|
+
var sz = line.text.length + sepSize;
|
7652
7664
|
if (sz > off) { ch = off; return true; }
|
7653
7665
|
off -= sz;
|
7654
7666
|
++lineNo;
|
@@ -7659,8 +7671,9 @@
|
|
7659
7671
|
coords = clipPos(this, coords);
|
7660
7672
|
var index = coords.ch;
|
7661
7673
|
if (coords.line < this.first || coords.ch < 0) return 0;
|
7674
|
+
var sepSize = this.lineSeparator().length;
|
7662
7675
|
this.iter(this.first, coords.line, function (line) {
|
7663
|
-
index += line.text.length +
|
7676
|
+
index += line.text.length + sepSize;
|
7664
7677
|
});
|
7665
7678
|
return index;
|
7666
7679
|
},
|
@@ -8889,7 +8902,7 @@
|
|
8889
8902
|
|
8890
8903
|
// THE END
|
8891
8904
|
|
8892
|
-
CodeMirror.version = "5.
|
8905
|
+
CodeMirror.version = "5.15.2";
|
8893
8906
|
|
8894
8907
|
return CodeMirror;
|
8895
8908
|
});
|
@@ -44,9 +44,17 @@
|
|
44
44
|
}
|
45
45
|
});
|
46
46
|
|
47
|
+
// Rough heuristic to try and detect lines that are part of multi-line string
|
48
|
+
function probablyInsideString(cm, pos, line) {
|
49
|
+
return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"`]/.test(line)
|
50
|
+
}
|
51
|
+
|
47
52
|
CodeMirror.defineExtension("lineComment", function(from, to, options) {
|
48
53
|
if (!options) options = noOptions;
|
49
54
|
var self = this, mode = self.getModeAt(from);
|
55
|
+
var firstLine = self.getLine(from.line);
|
56
|
+
if (firstLine == null || probablyInsideString(self, from, firstLine)) return;
|
57
|
+
|
50
58
|
var commentString = options.lineComment || mode.lineComment;
|
51
59
|
if (!commentString) {
|
52
60
|
if (options.blockCommentStart || mode.blockCommentStart) {
|
@@ -55,8 +63,7 @@
|
|
55
63
|
}
|
56
64
|
return;
|
57
65
|
}
|
58
|
-
|
59
|
-
if (firstLine == null) return;
|
66
|
+
|
60
67
|
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);
|
61
68
|
var pad = options.padding == null ? " " : options.padding;
|
62
69
|
var blankLines = options.commentBlankLines || from.line == to.line;
|
@@ -109,7 +109,7 @@
|
|
109
109
|
var ranges = cm.listSelections();
|
110
110
|
var opening = pos % 2 == 0;
|
111
111
|
|
112
|
-
var type
|
112
|
+
var type;
|
113
113
|
for (var i = 0; i < ranges.length; i++) {
|
114
114
|
var range = ranges[i], cur = range.head, curType;
|
115
115
|
var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
|
@@ -13,7 +13,7 @@
|
|
13
13
|
|
14
14
|
CodeMirror.registerHelper("fold", "brace", function(cm, start) {
|
15
15
|
var line = start.line, lineText = cm.getLine(line);
|
16
|
-
var
|
16
|
+
var tokenType;
|
17
17
|
|
18
18
|
function findOpening(openCh) {
|
19
19
|
for (var at = start.ch, pass = 0;;) {
|
@@ -72,15 +72,15 @@ CodeMirror.registerHelper("fold", "import", function(cm, start) {
|
|
72
72
|
}
|
73
73
|
}
|
74
74
|
|
75
|
-
var
|
76
|
-
if (!has || hasImport(
|
75
|
+
var startLine = start.line, has = hasImport(startLine), prev;
|
76
|
+
if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))
|
77
77
|
return null;
|
78
78
|
for (var end = has.end;;) {
|
79
79
|
var next = hasImport(end.line + 1);
|
80
80
|
if (next == null) break;
|
81
81
|
end = next.end;
|
82
82
|
}
|
83
|
-
return {from: cm.clipPos(CodeMirror.Pos(
|
83
|
+
return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};
|
84
84
|
});
|
85
85
|
|
86
86
|
CodeMirror.registerHelper("fold", "include", function(cm, start) {
|
@@ -91,14 +91,14 @@ CodeMirror.registerHelper("fold", "include", function(cm, start) {
|
|
91
91
|
if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8;
|
92
92
|
}
|
93
93
|
|
94
|
-
var
|
95
|
-
if (has == null || hasInclude(
|
96
|
-
for (var end =
|
94
|
+
var startLine = start.line, has = hasInclude(startLine);
|
95
|
+
if (has == null || hasInclude(startLine - 1) != null) return null;
|
96
|
+
for (var end = startLine;;) {
|
97
97
|
var next = hasInclude(end + 1);
|
98
98
|
if (next == null) break;
|
99
99
|
++end;
|
100
100
|
}
|
101
|
-
return {from: CodeMirror.Pos(
|
101
|
+
return {from: CodeMirror.Pos(startLine, has + 1),
|
102
102
|
to: cm.clipPos(CodeMirror.Pos(end))};
|
103
103
|
});
|
104
104
|
|
@@ -140,9 +140,9 @@
|
|
140
140
|
var openTag = toNextTag(iter), end;
|
141
141
|
if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return;
|
142
142
|
if (!openTag[1] && end != "selfClose") {
|
143
|
-
var
|
144
|
-
var
|
145
|
-
return
|
143
|
+
var startPos = Pos(iter.line, iter.ch);
|
144
|
+
var endPos = findMatchingClose(iter, openTag[2]);
|
145
|
+
return endPos && {from: startPos, to: endPos.from};
|
146
146
|
}
|
147
147
|
}
|
148
148
|
});
|
@@ -108,15 +108,11 @@
|
|
108
108
|
},
|
109
109
|
|
110
110
|
update: function(first) {
|
111
|
-
if (this.tick == null) return
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
this.options.hint(this.cm, function(data) {
|
117
|
-
if (self.tick == myTick) self.finishUpdate(data, first);
|
118
|
-
}, this.options);
|
119
|
-
}
|
111
|
+
if (this.tick == null) return
|
112
|
+
var self = this, myTick = ++this.tick
|
113
|
+
fetchHints(this.options.hint, this.cm, this.options, function(data) {
|
114
|
+
if (self.tick == myTick) self.finishUpdate(data, first)
|
115
|
+
})
|
120
116
|
},
|
121
117
|
|
122
118
|
finishUpdate: function(data, first) {
|
@@ -362,40 +358,31 @@
|
|
362
358
|
return result
|
363
359
|
}
|
364
360
|
|
361
|
+
function fetchHints(hint, cm, options, callback) {
|
362
|
+
if (hint.async) {
|
363
|
+
hint(cm, callback, options)
|
364
|
+
} else {
|
365
|
+
var result = hint(cm, options)
|
366
|
+
if (result && result.then) result.then(callback)
|
367
|
+
else callback(result)
|
368
|
+
}
|
369
|
+
}
|
370
|
+
|
365
371
|
function resolveAutoHints(cm, pos) {
|
366
372
|
var helpers = cm.getHelpers(pos, "hint"), words
|
367
373
|
if (helpers.length) {
|
368
|
-
var
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
if (helper.async) {
|
377
|
-
helper(cm, function(result) {
|
378
|
-
if (result) callback(result)
|
379
|
-
else run(i + 1)
|
380
|
-
}, options)
|
381
|
-
} else {
|
382
|
-
var result = helper(cm, options)
|
383
|
-
if (result) callback(result)
|
384
|
-
else run(i + 1)
|
385
|
-
}
|
386
|
-
}
|
387
|
-
run(0)
|
388
|
-
}
|
389
|
-
resolved.async = true
|
390
|
-
} else {
|
391
|
-
resolved = function(cm, options) {
|
392
|
-
var app = applicableHelpers(cm, helpers)
|
393
|
-
for (var i = 0; i < app.length; i++) {
|
394
|
-
var cur = app[i](cm, options)
|
395
|
-
if (cur && cur.list.length) return cur
|
396
|
-
}
|
374
|
+
var resolved = function(cm, callback, options) {
|
375
|
+
var app = applicableHelpers(cm, helpers);
|
376
|
+
function run(i) {
|
377
|
+
if (i == app.length) return callback(null)
|
378
|
+
fetchHints(app[i], cm, options, function(result) {
|
379
|
+
if (result && result.list.length > 0) callback(result)
|
380
|
+
else run(i + 1)
|
381
|
+
})
|
397
382
|
}
|
383
|
+
run(0)
|
398
384
|
}
|
385
|
+
resolved.async = true
|
399
386
|
resolved.supportsSelection = true
|
400
387
|
return resolved
|
401
388
|
} else if (words = cm.getHelper(cm.getCursor(), "hintWords")) {
|