codemirror-rails 3.20 → 3.21
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 +240 -135
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +6 -2
- data/vendor/assets/javascripts/codemirror/addons/comment/continuecomment.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +1 -0
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +5 -3
- data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +10 -6
- data/vendor/assets/javascripts/codemirror/addons/edit/continuelist.js +2 -0
- data/vendor/assets/javascripts/codemirror/addons/edit/matchbrackets.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/comment-fold.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +13 -2
- data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +2 -2
- data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +6 -0
- data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +3 -5
- data/vendor/assets/javascripts/codemirror/addons/hint/css-hint.js +29 -33
- data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/hint/pig-hint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/hint/python-hint.js +1 -5
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +58 -9
- data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +58 -17
- data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +5 -5
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +6 -1
- data/vendor/assets/javascripts/codemirror/addons/mode/multiplex.js +5 -3
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +26 -11
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +22 -11
- data/vendor/assets/javascripts/codemirror/addons/search/search.js +22 -9
- data/vendor/assets/javascripts/codemirror/addons/search/searchcursor.js +48 -24
- data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +15 -9
- data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +3 -3
- data/vendor/assets/javascripts/codemirror/addons/wrap/hardwrap.js +21 -9
- data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +12 -1
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +110 -28
- data/vendor/assets/javascripts/codemirror/modes/clike.js +28 -9
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +3 -4
- data/vendor/assets/javascripts/codemirror/modes/css.js +341 -297
- data/vendor/assets/javascripts/codemirror/modes/erlang.js +302 -179
- data/vendor/assets/javascripts/codemirror/modes/gfm.js +10 -5
- data/vendor/assets/javascripts/codemirror/modes/gherkin.js +45 -50
- data/vendor/assets/javascripts/codemirror/modes/haml.js +0 -4
- data/vendor/assets/javascripts/codemirror/modes/haskell.js +5 -3
- data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +0 -2
- data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +0 -2
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +43 -30
- data/vendor/assets/javascripts/codemirror/modes/jinja2.js +13 -3
- data/vendor/assets/javascripts/codemirror/modes/less.js +7 -6
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +231 -45
- data/vendor/assets/javascripts/codemirror/modes/{ocaml.js → mllike.js} +88 -13
- data/vendor/assets/javascripts/codemirror/modes/pegjs.js +5 -9
- data/vendor/assets/javascripts/codemirror/modes/php.js +6 -7
- data/vendor/assets/javascripts/codemirror/modes/python.js +6 -0
- data/vendor/assets/javascripts/codemirror/modes/r.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/rpm-spec.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +3 -1
- data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +4 -2
- data/vendor/assets/javascripts/codemirror/modes/smartymixed.js +0 -2
- data/vendor/assets/javascripts/codemirror/modes/sql.js +5 -4
- data/vendor/assets/javascripts/codemirror/modes/xml.js +87 -100
- data/vendor/assets/stylesheets/codemirror/themes/mbo.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/midnight.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/pastel-on-dark.css +49 -0
- data/vendor/assets/stylesheets/codemirror/themes/the-matrix.css +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8680d4179ae33590e39ba128f1345d74e83722db
|
|
4
|
+
data.tar.gz: 2cda7f5da857f741036521f93736630ede8ec6dc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8690cdf5554a8108e8c60956b196c91b121e3939e919ad030e0e76981f5bd0d126907049db5b2bef7014bca84b73ce2b36975eb7ce5e50dcc93e9e2296f77e50
|
|
7
|
+
data.tar.gz: a1afa46266825c3491100c691a11ec0ab1b21c3f9f9c4ac3901f5acd5f485a06b7e87f8a87636d84f6a058b039c5c5d50a1da6bbf5b16dcec3125c731b53df33
|
|
@@ -10,10 +10,11 @@ window.CodeMirror = (function() {
|
|
|
10
10
|
// IE11 currently doesn't count as 'ie', since it has almost none of
|
|
11
11
|
// the same bugs as earlier versions. Use ie_gt10 to handle
|
|
12
12
|
// incompatibilities in that version.
|
|
13
|
-
var
|
|
14
|
-
var ie_lt8 =
|
|
15
|
-
var ie_lt9 =
|
|
13
|
+
var old_ie = /MSIE \d/.test(navigator.userAgent);
|
|
14
|
+
var ie_lt8 = old_ie && (document.documentMode == null || document.documentMode < 8);
|
|
15
|
+
var ie_lt9 = old_ie && (document.documentMode == null || document.documentMode < 9);
|
|
16
16
|
var ie_gt10 = /Trident\/([7-9]|\d{2,})\./.test(navigator.userAgent);
|
|
17
|
+
var ie = old_ie || ie_gt10;
|
|
17
18
|
var webkit = /WebKit\//.test(navigator.userAgent);
|
|
18
19
|
var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent);
|
|
19
20
|
var chrome = /Chrome\//.test(navigator.userAgent);
|
|
@@ -35,7 +36,7 @@ window.CodeMirror = (function() {
|
|
|
35
36
|
if (opera_version && opera_version >= 15) { opera = false; webkit = true; }
|
|
36
37
|
// Some browsers use the wrong event properties to signal cmd/ctrl on OS X
|
|
37
38
|
var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11));
|
|
38
|
-
var captureMiddleClick = gecko || (
|
|
39
|
+
var captureMiddleClick = gecko || (old_ie && !ie_lt9);
|
|
39
40
|
|
|
40
41
|
// Optimize some code when these features are not used
|
|
41
42
|
var sawReadOnlySpans = false, sawCollapsedSpans = false;
|
|
@@ -61,7 +62,8 @@ window.CodeMirror = (function() {
|
|
|
61
62
|
overlays: [],
|
|
62
63
|
modeGen: 0,
|
|
63
64
|
overwrite: false, focused: false,
|
|
64
|
-
suppressEdits: false,
|
|
65
|
+
suppressEdits: false,
|
|
66
|
+
pasteIncoming: false, cutIncoming: false,
|
|
65
67
|
draggingText: false,
|
|
66
68
|
highlight: new Delayed()};
|
|
67
69
|
|
|
@@ -75,7 +77,7 @@ window.CodeMirror = (function() {
|
|
|
75
77
|
|
|
76
78
|
// Override magic textarea content restore that IE sometimes does
|
|
77
79
|
// on our hidden textarea on reload
|
|
78
|
-
if (
|
|
80
|
+
if (old_ie) setTimeout(bind(resetInput, this, true), 20);
|
|
79
81
|
|
|
80
82
|
registerEventHandlers(this);
|
|
81
83
|
// IE throws unspecified error in certain cases, when
|
|
@@ -195,6 +197,10 @@ window.CodeMirror = (function() {
|
|
|
195
197
|
|
|
196
198
|
function loadMode(cm) {
|
|
197
199
|
cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
|
|
200
|
+
resetModeState(cm);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function resetModeState(cm) {
|
|
198
204
|
cm.doc.iter(function(line) {
|
|
199
205
|
if (line.stateAfter) line.stateAfter = null;
|
|
200
206
|
if (line.styles) line.styles = null;
|
|
@@ -244,7 +250,6 @@ window.CodeMirror = (function() {
|
|
|
244
250
|
var map = keyMap[cm.options.keyMap], style = map.style;
|
|
245
251
|
cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") +
|
|
246
252
|
(style ? " cm-keymap-" + style : "");
|
|
247
|
-
cm.state.disableInput = map.disableInput;
|
|
248
253
|
}
|
|
249
254
|
|
|
250
255
|
function themeChanged(cm) {
|
|
@@ -450,7 +455,7 @@ window.CodeMirror = (function() {
|
|
|
450
455
|
// updates.
|
|
451
456
|
function updateDisplayInner(cm, changes, visible, forced) {
|
|
452
457
|
var display = cm.display, doc = cm.doc;
|
|
453
|
-
if (!display.wrapper.
|
|
458
|
+
if (!display.wrapper.offsetWidth) {
|
|
454
459
|
display.showingFrom = display.showingTo = doc.first;
|
|
455
460
|
display.viewOffset = 0;
|
|
456
461
|
return;
|
|
@@ -535,6 +540,7 @@ window.CodeMirror = (function() {
|
|
|
535
540
|
}
|
|
536
541
|
display.showingFrom = from; display.showingTo = to;
|
|
537
542
|
|
|
543
|
+
display.gutters.style.height = "";
|
|
538
544
|
updateHeightsInViewport(cm);
|
|
539
545
|
updateViewOffset(cm);
|
|
540
546
|
|
|
@@ -717,9 +723,9 @@ window.CodeMirror = (function() {
|
|
|
717
723
|
if (bgClass)
|
|
718
724
|
wrap.insertBefore(elt("div", null, bgClass + " CodeMirror-linebackground"), wrap.firstChild);
|
|
719
725
|
if (cm.options.lineNumbers || markers) {
|
|
720
|
-
var gutterWrap = wrap.insertBefore(elt("div", null,
|
|
726
|
+
var gutterWrap = wrap.insertBefore(elt("div", null, "CodeMirror-gutter-wrapper", "position: absolute; left: " +
|
|
721
727
|
(cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"),
|
|
722
|
-
|
|
728
|
+
lineElement);
|
|
723
729
|
if (cm.options.fixedGutter) (wrap.alignable || (wrap.alignable = [])).push(gutterWrap);
|
|
724
730
|
if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
|
|
725
731
|
wrap.lineNumber = gutterWrap.appendChild(
|
|
@@ -1053,7 +1059,7 @@ window.CodeMirror = (function() {
|
|
|
1053
1059
|
// doesn't work when wrapping is on, but in that case the
|
|
1054
1060
|
// situation is slightly better, since IE does cache line-wrapping
|
|
1055
1061
|
// information and only recomputes per-line.
|
|
1056
|
-
if (
|
|
1062
|
+
if (old_ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) {
|
|
1057
1063
|
var fragment = document.createDocumentFragment();
|
|
1058
1064
|
var chunk = 10, n = pre.childNodes.length;
|
|
1059
1065
|
for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) {
|
|
@@ -1113,7 +1119,7 @@ window.CodeMirror = (function() {
|
|
|
1113
1119
|
}
|
|
1114
1120
|
}
|
|
1115
1121
|
if (!rect) rect = data[i] = measureRect(getRect(node));
|
|
1116
|
-
if (cur.measureRight) rect.right = getRect(cur.measureRight).left;
|
|
1122
|
+
if (cur.measureRight) rect.right = getRect(cur.measureRight).left - outer.left;
|
|
1117
1123
|
if (cur.leftSide) rect.leftSide = measureRect(getRect(cur.leftSide));
|
|
1118
1124
|
}
|
|
1119
1125
|
removeChildren(cm.display.measure);
|
|
@@ -1289,7 +1295,7 @@ window.CodeMirror = (function() {
|
|
|
1289
1295
|
if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
|
|
1290
1296
|
var ch = x < fromX || x - fromX <= toX - x ? from : to;
|
|
1291
1297
|
var xDiff = x - (ch == from ? fromX : toX);
|
|
1292
|
-
while (isExtendingChar
|
|
1298
|
+
while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;
|
|
1293
1299
|
var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
|
|
1294
1300
|
xDiff < 0 ? -1 : xDiff ? 1 : 0);
|
|
1295
1301
|
return pos;
|
|
@@ -1481,7 +1487,7 @@ window.CodeMirror = (function() {
|
|
|
1481
1487
|
// supported or compatible enough yet to rely on.)
|
|
1482
1488
|
function readInput(cm) {
|
|
1483
1489
|
var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel;
|
|
1484
|
-
if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.
|
|
1490
|
+
if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.options.disableInput) return false;
|
|
1485
1491
|
if (cm.state.pasteIncoming && cm.state.fakedLastChar) {
|
|
1486
1492
|
input.value = input.value.substring(0, input.value.length - 1);
|
|
1487
1493
|
cm.state.fakedLastChar = false;
|
|
@@ -1499,22 +1505,32 @@ window.CodeMirror = (function() {
|
|
|
1499
1505
|
var same = 0, l = Math.min(prevInput.length, text.length);
|
|
1500
1506
|
while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
|
|
1501
1507
|
var from = sel.from, to = sel.to;
|
|
1508
|
+
var inserted = text.slice(same);
|
|
1502
1509
|
if (same < prevInput.length)
|
|
1503
1510
|
from = Pos(from.line, from.ch - (prevInput.length - same));
|
|
1504
1511
|
else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming)
|
|
1505
|
-
to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch +
|
|
1512
|
+
to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + inserted.length));
|
|
1506
1513
|
|
|
1507
1514
|
var updateInput = cm.curOp.updateInput;
|
|
1508
|
-
var changeEvent = {from: from, to: to, text: splitLines(
|
|
1509
|
-
origin: cm.state.pasteIncoming ? "paste" : "+input"};
|
|
1515
|
+
var changeEvent = {from: from, to: to, text: splitLines(inserted),
|
|
1516
|
+
origin: cm.state.pasteIncoming ? "paste" : cm.state.cutIncoming ? "cut" : "+input"};
|
|
1510
1517
|
makeChange(cm.doc, changeEvent, "end");
|
|
1511
1518
|
cm.curOp.updateInput = updateInput;
|
|
1512
1519
|
signalLater(cm, "inputRead", cm, changeEvent);
|
|
1520
|
+
if (inserted && !cm.state.pasteIncoming && cm.options.electricChars &&
|
|
1521
|
+
cm.options.smartIndent && sel.head.ch < 100) {
|
|
1522
|
+
var electric = cm.getModeAt(sel.head).electricChars;
|
|
1523
|
+
if (electric) for (var i = 0; i < electric.length; i++)
|
|
1524
|
+
if (inserted.indexOf(electric.charAt(i)) > -1) {
|
|
1525
|
+
indentLine(cm, sel.head.line, "smart");
|
|
1526
|
+
break;
|
|
1527
|
+
}
|
|
1528
|
+
}
|
|
1513
1529
|
|
|
1514
1530
|
if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";
|
|
1515
1531
|
else cm.display.prevInput = text;
|
|
1516
1532
|
if (withOp) endOperation(cm);
|
|
1517
|
-
cm.state.pasteIncoming = false;
|
|
1533
|
+
cm.state.pasteIncoming = cm.state.cutIncoming = false;
|
|
1518
1534
|
return true;
|
|
1519
1535
|
}
|
|
1520
1536
|
|
|
@@ -1549,7 +1565,7 @@ window.CodeMirror = (function() {
|
|
|
1549
1565
|
function registerEventHandlers(cm) {
|
|
1550
1566
|
var d = cm.display;
|
|
1551
1567
|
on(d.scroller, "mousedown", operation(cm, onMouseDown));
|
|
1552
|
-
if (
|
|
1568
|
+
if (old_ie)
|
|
1553
1569
|
on(d.scroller, "dblclick", operation(cm, function(e) {
|
|
1554
1570
|
if (signalDOMEvent(cm, e)) return;
|
|
1555
1571
|
var pos = posFromMouse(cm, e);
|
|
@@ -1655,21 +1671,22 @@ window.CodeMirror = (function() {
|
|
|
1655
1671
|
fastPoll(cm);
|
|
1656
1672
|
});
|
|
1657
1673
|
|
|
1658
|
-
function prepareCopy() {
|
|
1674
|
+
function prepareCopy(e) {
|
|
1659
1675
|
if (d.inaccurateSelection) {
|
|
1660
1676
|
d.prevInput = "";
|
|
1661
1677
|
d.inaccurateSelection = false;
|
|
1662
1678
|
d.input.value = cm.getSelection();
|
|
1663
1679
|
selectInput(d.input);
|
|
1664
1680
|
}
|
|
1681
|
+
if (e.type == "cut") cm.state.cutIncoming = true;
|
|
1665
1682
|
}
|
|
1666
1683
|
on(d.input, "cut", prepareCopy);
|
|
1667
1684
|
on(d.input, "copy", prepareCopy);
|
|
1668
1685
|
|
|
1669
1686
|
// Needed to handle Tab key in KHTML
|
|
1670
1687
|
if (khtml) on(d.sizer, "mouseup", function() {
|
|
1671
|
-
|
|
1672
|
-
|
|
1688
|
+
if (document.activeElement == d.input) d.input.blur();
|
|
1689
|
+
focusInput(cm);
|
|
1673
1690
|
});
|
|
1674
1691
|
}
|
|
1675
1692
|
|
|
@@ -1753,6 +1770,9 @@ window.CodeMirror = (function() {
|
|
|
1753
1770
|
e_preventDefault(e2);
|
|
1754
1771
|
extendSelection(cm.doc, start);
|
|
1755
1772
|
focusInput(cm);
|
|
1773
|
+
// Work around unexplainable focus problem in IE9 (#2127)
|
|
1774
|
+
if (old_ie && !ie_lt9)
|
|
1775
|
+
setTimeout(function() {document.body.focus(); focusInput(cm);}, 20);
|
|
1756
1776
|
}
|
|
1757
1777
|
});
|
|
1758
1778
|
// Let the drag handler handle this.
|
|
@@ -1827,7 +1847,7 @@ window.CodeMirror = (function() {
|
|
|
1827
1847
|
}
|
|
1828
1848
|
|
|
1829
1849
|
var move = operation(cm, function(e) {
|
|
1830
|
-
if (!
|
|
1850
|
+
if (!old_ie && !e_button(e)) done(e);
|
|
1831
1851
|
else extend(e);
|
|
1832
1852
|
});
|
|
1833
1853
|
var up = operation(cm, done);
|
|
@@ -1972,7 +1992,7 @@ window.CodeMirror = (function() {
|
|
|
1972
1992
|
// know one. These don't have to be accurate -- the result of them
|
|
1973
1993
|
// being wrong would just be a slight flicker on the first wheel
|
|
1974
1994
|
// scroll (if it is large enough).
|
|
1975
|
-
if (
|
|
1995
|
+
if (old_ie) wheelPixelsPerUnit = -.53;
|
|
1976
1996
|
else if (gecko) wheelPixelsPerUnit = 15;
|
|
1977
1997
|
else if (chrome) wheelPixelsPerUnit = -.7;
|
|
1978
1998
|
else if (safari) wheelPixelsPerUnit = -1/3;
|
|
@@ -2126,7 +2146,7 @@ window.CodeMirror = (function() {
|
|
|
2126
2146
|
var cm = this;
|
|
2127
2147
|
if (!cm.state.focused) onFocus(cm);
|
|
2128
2148
|
if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
|
|
2129
|
-
if (
|
|
2149
|
+
if (old_ie && e.keyCode == 27) e.returnValue = false;
|
|
2130
2150
|
var code = e.keyCode;
|
|
2131
2151
|
// IE does strange things with escape.
|
|
2132
2152
|
cm.doc.sel.shift = code == 16 || e.shiftKey;
|
|
@@ -2147,10 +2167,6 @@ window.CodeMirror = (function() {
|
|
|
2147
2167
|
if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
|
|
2148
2168
|
if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;
|
|
2149
2169
|
var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
|
|
2150
|
-
if (this.options.electricChars && this.doc.mode.electricChars &&
|
|
2151
|
-
this.options.smartIndent && !isReadOnly(this) &&
|
|
2152
|
-
this.doc.mode.electricChars.indexOf(ch) > -1)
|
|
2153
|
-
setTimeout(operation(cm, function() {indentLine(cm, cm.doc.sel.to.line, "smart");}), 75);
|
|
2154
2170
|
if (handleCharBinding(cm, e, ch)) return;
|
|
2155
2171
|
if (ie && !ie_lt9) cm.display.inputHasSelection = null;
|
|
2156
2172
|
fastPoll(cm);
|
|
@@ -2199,7 +2215,7 @@ window.CodeMirror = (function() {
|
|
|
2199
2215
|
var oldCSS = display.input.style.cssText;
|
|
2200
2216
|
display.inputDiv.style.position = "absolute";
|
|
2201
2217
|
display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
|
|
2202
|
-
"px; left: " + (e.clientX - 5) + "px; z-index: 1000; background:
|
|
2218
|
+
"px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: transparent; outline: none;" +
|
|
2203
2219
|
"border-width: 0; outline: none; overflow: hidden; opacity: .05; -ms-opacity: .05; filter: alpha(opacity=5);";
|
|
2204
2220
|
focusInput(cm);
|
|
2205
2221
|
resetInput(cm, true);
|
|
@@ -2221,10 +2237,10 @@ window.CodeMirror = (function() {
|
|
|
2221
2237
|
|
|
2222
2238
|
// Try to detect the user choosing select-all
|
|
2223
2239
|
if (display.input.selectionStart != null) {
|
|
2224
|
-
if (!
|
|
2240
|
+
if (!old_ie || ie_lt9) prepareSelectAllHack();
|
|
2225
2241
|
clearTimeout(detectingSelectAll);
|
|
2226
2242
|
var i = 0, poll = function(){
|
|
2227
|
-
if (display.prevInput == "
|
|
2243
|
+
if (display.prevInput == "\u200b" && display.input.selectionStart == 0)
|
|
2228
2244
|
operation(cm, commands.selectAll)(cm);
|
|
2229
2245
|
else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500);
|
|
2230
2246
|
else resetInput(cm);
|
|
@@ -2233,7 +2249,7 @@ window.CodeMirror = (function() {
|
|
|
2233
2249
|
}
|
|
2234
2250
|
}
|
|
2235
2251
|
|
|
2236
|
-
if (
|
|
2252
|
+
if (old_ie && !ie_lt9) prepareSelectAllHack();
|
|
2237
2253
|
if (captureMiddleClick) {
|
|
2238
2254
|
e_stop(e);
|
|
2239
2255
|
var mouseup = function() {
|
|
@@ -2506,6 +2522,7 @@ window.CodeMirror = (function() {
|
|
|
2506
2522
|
|
|
2507
2523
|
function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
|
|
2508
2524
|
function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
|
|
2525
|
+
function cmp(a, b) {return a.line - b.line || a.ch - b.ch;}
|
|
2509
2526
|
function copyPos(x) {return Pos(x.line, x.ch);}
|
|
2510
2527
|
|
|
2511
2528
|
// SELECTION
|
|
@@ -2650,14 +2667,13 @@ window.CodeMirror = (function() {
|
|
|
2650
2667
|
if (coords.top + box.top < 0) doScroll = true;
|
|
2651
2668
|
else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
|
|
2652
2669
|
if (doScroll != null && !phantom) {
|
|
2653
|
-
var
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
display.
|
|
2660
|
-
if (hidden) display.cursor.style.display = "none";
|
|
2670
|
+
var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " +
|
|
2671
|
+
(coords.top - display.viewOffset) + "px; height: " +
|
|
2672
|
+
(coords.bottom - coords.top + scrollerCutOff) + "px; left: " +
|
|
2673
|
+
coords.left + "px; width: 2px;");
|
|
2674
|
+
cm.display.lineSpace.appendChild(scrollNode);
|
|
2675
|
+
scrollNode.scrollIntoView(doScroll);
|
|
2676
|
+
cm.display.lineSpace.removeChild(scrollNode);
|
|
2661
2677
|
}
|
|
2662
2678
|
}
|
|
2663
2679
|
|
|
@@ -2740,7 +2756,10 @@ window.CodeMirror = (function() {
|
|
|
2740
2756
|
var tabSize = cm.options.tabSize;
|
|
2741
2757
|
var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
|
|
2742
2758
|
var curSpaceString = line.text.match(/^\s*/)[0], indentation;
|
|
2743
|
-
if (
|
|
2759
|
+
if (!aggressive && !/\S/.test(line.text)) {
|
|
2760
|
+
indentation = 0;
|
|
2761
|
+
how = "not";
|
|
2762
|
+
} else if (how == "smart") {
|
|
2744
2763
|
indentation = cm.doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
|
|
2745
2764
|
if (indentation == Pass) {
|
|
2746
2765
|
if (!aggressive) return;
|
|
@@ -2922,7 +2941,7 @@ window.CodeMirror = (function() {
|
|
|
2922
2941
|
}),
|
|
2923
2942
|
indentSelection: operation(null, function(how) {
|
|
2924
2943
|
var sel = this.doc.sel;
|
|
2925
|
-
if (posEq(sel.from, sel.to)) return indentLine(this, sel.from.line, how);
|
|
2944
|
+
if (posEq(sel.from, sel.to)) return indentLine(this, sel.from.line, how, true);
|
|
2926
2945
|
var e = sel.to.line - (sel.to.ch ? 0 : 1);
|
|
2927
2946
|
for (var i = sel.from.line; i <= e; ++i) indentLine(this, i, how);
|
|
2928
2947
|
}),
|
|
@@ -2967,11 +2986,31 @@ window.CodeMirror = (function() {
|
|
|
2967
2986
|
},
|
|
2968
2987
|
|
|
2969
2988
|
getHelper: function(pos, type) {
|
|
2970
|
-
|
|
2989
|
+
return this.getHelpers(pos, type)[0];
|
|
2990
|
+
},
|
|
2991
|
+
|
|
2992
|
+
getHelpers: function(pos, type) {
|
|
2993
|
+
var found = [];
|
|
2994
|
+
if (!helpers.hasOwnProperty(type)) return helpers;
|
|
2971
2995
|
var help = helpers[type], mode = this.getModeAt(pos);
|
|
2972
|
-
|
|
2973
|
-
mode.
|
|
2974
|
-
|
|
2996
|
+
if (typeof mode[type] == "string") {
|
|
2997
|
+
if (help[mode[type]]) found.push(help[mode[type]]);
|
|
2998
|
+
} else if (mode[type]) {
|
|
2999
|
+
for (var i = 0; i < mode[type].length; i++) {
|
|
3000
|
+
var val = help[mode[type][i]];
|
|
3001
|
+
if (val) found.push(val);
|
|
3002
|
+
}
|
|
3003
|
+
} else if (mode.helperType && help[mode.helperType]) {
|
|
3004
|
+
found.push(help[mode.helperType]);
|
|
3005
|
+
} else if (help[mode.name]) {
|
|
3006
|
+
found.push(help[mode.name]);
|
|
3007
|
+
}
|
|
3008
|
+
for (var i = 0; i < help._global.length; i++) {
|
|
3009
|
+
var cur = help._global[i];
|
|
3010
|
+
if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)
|
|
3011
|
+
found.push(cur.val);
|
|
3012
|
+
}
|
|
3013
|
+
return found;
|
|
2975
3014
|
},
|
|
2976
3015
|
|
|
2977
3016
|
getStateAfter: function(line, precise) {
|
|
@@ -3118,7 +3157,10 @@ window.CodeMirror = (function() {
|
|
|
3118
3157
|
|
|
3119
3158
|
triggerOnKeyDown: operation(null, onKeyDown),
|
|
3120
3159
|
|
|
3121
|
-
execCommand: function(cmd) {
|
|
3160
|
+
execCommand: function(cmd) {
|
|
3161
|
+
if (commands.hasOwnProperty(cmd))
|
|
3162
|
+
return commands[cmd](this);
|
|
3163
|
+
},
|
|
3122
3164
|
|
|
3123
3165
|
findPosH: function(from, amount, unit, visually) {
|
|
3124
3166
|
var dir = 1;
|
|
@@ -3160,14 +3202,18 @@ window.CodeMirror = (function() {
|
|
|
3160
3202
|
},
|
|
3161
3203
|
|
|
3162
3204
|
moveV: operation(null, function(dir, unit) {
|
|
3163
|
-
var sel = this.doc.sel;
|
|
3164
|
-
|
|
3165
|
-
|
|
3166
|
-
|
|
3167
|
-
|
|
3168
|
-
|
|
3205
|
+
var sel = this.doc.sel, target, goal;
|
|
3206
|
+
if (sel.shift || sel.extend || posEq(sel.from, sel.to)) {
|
|
3207
|
+
var pos = cursorCoords(this, sel.head, "div");
|
|
3208
|
+
if (sel.goalColumn != null) pos.left = sel.goalColumn;
|
|
3209
|
+
target = findPosV(this, pos, dir, unit);
|
|
3210
|
+
if (unit == "page") addToScrollPos(this, 0, charCoords(this, target, "div").top - pos.top);
|
|
3211
|
+
goal = pos.left;
|
|
3212
|
+
} else {
|
|
3213
|
+
target = dir < 0 ? sel.from : sel.to;
|
|
3214
|
+
}
|
|
3169
3215
|
extendSelection(this.doc, target, target, dir);
|
|
3170
|
-
sel.goalColumn =
|
|
3216
|
+
if (goal != null) sel.goalColumn = goal;
|
|
3171
3217
|
}),
|
|
3172
3218
|
|
|
3173
3219
|
toggleOverwrite: function(value) {
|
|
@@ -3277,7 +3323,7 @@ window.CodeMirror = (function() {
|
|
|
3277
3323
|
option("indentWithTabs", false);
|
|
3278
3324
|
option("smartIndent", true);
|
|
3279
3325
|
option("tabSize", 4, function(cm) {
|
|
3280
|
-
|
|
3326
|
+
resetModeState(cm);
|
|
3281
3327
|
clearCaches(cm);
|
|
3282
3328
|
regChange(cm);
|
|
3283
3329
|
}, true);
|
|
@@ -3330,6 +3376,7 @@ window.CodeMirror = (function() {
|
|
|
3330
3376
|
if (!val) resetInput(cm, true);
|
|
3331
3377
|
}
|
|
3332
3378
|
});
|
|
3379
|
+
option("disableInput", false, function(cm, val) {if (!val) resetInput(cm, true);}, true);
|
|
3333
3380
|
option("dragDrop", true);
|
|
3334
3381
|
|
|
3335
3382
|
option("cursorBlinkRate", 530);
|
|
@@ -3337,12 +3384,13 @@ window.CodeMirror = (function() {
|
|
|
3337
3384
|
option("cursorHeight", 1);
|
|
3338
3385
|
option("workTime", 100);
|
|
3339
3386
|
option("workDelay", 100);
|
|
3340
|
-
option("flattenSpans", true);
|
|
3387
|
+
option("flattenSpans", true, resetModeState, true);
|
|
3388
|
+
option("addModeClass", false, resetModeState, true);
|
|
3341
3389
|
option("pollInterval", 100);
|
|
3342
3390
|
option("undoDepth", 40, function(cm, val){cm.doc.history.undoDepth = val;});
|
|
3343
3391
|
option("historyEventDelay", 500);
|
|
3344
3392
|
option("viewportMargin", 10, function(cm){cm.refresh();}, true);
|
|
3345
|
-
option("maxHighlightLength", 10000,
|
|
3393
|
+
option("maxHighlightLength", 10000, resetModeState, true);
|
|
3346
3394
|
option("crudeMeasuringFrom", 10000);
|
|
3347
3395
|
option("moveInputWithCursor", true, function(cm, val) {
|
|
3348
3396
|
if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;
|
|
@@ -3399,6 +3447,9 @@ window.CodeMirror = (function() {
|
|
|
3399
3447
|
}
|
|
3400
3448
|
}
|
|
3401
3449
|
modeObj.name = spec.name;
|
|
3450
|
+
if (spec.helperType) modeObj.helperType = spec.helperType;
|
|
3451
|
+
if (spec.modeProps) for (var prop in spec.modeProps)
|
|
3452
|
+
modeObj[prop] = spec.modeProps[prop];
|
|
3402
3453
|
|
|
3403
3454
|
return modeObj;
|
|
3404
3455
|
};
|
|
@@ -3429,9 +3480,13 @@ window.CodeMirror = (function() {
|
|
|
3429
3480
|
|
|
3430
3481
|
var helpers = CodeMirror.helpers = {};
|
|
3431
3482
|
CodeMirror.registerHelper = function(type, name, value) {
|
|
3432
|
-
if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {};
|
|
3483
|
+
if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};
|
|
3433
3484
|
helpers[type][name] = value;
|
|
3434
3485
|
};
|
|
3486
|
+
CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {
|
|
3487
|
+
CodeMirror.registerHelper(type, name, value);
|
|
3488
|
+
helpers[type]._global.push({pred: predicate, val: value});
|
|
3489
|
+
};
|
|
3435
3490
|
|
|
3436
3491
|
// UTILITIES
|
|
3437
3492
|
|
|
@@ -3536,7 +3591,9 @@ window.CodeMirror = (function() {
|
|
|
3536
3591
|
indentAuto: function(cm) {cm.indentSelection("smart");},
|
|
3537
3592
|
indentMore: function(cm) {cm.indentSelection("add");},
|
|
3538
3593
|
indentLess: function(cm) {cm.indentSelection("subtract");},
|
|
3539
|
-
insertTab: function(cm) {
|
|
3594
|
+
insertTab: function(cm) {
|
|
3595
|
+
cm.replaceSelection("\t", "end", "+input");
|
|
3596
|
+
},
|
|
3540
3597
|
defaultTab: function(cm) {
|
|
3541
3598
|
if (cm.somethingSelected()) cm.indentSelection("add");
|
|
3542
3599
|
else cm.replaceSelection("\t", "end", "+input");
|
|
@@ -3709,11 +3766,12 @@ window.CodeMirror = (function() {
|
|
|
3709
3766
|
this.string = string;
|
|
3710
3767
|
this.tabSize = tabSize || 8;
|
|
3711
3768
|
this.lastColumnPos = this.lastColumnValue = 0;
|
|
3769
|
+
this.lineStart = 0;
|
|
3712
3770
|
}
|
|
3713
3771
|
|
|
3714
3772
|
StringStream.prototype = {
|
|
3715
3773
|
eol: function() {return this.pos >= this.string.length;},
|
|
3716
|
-
sol: function() {return this.pos ==
|
|
3774
|
+
sol: function() {return this.pos == this.lineStart;},
|
|
3717
3775
|
peek: function() {return this.string.charAt(this.pos) || undefined;},
|
|
3718
3776
|
next: function() {
|
|
3719
3777
|
if (this.pos < this.string.length)
|
|
@@ -3746,9 +3804,12 @@ window.CodeMirror = (function() {
|
|
|
3746
3804
|
this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
|
|
3747
3805
|
this.lastColumnPos = this.start;
|
|
3748
3806
|
}
|
|
3749
|
-
return this.lastColumnValue;
|
|
3807
|
+
return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
|
|
3808
|
+
},
|
|
3809
|
+
indentation: function() {
|
|
3810
|
+
return countColumn(this.string, null, this.tabSize) -
|
|
3811
|
+
(this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
|
|
3750
3812
|
},
|
|
3751
|
-
indentation: function() {return countColumn(this.string, null, this.tabSize);},
|
|
3752
3813
|
match: function(pattern, consume, caseInsensitive) {
|
|
3753
3814
|
if (typeof pattern == "string") {
|
|
3754
3815
|
var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
|
|
@@ -3764,7 +3825,12 @@ window.CodeMirror = (function() {
|
|
|
3764
3825
|
return match;
|
|
3765
3826
|
}
|
|
3766
3827
|
},
|
|
3767
|
-
current: function(){return this.string.slice(this.start, this.pos);}
|
|
3828
|
+
current: function(){return this.string.slice(this.start, this.pos);},
|
|
3829
|
+
hideFirstChars: function(n, inner) {
|
|
3830
|
+
this.lineStart += n;
|
|
3831
|
+
try { return inner(); }
|
|
3832
|
+
finally { this.lineStart -= n; }
|
|
3833
|
+
}
|
|
3768
3834
|
};
|
|
3769
3835
|
CodeMirror.StringStream = StringStream;
|
|
3770
3836
|
|
|
@@ -3816,7 +3882,7 @@ window.CodeMirror = (function() {
|
|
|
3816
3882
|
if (withOp) endOperation(cm);
|
|
3817
3883
|
};
|
|
3818
3884
|
|
|
3819
|
-
TextMarker.prototype.find = function() {
|
|
3885
|
+
TextMarker.prototype.find = function(bothSides) {
|
|
3820
3886
|
var from, to;
|
|
3821
3887
|
for (var i = 0; i < this.lines.length; ++i) {
|
|
3822
3888
|
var line = this.lines[i];
|
|
@@ -3827,7 +3893,7 @@ window.CodeMirror = (function() {
|
|
|
3827
3893
|
if (span.to != null) to = Pos(found, span.to);
|
|
3828
3894
|
}
|
|
3829
3895
|
}
|
|
3830
|
-
if (this.type == "bookmark") return from;
|
|
3896
|
+
if (this.type == "bookmark" && !bothSides) return from;
|
|
3831
3897
|
return from && {from: from, to: to};
|
|
3832
3898
|
};
|
|
3833
3899
|
|
|
@@ -3864,39 +3930,40 @@ window.CodeMirror = (function() {
|
|
|
3864
3930
|
}
|
|
3865
3931
|
};
|
|
3866
3932
|
|
|
3933
|
+
var nextMarkerId = 0;
|
|
3934
|
+
|
|
3867
3935
|
function markText(doc, from, to, options, type) {
|
|
3868
3936
|
if (options && options.shared) return markTextShared(doc, from, to, options, type);
|
|
3869
3937
|
if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);
|
|
3870
3938
|
|
|
3871
3939
|
var marker = new TextMarker(doc, type);
|
|
3872
|
-
if (posLess(to, from) || posEq(from, to) && type == "range" &&
|
|
3873
|
-
!(options.inclusiveLeft && options.inclusiveRight))
|
|
3874
|
-
return marker;
|
|
3875
3940
|
if (options) copyObj(options, marker);
|
|
3941
|
+
if (posLess(to, from) || posEq(from, to) && marker.clearWhenEmpty !== false)
|
|
3942
|
+
return marker;
|
|
3876
3943
|
if (marker.replacedWith) {
|
|
3877
3944
|
marker.collapsed = true;
|
|
3878
3945
|
marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget");
|
|
3879
3946
|
if (!options.handleMouseEvents) marker.replacedWith.ignoreEvents = true;
|
|
3880
3947
|
}
|
|
3881
|
-
if (marker.collapsed)
|
|
3948
|
+
if (marker.collapsed) {
|
|
3949
|
+
if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
|
|
3950
|
+
from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
|
|
3951
|
+
throw new Error("Inserting collapsed marker partially overlapping an existing one");
|
|
3952
|
+
sawCollapsedSpans = true;
|
|
3953
|
+
}
|
|
3882
3954
|
|
|
3883
3955
|
if (marker.addToHistory)
|
|
3884
3956
|
addToHistory(doc, {from: from, to: to, origin: "markText"},
|
|
3885
3957
|
{head: doc.sel.head, anchor: doc.sel.anchor}, NaN);
|
|
3886
3958
|
|
|
3887
|
-
var curLine = from.line,
|
|
3959
|
+
var curLine = from.line, cm = doc.cm, updateMaxLine;
|
|
3888
3960
|
doc.iter(curLine, to.line + 1, function(line) {
|
|
3889
3961
|
if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(doc, line) == cm.display.maxLine)
|
|
3890
3962
|
updateMaxLine = true;
|
|
3891
3963
|
var span = {from: null, to: null, marker: marker};
|
|
3892
|
-
|
|
3893
|
-
if (curLine ==
|
|
3894
|
-
if (curLine
|
|
3895
|
-
if (marker.collapsed) {
|
|
3896
|
-
if (curLine == to.line) collapsedAtEnd = collapsedSpanAt(line, to.ch);
|
|
3897
|
-
if (curLine == from.line) collapsedAtStart = collapsedSpanAt(line, from.ch);
|
|
3898
|
-
else updateLineHeight(line, 0);
|
|
3899
|
-
}
|
|
3964
|
+
if (curLine == from.line) span.from = from.ch;
|
|
3965
|
+
if (curLine == to.line) span.to = to.ch;
|
|
3966
|
+
if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);
|
|
3900
3967
|
addMarkedSpan(line, span);
|
|
3901
3968
|
++curLine;
|
|
3902
3969
|
});
|
|
@@ -3912,9 +3979,7 @@ window.CodeMirror = (function() {
|
|
|
3912
3979
|
doc.clearHistory();
|
|
3913
3980
|
}
|
|
3914
3981
|
if (marker.collapsed) {
|
|
3915
|
-
|
|
3916
|
-
throw new Error("Inserting collapsed marker overlapping an existing one");
|
|
3917
|
-
marker.size = size;
|
|
3982
|
+
marker.id = ++nextMarkerId;
|
|
3918
3983
|
marker.atomic = true;
|
|
3919
3984
|
}
|
|
3920
3985
|
if (cm) {
|
|
@@ -3987,9 +4052,7 @@ window.CodeMirror = (function() {
|
|
|
3987
4052
|
if (old) for (var i = 0, nw; i < old.length; ++i) {
|
|
3988
4053
|
var span = old[i], marker = span.marker;
|
|
3989
4054
|
var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
|
|
3990
|
-
if (startsBefore ||
|
|
3991
|
-
(marker.inclusiveLeft && marker.inclusiveRight || marker.type == "bookmark") &&
|
|
3992
|
-
span.from == startCh && (!isInsert || !span.marker.insertLeft)) {
|
|
4055
|
+
if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
|
|
3993
4056
|
var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);
|
|
3994
4057
|
(nw || (nw = [])).push({from: span.from,
|
|
3995
4058
|
to: endsAfter ? null : span.to,
|
|
@@ -4003,7 +4066,7 @@ window.CodeMirror = (function() {
|
|
|
4003
4066
|
if (old) for (var i = 0, nw; i < old.length; ++i) {
|
|
4004
4067
|
var span = old[i], marker = span.marker;
|
|
4005
4068
|
var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
|
|
4006
|
-
if (endsAfter ||
|
|
4069
|
+
if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
|
|
4007
4070
|
var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);
|
|
4008
4071
|
(nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh,
|
|
4009
4072
|
to: span.to == null ? null : span.to - endCh,
|
|
@@ -4053,13 +4116,9 @@ window.CodeMirror = (function() {
|
|
|
4053
4116
|
}
|
|
4054
4117
|
}
|
|
4055
4118
|
}
|
|
4056
|
-
|
|
4057
|
-
|
|
4058
|
-
|
|
4059
|
-
if (first[i].from != null && first[i].from == first[i].to && first[i].marker.type != "bookmark")
|
|
4060
|
-
first.splice(i--, 1);
|
|
4061
|
-
if (!first.length) first = null;
|
|
4062
|
-
}
|
|
4119
|
+
// Make sure we didn't create any zero-length spans
|
|
4120
|
+
if (first) first = clearEmptySpans(first);
|
|
4121
|
+
if (last && last != first) last = clearEmptySpans(last);
|
|
4063
4122
|
|
|
4064
4123
|
var newMarkers = [first];
|
|
4065
4124
|
if (!sameLine) {
|
|
@@ -4076,6 +4135,16 @@ window.CodeMirror = (function() {
|
|
|
4076
4135
|
return newMarkers;
|
|
4077
4136
|
}
|
|
4078
4137
|
|
|
4138
|
+
function clearEmptySpans(spans) {
|
|
4139
|
+
for (var i = 0; i < spans.length; ++i) {
|
|
4140
|
+
var span = spans[i];
|
|
4141
|
+
if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
|
|
4142
|
+
spans.splice(i--, 1);
|
|
4143
|
+
}
|
|
4144
|
+
if (!spans.length) return null;
|
|
4145
|
+
return spans;
|
|
4146
|
+
}
|
|
4147
|
+
|
|
4079
4148
|
function mergeOldSpans(doc, change) {
|
|
4080
4149
|
var old = getOldSpans(doc, change);
|
|
4081
4150
|
var stretched = stretchSpansOverChange(doc, change);
|
|
@@ -4126,20 +4195,48 @@ window.CodeMirror = (function() {
|
|
|
4126
4195
|
return parts;
|
|
4127
4196
|
}
|
|
4128
4197
|
|
|
4129
|
-
function
|
|
4198
|
+
function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }
|
|
4199
|
+
function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }
|
|
4200
|
+
|
|
4201
|
+
function compareCollapsedMarkers(a, b) {
|
|
4202
|
+
var lenDiff = a.lines.length - b.lines.length;
|
|
4203
|
+
if (lenDiff != 0) return lenDiff;
|
|
4204
|
+
var aPos = a.find(), bPos = b.find();
|
|
4205
|
+
var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
|
|
4206
|
+
if (fromCmp) return -fromCmp;
|
|
4207
|
+
var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
|
|
4208
|
+
if (toCmp) return toCmp;
|
|
4209
|
+
return b.id - a.id;
|
|
4210
|
+
}
|
|
4211
|
+
|
|
4212
|
+
function collapsedSpanAtSide(line, start) {
|
|
4130
4213
|
var sps = sawCollapsedSpans && line.markedSpans, found;
|
|
4131
4214
|
if (sps) for (var sp, i = 0; i < sps.length; ++i) {
|
|
4132
4215
|
sp = sps[i];
|
|
4133
|
-
if (
|
|
4134
|
-
|
|
4135
|
-
(sp.to == null || sp.to > ch) &&
|
|
4136
|
-
(!found || found.width < sp.marker.width))
|
|
4216
|
+
if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
|
|
4217
|
+
(!found || compareCollapsedMarkers(found, sp.marker) < 0))
|
|
4137
4218
|
found = sp.marker;
|
|
4138
4219
|
}
|
|
4139
4220
|
return found;
|
|
4140
4221
|
}
|
|
4141
|
-
function collapsedSpanAtStart(line) { return
|
|
4142
|
-
function collapsedSpanAtEnd(line) { return
|
|
4222
|
+
function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }
|
|
4223
|
+
function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }
|
|
4224
|
+
|
|
4225
|
+
function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
|
|
4226
|
+
var line = getLine(doc, lineNo);
|
|
4227
|
+
var sps = sawCollapsedSpans && line.markedSpans;
|
|
4228
|
+
if (sps) for (var i = 0; i < sps.length; ++i) {
|
|
4229
|
+
var sp = sps[i];
|
|
4230
|
+
if (!sp.marker.collapsed) continue;
|
|
4231
|
+
var found = sp.marker.find(true);
|
|
4232
|
+
var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
|
|
4233
|
+
var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
|
|
4234
|
+
if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;
|
|
4235
|
+
if (fromCmp <= 0 && (cmp(found.to, from) || extraRight(sp.marker) - extraLeft(marker)) > 0 ||
|
|
4236
|
+
fromCmp >= 0 && (cmp(found.from, to) || extraLeft(sp.marker) - extraRight(marker)) < 0)
|
|
4237
|
+
return true;
|
|
4238
|
+
}
|
|
4239
|
+
}
|
|
4143
4240
|
|
|
4144
4241
|
function visualLine(doc, line) {
|
|
4145
4242
|
var merged;
|
|
@@ -4169,6 +4266,7 @@ window.CodeMirror = (function() {
|
|
|
4169
4266
|
for (var sp, i = 0; i < line.markedSpans.length; ++i) {
|
|
4170
4267
|
sp = line.markedSpans[i];
|
|
4171
4268
|
if (sp.marker.collapsed && !sp.marker.replacedWith && sp.from == span.to &&
|
|
4269
|
+
(sp.to == null || sp.to != span.from) &&
|
|
4172
4270
|
(sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
|
|
4173
4271
|
lineIsHiddenInner(doc, line, sp)) return true;
|
|
4174
4272
|
}
|
|
@@ -4298,6 +4396,10 @@ window.CodeMirror = (function() {
|
|
|
4298
4396
|
} else {
|
|
4299
4397
|
style = mode.token(stream, state);
|
|
4300
4398
|
}
|
|
4399
|
+
if (cm.options.addModeClass) {
|
|
4400
|
+
var mName = CodeMirror.innerMode(mode, state).mode.name;
|
|
4401
|
+
if (mName) style = "m-" + (style ? mName + " " + style : mName);
|
|
4402
|
+
}
|
|
4301
4403
|
if (!flattenSpans || curStyle != style) {
|
|
4302
4404
|
if (curStart < stream.start) f(stream.start, curStyle);
|
|
4303
4405
|
curStart = stream.start; curStyle = style;
|
|
@@ -4369,7 +4471,7 @@ window.CodeMirror = (function() {
|
|
|
4369
4471
|
}
|
|
4370
4472
|
}
|
|
4371
4473
|
|
|
4372
|
-
var styleToClassCache = {};
|
|
4474
|
+
var styleToClassCache = {}, styleToClassCacheWithMode = {};
|
|
4373
4475
|
function interpretTokenStyle(style, builder) {
|
|
4374
4476
|
if (!style) return null;
|
|
4375
4477
|
for (;;) {
|
|
@@ -4382,8 +4484,9 @@ window.CodeMirror = (function() {
|
|
|
4382
4484
|
else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(builder[prop]))
|
|
4383
4485
|
builder[prop] += " " + lineClass[2];
|
|
4384
4486
|
}
|
|
4385
|
-
|
|
4386
|
-
|
|
4487
|
+
var cache = builder.cm.options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
|
|
4488
|
+
return cache[style] ||
|
|
4489
|
+
(cache[style] = "cm-" + style.replace(/ +/g, " cm-"));
|
|
4387
4490
|
}
|
|
4388
4491
|
|
|
4389
4492
|
function buildLineContent(cm, realLine, measure, copyWidgets) {
|
|
@@ -4400,7 +4503,7 @@ window.CodeMirror = (function() {
|
|
|
4400
4503
|
builder.measure = line == realLine && measure;
|
|
4401
4504
|
builder.pos = 0;
|
|
4402
4505
|
builder.addToken = builder.measure ? buildTokenMeasure : buildToken;
|
|
4403
|
-
if ((
|
|
4506
|
+
if ((old_ie || webkit) && cm.getOption("lineWrapping"))
|
|
4404
4507
|
builder.addToken = buildTokenSplitSpaces(builder.addToken);
|
|
4405
4508
|
var next = insertLineContent(line, builder, getLineStyles(cm, line));
|
|
4406
4509
|
if (measure && line == realLine && !builder.measuredSomething) {
|
|
@@ -4419,7 +4522,7 @@ window.CodeMirror = (function() {
|
|
|
4419
4522
|
// Work around problem with the reported dimensions of single-char
|
|
4420
4523
|
// direction spans on IE (issue #1129). See also the comment in
|
|
4421
4524
|
// cursorCoords.
|
|
4422
|
-
if (measure &&
|
|
4525
|
+
if (measure && ie && (order = getOrder(line))) {
|
|
4423
4526
|
var l = order.length - 1;
|
|
4424
4527
|
if (order[l].from == order[l].to) --l;
|
|
4425
4528
|
var last = order[l], prev = order[l - 1];
|
|
@@ -4486,13 +4589,12 @@ window.CodeMirror = (function() {
|
|
|
4486
4589
|
function buildTokenMeasure(builder, text, style, startStyle, endStyle) {
|
|
4487
4590
|
var wrapping = builder.cm.options.lineWrapping;
|
|
4488
4591
|
for (var i = 0; i < text.length; ++i) {
|
|
4489
|
-
var
|
|
4490
|
-
|
|
4491
|
-
|
|
4492
|
-
|
|
4493
|
-
|
|
4592
|
+
var start = i == 0, to = i + 1;
|
|
4593
|
+
while (to < text.length && isExtendingChar(text.charAt(to))) ++to;
|
|
4594
|
+
var ch = text.slice(i, to);
|
|
4595
|
+
i = to - 1;
|
|
4596
|
+
if (i && wrapping && spanAffectsWrapping(text, i))
|
|
4494
4597
|
builder.pre.appendChild(elt("wbr"));
|
|
4495
|
-
}
|
|
4496
4598
|
var old = builder.measure[builder.pos];
|
|
4497
4599
|
var span = builder.measure[builder.pos] =
|
|
4498
4600
|
buildToken(builder, ch, style,
|
|
@@ -4501,7 +4603,7 @@ window.CodeMirror = (function() {
|
|
|
4501
4603
|
// In IE single-space nodes wrap differently than spaces
|
|
4502
4604
|
// embedded in larger text nodes, except when set to
|
|
4503
4605
|
// white-space: normal (issue #1268).
|
|
4504
|
-
if (
|
|
4606
|
+
if (old_ie && wrapping && ch == " " && i && !/\s/.test(text.charAt(i - 1)) &&
|
|
4505
4607
|
i < text.length - 1 && !/\s/.test(text.charAt(i + 1)))
|
|
4506
4608
|
span.style.whiteSpace = "normal";
|
|
4507
4609
|
builder.pos += ch.length;
|
|
@@ -4569,7 +4671,7 @@ window.CodeMirror = (function() {
|
|
|
4569
4671
|
if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
|
|
4570
4672
|
if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle;
|
|
4571
4673
|
if (m.title && !title) title = m.title;
|
|
4572
|
-
if (m.collapsed && (!collapsed || collapsed.marker
|
|
4674
|
+
if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
|
|
4573
4675
|
collapsed = sp;
|
|
4574
4676
|
} else if (sp.from > pos && nextChange > sp.from) {
|
|
4575
4677
|
nextChange = sp.from;
|
|
@@ -4902,10 +5004,11 @@ window.CodeMirror = (function() {
|
|
|
4902
5004
|
clearHistory: function() {this.history = makeHistory(this.history.maxGeneration);},
|
|
4903
5005
|
|
|
4904
5006
|
markClean: function() {
|
|
4905
|
-
this.cleanGeneration = this.changeGeneration();
|
|
5007
|
+
this.cleanGeneration = this.changeGeneration(true);
|
|
4906
5008
|
},
|
|
4907
|
-
changeGeneration: function() {
|
|
4908
|
-
|
|
5009
|
+
changeGeneration: function(forceSplit) {
|
|
5010
|
+
if (forceSplit)
|
|
5011
|
+
this.history.lastOp = this.history.lastOrigin = null;
|
|
4909
5012
|
return this.history.generation;
|
|
4910
5013
|
},
|
|
4911
5014
|
isClean: function (gen) {
|
|
@@ -4927,7 +5030,8 @@ window.CodeMirror = (function() {
|
|
|
4927
5030
|
},
|
|
4928
5031
|
setBookmark: function(pos, options) {
|
|
4929
5032
|
var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
|
|
4930
|
-
insertLeft: options && options.insertLeft
|
|
5033
|
+
insertLeft: options && options.insertLeft,
|
|
5034
|
+
clearWhenEmpty: false};
|
|
4931
5035
|
pos = clipPos(this, pos);
|
|
4932
5036
|
return markText(this, pos, pos, realOpts, "bookmark");
|
|
4933
5037
|
},
|
|
@@ -5208,10 +5312,10 @@ window.CodeMirror = (function() {
|
|
|
5208
5312
|
anchorBefore: doc.sel.anchor, headBefore: doc.sel.head,
|
|
5209
5313
|
anchorAfter: selAfter.anchor, headAfter: selAfter.head};
|
|
5210
5314
|
hist.done.push(cur);
|
|
5211
|
-
hist.generation = ++hist.maxGeneration;
|
|
5212
5315
|
while (hist.done.length > hist.undoDepth)
|
|
5213
5316
|
hist.done.shift();
|
|
5214
5317
|
}
|
|
5318
|
+
hist.generation = ++hist.maxGeneration;
|
|
5215
5319
|
hist.lastTime = time;
|
|
5216
5320
|
hist.lastOp = opId;
|
|
5217
5321
|
hist.lastOrigin = change.origin;
|
|
@@ -5507,7 +5611,8 @@ window.CodeMirror = (function() {
|
|
|
5507
5611
|
return true;
|
|
5508
5612
|
}
|
|
5509
5613
|
|
|
5510
|
-
var
|
|
5614
|
+
var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
|
|
5615
|
+
function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }
|
|
5511
5616
|
|
|
5512
5617
|
// DOM UTILITIES
|
|
5513
5618
|
|
|
@@ -5580,7 +5685,7 @@ window.CodeMirror = (function() {
|
|
|
5580
5685
|
if (/\w/.test(str.charAt(i - 2)) && /[^\-?\.]/.test(str.charAt(i))) return true;
|
|
5581
5686
|
if (i > 2 && /[\d\.,]/.test(str.charAt(i - 2)) && /[\d\.,]/.test(str.charAt(i))) return false;
|
|
5582
5687
|
}
|
|
5583
|
-
return /[~!#%&*)=+}\]\\|\"\.>,:;][({[<]|-[^\-?\.\u2010-\u201f\u2026]|\?[\w~`@#$%\^&*(_=+{[|><]
|
|
5688
|
+
return /[~!#%&*)=+}\]\\|\"\.>,:;][({[<]|-[^\-?\.\u2010-\u201f\u2026]|\?[\w~`@#$%\^&*(_=+{[|><]|\u2026[\w~`@#$%\^&*(_=+{[><]/.test(str.slice(i - 1, i + 1));
|
|
5584
5689
|
};
|
|
5585
5690
|
|
|
5586
5691
|
var knownScrollbarWidth;
|
|
@@ -5648,14 +5753,14 @@ window.CodeMirror = (function() {
|
|
|
5648
5753
|
var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
|
|
5649
5754
|
19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
|
|
5650
5755
|
36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
|
|
5651
|
-
46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod",
|
|
5652
|
-
186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
|
|
5653
|
-
221: "]", 222: "'",
|
|
5654
|
-
|
|
5756
|
+
46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", 107: "=", 109: "-", 127: "Delete",
|
|
5757
|
+
173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
|
|
5758
|
+
221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
|
|
5759
|
+
63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"};
|
|
5655
5760
|
CodeMirror.keyNames = keyNames;
|
|
5656
5761
|
(function() {
|
|
5657
5762
|
// Number keys
|
|
5658
|
-
for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i);
|
|
5763
|
+
for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);
|
|
5659
5764
|
// Alphabetic keys
|
|
5660
5765
|
for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
|
|
5661
5766
|
// Function keys
|
|
@@ -5712,29 +5817,29 @@ window.CodeMirror = (function() {
|
|
|
5712
5817
|
}
|
|
5713
5818
|
var bidiOther;
|
|
5714
5819
|
function getBidiPartAt(order, pos) {
|
|
5820
|
+
bidiOther = null;
|
|
5715
5821
|
for (var i = 0, found; i < order.length; ++i) {
|
|
5716
5822
|
var cur = order[i];
|
|
5717
|
-
if (cur.from < pos && cur.to > pos)
|
|
5718
|
-
if (cur.from == pos || cur.to == pos) {
|
|
5823
|
+
if (cur.from < pos && cur.to > pos) return i;
|
|
5824
|
+
if ((cur.from == pos || cur.to == pos)) {
|
|
5719
5825
|
if (found == null) {
|
|
5720
5826
|
found = i;
|
|
5721
5827
|
} else if (compareBidiLevel(order, cur.level, order[found].level)) {
|
|
5722
|
-
bidiOther = found;
|
|
5828
|
+
if (cur.from != cur.to) bidiOther = found;
|
|
5723
5829
|
return i;
|
|
5724
5830
|
} else {
|
|
5725
|
-
bidiOther = i;
|
|
5831
|
+
if (cur.from != cur.to) bidiOther = i;
|
|
5726
5832
|
return found;
|
|
5727
5833
|
}
|
|
5728
5834
|
}
|
|
5729
5835
|
}
|
|
5730
|
-
bidiOther = null;
|
|
5731
5836
|
return found;
|
|
5732
5837
|
}
|
|
5733
5838
|
|
|
5734
5839
|
function moveInLine(line, pos, dir, byUnit) {
|
|
5735
5840
|
if (!byUnit) return pos + dir;
|
|
5736
5841
|
do pos += dir;
|
|
5737
|
-
while (pos > 0 && isExtendingChar
|
|
5842
|
+
while (pos > 0 && isExtendingChar(line.text.charAt(pos)));
|
|
5738
5843
|
return pos;
|
|
5739
5844
|
}
|
|
5740
5845
|
|
|
@@ -5769,7 +5874,7 @@ window.CodeMirror = (function() {
|
|
|
5769
5874
|
|
|
5770
5875
|
function moveLogically(line, start, dir, byUnit) {
|
|
5771
5876
|
var target = start + dir;
|
|
5772
|
-
if (byUnit) while (target > 0 && isExtendingChar
|
|
5877
|
+
if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;
|
|
5773
5878
|
return target < 0 || target > line.text.length ? null : target;
|
|
5774
5879
|
}
|
|
5775
5880
|
|
|
@@ -5861,7 +5966,7 @@ window.CodeMirror = (function() {
|
|
|
5861
5966
|
if (type == ",") types[i] = "N";
|
|
5862
5967
|
else if (type == "%") {
|
|
5863
5968
|
for (var end = i + 1; end < len && types[end] == "%"; ++end) {}
|
|
5864
|
-
var replace = (i && types[i-1] == "!") || (end < len
|
|
5969
|
+
var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
|
|
5865
5970
|
for (var j = i; j < end; ++j) types[j] = replace;
|
|
5866
5971
|
i = end - 1;
|
|
5867
5972
|
}
|
|
@@ -5886,7 +5991,7 @@ window.CodeMirror = (function() {
|
|
|
5886
5991
|
if (isNeutral.test(types[i])) {
|
|
5887
5992
|
for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}
|
|
5888
5993
|
var before = (i ? types[i-1] : outerType) == "L";
|
|
5889
|
-
var after = (end < len
|
|
5994
|
+
var after = (end < len ? types[end] : outerType) == "L";
|
|
5890
5995
|
var replace = before || after ? "L" : "R";
|
|
5891
5996
|
for (var j = i; j < end; ++j) types[j] = replace;
|
|
5892
5997
|
i = end - 1;
|
|
@@ -5936,7 +6041,7 @@ window.CodeMirror = (function() {
|
|
|
5936
6041
|
|
|
5937
6042
|
// THE END
|
|
5938
6043
|
|
|
5939
|
-
CodeMirror.version = "3.
|
|
6044
|
+
CodeMirror.version = "3.21.0";
|
|
5940
6045
|
|
|
5941
6046
|
return CodeMirror;
|
|
5942
6047
|
})();
|