codemirror-rails 5.13.2 → 5.15.2
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 +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")) {
|