codemirror-rails 3.16 → 3.17
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/README.md +9 -0
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +104 -48
- data/vendor/assets/javascripts/codemirror/addons/comment/continuecomment.js +25 -15
- data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +28 -27
- data/vendor/assets/javascripts/codemirror/addons/edit/matchtags.js +10 -5
- data/vendor/assets/javascripts/codemirror/addons/hint/css-hint.js +50 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +0 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +10 -7
- data/vendor/assets/javascripts/codemirror/addons/lint/css-lint.js +17 -0
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +32 -6
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/search/searchcursor.js +2 -2
- data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +29 -6
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +13 -0
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/css.js +15 -13
- data/vendor/assets/javascripts/codemirror/modes/d.js +0 -0
- data/vendor/assets/javascripts/codemirror/modes/dtd.js +127 -0
- data/vendor/assets/javascripts/codemirror/modes/fortran.js +173 -0
- data/vendor/assets/javascripts/codemirror/modes/haskell.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/less.js +47 -49
- data/vendor/assets/javascripts/codemirror/modes/octave.js +118 -0
- data/vendor/assets/javascripts/codemirror/modes/sql.js +8 -5
- data/vendor/assets/javascripts/codemirror/modes/toml.js +71 -0
- data/vendor/assets/stylesheets/codemirror.css +7 -3
- data/vendor/assets/stylesheets/codemirror/addons/display/fullscreen.css +1 -1
- data/vendor/assets/stylesheets/codemirror/addons/lint/lint.css +3 -27
- data/vendor/assets/stylesheets/codemirror/themes/solarized.css +2 -24
- metadata +24 -21
- data/vendor/assets/javascripts/codemirror/addons/edit/continuecomment.js +0 -44
- data/vendor/assets/javascripts/codemirror/addons/merge/dep/diff_match_patch.js +0 -50
- data/vendor/assets/javascripts/codemirror/modes/scss_test.js +0 -80
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fcaf99c9b9c190aac2de9f68cf058ec3e82d265e
|
4
|
+
data.tar.gz: ba0b7668f1502e7e13b6de64a35abf984d910070
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6eb46499bbe5f971c6349a02248de371288b69be40f59a7d2e591d32b2288b864542152cc3aa55ccdd87e16f299fb4a4e1554299a714a73d9361be56e99a0476
|
7
|
+
data.tar.gz: 225e6fe1d5a6ef50d703323bd19c15f36ab22ad7f5574745e2b960908938eb74a5065fa2d2c88c302d6d24350c9b037dfd3f1a6956d0f2493e60c07c476a1bb6
|
data/README.md
CHANGED
@@ -59,6 +59,15 @@ Additional CSS themes can be added to your application.css
|
|
59
59
|
//= require codemirror/themes/night
|
60
60
|
```
|
61
61
|
|
62
|
+
### Precompiling Codemirror
|
63
|
+
|
64
|
+
If your project is using precompiling, depending on your method of grabbing files to precompile, you might need to add the below line to your ```` application.rb```, to get rails to precompile all js, css files used by codemirror. You can also manually whitelist only the files that you use.
|
65
|
+
|
66
|
+
```rb
|
67
|
+
config.assets.precompile += ["codemirror*", "codemirror/**/*"]
|
68
|
+
```
|
69
|
+
|
70
|
+
|
62
71
|
## CodeMirror for Rails 3
|
63
72
|
|
64
73
|
You can use the generator included with this gem to copy the CodeMirror 2
|
@@ -1,5 +1,3 @@
|
|
1
|
-
// CodeMirror version 3.16
|
2
|
-
//
|
3
1
|
// CodeMirror is the only global var we claim
|
4
2
|
window.CodeMirror = (function() {
|
5
3
|
"use strict";
|
@@ -306,15 +304,13 @@ window.CodeMirror = (function() {
|
|
306
304
|
// Make sure the gutters options contains the element
|
307
305
|
// "CodeMirror-linenumbers" when the lineNumbers option is true.
|
308
306
|
function setGuttersForLineNumbers(options) {
|
309
|
-
var found =
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
307
|
+
var found = indexOf(options.gutters, "CodeMirror-linenumbers");
|
308
|
+
if (found == -1 && options.lineNumbers) {
|
309
|
+
options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);
|
310
|
+
} else if (found > -1 && !options.lineNumbers) {
|
311
|
+
options.gutters = options.gutters.slice(0);
|
312
|
+
options.gutters.splice(i, 1);
|
315
313
|
}
|
316
|
-
if (!found && options.lineNumbers)
|
317
|
-
options.gutters.push("CodeMirror-linenumbers");
|
318
314
|
}
|
319
315
|
|
320
316
|
// SCROLLBARS
|
@@ -413,12 +409,18 @@ window.CodeMirror = (function() {
|
|
413
409
|
function updateDisplay(cm, changes, viewPort, forced) {
|
414
410
|
var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo, updated;
|
415
411
|
var visible = visibleLines(cm.display, cm.doc, viewPort);
|
416
|
-
for (;;) {
|
412
|
+
for (var first = true;; first = false) {
|
413
|
+
var oldWidth = cm.display.scroller.clientWidth;
|
417
414
|
if (!updateDisplayInner(cm, changes, visible, forced)) break;
|
418
|
-
forced = false;
|
419
415
|
updated = true;
|
416
|
+
changes = [];
|
420
417
|
updateSelection(cm);
|
421
418
|
updateScrollbars(cm);
|
419
|
+
if (first && cm.options.lineWrapping && oldWidth != cm.display.scroller.clientWidth) {
|
420
|
+
forced = true;
|
421
|
+
continue;
|
422
|
+
}
|
423
|
+
forced = false;
|
422
424
|
|
423
425
|
// Clip forced viewport to actual scrollable area
|
424
426
|
if (viewPort)
|
@@ -427,7 +429,6 @@ window.CodeMirror = (function() {
|
|
427
429
|
visible = visibleLines(cm.display, cm.doc, viewPort);
|
428
430
|
if (visible.from >= cm.display.showingFrom && visible.to <= cm.display.showingTo)
|
429
431
|
break;
|
430
|
-
changes = [];
|
431
432
|
}
|
432
433
|
|
433
434
|
if (updated) {
|
@@ -665,10 +666,11 @@ window.CodeMirror = (function() {
|
|
665
666
|
}
|
666
667
|
|
667
668
|
function buildLineElement(cm, line, lineNo, dims, reuse) {
|
668
|
-
var
|
669
|
+
var built = buildLineContent(cm, line), lineElement = built.pre;
|
669
670
|
var markers = line.gutterMarkers, display = cm.display, wrap;
|
670
671
|
|
671
|
-
|
672
|
+
var bgClass = built.bgClass ? built.bgClass + " " + (line.bgClass || "") : line.bgClass;
|
673
|
+
if (!cm.options.lineNumbers && !markers && !bgClass && !line.wrapClass && !line.widgets)
|
672
674
|
return lineElement;
|
673
675
|
|
674
676
|
// Lines with gutter elements, widgets or a background class need
|
@@ -706,8 +708,8 @@ window.CodeMirror = (function() {
|
|
706
708
|
wrap.appendChild(lineElement);
|
707
709
|
}
|
708
710
|
// Kludge to make sure the styled element lies behind the selection (by z-index)
|
709
|
-
if (
|
710
|
-
wrap.insertBefore(elt("div", null,
|
711
|
+
if (bgClass)
|
712
|
+
wrap.insertBefore(elt("div", null, bgClass + " CodeMirror-linebackground"), wrap.firstChild);
|
711
713
|
if (cm.options.lineNumbers || markers) {
|
712
714
|
var gutterWrap = wrap.insertBefore(elt("div", null, null, "position: absolute; left: " +
|
713
715
|
(cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"),
|
@@ -974,6 +976,10 @@ window.CodeMirror = (function() {
|
|
974
976
|
function measureChar(cm, line, ch, data, bias) {
|
975
977
|
var dir = -1;
|
976
978
|
data = data || measureLine(cm, line);
|
979
|
+
if (data.crude) {
|
980
|
+
var left = data.left + ch * data.width;
|
981
|
+
return {left: left, right: left + data.width, top: data.top, bottom: data.bottom};
|
982
|
+
}
|
977
983
|
|
978
984
|
for (var pos = ch;; pos += dir) {
|
979
985
|
var r = data[pos];
|
@@ -995,7 +1001,7 @@ window.CodeMirror = (function() {
|
|
995
1001
|
var memo = cache[i];
|
996
1002
|
if (memo.text == line.text && memo.markedSpans == line.markedSpans &&
|
997
1003
|
cm.display.scroller.clientWidth == memo.width &&
|
998
|
-
memo.classes == line.textClass + "|" + line.
|
1004
|
+
memo.classes == line.textClass + "|" + line.wrapClass)
|
999
1005
|
return memo;
|
1000
1006
|
}
|
1001
1007
|
}
|
@@ -1015,15 +1021,18 @@ window.CodeMirror = (function() {
|
|
1015
1021
|
var cache = cm.display.measureLineCache;
|
1016
1022
|
var memo = {text: line.text, width: cm.display.scroller.clientWidth,
|
1017
1023
|
markedSpans: line.markedSpans, measure: measure,
|
1018
|
-
classes: line.textClass + "|" + line.
|
1024
|
+
classes: line.textClass + "|" + line.wrapClass};
|
1019
1025
|
if (cache.length == 16) cache[++cm.display.measureLineCachePos % 16] = memo;
|
1020
1026
|
else cache.push(memo);
|
1021
1027
|
return measure;
|
1022
1028
|
}
|
1023
1029
|
|
1024
1030
|
function measureLineInner(cm, line) {
|
1031
|
+
if (!cm.options.lineWrapping && line.text.length >= cm.options.crudeMeasuringFrom)
|
1032
|
+
return crudelyMeasureLine(cm, line);
|
1033
|
+
|
1025
1034
|
var display = cm.display, measure = emptyArray(line.text.length);
|
1026
|
-
var pre =
|
1035
|
+
var pre = buildLineContent(cm, line, measure, true).pre;
|
1027
1036
|
|
1028
1037
|
// IE does not cache element positions of inline elements between
|
1029
1038
|
// calls to getBoundingClientRect. This makes the loop below,
|
@@ -1108,6 +1117,15 @@ window.CodeMirror = (function() {
|
|
1108
1117
|
return data;
|
1109
1118
|
}
|
1110
1119
|
|
1120
|
+
function crudelyMeasureLine(cm, line) {
|
1121
|
+
var copy = new Line(line.text.slice(0, 100), null);
|
1122
|
+
if (line.textClass) copy.textClass = line.textClass;
|
1123
|
+
var measure = measureLineInner(cm, copy);
|
1124
|
+
var left = measureChar(cm, copy, 0, measure, "left");
|
1125
|
+
var right = measureChar(cm, copy, 99, measure, "right");
|
1126
|
+
return {crude: true, top: left.top, left: left.left, bottom: left.bottom, width: (right.right - left.left) / 100};
|
1127
|
+
}
|
1128
|
+
|
1111
1129
|
function measureLineWidth(cm, line) {
|
1112
1130
|
var hasBadSpan = false;
|
1113
1131
|
if (line.markedSpans) for (var i = 0; i < line.markedSpans; ++i) {
|
@@ -1115,9 +1133,10 @@ window.CodeMirror = (function() {
|
|
1115
1133
|
if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true;
|
1116
1134
|
}
|
1117
1135
|
var cached = !hasBadSpan && findCachedMeasurement(cm, line);
|
1118
|
-
if (cached
|
1136
|
+
if (cached || line.text.length >= cm.options.crudeMeasuringFrom)
|
1137
|
+
return measureChar(cm, line, line.text.length, cached && cached.measure, "right").right;
|
1119
1138
|
|
1120
|
-
var pre =
|
1139
|
+
var pre = buildLineContent(cm, line, null, true).pre;
|
1121
1140
|
var end = pre.appendChild(zeroWidthElement(cm.display.measure));
|
1122
1141
|
removeChildrenAndAdd(cm.display.measure, pre);
|
1123
1142
|
return getRect(end).right - getRect(cm.display.lineDiv).left;
|
@@ -1586,7 +1605,10 @@ window.CodeMirror = (function() {
|
|
1586
1605
|
if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
|
1587
1606
|
if (e.keyCode == 16) cm.doc.sel.shift = false;
|
1588
1607
|
}));
|
1589
|
-
on(d.input, "input",
|
1608
|
+
on(d.input, "input", function() {
|
1609
|
+
if (ie && !ie_lt9 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;
|
1610
|
+
fastPoll(cm);
|
1611
|
+
});
|
1590
1612
|
on(d.input, "keydown", operation(cm, onKeyDown));
|
1591
1613
|
on(d.input, "keypress", operation(cm, onKeyPress));
|
1592
1614
|
on(d.input, "focus", bind(onFocus, cm));
|
@@ -1802,17 +1824,16 @@ window.CodeMirror = (function() {
|
|
1802
1824
|
on(document, "mouseup", up);
|
1803
1825
|
}
|
1804
1826
|
|
1805
|
-
function
|
1806
|
-
var display = cm.display;
|
1827
|
+
function gutterEvent(cm, e, type, prevent, signalfn) {
|
1807
1828
|
try { var mX = e.clientX, mY = e.clientY; }
|
1808
1829
|
catch(e) { return false; }
|
1830
|
+
if (mX >= Math.floor(getRect(cm.display.gutters).right)) return false;
|
1831
|
+
if (prevent) e_preventDefault(e);
|
1809
1832
|
|
1810
|
-
|
1811
|
-
e_preventDefault(e);
|
1812
|
-
if (!hasHandler(cm, "gutterClick")) return true;
|
1813
|
-
|
1833
|
+
var display = cm.display;
|
1814
1834
|
var lineBox = getRect(display.lineDiv);
|
1815
|
-
|
1835
|
+
|
1836
|
+
if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);
|
1816
1837
|
mY -= lineBox.top - display.viewOffset;
|
1817
1838
|
|
1818
1839
|
for (var i = 0; i < cm.options.gutters.length; ++i) {
|
@@ -1820,11 +1841,19 @@ window.CodeMirror = (function() {
|
|
1820
1841
|
if (g && getRect(g).right >= mX) {
|
1821
1842
|
var line = lineAtHeight(cm.doc, mY);
|
1822
1843
|
var gutter = cm.options.gutters[i];
|
1823
|
-
|
1824
|
-
|
1844
|
+
signalfn(cm, type, cm, line, gutter, e);
|
1845
|
+
return e_defaultPrevented(e);
|
1825
1846
|
}
|
1826
1847
|
}
|
1827
|
-
|
1848
|
+
}
|
1849
|
+
|
1850
|
+
function contextMenuInGutter(cm, e) {
|
1851
|
+
if (!hasHandler(cm, "gutterContextMenu")) return false;
|
1852
|
+
return gutterEvent(cm, e, "gutterContextMenu", false, signal);
|
1853
|
+
}
|
1854
|
+
|
1855
|
+
function clickInGutter(cm, e) {
|
1856
|
+
return gutterEvent(cm, e, "gutterClick", true, signalLater);
|
1828
1857
|
}
|
1829
1858
|
|
1830
1859
|
// Kludge to work around strange IE behavior where it'll sometimes
|
@@ -1887,6 +1916,7 @@ window.CodeMirror = (function() {
|
|
1887
1916
|
// Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
|
1888
1917
|
if (e.dataTransfer.setDragImage && !safari) {
|
1889
1918
|
var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
|
1919
|
+
img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
|
1890
1920
|
if (opera) {
|
1891
1921
|
img.width = img.height = 1;
|
1892
1922
|
cm.display.wrapper.appendChild(img);
|
@@ -2145,7 +2175,7 @@ window.CodeMirror = (function() {
|
|
2145
2175
|
function onContextMenu(cm, e) {
|
2146
2176
|
if (signalDOMEvent(cm, e, "contextmenu")) return;
|
2147
2177
|
var display = cm.display, sel = cm.doc.sel;
|
2148
|
-
if (eventInWidget(display, e)) return;
|
2178
|
+
if (eventInWidget(display, e) || contextMenuInGutter(cm, e)) return;
|
2149
2179
|
|
2150
2180
|
var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
|
2151
2181
|
if (!pos || opera) return; // Opera is difficult.
|
@@ -2164,8 +2194,8 @@ window.CodeMirror = (function() {
|
|
2164
2194
|
|
2165
2195
|
function prepareSelectAllHack() {
|
2166
2196
|
if (display.input.selectionStart != null) {
|
2167
|
-
var extval = display.input.value = "
|
2168
|
-
display.prevInput = "
|
2197
|
+
var extval = display.input.value = "\u200b" + (posEq(sel.from, sel.to) ? "" : display.input.value);
|
2198
|
+
display.prevInput = "\u200b";
|
2169
2199
|
display.input.selectionStart = 1; display.input.selectionEnd = extval.length;
|
2170
2200
|
}
|
2171
2201
|
}
|
@@ -2299,6 +2329,7 @@ window.CodeMirror = (function() {
|
|
2299
2329
|
}
|
2300
2330
|
|
2301
2331
|
function makeChangeNoReadonly(doc, change, selUpdate) {
|
2332
|
+
if (change.text.length == 1 && change.text[0] == "" && posEq(change.from, change.to)) return;
|
2302
2333
|
var selAfter = computeSelAfterChange(doc, change, selUpdate);
|
2303
2334
|
addToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
|
2304
2335
|
|
@@ -2521,6 +2552,7 @@ window.CodeMirror = (function() {
|
|
2521
2552
|
|
2522
2553
|
var sel = doc.sel;
|
2523
2554
|
sel.goalColumn = null;
|
2555
|
+
if (bias == null) bias = posLess(head, sel.head) ? -1 : 1;
|
2524
2556
|
// Skip over atomic spans.
|
2525
2557
|
if (checkAtomic || !posEq(anchor, sel.anchor))
|
2526
2558
|
anchor = skipAtomic(doc, anchor, bias, checkAtomic != "push");
|
@@ -3165,9 +3197,11 @@ window.CodeMirror = (function() {
|
|
3165
3197
|
operation: function(f){return runInOp(this, f);},
|
3166
3198
|
|
3167
3199
|
refresh: operation(null, function() {
|
3200
|
+
var badHeight = this.display.cachedTextHeight == null;
|
3168
3201
|
clearCaches(this);
|
3169
3202
|
updateScrollPos(this, this.doc.scrollLeft, this.doc.scrollTop);
|
3170
3203
|
regChange(this);
|
3204
|
+
if (badHeight) estimateLineHeights(this);
|
3171
3205
|
}),
|
3172
3206
|
|
3173
3207
|
swapDoc: operation(null, function(doc) {
|
@@ -3268,6 +3302,7 @@ window.CodeMirror = (function() {
|
|
3268
3302
|
option("historyEventDelay", 500);
|
3269
3303
|
option("viewportMargin", 10, function(cm){cm.refresh();}, true);
|
3270
3304
|
option("maxHighlightLength", 10000, function(cm){loadMode(cm); cm.refresh();}, true);
|
3305
|
+
option("crudeMeasuringFrom", 10000);
|
3271
3306
|
option("moveInputWithCursor", true, function(cm, val) {
|
3272
3307
|
if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;
|
3273
3308
|
});
|
@@ -4210,8 +4245,7 @@ window.CodeMirror = (function() {
|
|
4210
4245
|
while (!stream.eol()) {
|
4211
4246
|
if (stream.pos > cm.options.maxHighlightLength) {
|
4212
4247
|
flattenSpans = false;
|
4213
|
-
|
4214
|
-
stream.pos = Math.min(text.length, stream.start + 50000);
|
4248
|
+
stream.pos = text.length;
|
4215
4249
|
style = null;
|
4216
4250
|
} else {
|
4217
4251
|
style = mode.token(stream, state);
|
@@ -4222,7 +4256,12 @@ window.CodeMirror = (function() {
|
|
4222
4256
|
}
|
4223
4257
|
stream.start = stream.pos;
|
4224
4258
|
}
|
4225
|
-
|
4259
|
+
while (curStart < stream.pos) {
|
4260
|
+
// Webkit seems to refuse to render text nodes longer than 57444 characters
|
4261
|
+
var pos = Math.min(stream.pos, curStart + 50000);
|
4262
|
+
f(pos, curStyle);
|
4263
|
+
curStart = pos;
|
4264
|
+
}
|
4226
4265
|
}
|
4227
4266
|
|
4228
4267
|
function highlightLine(cm, line, state) {
|
@@ -4280,13 +4319,23 @@ window.CodeMirror = (function() {
|
|
4280
4319
|
}
|
4281
4320
|
|
4282
4321
|
var styleToClassCache = {};
|
4283
|
-
function
|
4322
|
+
function interpretTokenStyle(style, builder) {
|
4284
4323
|
if (!style) return null;
|
4324
|
+
for (;;) {
|
4325
|
+
var lineClass = style.match(/(?:^|\s)line-(background-)?(\S+)/);
|
4326
|
+
if (!lineClass) break;
|
4327
|
+
style = style.slice(0, lineClass.index) + style.slice(lineClass.index + lineClass[0].length);
|
4328
|
+
var prop = lineClass[1] ? "bgClass" : "textClass";
|
4329
|
+
if (builder[prop] == null)
|
4330
|
+
builder[prop] = lineClass[2];
|
4331
|
+
else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(builder[prop]))
|
4332
|
+
builder[prop] += " " + lineClass[2];
|
4333
|
+
}
|
4285
4334
|
return styleToClassCache[style] ||
|
4286
4335
|
(styleToClassCache[style] = "cm-" + style.replace(/ +/g, " cm-"));
|
4287
4336
|
}
|
4288
4337
|
|
4289
|
-
function
|
4338
|
+
function buildLineContent(cm, realLine, measure, copyWidgets) {
|
4290
4339
|
var merged, line = realLine, empty = true;
|
4291
4340
|
while (merged = collapsedSpanAtStart(line))
|
4292
4341
|
line = getLine(cm.doc, merged.find().from.line);
|
@@ -4294,7 +4343,6 @@ window.CodeMirror = (function() {
|
|
4294
4343
|
var builder = {pre: elt("pre"), col: 0, pos: 0,
|
4295
4344
|
measure: null, measuredSomething: false, cm: cm,
|
4296
4345
|
copyWidgets: copyWidgets};
|
4297
|
-
if (line.textClass) builder.pre.className = line.textClass;
|
4298
4346
|
|
4299
4347
|
do {
|
4300
4348
|
if (line.text) empty = false;
|
@@ -4331,8 +4379,11 @@ window.CodeMirror = (function() {
|
|
4331
4379
|
}
|
4332
4380
|
}
|
4333
4381
|
|
4382
|
+
var textClass = builder.textClass ? builder.textClass + " " + (realLine.textClass || "") : realLine.textClass;
|
4383
|
+
if (textClass) builder.pre.className = textClass;
|
4384
|
+
|
4334
4385
|
signal(cm, "renderLine", cm, realLine, builder.pre);
|
4335
|
-
return builder
|
4386
|
+
return builder;
|
4336
4387
|
}
|
4337
4388
|
|
4338
4389
|
var tokenSpecialChars = /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\uFEFF]/g;
|
@@ -4443,7 +4494,7 @@ window.CodeMirror = (function() {
|
|
4443
4494
|
var spans = line.markedSpans, allText = line.text, at = 0;
|
4444
4495
|
if (!spans) {
|
4445
4496
|
for (var i = 1; i < styles.length; i+=2)
|
4446
|
-
builder.addToken(builder, allText.slice(at, at = styles[i]),
|
4497
|
+
builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder));
|
4447
4498
|
return;
|
4448
4499
|
}
|
4449
4500
|
|
@@ -4493,7 +4544,7 @@ window.CodeMirror = (function() {
|
|
4493
4544
|
spanStartStyle = "";
|
4494
4545
|
}
|
4495
4546
|
text = allText.slice(at, at = styles[i++]);
|
4496
|
-
style =
|
4547
|
+
style = interpretTokenStyle(styles[i++], builder);
|
4497
4548
|
}
|
4498
4549
|
}
|
4499
4550
|
}
|
@@ -5461,13 +5512,18 @@ window.CodeMirror = (function() {
|
|
5461
5512
|
spanAffectsWrapping = function(str, i) {
|
5462
5513
|
return /\-[^ \-?]|\?[^ !\'\"\),.\-\/:;\?\]\}]/.test(str.slice(i - 1, i + 1));
|
5463
5514
|
};
|
5464
|
-
else if (webkit &&
|
5515
|
+
else if (webkit && /Chrome\/(?:29|[3-9]\d|\d\d\d)\./.test(navigator.userAgent))
|
5516
|
+
spanAffectsWrapping = function(str, i) {
|
5517
|
+
var code = str.charCodeAt(i - 1);
|
5518
|
+
return code >= 8208 && code <= 8212;
|
5519
|
+
};
|
5520
|
+
else if (webkit)
|
5465
5521
|
spanAffectsWrapping = function(str, i) {
|
5466
5522
|
if (i > 1 && str.charCodeAt(i - 1) == 45) {
|
5467
5523
|
if (/\w/.test(str.charAt(i - 2)) && /[^\-?\.]/.test(str.charAt(i))) return true;
|
5468
5524
|
if (i > 2 && /[\d\.,]/.test(str.charAt(i - 2)) && /[\d\.,]/.test(str.charAt(i))) return false;
|
5469
5525
|
}
|
5470
|
-
return /[~!#%&*)=+}\]
|
5526
|
+
return /[~!#%&*)=+}\]\\|\"\.>,:;][({[<]|-[^\-?\.\u2010-\u201f\u2026]|\?[\w~`@#$%\^&*(_=+{[|><]|…[\w~`@#$%\^&*(_=+{[><]/.test(str.slice(i - 1, i + 1));
|
5471
5527
|
};
|
5472
5528
|
|
5473
5529
|
var knownScrollbarWidth;
|
@@ -5823,7 +5879,7 @@ window.CodeMirror = (function() {
|
|
5823
5879
|
|
5824
5880
|
// THE END
|
5825
5881
|
|
5826
|
-
CodeMirror.version = "3.
|
5882
|
+
CodeMirror.version = "3.17.0";
|
5827
5883
|
|
5828
5884
|
return CodeMirror;
|
5829
5885
|
})();
|
@@ -1,35 +1,43 @@
|
|
1
1
|
(function() {
|
2
2
|
var modes = ["clike", "css", "javascript"];
|
3
3
|
for (var i = 0; i < modes.length; ++i)
|
4
|
-
CodeMirror.extendMode(modes[i], {
|
5
|
-
blockCommentEnd: "*/",
|
6
|
-
blockCommentContinue: " * "});
|
4
|
+
CodeMirror.extendMode(modes[i], {blockCommentContinue: " * "});
|
7
5
|
|
8
6
|
function continueComment(cm) {
|
9
7
|
var pos = cm.getCursor(), token = cm.getTokenAt(pos);
|
8
|
+
if (token.type != "comment") return CodeMirror.Pass;
|
10
9
|
var mode = CodeMirror.innerMode(cm.getMode(), token.state).mode;
|
11
|
-
var space;
|
12
10
|
|
13
|
-
|
11
|
+
var insert;
|
12
|
+
if (mode.blockCommentStart && mode.blockCommentContinue) {
|
14
13
|
var end = token.string.indexOf(mode.blockCommentEnd);
|
15
14
|
var full = cm.getRange(CodeMirror.Pos(pos.line, 0), CodeMirror.Pos(pos.line, token.end)), found;
|
16
15
|
if (end != -1 && end == token.string.length - mode.blockCommentEnd.length) {
|
17
16
|
// Comment ended, don't continue it
|
18
17
|
} else if (token.string.indexOf(mode.blockCommentStart) == 0) {
|
19
|
-
|
20
|
-
if (!/^\s*$/.test(
|
21
|
-
|
22
|
-
for (var i = 0; i < token.start; ++i)
|
18
|
+
insert = full.slice(0, token.start);
|
19
|
+
if (!/^\s*$/.test(insert)) {
|
20
|
+
insert = "";
|
21
|
+
for (var i = 0; i < token.start; ++i) insert += " ";
|
23
22
|
}
|
24
23
|
} else if ((found = full.indexOf(mode.blockCommentContinue)) != -1 &&
|
25
24
|
found + mode.blockCommentContinue.length > token.start &&
|
26
25
|
/^\s*$/.test(full.slice(0, found))) {
|
27
|
-
|
26
|
+
insert = full.slice(0, found);
|
27
|
+
}
|
28
|
+
if (insert != null) insert += mode.blockCommentContinue;
|
29
|
+
}
|
30
|
+
if (insert == null && mode.lineComment) {
|
31
|
+
var line = cm.getLine(pos.line), found = line.indexOf(mode.lineComment);
|
32
|
+
if (found > -1) {
|
33
|
+
insert = line.slice(0, found);
|
34
|
+
if (/\S/.test(insert)) insert = null;
|
35
|
+
else insert += mode.lineComment + line.slice(found + mode.lineComment.length).match(/^\s*/)[0];
|
28
36
|
}
|
29
37
|
}
|
30
38
|
|
31
|
-
if (
|
32
|
-
cm.replaceSelection("\n" +
|
39
|
+
if (insert != null)
|
40
|
+
cm.replaceSelection("\n" + insert, "end");
|
33
41
|
else
|
34
42
|
return CodeMirror.Pass;
|
35
43
|
}
|
@@ -37,8 +45,10 @@
|
|
37
45
|
CodeMirror.defineOption("continueComments", null, function(cm, val, prev) {
|
38
46
|
if (prev && prev != CodeMirror.Init)
|
39
47
|
cm.removeKeyMap("continueComment");
|
40
|
-
|
41
|
-
|
42
|
-
|
48
|
+
if (val) {
|
49
|
+
var map = {name: "continueComment"};
|
50
|
+
map[typeof val == "string" ? val : "Enter"] = continueComment;
|
51
|
+
cm.addKeyMap(map);
|
52
|
+
}
|
43
53
|
});
|
44
54
|
})();
|