codemirror-rails 3.14 → 3.15
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 +178 -94
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +3 -3
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/edit/matchtags.js +51 -0
- data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +9 -6
- data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +9 -4
- data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +122 -0
- data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +3 -2
- data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +24 -17
- data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +34 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +5 -3
- data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +7 -3
- data/vendor/assets/javascripts/codemirror/addons/hint/pig-hint.js +4 -2
- data/vendor/assets/javascripts/codemirror/addons/hint/python-hint.js +4 -2
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +6 -2
- data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +5 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/coffeescript-lint.js +3 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/javascript-lint.js +3 -6
- data/vendor/assets/javascripts/codemirror/addons/lint/json-lint.js +3 -2
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +12 -6
- data/vendor/assets/javascripts/codemirror/addons/merge/dep/diff_match_patch.js +50 -0
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +40 -24
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +11 -9
- data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +608 -0
- data/vendor/assets/javascripts/codemirror/addons/tern/worker.js +39 -0
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +120 -101
- data/vendor/assets/javascripts/codemirror/modes/clike.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/css.js +33 -16
- data/vendor/assets/javascripts/codemirror/modes/groovy.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/jade.js +90 -0
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +21 -18
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +26 -1
- data/vendor/assets/javascripts/codemirror/modes/nginx.js +163 -0
- data/vendor/assets/javascripts/codemirror/modes/python.js +19 -2
- data/vendor/assets/javascripts/codemirror/modes/rst.js +30 -19
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +4 -4
- data/vendor/assets/javascripts/codemirror/modes/rust.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/scss_test.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +12 -2
- data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +170 -0
- data/vendor/assets/javascripts/codemirror/modes/sparql.js +4 -2
- data/vendor/assets/javascripts/codemirror/modes/vbscript.js +330 -22
- data/vendor/assets/javascripts/codemirror/modes/xml.js +18 -3
- data/vendor/assets/stylesheets/codemirror.css +10 -0
- data/vendor/assets/stylesheets/codemirror/addons/merge/merge.css +39 -29
- data/vendor/assets/stylesheets/codemirror/addons/tern/tern.css +85 -0
- data/vendor/assets/stylesheets/codemirror/themes/3024-day.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/3024-night.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/base16-light.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/midnight.css +5 -14
- data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-eighties.css +33 -0
- data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +2 -2
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b87d64cb7ae54051ff568e14699010de59f830b4
|
4
|
+
data.tar.gz: c1b9dfa59056dc0e7fa7a2dc097478013c95e6d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ca0fdfede9a60eb79b632a66bf0afb91627cf98d610a45d822a0fca46e44bcf9af84fb5ba61d3316af5cb0f8e83ed713877e2c22e06f109cfa9615d04ed740d
|
7
|
+
data.tar.gz: a489edc67eec3593cfc023f7e039b5d41b76ad7f7d7b1d54495ae348c87f704b7abb15073cf37870140595f5fbe7d35212fe30d18c592fbbf9d89c21ee9c9433
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// CodeMirror version 3.
|
1
|
+
// CodeMirror version 3.15
|
2
2
|
//
|
3
3
|
// CodeMirror is the only global var we claim
|
4
4
|
window.CodeMirror = (function() {
|
@@ -30,6 +30,7 @@ window.CodeMirror = (function() {
|
|
30
30
|
|
31
31
|
var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/);
|
32
32
|
if (opera_version) opera_version = Number(opera_version[1]);
|
33
|
+
if (opera_version && opera_version >= 15) { opera = false; webkit = true; }
|
33
34
|
// Some browsers use the wrong event properties to signal cmd/ctrl on OS X
|
34
35
|
var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11));
|
35
36
|
var captureMiddleClick = gecko || (ie && !ie_lt9);
|
@@ -403,11 +404,12 @@ window.CodeMirror = (function() {
|
|
403
404
|
|
404
405
|
// DISPLAY DRAWING
|
405
406
|
|
406
|
-
function updateDisplay(cm, changes, viewPort) {
|
407
|
+
function updateDisplay(cm, changes, viewPort, forced) {
|
407
408
|
var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo, updated;
|
408
409
|
var visible = visibleLines(cm.display, cm.doc, viewPort);
|
409
410
|
for (;;) {
|
410
|
-
if (!updateDisplayInner(cm, changes, visible)) break;
|
411
|
+
if (!updateDisplayInner(cm, changes, visible, forced)) break;
|
412
|
+
forced = false;
|
411
413
|
updated = true;
|
412
414
|
updateSelection(cm);
|
413
415
|
updateScrollbars(cm);
|
@@ -433,7 +435,7 @@ window.CodeMirror = (function() {
|
|
433
435
|
// Uses a set of changes plus the current scroll position to
|
434
436
|
// determine which DOM updates have to be made, and makes the
|
435
437
|
// updates.
|
436
|
-
function updateDisplayInner(cm, changes, visible) {
|
438
|
+
function updateDisplayInner(cm, changes, visible, forced) {
|
437
439
|
var display = cm.display, doc = cm.doc;
|
438
440
|
if (!display.wrapper.clientWidth) {
|
439
441
|
display.showingFrom = display.showingTo = doc.first;
|
@@ -442,7 +444,7 @@ window.CodeMirror = (function() {
|
|
442
444
|
}
|
443
445
|
|
444
446
|
// Bail out if the visible area is already rendered and nothing changed.
|
445
|
-
if (changes.length == 0 &&
|
447
|
+
if (!forced && changes.length == 0 &&
|
446
448
|
visible.from > display.showingFrom && visible.to < display.showingTo)
|
447
449
|
return;
|
448
450
|
|
@@ -495,7 +497,7 @@ window.CodeMirror = (function() {
|
|
495
497
|
if (range.from >= range.to) intact.splice(i--, 1);
|
496
498
|
else intactLines += range.to - range.from;
|
497
499
|
}
|
498
|
-
if (intactLines == to - from && from == display.showingFrom && to == display.showingTo) {
|
500
|
+
if (!forced && intactLines == to - from && from == display.showingFrom && to == display.showingTo) {
|
499
501
|
updateViewOffset(cm);
|
500
502
|
return;
|
501
503
|
}
|
@@ -520,6 +522,14 @@ window.CodeMirror = (function() {
|
|
520
522
|
}
|
521
523
|
display.showingFrom = from; display.showingTo = to;
|
522
524
|
|
525
|
+
updateHeightsInViewport(cm);
|
526
|
+
updateViewOffset(cm);
|
527
|
+
|
528
|
+
return true;
|
529
|
+
}
|
530
|
+
|
531
|
+
function updateHeightsInViewport(cm) {
|
532
|
+
var display = cm.display;
|
523
533
|
var prevBottom = display.lineDiv.offsetTop;
|
524
534
|
for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) {
|
525
535
|
if (ie_lt8) {
|
@@ -539,9 +549,6 @@ window.CodeMirror = (function() {
|
|
539
549
|
widgets[i].height = widgets[i].node.offsetHeight;
|
540
550
|
}
|
541
551
|
}
|
542
|
-
updateViewOffset(cm);
|
543
|
-
|
544
|
-
return true;
|
545
552
|
}
|
546
553
|
|
547
554
|
function updateViewOffset(cm) {
|
@@ -670,10 +677,10 @@ window.CodeMirror = (function() {
|
|
670
677
|
if (!/\bCodeMirror-linewidget\b/.test(n.className)) {
|
671
678
|
reuse.removeChild(n);
|
672
679
|
} else {
|
673
|
-
for (var i = 0
|
680
|
+
for (var i = 0; i < line.widgets.length; ++i) {
|
674
681
|
var widget = line.widgets[i];
|
675
|
-
if (!widget.above) { insertBefore = n; first = false; }
|
676
682
|
if (widget.node == n.firstChild) {
|
683
|
+
if (!widget.above && !insertBefore) insertBefore = n;
|
677
684
|
positionLineWidget(widget, n, reuse, dims);
|
678
685
|
++widgetsSeen;
|
679
686
|
break;
|
@@ -966,11 +973,13 @@ window.CodeMirror = (function() {
|
|
966
973
|
if (r) break;
|
967
974
|
if (dir < 0 && pos == 0) dir = 1;
|
968
975
|
}
|
969
|
-
|
976
|
+
bias = pos > ch ? "left" : pos < ch ? "right" : bias;
|
977
|
+
if (bias == "left" && r.leftSide) r = r.leftSide;
|
978
|
+
else if (bias == "right" && r.rightSide) r = r.rightSide;
|
970
979
|
return {left: pos < ch ? r.right : r.left,
|
971
980
|
right: pos > ch ? r.left : r.right,
|
972
|
-
top:
|
973
|
-
bottom:
|
981
|
+
top: r.top,
|
982
|
+
bottom: r.bottom};
|
974
983
|
}
|
975
984
|
|
976
985
|
function findCachedMeasurement(cm, line) {
|
@@ -1007,7 +1016,7 @@ window.CodeMirror = (function() {
|
|
1007
1016
|
|
1008
1017
|
function measureLineInner(cm, line) {
|
1009
1018
|
var display = cm.display, measure = emptyArray(line.text.length);
|
1010
|
-
var pre = lineContent(cm, line, measure);
|
1019
|
+
var pre = lineContent(cm, line, measure, true);
|
1011
1020
|
|
1012
1021
|
// IE does not cache element positions of inline elements between
|
1013
1022
|
// calls to getBoundingClientRect. This makes the loop below,
|
@@ -1043,48 +1052,50 @@ window.CodeMirror = (function() {
|
|
1043
1052
|
if (ie_lt9 && display.measure.first != pre)
|
1044
1053
|
removeChildrenAndAdd(display.measure, pre);
|
1045
1054
|
|
1046
|
-
function
|
1055
|
+
function measureRect(rect) {
|
1056
|
+
var top = rect.top - outer.top, bot = rect.bottom - outer.top;
|
1047
1057
|
if (bot > maxBot) bot = maxBot;
|
1048
1058
|
if (top < 0) top = 0;
|
1049
|
-
for (var
|
1050
|
-
var rtop = vranges[
|
1059
|
+
for (var i = vranges.length - 2; i >= 0; i -= 2) {
|
1060
|
+
var rtop = vranges[i], rbot = vranges[i+1];
|
1051
1061
|
if (rtop > bot || rbot < top) continue;
|
1052
1062
|
if (rtop <= top && rbot >= bot ||
|
1053
1063
|
top <= rtop && bot >= rbot ||
|
1054
1064
|
Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) {
|
1055
|
-
vranges[
|
1056
|
-
vranges[
|
1057
|
-
|
1065
|
+
vranges[i] = Math.min(top, rtop);
|
1066
|
+
vranges[i+1] = Math.max(bot, rbot);
|
1067
|
+
break;
|
1058
1068
|
}
|
1059
1069
|
}
|
1060
|
-
vranges.push(top, bot);
|
1061
|
-
return
|
1070
|
+
if (i < 0) { i = vranges.length; vranges.push(top, bot); }
|
1071
|
+
return {left: rect.left - outer.left,
|
1072
|
+
right: rect.right - outer.left,
|
1073
|
+
top: i, bottom: null};
|
1074
|
+
}
|
1075
|
+
function finishRect(rect) {
|
1076
|
+
rect.bottom = vranges[rect.top+1];
|
1077
|
+
rect.top = vranges[rect.top];
|
1062
1078
|
}
|
1063
1079
|
|
1064
1080
|
for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) {
|
1065
|
-
var
|
1081
|
+
var node = cur, rect = null;
|
1066
1082
|
// A widget might wrap, needs special care
|
1067
1083
|
if (/\bCodeMirror-widget\b/.test(cur.className) && cur.getClientRects) {
|
1068
1084
|
if (cur.firstChild.nodeType == 1) node = cur.firstChild;
|
1069
|
-
var rects = node.getClientRects()
|
1085
|
+
var rects = node.getClientRects();
|
1070
1086
|
if (rects.length > 1) {
|
1071
|
-
|
1072
|
-
|
1073
|
-
data[i] = {left: rLeft.left - outer.left, right: rRight.right - outer.left,
|
1074
|
-
top: vCatLeft, topRight: vCatRight};
|
1075
|
-
continue;
|
1087
|
+
rect = data[i] = measureRect(rects[0]);
|
1088
|
+
rect.rightSide = measureRect(rects[rects.length - 1]);
|
1076
1089
|
}
|
1077
1090
|
}
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1081
|
-
if (cur.measureRight) right = getRect(cur.measureRight).left;
|
1082
|
-
data[i] = {left: size.left - outer.left, right: right - outer.left, top: vCat};
|
1091
|
+
if (!rect) rect = data[i] = measureRect(getRect(node));
|
1092
|
+
if (cur.measureRight) rect.right = getRect(cur.measureRight).left;
|
1093
|
+
if (cur.leftSide) rect.leftSide = measureRect(getRect(cur.leftSide));
|
1083
1094
|
}
|
1084
1095
|
for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) {
|
1085
|
-
|
1086
|
-
cur.
|
1087
|
-
if (
|
1096
|
+
finishRect(cur);
|
1097
|
+
if (cur.leftSide) finishRect(cur.leftSide);
|
1098
|
+
if (cur.rightSide) finishRect(cur.rightSide);
|
1088
1099
|
}
|
1089
1100
|
return data;
|
1090
1101
|
}
|
@@ -1098,7 +1109,7 @@ window.CodeMirror = (function() {
|
|
1098
1109
|
var cached = !hasBadSpan && findCachedMeasurement(cm, line);
|
1099
1110
|
if (cached) return measureChar(cm, line, line.text.length, cached.measure, "right").right;
|
1100
1111
|
|
1101
|
-
var pre = lineContent(cm, line);
|
1112
|
+
var pre = lineContent(cm, line, null, true);
|
1102
1113
|
var end = pre.appendChild(zeroWidthElement(cm.display.measure));
|
1103
1114
|
removeChildrenAndAdd(cm.display.measure, pre);
|
1104
1115
|
return getRect(end).right - getRect(cm.display.lineDiv).left;
|
@@ -1302,6 +1313,7 @@ window.CodeMirror = (function() {
|
|
1302
1313
|
// An array of ranges of lines that have to be updated. See
|
1303
1314
|
// updateDisplay.
|
1304
1315
|
changes: [],
|
1316
|
+
forceUpdate: false,
|
1305
1317
|
updateInput: null,
|
1306
1318
|
userSelChange: null,
|
1307
1319
|
textChanged: null,
|
@@ -1334,8 +1346,8 @@ window.CodeMirror = (function() {
|
|
1334
1346
|
var coords = cursorCoords(cm, doc.sel.head);
|
1335
1347
|
newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom);
|
1336
1348
|
}
|
1337
|
-
if (op.changes.length || newScrollPos && newScrollPos.scrollTop != null) {
|
1338
|
-
updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop);
|
1349
|
+
if (op.changes.length || op.forceUpdate || newScrollPos && newScrollPos.scrollTop != null) {
|
1350
|
+
updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop, op.forceUpdate);
|
1339
1351
|
if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop;
|
1340
1352
|
}
|
1341
1353
|
if (!updated && op.selectionChanged) updateSelection(cm);
|
@@ -2105,6 +2117,7 @@ window.CodeMirror = (function() {
|
|
2105
2117
|
|
2106
2118
|
var detectingSelectAll;
|
2107
2119
|
function onContextMenu(cm, e) {
|
2120
|
+
if (signalDOMEvent(cm, e, "contextmenu")) return;
|
2108
2121
|
var display = cm.display, sel = cm.doc.sel;
|
2109
2122
|
if (eventInWidget(display, e)) return;
|
2110
2123
|
|
@@ -2755,7 +2768,7 @@ window.CodeMirror = (function() {
|
|
2755
2768
|
function findWordAt(line, pos) {
|
2756
2769
|
var start = pos.ch, end = pos.ch;
|
2757
2770
|
if (line) {
|
2758
|
-
if (pos.xRel < 0 || end == line.length) --start; else ++end;
|
2771
|
+
if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
|
2759
2772
|
var startChar = line.charAt(start);
|
2760
2773
|
var check = isWordChar(startChar) ? isWordChar
|
2761
2774
|
: /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
|
@@ -2796,7 +2809,7 @@ window.CodeMirror = (function() {
|
|
2796
2809
|
removeKeyMap: function(map) {
|
2797
2810
|
var maps = this.state.keyMaps;
|
2798
2811
|
for (var i = 0; i < maps.length; ++i)
|
2799
|
-
if ((typeof
|
2812
|
+
if (maps[i] == map || (typeof maps[i] != "string" && maps[i].name == map)) {
|
2800
2813
|
maps.splice(i, 1);
|
2801
2814
|
return true;
|
2802
2815
|
}
|
@@ -2860,6 +2873,7 @@ window.CodeMirror = (function() {
|
|
2860
2873
|
pos = clipPos(this.doc, pos);
|
2861
2874
|
var styles = getLineStyles(this, getLine(this.doc, pos.line));
|
2862
2875
|
var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
|
2876
|
+
if (ch == 0) return styles[2];
|
2863
2877
|
for (;;) {
|
2864
2878
|
var mid = (before + after) >> 1;
|
2865
2879
|
if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
|
@@ -2868,6 +2882,20 @@ window.CodeMirror = (function() {
|
|
2868
2882
|
}
|
2869
2883
|
},
|
2870
2884
|
|
2885
|
+
getModeAt: function(pos) {
|
2886
|
+
var mode = this.doc.mode;
|
2887
|
+
if (!mode.innerMode) return mode;
|
2888
|
+
return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;
|
2889
|
+
},
|
2890
|
+
|
2891
|
+
getHelper: function(pos, type) {
|
2892
|
+
if (!helpers.hasOwnProperty(type)) return;
|
2893
|
+
var help = helpers[type], mode = this.getModeAt(pos);
|
2894
|
+
return mode[type] && help[mode[type]] ||
|
2895
|
+
mode.helperType && help[mode.helperType] ||
|
2896
|
+
help[mode.name];
|
2897
|
+
},
|
2898
|
+
|
2871
2899
|
getStateAfter: function(line, precise) {
|
2872
2900
|
var doc = this.doc;
|
2873
2901
|
line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
|
@@ -3097,17 +3125,16 @@ window.CodeMirror = (function() {
|
|
3097
3125
|
updateScrollPos(this, sPos.scrollLeft, sPos.scrollTop);
|
3098
3126
|
}),
|
3099
3127
|
|
3100
|
-
setSize: function(width, height) {
|
3128
|
+
setSize: operation(null, function(width, height) {
|
3101
3129
|
function interpret(val) {
|
3102
3130
|
return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;
|
3103
3131
|
}
|
3104
3132
|
if (width != null) this.display.wrapper.style.width = interpret(width);
|
3105
3133
|
if (height != null) this.display.wrapper.style.height = interpret(height);
|
3106
|
-
this.
|
3107
|
-
|
3108
|
-
|
3109
|
-
|
3110
|
-
off: function(type, f) {off(this, type, f);},
|
3134
|
+
if (this.options.lineWrapping)
|
3135
|
+
this.display.measureLineCache.length = this.display.measureLineCachePos = 0;
|
3136
|
+
this.curOp.forceUpdate = true;
|
3137
|
+
}),
|
3111
3138
|
|
3112
3139
|
operation: function(f){return runInOp(this, f);},
|
3113
3140
|
|
@@ -3132,6 +3159,7 @@ window.CodeMirror = (function() {
|
|
3132
3159
|
getScrollerElement: function(){return this.display.scroller;},
|
3133
3160
|
getGutterElement: function(){return this.display.gutters;}
|
3134
3161
|
};
|
3162
|
+
eventMixin(CodeMirror);
|
3135
3163
|
|
3136
3164
|
// OPTION DEFAULTS
|
3137
3165
|
|
@@ -3256,7 +3284,7 @@ window.CodeMirror = (function() {
|
|
3256
3284
|
};
|
3257
3285
|
|
3258
3286
|
CodeMirror.getMode = function(options, spec) {
|
3259
|
-
spec = CodeMirror.resolveMode(spec);
|
3287
|
+
var spec = CodeMirror.resolveMode(spec);
|
3260
3288
|
var mfactory = modes[spec.name];
|
3261
3289
|
if (!mfactory) return CodeMirror.getMode(options, "text/plain");
|
3262
3290
|
var modeObj = mfactory(options, spec);
|
@@ -3269,6 +3297,7 @@ window.CodeMirror = (function() {
|
|
3269
3297
|
}
|
3270
3298
|
}
|
3271
3299
|
modeObj.name = spec.name;
|
3300
|
+
|
3272
3301
|
return modeObj;
|
3273
3302
|
};
|
3274
3303
|
|
@@ -3296,6 +3325,16 @@ window.CodeMirror = (function() {
|
|
3296
3325
|
var initHooks = [];
|
3297
3326
|
CodeMirror.defineInitHook = function(f) {initHooks.push(f);};
|
3298
3327
|
|
3328
|
+
var helpers = CodeMirror.helpers = {};
|
3329
|
+
CodeMirror.registerHelper = function(type, name, value) {
|
3330
|
+
if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {};
|
3331
|
+
helpers[type][name] = value;
|
3332
|
+
};
|
3333
|
+
|
3334
|
+
// UTILITIES
|
3335
|
+
|
3336
|
+
CodeMirror.isWordChar = isWordChar;
|
3337
|
+
|
3299
3338
|
// MODE STATE HANDLING
|
3300
3339
|
|
3301
3340
|
// Utility functions for working with state. Exported because modes
|
@@ -3321,6 +3360,7 @@ window.CodeMirror = (function() {
|
|
3321
3360
|
CodeMirror.innerMode = function(mode, state) {
|
3322
3361
|
while (mode.innerMode) {
|
3323
3362
|
var info = mode.innerMode(state);
|
3363
|
+
if (!info || info.mode == mode) break;
|
3324
3364
|
state = info.state;
|
3325
3365
|
mode = info.mode;
|
3326
3366
|
}
|
@@ -3633,11 +3673,16 @@ window.CodeMirror = (function() {
|
|
3633
3673
|
this.doc = doc;
|
3634
3674
|
}
|
3635
3675
|
CodeMirror.TextMarker = TextMarker;
|
3676
|
+
eventMixin(TextMarker);
|
3636
3677
|
|
3637
3678
|
TextMarker.prototype.clear = function() {
|
3638
3679
|
if (this.explicitlyCleared) return;
|
3639
3680
|
var cm = this.doc.cm, withOp = cm && !cm.curOp;
|
3640
3681
|
if (withOp) startOperation(cm);
|
3682
|
+
if (hasHandler(this, "clear")) {
|
3683
|
+
var found = this.find();
|
3684
|
+
if (found) signalLater(this, "clear", found.from, found.to);
|
3685
|
+
}
|
3641
3686
|
var min = null, max = null;
|
3642
3687
|
for (var i = 0; i < this.lines.length; ++i) {
|
3643
3688
|
var line = this.lines[i];
|
@@ -3666,7 +3711,6 @@ window.CodeMirror = (function() {
|
|
3666
3711
|
if (cm) reCheckSelection(cm);
|
3667
3712
|
}
|
3668
3713
|
if (withOp) endOperation(cm);
|
3669
|
-
signalLater(this, "clear");
|
3670
3714
|
};
|
3671
3715
|
|
3672
3716
|
TextMarker.prototype.find = function() {
|
@@ -3694,7 +3738,9 @@ window.CodeMirror = (function() {
|
|
3694
3738
|
if (node.offsetHeight != line.height) updateLineHeight(line, node.offsetHeight);
|
3695
3739
|
break;
|
3696
3740
|
}
|
3697
|
-
runInOp(cm, function() {
|
3741
|
+
runInOp(cm, function() {
|
3742
|
+
cm.curOp.selectionChanged = cm.curOp.forceUpdate = cm.curOp.updateMaxLine = true;
|
3743
|
+
});
|
3698
3744
|
}
|
3699
3745
|
};
|
3700
3746
|
|
@@ -3767,7 +3813,7 @@ window.CodeMirror = (function() {
|
|
3767
3813
|
}
|
3768
3814
|
if (cm) {
|
3769
3815
|
if (updateMaxLine) cm.curOp.updateMaxLine = true;
|
3770
|
-
if (marker.className || marker.startStyle || marker.endStyle || marker.collapsed)
|
3816
|
+
if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.collapsed)
|
3771
3817
|
regChange(cm, from.line, to.line + 1);
|
3772
3818
|
if (marker.atomic) reCheckSelection(cm);
|
3773
3819
|
}
|
@@ -3785,6 +3831,7 @@ window.CodeMirror = (function() {
|
|
3785
3831
|
}
|
3786
3832
|
}
|
3787
3833
|
CodeMirror.SharedTextMarker = SharedTextMarker;
|
3834
|
+
eventMixin(SharedTextMarker);
|
3788
3835
|
|
3789
3836
|
SharedTextMarker.prototype.clear = function() {
|
3790
3837
|
if (this.explicitlyCleared) return;
|
@@ -4037,11 +4084,12 @@ window.CodeMirror = (function() {
|
|
4037
4084
|
// LINE WIDGETS
|
4038
4085
|
|
4039
4086
|
var LineWidget = CodeMirror.LineWidget = function(cm, node, options) {
|
4040
|
-
for (var opt in options) if (options.hasOwnProperty(opt))
|
4087
|
+
if (options) for (var opt in options) if (options.hasOwnProperty(opt))
|
4041
4088
|
this[opt] = options[opt];
|
4042
4089
|
this.cm = cm;
|
4043
4090
|
this.node = node;
|
4044
4091
|
};
|
4092
|
+
eventMixin(LineWidget);
|
4045
4093
|
function widgetOperation(f) {
|
4046
4094
|
return function() {
|
4047
4095
|
var withOp = !this.cm.curOp;
|
@@ -4056,7 +4104,9 @@ window.CodeMirror = (function() {
|
|
4056
4104
|
if (no == null || !ws) return;
|
4057
4105
|
for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);
|
4058
4106
|
if (!ws.length) this.line.widgets = null;
|
4107
|
+
var aboveVisible = heightAtLine(this.cm, this.line) < this.cm.doc.scrollTop;
|
4059
4108
|
updateLineHeight(this.line, Math.max(0, this.line.height - widgetHeight(this)));
|
4109
|
+
if (aboveVisible) addToScrollPos(this.cm, 0, -this.height);
|
4060
4110
|
regChange(this.cm, no, no + 1);
|
4061
4111
|
});
|
4062
4112
|
LineWidget.prototype.changed = widgetOperation(function() {
|
@@ -4080,10 +4130,12 @@ window.CodeMirror = (function() {
|
|
4080
4130
|
var widget = new LineWidget(cm, node, options);
|
4081
4131
|
if (widget.noHScroll) cm.display.alignWidgets = true;
|
4082
4132
|
changeLine(cm, handle, function(line) {
|
4083
|
-
|
4133
|
+
var widgets = line.widgets || (line.widgets = []);
|
4134
|
+
if (widget.insertAt == null) widgets.push(widget);
|
4135
|
+
else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);
|
4084
4136
|
widget.line = line;
|
4085
4137
|
if (!lineIsHidden(cm.doc, line) || widget.showIfHidden) {
|
4086
|
-
var aboveVisible = heightAtLine(cm, line) < cm.
|
4138
|
+
var aboveVisible = heightAtLine(cm, line) < cm.doc.scrollTop;
|
4087
4139
|
updateLineHeight(line, line.height + widgetHeight(widget));
|
4088
4140
|
if (aboveVisible) addToScrollPos(cm, 0, widget.height);
|
4089
4141
|
}
|
@@ -4096,12 +4148,12 @@ window.CodeMirror = (function() {
|
|
4096
4148
|
|
4097
4149
|
// Line objects. These hold state related to a line, including
|
4098
4150
|
// highlighting info (the styles array).
|
4099
|
-
function
|
4100
|
-
|
4101
|
-
attachMarkedSpans(
|
4102
|
-
|
4103
|
-
|
4104
|
-
|
4151
|
+
var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {
|
4152
|
+
this.text = text;
|
4153
|
+
attachMarkedSpans(this, markedSpans);
|
4154
|
+
this.height = estimateHeight ? estimateHeight(this) : 1;
|
4155
|
+
};
|
4156
|
+
eventMixin(Line);
|
4105
4157
|
|
4106
4158
|
function updateLine(line, text, markedSpans, estimateHeight) {
|
4107
4159
|
line.text = text;
|
@@ -4207,13 +4259,14 @@ window.CodeMirror = (function() {
|
|
4207
4259
|
(styleToClassCache[style] = "cm-" + style.replace(/ +/g, " cm-"));
|
4208
4260
|
}
|
4209
4261
|
|
4210
|
-
function lineContent(cm, realLine, measure) {
|
4262
|
+
function lineContent(cm, realLine, measure, copyWidgets) {
|
4211
4263
|
var merged, line = realLine, empty = true;
|
4212
4264
|
while (merged = collapsedSpanAtStart(line))
|
4213
4265
|
line = getLine(cm.doc, merged.find().from.line);
|
4214
4266
|
|
4215
|
-
var builder = {pre: elt("pre"), col: 0, pos: 0,
|
4216
|
-
measure: null, measuredSomething: false, cm: cm
|
4267
|
+
var builder = {pre: elt("pre"), col: 0, pos: 0,
|
4268
|
+
measure: null, measuredSomething: false, cm: cm,
|
4269
|
+
copyWidgets: copyWidgets};
|
4217
4270
|
if (line.textClass) builder.pre.className = line.textClass;
|
4218
4271
|
|
4219
4272
|
do {
|
@@ -4256,7 +4309,7 @@ window.CodeMirror = (function() {
|
|
4256
4309
|
}
|
4257
4310
|
|
4258
4311
|
var tokenSpecialChars = /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\uFEFF]/g;
|
4259
|
-
function buildToken(builder, text, style, startStyle, endStyle) {
|
4312
|
+
function buildToken(builder, text, style, startStyle, endStyle, title) {
|
4260
4313
|
if (!text) return;
|
4261
4314
|
if (!tokenSpecialChars.test(text)) {
|
4262
4315
|
builder.col += text.length;
|
@@ -4289,7 +4342,9 @@ window.CodeMirror = (function() {
|
|
4289
4342
|
var fullStyle = style || "";
|
4290
4343
|
if (startStyle) fullStyle += startStyle;
|
4291
4344
|
if (endStyle) fullStyle += endStyle;
|
4292
|
-
|
4345
|
+
var token = elt("span", [content], fullStyle);
|
4346
|
+
if (title) token.title = title;
|
4347
|
+
return builder.pre.appendChild(token);
|
4293
4348
|
}
|
4294
4349
|
builder.pre.appendChild(content);
|
4295
4350
|
}
|
@@ -4304,9 +4359,11 @@ window.CodeMirror = (function() {
|
|
4304
4359
|
} else if (i && wrapping && spanAffectsWrapping(text, i)) {
|
4305
4360
|
builder.pre.appendChild(elt("wbr"));
|
4306
4361
|
}
|
4362
|
+
var old = builder.measure[builder.pos];
|
4307
4363
|
var span = builder.measure[builder.pos] =
|
4308
4364
|
buildToken(builder, ch, style,
|
4309
4365
|
start && startStyle, i == text.length - 1 && endStyle);
|
4366
|
+
if (old) span.leftSide = old.leftSide || old;
|
4310
4367
|
// In IE single-space nodes wrap differently than spaces
|
4311
4368
|
// embedded in larger text nodes, except when set to
|
4312
4369
|
// white-space: normal (issue #1268).
|
@@ -4325,20 +4382,28 @@ window.CodeMirror = (function() {
|
|
4325
4382
|
out += " ";
|
4326
4383
|
return out;
|
4327
4384
|
}
|
4328
|
-
return function(builder, text, style, startStyle, endStyle) {
|
4329
|
-
return inner(builder, text.replace(/ {3,}/, split), style, startStyle, endStyle);
|
4385
|
+
return function(builder, text, style, startStyle, endStyle, title) {
|
4386
|
+
return inner(builder, text.replace(/ {3,}/, split), style, startStyle, endStyle, title);
|
4330
4387
|
};
|
4331
4388
|
}
|
4332
4389
|
|
4333
|
-
function buildCollapsedSpan(builder, size,
|
4390
|
+
function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
|
4391
|
+
var widget = !ignoreWidget && marker.replacedWith;
|
4334
4392
|
if (widget) {
|
4335
|
-
if (
|
4393
|
+
if (builder.copyWidgets) widget = widget.cloneNode(true);
|
4394
|
+
builder.pre.appendChild(widget);
|
4336
4395
|
if (builder.measure) {
|
4337
|
-
|
4338
|
-
|
4396
|
+
if (size) {
|
4397
|
+
builder.measure[builder.pos] = widget;
|
4398
|
+
} else {
|
4399
|
+
var elt = builder.measure[builder.pos] = zeroWidthElement(builder.cm.display.measure);
|
4400
|
+
if (marker.type != "bookmark" || marker.insertLeft)
|
4401
|
+
builder.pre.insertBefore(elt, widget);
|
4402
|
+
else
|
4403
|
+
builder.pre.appendChild(elt);
|
4404
|
+
}
|
4339
4405
|
builder.measuredSomething = true;
|
4340
4406
|
}
|
4341
|
-
builder.pre.appendChild(widget);
|
4342
4407
|
}
|
4343
4408
|
builder.pos += size;
|
4344
4409
|
}
|
@@ -4354,10 +4419,10 @@ window.CodeMirror = (function() {
|
|
4354
4419
|
}
|
4355
4420
|
|
4356
4421
|
var len = allText.length, pos = 0, i = 1, text = "", style;
|
4357
|
-
var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed;
|
4422
|
+
var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;
|
4358
4423
|
for (;;) {
|
4359
4424
|
if (nextChange == pos) { // Update current marker set
|
4360
|
-
spanStyle = spanEndStyle = spanStartStyle = "";
|
4425
|
+
spanStyle = spanEndStyle = spanStartStyle = title = "";
|
4361
4426
|
collapsed = null; nextChange = Infinity;
|
4362
4427
|
var foundBookmark = null;
|
4363
4428
|
for (var j = 0; j < spans.length; ++j) {
|
@@ -4367,17 +4432,17 @@ window.CodeMirror = (function() {
|
|
4367
4432
|
if (m.className) spanStyle += " " + m.className;
|
4368
4433
|
if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
|
4369
4434
|
if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle;
|
4435
|
+
if (m.title && !title) title = m.title;
|
4370
4436
|
if (m.collapsed && (!collapsed || collapsed.marker.size < m.size))
|
4371
4437
|
collapsed = sp;
|
4372
4438
|
} else if (sp.from > pos && nextChange > sp.from) {
|
4373
4439
|
nextChange = sp.from;
|
4374
4440
|
}
|
4375
|
-
if (m.type == "bookmark" && sp.from == pos && m.replacedWith)
|
4376
|
-
foundBookmark = m.replacedWith;
|
4441
|
+
if (m.type == "bookmark" && sp.from == pos && m.replacedWith) foundBookmark = m;
|
4377
4442
|
}
|
4378
4443
|
if (collapsed && (collapsed.from || 0) == pos) {
|
4379
4444
|
buildCollapsedSpan(builder, (collapsed.to == null ? len : collapsed.to) - pos,
|
4380
|
-
collapsed.from
|
4445
|
+
collapsed.marker, collapsed.from == null);
|
4381
4446
|
if (collapsed.to == null) return collapsed.marker.find();
|
4382
4447
|
}
|
4383
4448
|
if (foundBookmark && !collapsed) buildCollapsedSpan(builder, 0, foundBookmark);
|
@@ -4391,7 +4456,7 @@ window.CodeMirror = (function() {
|
|
4391
4456
|
if (!collapsed) {
|
4392
4457
|
var tokenText = end > upto ? text.slice(0, upto - pos) : text;
|
4393
4458
|
builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
|
4394
|
-
spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "");
|
4459
|
+
spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title);
|
4395
4460
|
}
|
4396
4461
|
if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
|
4397
4462
|
pos = end;
|
@@ -4421,7 +4486,7 @@ window.CodeMirror = (function() {
|
|
4421
4486
|
// This is a whole-line replace. Treated specially to make
|
4422
4487
|
// sure line objects move the way they are supposed to.
|
4423
4488
|
for (var i = 0, e = text.length - 1, added = []; i < e; ++i)
|
4424
|
-
added.push(
|
4489
|
+
added.push(new Line(text[i], spansFor(i), estimateHeight));
|
4425
4490
|
update(lastLine, lastLine.text, lastSpans);
|
4426
4491
|
if (nlines) doc.remove(from.line, nlines);
|
4427
4492
|
if (added.length) doc.insert(from.line, added);
|
@@ -4430,8 +4495,8 @@ window.CodeMirror = (function() {
|
|
4430
4495
|
update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
|
4431
4496
|
} else {
|
4432
4497
|
for (var added = [], i = 1, e = text.length - 1; i < e; ++i)
|
4433
|
-
added.push(
|
4434
|
-
added.push(
|
4498
|
+
added.push(new Line(text[i], spansFor(i), estimateHeight));
|
4499
|
+
added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
|
4435
4500
|
update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
|
4436
4501
|
doc.insert(from.line + 1, added);
|
4437
4502
|
}
|
@@ -4442,7 +4507,7 @@ window.CodeMirror = (function() {
|
|
4442
4507
|
update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
|
4443
4508
|
update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
|
4444
4509
|
for (var i = 1, e = text.length - 1, added = []; i < e; ++i)
|
4445
|
-
added.push(
|
4510
|
+
added.push(new Line(text[i], spansFor(i), estimateHeight));
|
4446
4511
|
if (nlines > 1) doc.remove(from.line + 1, nlines - 1);
|
4447
4512
|
doc.insert(from.line + 1, added);
|
4448
4513
|
}
|
@@ -4585,7 +4650,7 @@ window.CodeMirror = (function() {
|
|
4585
4650
|
if (!(this instanceof Doc)) return new Doc(text, mode, firstLine);
|
4586
4651
|
if (firstLine == null) firstLine = 0;
|
4587
4652
|
|
4588
|
-
BranchChunk.call(this, [new LeafChunk([
|
4653
|
+
BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
|
4589
4654
|
this.first = firstLine;
|
4590
4655
|
this.scrollTop = this.scrollLeft = 0;
|
4591
4656
|
this.cantEdit = false;
|
@@ -4650,6 +4715,11 @@ window.CodeMirror = (function() {
|
|
4650
4715
|
getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},
|
4651
4716
|
getLineNumber: function(line) {return lineNo(line);},
|
4652
4717
|
|
4718
|
+
getLineHandleVisualStart: function(line) {
|
4719
|
+
if (typeof line == "number") line = getLine(this, line);
|
4720
|
+
return visualLine(this, line);
|
4721
|
+
},
|
4722
|
+
|
4653
4723
|
lineCount: function() {return this.size;},
|
4654
4724
|
firstLine: function() {return this.first;},
|
4655
4725
|
lastLine: function() {return this.first + this.size - 1;},
|
@@ -4820,6 +4890,8 @@ window.CodeMirror = (function() {
|
|
4820
4890
|
return function() {return method.apply(this.doc, arguments);};
|
4821
4891
|
})(Doc.prototype[prop]);
|
4822
4892
|
|
4893
|
+
eventMixin(Doc);
|
4894
|
+
|
4823
4895
|
function linkedDocs(doc, f, sharedHistOnly) {
|
4824
4896
|
function propagate(doc, skip, sharedHist) {
|
4825
4897
|
if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {
|
@@ -4963,7 +5035,8 @@ window.CodeMirror = (function() {
|
|
4963
5035
|
}
|
4964
5036
|
|
4965
5037
|
function historyChangeFromChange(doc, change) {
|
4966
|
-
var
|
5038
|
+
var from = { line: change.from.line, ch: change.from.ch };
|
5039
|
+
var histChange = {from: from, to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
|
4967
5040
|
attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
|
4968
5041
|
linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);
|
4969
5042
|
return histChange;
|
@@ -5183,9 +5256,9 @@ window.CodeMirror = (function() {
|
|
5183
5256
|
delayedCallbacks.push(bnd(arr[i]));
|
5184
5257
|
}
|
5185
5258
|
|
5186
|
-
function signalDOMEvent(cm, e) {
|
5187
|
-
signal(cm, e.type, cm, e);
|
5188
|
-
return e_defaultPrevented(e);
|
5259
|
+
function signalDOMEvent(cm, e, override) {
|
5260
|
+
signal(cm, override || e.type, cm, e);
|
5261
|
+
return e_defaultPrevented(e) || e.codemirrorIgnore;
|
5189
5262
|
}
|
5190
5263
|
|
5191
5264
|
function fireDelayed() {
|
@@ -5202,6 +5275,11 @@ window.CodeMirror = (function() {
|
|
5202
5275
|
|
5203
5276
|
CodeMirror.on = on; CodeMirror.off = off; CodeMirror.signal = signal;
|
5204
5277
|
|
5278
|
+
function eventMixin(ctor) {
|
5279
|
+
ctor.prototype.on = function(type, f) {on(this, type, f);};
|
5280
|
+
ctor.prototype.off = function(type, f) {off(this, type, f);};
|
5281
|
+
}
|
5282
|
+
|
5205
5283
|
// MISC UTILITIES
|
5206
5284
|
|
5207
5285
|
// Number of pixels added to scroller and sizer to hide scrollbar
|
@@ -5353,10 +5431,12 @@ window.CodeMirror = (function() {
|
|
5353
5431
|
spanAffectsWrapping = function(str, i) {
|
5354
5432
|
return /\-[^ \-?]|\?[^ !\'\"\),.\-\/:;\?\]\}]/.test(str.slice(i - 1, i + 1));
|
5355
5433
|
};
|
5356
|
-
else if (webkit)
|
5434
|
+
else if (webkit && !/Chrome\/(?:29|[3-9]\d|\d\d\d)\./.test(navigator.userAgent))
|
5357
5435
|
spanAffectsWrapping = function(str, i) {
|
5358
|
-
if (i > 1 && str.charCodeAt(i - 1) == 45
|
5359
|
-
return true;
|
5436
|
+
if (i > 1 && str.charCodeAt(i - 1) == 45) {
|
5437
|
+
if (/\w/.test(str.charAt(i - 2)) && /[^\-?\.]/.test(str.charAt(i))) return true;
|
5438
|
+
if (i > 2 && /[\d\.,]/.test(str.charAt(i - 2)) && /[\d\.,]/.test(str.charAt(i))) return false;
|
5439
|
+
}
|
5360
5440
|
return /[~!#%&*)=+}\]|\"\.>,:;][({[<]|-[^\-?\.\u2010-\u201f\u2026]|\?[\w~`@#$%\^&*(_=+{[|><]|…[\w~`@#$%\^&*(_=+{[><]/.test(str.slice(i - 1, i + 1));
|
5361
5441
|
};
|
5362
5442
|
|
@@ -5443,11 +5523,15 @@ window.CodeMirror = (function() {
|
|
5443
5523
|
|
5444
5524
|
function iterateBidiSections(order, from, to, f) {
|
5445
5525
|
if (!order) return f(from, to, "ltr");
|
5526
|
+
var found = false;
|
5446
5527
|
for (var i = 0; i < order.length; ++i) {
|
5447
5528
|
var part = order[i];
|
5448
|
-
if (part.from < to && part.to > from || from == to && part.to == from)
|
5529
|
+
if (part.from < to && part.to > from || from == to && part.to == from) {
|
5449
5530
|
f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");
|
5531
|
+
found = true;
|
5532
|
+
}
|
5450
5533
|
}
|
5534
|
+
if (!found) f(from, to, "ltr");
|
5451
5535
|
}
|
5452
5536
|
|
5453
5537
|
function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }
|
@@ -5709,7 +5793,7 @@ window.CodeMirror = (function() {
|
|
5709
5793
|
|
5710
5794
|
// THE END
|
5711
5795
|
|
5712
|
-
CodeMirror.version = "3.
|
5796
|
+
CodeMirror.version = "3.15.0";
|
5713
5797
|
|
5714
5798
|
return CodeMirror;
|
5715
5799
|
})();
|