codemirror-rails 3.16 → 3.17
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
})();
|