codemirror-rails 3.13 → 3.14
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 +328 -250
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +7 -6
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +33 -7
- data/vendor/assets/javascripts/codemirror/addons/edit/matchbrackets.js +14 -10
- data/vendor/assets/javascripts/codemirror/addons/edit/trailingspace.js +15 -0
- data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +70 -17
- data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +56 -20
- data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +135 -39
- data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +324 -571
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +199 -109
- data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +60 -113
- data/vendor/assets/javascripts/codemirror/addons/lint/coffeescript-lint.js +24 -0
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +431 -0
- data/vendor/assets/javascripts/codemirror/addons/mode/multiplex.js +7 -1
- data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +46 -20
- data/vendor/assets/javascripts/codemirror/addons/search/search.js +1 -1
- data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +370 -13
- data/vendor/assets/javascripts/codemirror/keymaps/extra.js +43 -0
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +535 -214
- data/vendor/assets/javascripts/codemirror/modes/clike.js +56 -0
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +19 -14
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +2 -2
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +67 -16
- data/vendor/assets/javascripts/codemirror/modes/smarty.js +167 -110
- data/vendor/assets/javascripts/codemirror/modes/sql.js +97 -15
- data/vendor/assets/javascripts/codemirror/modes/xml.js +14 -18
- data/vendor/assets/stylesheets/codemirror.css +0 -1
- data/vendor/assets/stylesheets/codemirror/addons/merge/merge.css +82 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8db830325f2938ade6c18b47a5812733158244e
|
4
|
+
data.tar.gz: 018e82750853a395756b30bb752221b248239a7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7897de28740b56bdecf9c8ba8571ac11eb74ff6224690d9aa689bd9488f2dbb8a750e0d31548df25b045ad212b977e880c5b440db371566cdfa76c6b535d4575
|
7
|
+
data.tar.gz: d9c73bfaf3cdca3cd320997bcff2759e3216afe96f2c2b979c7c5838c8ecb00a7c29f0ef094587a58d7874c990eea73540e7666f01127bacc653764de778c69c
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// CodeMirror version 3.
|
1
|
+
// CodeMirror version 3.14
|
2
2
|
//
|
3
3
|
// CodeMirror is the only global var we claim
|
4
4
|
window.CodeMirror = (function() {
|
@@ -238,9 +238,10 @@ window.CodeMirror = (function() {
|
|
238
238
|
}
|
239
239
|
|
240
240
|
function keyMapChanged(cm) {
|
241
|
-
var
|
241
|
+
var map = keyMap[cm.options.keyMap], style = map.style;
|
242
242
|
cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") +
|
243
243
|
(style ? " cm-keymap-" + style : "");
|
244
|
+
cm.state.disableInput = map.disableInput;
|
244
245
|
}
|
245
246
|
|
246
247
|
function themeChanged(cm) {
|
@@ -325,8 +326,8 @@ window.CodeMirror = (function() {
|
|
325
326
|
d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px";
|
326
327
|
d.gutters.style.height = Math.max(totalHeight, d.scroller.clientHeight - scrollerCutOff) + "px";
|
327
328
|
var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight);
|
328
|
-
var needsH = d.scroller.scrollWidth > d.scroller.clientWidth;
|
329
|
-
var needsV = scrollHeight > d.scroller.clientHeight;
|
329
|
+
var needsH = d.scroller.scrollWidth > (d.scroller.clientWidth + 1);
|
330
|
+
var needsV = scrollHeight > (d.scroller.clientHeight + 1);
|
330
331
|
if (needsV) {
|
331
332
|
d.scrollbarV.style.display = "block";
|
332
333
|
d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0";
|
@@ -513,9 +514,11 @@ window.CodeMirror = (function() {
|
|
513
514
|
display.lastSizeC != display.wrapper.clientHeight;
|
514
515
|
// This is just a bogus formula that detects when the editor is
|
515
516
|
// resized or the font size changes.
|
516
|
-
if (different)
|
517
|
+
if (different) {
|
518
|
+
display.lastSizeC = display.wrapper.clientHeight;
|
519
|
+
startWorker(cm, 400);
|
520
|
+
}
|
517
521
|
display.showingFrom = from; display.showingTo = to;
|
518
|
-
startWorker(cm, 100);
|
519
522
|
|
520
523
|
var prevBottom = display.lineDiv.offsetTop;
|
521
524
|
for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) {
|
@@ -604,8 +607,9 @@ window.CodeMirror = (function() {
|
|
604
607
|
if (nextIntact && nextIntact.to == lineN) nextIntact = intact.shift();
|
605
608
|
if (lineIsHidden(cm.doc, line)) {
|
606
609
|
if (line.height != 0) updateLineHeight(line, 0);
|
607
|
-
if (line.widgets && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i)
|
608
|
-
|
610
|
+
if (line.widgets && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) {
|
611
|
+
var w = line.widgets[i];
|
612
|
+
if (w.showIfHidden) {
|
609
613
|
var prev = cur.previousSibling;
|
610
614
|
if (/pre/i.test(prev.nodeName)) {
|
611
615
|
var wrap = elt("div", null, null, "position: relative");
|
@@ -613,9 +617,11 @@ window.CodeMirror = (function() {
|
|
613
617
|
wrap.appendChild(prev);
|
614
618
|
prev = wrap;
|
615
619
|
}
|
616
|
-
var wnode = prev.appendChild(elt("div", [
|
617
|
-
|
620
|
+
var wnode = prev.appendChild(elt("div", [w.node], "CodeMirror-linewidget"));
|
621
|
+
if (!w.handleMouseEvents) wnode.ignoreEvents = true;
|
622
|
+
positionLineWidget(w, wnode, prev, dims);
|
618
623
|
}
|
624
|
+
}
|
619
625
|
} else if (nextIntact && nextIntact.from <= lineN && nextIntact.to > lineN) {
|
620
626
|
// This line is intact. Skip to the actual node. Update its
|
621
627
|
// line number if needed.
|
@@ -658,25 +664,25 @@ window.CodeMirror = (function() {
|
|
658
664
|
|
659
665
|
if (reuse) {
|
660
666
|
reuse.alignable = null;
|
661
|
-
var isOk = true, widgetsSeen = 0;
|
667
|
+
var isOk = true, widgetsSeen = 0, insertBefore = null;
|
662
668
|
for (var n = reuse.firstChild, next; n; n = next) {
|
663
669
|
next = n.nextSibling;
|
664
670
|
if (!/\bCodeMirror-linewidget\b/.test(n.className)) {
|
665
671
|
reuse.removeChild(n);
|
666
672
|
} else {
|
667
673
|
for (var i = 0, first = true; i < line.widgets.length; ++i) {
|
668
|
-
var widget = line.widgets[i]
|
669
|
-
if (!widget.above) {
|
674
|
+
var widget = line.widgets[i];
|
675
|
+
if (!widget.above) { insertBefore = n; first = false; }
|
670
676
|
if (widget.node == n.firstChild) {
|
671
677
|
positionLineWidget(widget, n, reuse, dims);
|
672
678
|
++widgetsSeen;
|
673
|
-
if (isFirst) reuse.insertBefore(lineElement, n);
|
674
679
|
break;
|
675
680
|
}
|
676
681
|
}
|
677
682
|
if (i == line.widgets.length) { isOk = false; break; }
|
678
683
|
}
|
679
684
|
}
|
685
|
+
reuse.insertBefore(lineElement, insertBefore);
|
680
686
|
if (isOk && widgetsSeen == line.widgets.length) {
|
681
687
|
wrap = reuse;
|
682
688
|
reuse.className = line.wrapClass || "";
|
@@ -711,6 +717,7 @@ window.CodeMirror = (function() {
|
|
711
717
|
if (ie_lt8) wrap.style.zIndex = 2;
|
712
718
|
if (line.widgets && wrap != reuse) for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
|
713
719
|
var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
|
720
|
+
if (!widget.handleMouseEvents) node.ignoreEvents = true;
|
714
721
|
positionLineWidget(widget, node, wrap, dims);
|
715
722
|
if (widget.above)
|
716
723
|
wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement);
|
@@ -793,74 +800,59 @@ window.CodeMirror = (function() {
|
|
793
800
|
"px; height: " + (bottom - top) + "px"));
|
794
801
|
}
|
795
802
|
|
796
|
-
function drawForLine(line, fromArg, toArg
|
803
|
+
function drawForLine(line, fromArg, toArg) {
|
797
804
|
var lineObj = getLine(doc, line);
|
798
|
-
var lineLen = lineObj.text.length
|
799
|
-
|
800
|
-
|
805
|
+
var lineLen = lineObj.text.length;
|
806
|
+
var start, end;
|
807
|
+
function coords(ch, bias) {
|
808
|
+
return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
|
801
809
|
}
|
802
810
|
|
803
811
|
iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
|
804
|
-
var leftPos = coords(from), rightPos, left, right;
|
812
|
+
var leftPos = coords(from, "left"), rightPos, left, right;
|
805
813
|
if (from == to) {
|
806
814
|
rightPos = leftPos;
|
807
815
|
left = right = leftPos.left;
|
808
816
|
} else {
|
809
|
-
rightPos = coords(to - 1);
|
817
|
+
rightPos = coords(to - 1, "right");
|
810
818
|
if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
|
811
819
|
left = leftPos.left;
|
812
820
|
right = rightPos.right;
|
813
821
|
}
|
822
|
+
if (fromArg == null && from == 0) left = pl;
|
814
823
|
if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
|
815
824
|
add(left, leftPos.top, null, leftPos.bottom);
|
816
825
|
left = pl;
|
817
826
|
if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
|
818
827
|
}
|
819
828
|
if (toArg == null && to == lineLen) right = clientWidth;
|
820
|
-
if (
|
821
|
-
|
829
|
+
if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
|
830
|
+
start = leftPos;
|
831
|
+
if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
|
832
|
+
end = rightPos;
|
822
833
|
if (left < pl + 1) left = pl;
|
823
834
|
add(left, rightPos.top, right - left, rightPos.bottom);
|
824
835
|
});
|
825
|
-
return
|
836
|
+
return {start: start, end: end};
|
826
837
|
}
|
827
838
|
|
828
839
|
if (sel.from.line == sel.to.line) {
|
829
840
|
drawForLine(sel.from.line, sel.from.ch, sel.to.ch);
|
830
841
|
} else {
|
831
|
-
var
|
832
|
-
var
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
if (
|
837
|
-
|
838
|
-
|
839
|
-
|
842
|
+
var fromLine = getLine(doc, sel.from.line), toLine = getLine(doc, sel.to.line);
|
843
|
+
var singleVLine = visualLine(doc, fromLine) == visualLine(doc, toLine);
|
844
|
+
var leftEnd = drawForLine(sel.from.line, sel.from.ch, singleVLine ? fromLine.text.length : null).end;
|
845
|
+
var rightStart = drawForLine(sel.to.line, singleVLine ? 0 : null, sel.to.ch).start;
|
846
|
+
if (singleVLine) {
|
847
|
+
if (leftEnd.top < rightStart.top - 2) {
|
848
|
+
add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
|
849
|
+
add(pl, rightStart.top, rightStart.left, rightStart.bottom);
|
850
|
+
} else {
|
851
|
+
add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
|
840
852
|
}
|
841
|
-
cur = getLine(doc, found.to.line);
|
842
|
-
}
|
843
|
-
|
844
|
-
// This is a single, merged line
|
845
|
-
if (singleLine) {
|
846
|
-
for (var i = 0; i < path.length; i += 3)
|
847
|
-
drawForLine(path[i], path[i+1], path[i+2]);
|
848
|
-
} else {
|
849
|
-
var middleTop, middleBot, toObj = getLine(doc, sel.to.line);
|
850
|
-
if (sel.from.ch)
|
851
|
-
// Draw the first line of selection.
|
852
|
-
middleTop = drawForLine(sel.from.line, sel.from.ch, null, false);
|
853
|
-
else
|
854
|
-
// Simply include it in the middle block.
|
855
|
-
middleTop = heightAtLine(cm, fromObj) - display.viewOffset;
|
856
|
-
|
857
|
-
if (!sel.to.ch)
|
858
|
-
middleBot = heightAtLine(cm, toObj) - display.viewOffset;
|
859
|
-
else
|
860
|
-
middleBot = drawForLine(sel.to.line, collapsedSpanAtStart(toObj) ? null : 0, sel.to.ch, true);
|
861
|
-
|
862
|
-
if (middleTop < middleBot) add(pl, middleTop, null, middleBot);
|
863
853
|
}
|
854
|
+
if (leftEnd.bottom < rightStart.top)
|
855
|
+
add(pl, leftEnd.bottom, null, rightStart.top);
|
864
856
|
}
|
865
857
|
|
866
858
|
removeChildrenAndAdd(display.selectionDiv, fragment);
|
@@ -926,12 +918,12 @@ window.CodeMirror = (function() {
|
|
926
918
|
// valid state. If that fails, it returns the line with the
|
927
919
|
// smallest indentation, which tends to need the least context to
|
928
920
|
// parse correctly.
|
929
|
-
function findStartLine(cm, n) {
|
921
|
+
function findStartLine(cm, n, precise) {
|
930
922
|
var minindent, minline, doc = cm.doc;
|
931
923
|
for (var search = n, lim = n - 100; search > lim; --search) {
|
932
924
|
if (search <= doc.first) return doc.first;
|
933
925
|
var line = getLine(doc, search - 1);
|
934
|
-
if (line.stateAfter) return search;
|
926
|
+
if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
|
935
927
|
var indented = countColumn(line.text, null, cm.options.tabSize);
|
936
928
|
if (minline == null || minindent > indented) {
|
937
929
|
minline = search - 1;
|
@@ -941,10 +933,10 @@ window.CodeMirror = (function() {
|
|
941
933
|
return minline;
|
942
934
|
}
|
943
935
|
|
944
|
-
function getStateBefore(cm, n) {
|
936
|
+
function getStateBefore(cm, n, precise) {
|
945
937
|
var doc = cm.doc, display = cm.display;
|
946
938
|
if (!doc.mode.startState) return true;
|
947
|
-
var pos = findStartLine(cm, n), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
|
939
|
+
var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
|
948
940
|
if (!state) state = startState(doc.mode);
|
949
941
|
else state = copyState(doc.mode, state);
|
950
942
|
doc.iter(pos, n, function(line) {
|
@@ -965,7 +957,7 @@ window.CodeMirror = (function() {
|
|
965
957
|
return e.offsetLeft;
|
966
958
|
}
|
967
959
|
|
968
|
-
function measureChar(cm, line, ch, data) {
|
960
|
+
function measureChar(cm, line, ch, data, bias) {
|
969
961
|
var dir = -1;
|
970
962
|
data = data || measureLine(cm, line);
|
971
963
|
|
@@ -974,9 +966,11 @@ window.CodeMirror = (function() {
|
|
974
966
|
if (r) break;
|
975
967
|
if (dir < 0 && pos == 0) dir = 1;
|
976
968
|
}
|
969
|
+
var rightV = (pos < ch || bias == "right") && r.topRight != null;
|
977
970
|
return {left: pos < ch ? r.right : r.left,
|
978
971
|
right: pos > ch ? r.left : r.right,
|
979
|
-
top: r.
|
972
|
+
top: rightV ? r.topRight : r.top,
|
973
|
+
bottom: rightV ? r.bottomRight : r.bottom};
|
980
974
|
}
|
981
975
|
|
982
976
|
function findCachedMeasurement(cm, line) {
|
@@ -1049,9 +1043,9 @@ window.CodeMirror = (function() {
|
|
1049
1043
|
if (ie_lt9 && display.measure.first != pre)
|
1050
1044
|
removeChildrenAndAdd(display.measure, pre);
|
1051
1045
|
|
1052
|
-
|
1053
|
-
|
1054
|
-
|
1046
|
+
function categorizeVSpan(top, bot) {
|
1047
|
+
if (bot > maxBot) bot = maxBot;
|
1048
|
+
if (top < 0) top = 0;
|
1055
1049
|
for (var j = 0; j < vranges.length; j += 2) {
|
1056
1050
|
var rtop = vranges[j], rbot = vranges[j+1];
|
1057
1051
|
if (rtop > bot || rbot < top) continue;
|
@@ -1060,19 +1054,38 @@ window.CodeMirror = (function() {
|
|
1060
1054
|
Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) {
|
1061
1055
|
vranges[j] = Math.min(top, rtop);
|
1062
1056
|
vranges[j+1] = Math.max(bot, rbot);
|
1063
|
-
|
1057
|
+
return j;
|
1058
|
+
}
|
1059
|
+
}
|
1060
|
+
vranges.push(top, bot);
|
1061
|
+
return j;
|
1062
|
+
}
|
1063
|
+
|
1064
|
+
for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) {
|
1065
|
+
var size, node = cur;
|
1066
|
+
// A widget might wrap, needs special care
|
1067
|
+
if (/\bCodeMirror-widget\b/.test(cur.className) && cur.getClientRects) {
|
1068
|
+
if (cur.firstChild.nodeType == 1) node = cur.firstChild;
|
1069
|
+
var rects = node.getClientRects(), rLeft = rects[0], rRight = rects[rects.length - 1];
|
1070
|
+
if (rects.length > 1) {
|
1071
|
+
var vCatLeft = categorizeVSpan(rLeft.top - outer.top, rLeft.bottom - outer.top);
|
1072
|
+
var vCatRight = categorizeVSpan(rRight.top - outer.top, rRight.bottom - outer.top);
|
1073
|
+
data[i] = {left: rLeft.left - outer.left, right: rRight.right - outer.left,
|
1074
|
+
top: vCatLeft, topRight: vCatRight};
|
1075
|
+
continue;
|
1064
1076
|
}
|
1065
1077
|
}
|
1066
|
-
|
1078
|
+
size = getRect(node);
|
1079
|
+
var vCat = categorizeVSpan(size.top - outer.top, size.bottom - outer.top);
|
1067
1080
|
var right = size.right;
|
1068
1081
|
if (cur.measureRight) right = getRect(cur.measureRight).left;
|
1069
|
-
data[i] = {left: size.left - outer.left, right: right - outer.left, top:
|
1082
|
+
data[i] = {left: size.left - outer.left, right: right - outer.left, top: vCat};
|
1070
1083
|
}
|
1071
1084
|
for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) {
|
1072
|
-
var vr = cur.top;
|
1085
|
+
var vr = cur.top, vrRight = cur.topRight;
|
1073
1086
|
cur.top = vranges[vr]; cur.bottom = vranges[vr+1];
|
1087
|
+
if (vrRight != null) { cur.topRight = vranges[vrRight]; cur.bottomRight = vranges[vrRight+1]; }
|
1074
1088
|
}
|
1075
|
-
|
1076
1089
|
return data;
|
1077
1090
|
}
|
1078
1091
|
|
@@ -1083,7 +1096,7 @@ window.CodeMirror = (function() {
|
|
1083
1096
|
if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true;
|
1084
1097
|
}
|
1085
1098
|
var cached = !hasBadSpan && findCachedMeasurement(cm, line);
|
1086
|
-
if (cached) return measureChar(cm, line, line.text.length, cached.measure).right;
|
1099
|
+
if (cached) return measureChar(cm, line, line.text.length, cached.measure, "right").right;
|
1087
1100
|
|
1088
1101
|
var pre = lineContent(cm, line);
|
1089
1102
|
var end = pre.appendChild(zeroWidthElement(cm.display.measure));
|
@@ -1098,6 +1111,9 @@ window.CodeMirror = (function() {
|
|
1098
1111
|
cm.display.lineNumChars = null;
|
1099
1112
|
}
|
1100
1113
|
|
1114
|
+
function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
|
1115
|
+
function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }
|
1116
|
+
|
1101
1117
|
// Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page"
|
1102
1118
|
function intoCoordSystem(cm, lineObj, rect, context) {
|
1103
1119
|
if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
|
@@ -1107,11 +1123,12 @@ window.CodeMirror = (function() {
|
|
1107
1123
|
if (context == "line") return rect;
|
1108
1124
|
if (!context) context = "local";
|
1109
1125
|
var yOff = heightAtLine(cm, lineObj);
|
1110
|
-
if (context
|
1111
|
-
|
1126
|
+
if (context == "local") yOff += paddingTop(cm.display);
|
1127
|
+
else yOff -= cm.display.viewOffset;
|
1128
|
+
if (context == "page" || context == "window") {
|
1112
1129
|
var lOff = getRect(cm.display.lineSpace);
|
1113
|
-
yOff += lOff.top + (window
|
1114
|
-
var xOff = lOff.left + (window
|
1130
|
+
yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
|
1131
|
+
var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
|
1115
1132
|
rect.left += xOff; rect.right += xOff;
|
1116
1133
|
}
|
1117
1134
|
rect.top += yOff; rect.bottom += yOff;
|
@@ -1123,31 +1140,30 @@ window.CodeMirror = (function() {
|
|
1123
1140
|
function fromCoordSystem(cm, coords, context) {
|
1124
1141
|
if (context == "div") return coords;
|
1125
1142
|
var left = coords.left, top = coords.top;
|
1143
|
+
// First move into "page" coordinate system
|
1126
1144
|
if (context == "page") {
|
1127
|
-
left -=
|
1128
|
-
top -=
|
1145
|
+
left -= pageScrollX();
|
1146
|
+
top -= pageScrollY();
|
1147
|
+
} else if (context == "local" || !context) {
|
1148
|
+
var localBox = getRect(cm.display.sizer);
|
1149
|
+
left += localBox.left;
|
1150
|
+
top += localBox.top;
|
1129
1151
|
}
|
1152
|
+
|
1130
1153
|
var lineSpaceBox = getRect(cm.display.lineSpace);
|
1131
|
-
left
|
1132
|
-
top -= lineSpaceBox.top;
|
1133
|
-
if (context == "local" || !context) {
|
1134
|
-
var editorBox = getRect(cm.display.wrapper);
|
1135
|
-
left += editorBox.left;
|
1136
|
-
top += editorBox.top;
|
1137
|
-
}
|
1138
|
-
return {left: left, top: top};
|
1154
|
+
return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
|
1139
1155
|
}
|
1140
1156
|
|
1141
|
-
function charCoords(cm, pos, context, lineObj) {
|
1157
|
+
function charCoords(cm, pos, context, lineObj, bias) {
|
1142
1158
|
if (!lineObj) lineObj = getLine(cm.doc, pos.line);
|
1143
|
-
return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch), context);
|
1159
|
+
return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, null, bias), context);
|
1144
1160
|
}
|
1145
1161
|
|
1146
1162
|
function cursorCoords(cm, pos, context, lineObj, measurement) {
|
1147
1163
|
lineObj = lineObj || getLine(cm.doc, pos.line);
|
1148
1164
|
if (!measurement) measurement = measureLine(cm, lineObj);
|
1149
1165
|
function get(ch, right) {
|
1150
|
-
var m = measureChar(cm, lineObj, ch, measurement);
|
1166
|
+
var m = measureChar(cm, lineObj, ch, measurement, right ? "right" : "left");
|
1151
1167
|
if (right) m.left = m.right; else m.right = m.left;
|
1152
1168
|
return intoCoordSystem(cm, lineObj, m, context);
|
1153
1169
|
}
|
@@ -1173,8 +1189,9 @@ window.CodeMirror = (function() {
|
|
1173
1189
|
return val;
|
1174
1190
|
}
|
1175
1191
|
|
1176
|
-
function
|
1192
|
+
function PosWithInfo(line, ch, outside, xRel) {
|
1177
1193
|
var pos = new Pos(line, ch);
|
1194
|
+
pos.xRel = xRel;
|
1178
1195
|
if (outside) pos.outside = true;
|
1179
1196
|
return pos;
|
1180
1197
|
}
|
@@ -1183,10 +1200,10 @@ window.CodeMirror = (function() {
|
|
1183
1200
|
function coordsChar(cm, x, y) {
|
1184
1201
|
var doc = cm.doc;
|
1185
1202
|
y += cm.display.viewOffset;
|
1186
|
-
if (y < 0) return
|
1203
|
+
if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
|
1187
1204
|
var lineNo = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
|
1188
1205
|
if (lineNo > last)
|
1189
|
-
return
|
1206
|
+
return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
|
1190
1207
|
if (x < 0) x = 0;
|
1191
1208
|
|
1192
1209
|
for (;;) {
|
@@ -1194,7 +1211,7 @@ window.CodeMirror = (function() {
|
|
1194
1211
|
var found = coordsCharInner(cm, lineObj, lineNo, x, y);
|
1195
1212
|
var merged = collapsedSpanAtEnd(lineObj);
|
1196
1213
|
var mergedPos = merged && merged.find();
|
1197
|
-
if (merged && found.ch
|
1214
|
+
if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
|
1198
1215
|
lineNo = mergedPos.to.line;
|
1199
1216
|
else
|
1200
1217
|
return found;
|
@@ -1220,14 +1237,15 @@ window.CodeMirror = (function() {
|
|
1220
1237
|
var from = lineLeft(lineObj), to = lineRight(lineObj);
|
1221
1238
|
var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;
|
1222
1239
|
|
1223
|
-
if (x > toX) return
|
1240
|
+
if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
|
1224
1241
|
// Do a binary search between these bounds.
|
1225
1242
|
for (;;) {
|
1226
1243
|
if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
|
1227
|
-
var
|
1244
|
+
var ch = x < fromX || x - fromX <= toX - x ? from : to;
|
1245
|
+
var xDiff = x - (ch == from ? fromX : toX);
|
1228
1246
|
while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch;
|
1229
|
-
var pos =
|
1230
|
-
|
1247
|
+
var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
|
1248
|
+
xDiff < 0 ? -1 : xDiff ? 1 : 0);
|
1231
1249
|
return pos;
|
1232
1250
|
}
|
1233
1251
|
var step = Math.ceil(dist / 2), middle = from + step;
|
@@ -1413,7 +1431,7 @@ window.CodeMirror = (function() {
|
|
1413
1431
|
// supported or compatible enough yet to rely on.)
|
1414
1432
|
function readInput(cm) {
|
1415
1433
|
var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel;
|
1416
|
-
if (!cm.state.focused || hasSelection(input) || isReadOnly(cm)) return false;
|
1434
|
+
if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.state.disableInput) return false;
|
1417
1435
|
var text = input.value;
|
1418
1436
|
if (text == prevInput && posEq(sel.from, sel.to)) return false;
|
1419
1437
|
if (ie && !ie_lt9 && cm.display.inputHasSelection === text) {
|
@@ -1431,11 +1449,14 @@ window.CodeMirror = (function() {
|
|
1431
1449
|
from = Pos(from.line, from.ch - (prevInput.length - same));
|
1432
1450
|
else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming)
|
1433
1451
|
to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + (text.length - same)));
|
1434
|
-
var updateInput = cm.curOp.updateInput;
|
1435
|
-
makeChange(cm.doc, {from: from, to: to, text: splitLines(text.slice(same)),
|
1436
|
-
origin: cm.state.pasteIncoming ? "paste" : "+input"}, "end");
|
1437
1452
|
|
1453
|
+
var updateInput = cm.curOp.updateInput;
|
1454
|
+
var changeEvent = {from: from, to: to, text: splitLines(text.slice(same)),
|
1455
|
+
origin: cm.state.pasteIncoming ? "paste" : "+input"};
|
1456
|
+
makeChange(cm.doc, changeEvent, "end");
|
1438
1457
|
cm.curOp.updateInput = updateInput;
|
1458
|
+
signalLater(cm, "inputRead", cm, changeEvent);
|
1459
|
+
|
1439
1460
|
if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";
|
1440
1461
|
else cm.display.prevInput = text;
|
1441
1462
|
if (withOp) endOperation(cm);
|
@@ -1476,6 +1497,7 @@ window.CodeMirror = (function() {
|
|
1476
1497
|
on(d.scroller, "mousedown", operation(cm, onMouseDown));
|
1477
1498
|
if (ie)
|
1478
1499
|
on(d.scroller, "dblclick", operation(cm, function(e) {
|
1500
|
+
if (signalDOMEvent(cm, e)) return;
|
1479
1501
|
var pos = posFromMouse(cm, e);
|
1480
1502
|
if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
|
1481
1503
|
e_preventDefault(e);
|
@@ -1483,7 +1505,7 @@ window.CodeMirror = (function() {
|
|
1483
1505
|
extendSelection(cm.doc, word.from, word.to);
|
1484
1506
|
}));
|
1485
1507
|
else
|
1486
|
-
on(d.scroller, "dblclick", e_preventDefault);
|
1508
|
+
on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
|
1487
1509
|
on(d.lineSpace, "selectstart", function(e) {
|
1488
1510
|
if (!eventInWidget(d, e)) e_preventDefault(e);
|
1489
1511
|
});
|
@@ -1515,11 +1537,15 @@ window.CodeMirror = (function() {
|
|
1515
1537
|
// Prevent wrapper from ever scrolling
|
1516
1538
|
on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
|
1517
1539
|
|
1540
|
+
var resizeTimer;
|
1518
1541
|
function onResize() {
|
1519
|
-
|
1520
|
-
|
1521
|
-
|
1522
|
-
|
1542
|
+
if (resizeTimer == null) resizeTimer = setTimeout(function() {
|
1543
|
+
resizeTimer = null;
|
1544
|
+
// Might be a text scaling operation, clear size caches.
|
1545
|
+
d.cachedCharWidth = d.cachedTextHeight = knownScrollbarWidth = null;
|
1546
|
+
clearCaches(cm);
|
1547
|
+
runInOp(cm, bind(regChange, cm));
|
1548
|
+
}, 100);
|
1523
1549
|
}
|
1524
1550
|
on(window, "resize", onResize);
|
1525
1551
|
// Above handler holds on to the editor and its data structures.
|
@@ -1533,7 +1559,7 @@ window.CodeMirror = (function() {
|
|
1533
1559
|
setTimeout(unregister, 5000);
|
1534
1560
|
|
1535
1561
|
on(d.input, "keyup", operation(cm, function(e) {
|
1536
|
-
if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
|
1562
|
+
if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
|
1537
1563
|
if (e.keyCode == 16) cm.doc.sel.shift = false;
|
1538
1564
|
}));
|
1539
1565
|
on(d.input, "input", bind(fastPoll, cm));
|
@@ -1543,7 +1569,7 @@ window.CodeMirror = (function() {
|
|
1543
1569
|
on(d.input, "blur", bind(onBlur, cm));
|
1544
1570
|
|
1545
1571
|
function drag_(e) {
|
1546
|
-
if (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return;
|
1572
|
+
if (signalDOMEvent(cm, e) || cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return;
|
1547
1573
|
e_stop(e);
|
1548
1574
|
}
|
1549
1575
|
if (cm.options.dragDrop) {
|
@@ -1582,9 +1608,7 @@ window.CodeMirror = (function() {
|
|
1582
1608
|
|
1583
1609
|
function eventInWidget(display, e) {
|
1584
1610
|
for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
|
1585
|
-
if (!n) return true;
|
1586
|
-
if (/\bCodeMirror-(?:line)?widget\b/.test(n.className) ||
|
1587
|
-
n.parentNode == display.sizer && n != display.mover) return true;
|
1611
|
+
if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true;
|
1588
1612
|
}
|
1589
1613
|
}
|
1590
1614
|
|
@@ -1604,6 +1628,7 @@ window.CodeMirror = (function() {
|
|
1604
1628
|
|
1605
1629
|
var lastClick, lastDoubleClick;
|
1606
1630
|
function onMouseDown(e) {
|
1631
|
+
if (signalDOMEvent(this, e)) return;
|
1607
1632
|
var cm = this, display = cm.display, doc = cm.doc, sel = doc.sel;
|
1608
1633
|
sel.shift = e.shiftKey;
|
1609
1634
|
|
@@ -1727,8 +1752,6 @@ window.CodeMirror = (function() {
|
|
1727
1752
|
|
1728
1753
|
function done(e) {
|
1729
1754
|
counter = Infinity;
|
1730
|
-
var cur = posFromMouse(cm, e);
|
1731
|
-
if (cur) doSelect(cur);
|
1732
1755
|
e_preventDefault(e);
|
1733
1756
|
focusInput(cm);
|
1734
1757
|
off(document, "mousemove", move);
|
@@ -1744,11 +1767,41 @@ window.CodeMirror = (function() {
|
|
1744
1767
|
on(document, "mouseup", up);
|
1745
1768
|
}
|
1746
1769
|
|
1770
|
+
function clickInGutter(cm, e) {
|
1771
|
+
var display = cm.display;
|
1772
|
+
try { var mX = e.clientX, mY = e.clientY; }
|
1773
|
+
catch(e) { return false; }
|
1774
|
+
|
1775
|
+
if (mX >= Math.floor(getRect(display.gutters).right)) return false;
|
1776
|
+
e_preventDefault(e);
|
1777
|
+
if (!hasHandler(cm, "gutterClick")) return true;
|
1778
|
+
|
1779
|
+
var lineBox = getRect(display.lineDiv);
|
1780
|
+
if (mY > lineBox.bottom) return true;
|
1781
|
+
mY -= lineBox.top - display.viewOffset;
|
1782
|
+
|
1783
|
+
for (var i = 0; i < cm.options.gutters.length; ++i) {
|
1784
|
+
var g = display.gutters.childNodes[i];
|
1785
|
+
if (g && getRect(g).right >= mX) {
|
1786
|
+
var line = lineAtHeight(cm.doc, mY);
|
1787
|
+
var gutter = cm.options.gutters[i];
|
1788
|
+
signalLater(cm, "gutterClick", cm, line, gutter, e);
|
1789
|
+
break;
|
1790
|
+
}
|
1791
|
+
}
|
1792
|
+
return true;
|
1793
|
+
}
|
1794
|
+
|
1795
|
+
// Kludge to work around strange IE behavior where it'll sometimes
|
1796
|
+
// re-fire a series of drag-related events right after the drop (#1551)
|
1797
|
+
var lastDrop = 0;
|
1798
|
+
|
1747
1799
|
function onDrop(e) {
|
1748
1800
|
var cm = this;
|
1749
|
-
if (eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))))
|
1801
|
+
if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))))
|
1750
1802
|
return;
|
1751
1803
|
e_preventDefault(e);
|
1804
|
+
if (ie) lastDrop = +new Date;
|
1752
1805
|
var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
|
1753
1806
|
if (!pos || isReadOnly(cm)) return;
|
1754
1807
|
if (files && files.length && window.FileReader && window.File) {
|
@@ -1788,41 +1841,16 @@ window.CodeMirror = (function() {
|
|
1788
1841
|
}
|
1789
1842
|
}
|
1790
1843
|
|
1791
|
-
function clickInGutter(cm, e) {
|
1792
|
-
var display = cm.display;
|
1793
|
-
try { var mX = e.clientX, mY = e.clientY; }
|
1794
|
-
catch(e) { return false; }
|
1795
|
-
|
1796
|
-
if (mX >= Math.floor(getRect(display.gutters).right)) return false;
|
1797
|
-
e_preventDefault(e);
|
1798
|
-
if (!hasHandler(cm, "gutterClick")) return true;
|
1799
|
-
|
1800
|
-
var lineBox = getRect(display.lineDiv);
|
1801
|
-
if (mY > lineBox.bottom) return true;
|
1802
|
-
mY -= lineBox.top - display.viewOffset;
|
1803
|
-
|
1804
|
-
for (var i = 0; i < cm.options.gutters.length; ++i) {
|
1805
|
-
var g = display.gutters.childNodes[i];
|
1806
|
-
if (g && getRect(g).right >= mX) {
|
1807
|
-
var line = lineAtHeight(cm.doc, mY);
|
1808
|
-
var gutter = cm.options.gutters[i];
|
1809
|
-
signalLater(cm, "gutterClick", cm, line, gutter, e);
|
1810
|
-
break;
|
1811
|
-
}
|
1812
|
-
}
|
1813
|
-
return true;
|
1814
|
-
}
|
1815
|
-
|
1816
1844
|
function onDragStart(cm, e) {
|
1817
|
-
if (ie && !cm.state.draggingText) { e_stop(e); return; }
|
1818
|
-
if (eventInWidget(cm.display, e)) return;
|
1845
|
+
if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
|
1846
|
+
if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
|
1819
1847
|
|
1820
1848
|
var txt = cm.getSelection();
|
1821
1849
|
e.dataTransfer.setData("Text", txt);
|
1822
1850
|
|
1823
1851
|
// Use dummy image instead of default browsers image.
|
1824
1852
|
// Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
|
1825
|
-
if (e.dataTransfer.setDragImage) {
|
1853
|
+
if (e.dataTransfer.setDragImage && !safari) {
|
1826
1854
|
var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
|
1827
1855
|
if (opera) {
|
1828
1856
|
img.width = img.height = 1;
|
@@ -1830,15 +1858,6 @@ window.CodeMirror = (function() {
|
|
1830
1858
|
// Force a relayout, or Opera won't use our image for some obscure reason
|
1831
1859
|
img._top = img.offsetTop;
|
1832
1860
|
}
|
1833
|
-
if (safari) {
|
1834
|
-
if (cm.display.dragImg) {
|
1835
|
-
img = cm.display.dragImg;
|
1836
|
-
} else {
|
1837
|
-
cm.display.dragImg = img;
|
1838
|
-
img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
|
1839
|
-
cm.display.wrapper.appendChild(img);
|
1840
|
-
}
|
1841
|
-
}
|
1842
1861
|
e.dataTransfer.setDragImage(img, 0, 0);
|
1843
1862
|
if (opera) img.parentNode.removeChild(img);
|
1844
1863
|
}
|
@@ -1851,6 +1870,7 @@ window.CodeMirror = (function() {
|
|
1851
1870
|
if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
|
1852
1871
|
if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val;
|
1853
1872
|
if (gecko) updateDisplay(cm, []);
|
1873
|
+
startWorker(cm, 100);
|
1854
1874
|
}
|
1855
1875
|
function setScrollLeft(cm, val, isScroller) {
|
1856
1876
|
if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
|
@@ -1983,8 +2003,10 @@ window.CodeMirror = (function() {
|
|
1983
2003
|
var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto;
|
1984
2004
|
clearTimeout(maybeTransition);
|
1985
2005
|
if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {
|
1986
|
-
if (getKeyMap(cm.options.keyMap) == startMap)
|
2006
|
+
if (getKeyMap(cm.options.keyMap) == startMap) {
|
1987
2007
|
cm.options.keyMap = (next.call ? next.call(null, cm) : next);
|
2008
|
+
keyMapChanged(cm);
|
2009
|
+
}
|
1988
2010
|
}, 50);
|
1989
2011
|
|
1990
2012
|
var name = keyName(e, true), handled = false;
|
@@ -1997,17 +2019,18 @@ window.CodeMirror = (function() {
|
|
1997
2019
|
// 'go') bound to the keyname without 'Shift-'.
|
1998
2020
|
handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);})
|
1999
2021
|
|| lookupKey(name, keymaps, function(b) {
|
2000
|
-
if (typeof b == "string"
|
2022
|
+
if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
|
2023
|
+
return doHandleBinding(cm, b);
|
2001
2024
|
});
|
2002
2025
|
} else {
|
2003
2026
|
handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); });
|
2004
2027
|
}
|
2005
|
-
if (handled == "stop") handled = false;
|
2006
2028
|
|
2007
2029
|
if (handled) {
|
2008
2030
|
e_preventDefault(e);
|
2009
2031
|
restartBlink(cm);
|
2010
2032
|
if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
|
2033
|
+
signalLater(cm, "keyHandled", cm, name, e);
|
2011
2034
|
}
|
2012
2035
|
return handled;
|
2013
2036
|
}
|
@@ -2018,6 +2041,7 @@ window.CodeMirror = (function() {
|
|
2018
2041
|
if (handled) {
|
2019
2042
|
e_preventDefault(e);
|
2020
2043
|
restartBlink(cm);
|
2044
|
+
signalLater(cm, "keyHandled", cm, "'" + ch + "'", e);
|
2021
2045
|
}
|
2022
2046
|
return handled;
|
2023
2047
|
}
|
@@ -2027,7 +2051,7 @@ window.CodeMirror = (function() {
|
|
2027
2051
|
var cm = this;
|
2028
2052
|
if (!cm.state.focused) onFocus(cm);
|
2029
2053
|
if (ie && e.keyCode == 27) { e.returnValue = false; }
|
2030
|
-
if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
|
2054
|
+
if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
|
2031
2055
|
var code = e.keyCode;
|
2032
2056
|
// IE does strange things with escape.
|
2033
2057
|
cm.doc.sel.shift = code == 16 || e.shiftKey;
|
@@ -2043,7 +2067,7 @@ window.CodeMirror = (function() {
|
|
2043
2067
|
|
2044
2068
|
function onKeyPress(e) {
|
2045
2069
|
var cm = this;
|
2046
|
-
if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
|
2070
|
+
if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
|
2047
2071
|
var keyCode = e.keyCode, charCode = e.charCode;
|
2048
2072
|
if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
|
2049
2073
|
if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;
|
@@ -2141,11 +2165,11 @@ window.CodeMirror = (function() {
|
|
2141
2165
|
|
2142
2166
|
// UPDATING
|
2143
2167
|
|
2144
|
-
|
2168
|
+
var changeEnd = CodeMirror.changeEnd = function(change) {
|
2145
2169
|
if (!change.text) return change.to;
|
2146
2170
|
return Pos(change.from.line + change.text.length - 1,
|
2147
2171
|
lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));
|
2148
|
-
}
|
2172
|
+
};
|
2149
2173
|
|
2150
2174
|
// Make sure a position will be valid after the given change.
|
2151
2175
|
function clipPostChange(doc, change, pos) {
|
@@ -2187,21 +2211,21 @@ window.CodeMirror = (function() {
|
|
2187
2211
|
return {anchor: adjustPos(doc.sel.anchor), head: adjustPos(doc.sel.head)};
|
2188
2212
|
}
|
2189
2213
|
|
2190
|
-
function filterChange(doc, change) {
|
2214
|
+
function filterChange(doc, change, update) {
|
2191
2215
|
var obj = {
|
2192
2216
|
canceled: false,
|
2193
2217
|
from: change.from,
|
2194
2218
|
to: change.to,
|
2195
2219
|
text: change.text,
|
2196
2220
|
origin: change.origin,
|
2197
|
-
update: function(from, to, text, origin) {
|
2198
|
-
if (from) this.from = clipPos(doc, from);
|
2199
|
-
if (to) this.to = clipPos(doc, to);
|
2200
|
-
if (text) this.text = text;
|
2201
|
-
if (origin !== undefined) this.origin = origin;
|
2202
|
-
},
|
2203
2221
|
cancel: function() { this.canceled = true; }
|
2204
2222
|
};
|
2223
|
+
if (update) obj.update = function(from, to, text, origin) {
|
2224
|
+
if (from) this.from = clipPos(doc, from);
|
2225
|
+
if (to) this.to = clipPos(doc, to);
|
2226
|
+
if (text) this.text = text;
|
2227
|
+
if (origin !== undefined) this.origin = origin;
|
2228
|
+
};
|
2205
2229
|
signal(doc, "beforeChange", doc, obj);
|
2206
2230
|
if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);
|
2207
2231
|
|
@@ -2218,7 +2242,7 @@ window.CodeMirror = (function() {
|
|
2218
2242
|
}
|
2219
2243
|
|
2220
2244
|
if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
|
2221
|
-
change = filterChange(doc, change);
|
2245
|
+
change = filterChange(doc, change, true);
|
2222
2246
|
if (!change) return;
|
2223
2247
|
}
|
2224
2248
|
|
@@ -2257,15 +2281,23 @@ window.CodeMirror = (function() {
|
|
2257
2281
|
var hist = doc.history;
|
2258
2282
|
var event = (type == "undo" ? hist.done : hist.undone).pop();
|
2259
2283
|
if (!event) return;
|
2260
|
-
hist.dirtyCounter += type == "undo" ? -1 : 1;
|
2261
2284
|
|
2262
2285
|
var anti = {changes: [], anchorBefore: event.anchorAfter, headBefore: event.headAfter,
|
2263
|
-
anchorAfter: event.anchorBefore, headAfter: event.headBefore
|
2286
|
+
anchorAfter: event.anchorBefore, headAfter: event.headBefore,
|
2287
|
+
generation: hist.generation};
|
2264
2288
|
(type == "undo" ? hist.undone : hist.done).push(anti);
|
2289
|
+
hist.generation = event.generation || ++hist.maxGeneration;
|
2290
|
+
|
2291
|
+
var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
|
2265
2292
|
|
2266
2293
|
for (var i = event.changes.length - 1; i >= 0; --i) {
|
2267
2294
|
var change = event.changes[i];
|
2268
2295
|
change.origin = type;
|
2296
|
+
if (filter && !filterChange(doc, change, false)) {
|
2297
|
+
(type == "undo" ? hist.done : hist.undone).length = 0;
|
2298
|
+
return;
|
2299
|
+
}
|
2300
|
+
|
2269
2301
|
anti.changes.push(historyChangeFromChange(doc, change));
|
2270
2302
|
|
2271
2303
|
var after = i ? computeSelAfterChange(doc, change, null)
|
@@ -2529,9 +2561,9 @@ window.CodeMirror = (function() {
|
|
2529
2561
|
function scrollCursorIntoView(cm) {
|
2530
2562
|
var coords = scrollPosIntoView(cm, cm.doc.sel.head, cm.options.cursorScrollMargin);
|
2531
2563
|
if (!cm.state.focused) return;
|
2532
|
-
var display = cm.display, box = getRect(display.sizer), doScroll = null
|
2533
|
-
if (coords.top +
|
2534
|
-
else if (coords.bottom +
|
2564
|
+
var display = cm.display, box = getRect(display.sizer), doScroll = null;
|
2565
|
+
if (coords.top + box.top < 0) doScroll = true;
|
2566
|
+
else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
|
2535
2567
|
if (doScroll != null && !phantom) {
|
2536
2568
|
var hidden = display.cursor.style.display == "none";
|
2537
2569
|
if (hidden) {
|
@@ -2569,12 +2601,11 @@ window.CodeMirror = (function() {
|
|
2569
2601
|
}
|
2570
2602
|
|
2571
2603
|
function calculateScrollPos(cm, x1, y1, x2, y2) {
|
2572
|
-
var display = cm.display,
|
2573
|
-
y1 += pt; y2 += pt;
|
2604
|
+
var display = cm.display, snapMargin = textHeight(cm.display);
|
2574
2605
|
if (y1 < 0) y1 = 0;
|
2575
2606
|
var screen = display.scroller.clientHeight - scrollerCutOff, screentop = display.scroller.scrollTop, result = {};
|
2576
2607
|
var docBottom = cm.doc.height + paddingVert(display);
|
2577
|
-
var atTop = y1 <
|
2608
|
+
var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;
|
2578
2609
|
if (y1 < screentop) {
|
2579
2610
|
result.scrollTop = atTop ? 0 : y1;
|
2580
2611
|
} else if (y2 > screentop + screen) {
|
@@ -2611,7 +2642,7 @@ window.CodeMirror = (function() {
|
|
2611
2642
|
|
2612
2643
|
function indentLine(cm, n, how, aggressive) {
|
2613
2644
|
var doc = cm.doc;
|
2614
|
-
if (
|
2645
|
+
if (how == null) how = "add";
|
2615
2646
|
if (how == "smart") {
|
2616
2647
|
if (!cm.doc.mode.indent) how = "prev";
|
2617
2648
|
else var state = getStateBefore(cm, n);
|
@@ -2634,6 +2665,8 @@ window.CodeMirror = (function() {
|
|
2634
2665
|
indentation = curSpace + cm.options.indentUnit;
|
2635
2666
|
} else if (how == "subtract") {
|
2636
2667
|
indentation = curSpace - cm.options.indentUnit;
|
2668
|
+
} else if (typeof how == "number") {
|
2669
|
+
indentation = curSpace + how;
|
2637
2670
|
}
|
2638
2671
|
indentation = Math.max(0, indentation);
|
2639
2672
|
|
@@ -2722,7 +2755,7 @@ window.CodeMirror = (function() {
|
|
2722
2755
|
function findWordAt(line, pos) {
|
2723
2756
|
var start = pos.ch, end = pos.ch;
|
2724
2757
|
if (line) {
|
2725
|
-
if (pos.
|
2758
|
+
if (pos.xRel < 0 || end == line.length) --start; else ++end;
|
2726
2759
|
var startChar = line.charAt(start);
|
2727
2760
|
var check = isWordChar(startChar) ? isWordChar
|
2728
2761
|
: /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
|
@@ -2779,7 +2812,8 @@ window.CodeMirror = (function() {
|
|
2779
2812
|
removeOverlay: operation(null, function(spec) {
|
2780
2813
|
var overlays = this.state.overlays;
|
2781
2814
|
for (var i = 0; i < overlays.length; ++i) {
|
2782
|
-
|
2815
|
+
var cur = overlays[i].modeSpec;
|
2816
|
+
if (cur == spec || typeof spec == "string" && cur.name == spec) {
|
2783
2817
|
overlays.splice(i, 1);
|
2784
2818
|
this.state.modeGen++;
|
2785
2819
|
regChange(this);
|
@@ -2789,7 +2823,7 @@ window.CodeMirror = (function() {
|
|
2789
2823
|
}),
|
2790
2824
|
|
2791
2825
|
indentLine: operation(null, function(n, dir, aggressive) {
|
2792
|
-
if (typeof dir != "string") {
|
2826
|
+
if (typeof dir != "string" && typeof dir != "number") {
|
2793
2827
|
if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";
|
2794
2828
|
else dir = dir ? "add" : "subtract";
|
2795
2829
|
}
|
@@ -2804,10 +2838,10 @@ window.CodeMirror = (function() {
|
|
2804
2838
|
|
2805
2839
|
// Fetch the parser token for a given character. Useful for hacks
|
2806
2840
|
// that want to inspect the mode state (say, for completion).
|
2807
|
-
getTokenAt: function(pos) {
|
2841
|
+
getTokenAt: function(pos, precise) {
|
2808
2842
|
var doc = this.doc;
|
2809
2843
|
pos = clipPos(doc, pos);
|
2810
|
-
var state = getStateBefore(this, pos.line), mode = this.doc.mode;
|
2844
|
+
var state = getStateBefore(this, pos.line, precise), mode = this.doc.mode;
|
2811
2845
|
var line = getLine(doc, pos.line);
|
2812
2846
|
var stream = new StringStream(line.text, this.options.tabSize);
|
2813
2847
|
while (stream.pos < pos.ch && !stream.eol()) {
|
@@ -2822,10 +2856,22 @@ window.CodeMirror = (function() {
|
|
2822
2856
|
state: state};
|
2823
2857
|
},
|
2824
2858
|
|
2825
|
-
|
2859
|
+
getTokenTypeAt: function(pos) {
|
2860
|
+
pos = clipPos(this.doc, pos);
|
2861
|
+
var styles = getLineStyles(this, getLine(this.doc, pos.line));
|
2862
|
+
var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
|
2863
|
+
for (;;) {
|
2864
|
+
var mid = (before + after) >> 1;
|
2865
|
+
if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
|
2866
|
+
else if (styles[mid * 2 + 1] < ch) before = mid + 1;
|
2867
|
+
else return styles[mid * 2 + 2];
|
2868
|
+
}
|
2869
|
+
},
|
2870
|
+
|
2871
|
+
getStateAfter: function(line, precise) {
|
2826
2872
|
var doc = this.doc;
|
2827
2873
|
line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
|
2828
|
-
return getStateBefore(this, line + 1);
|
2874
|
+
return getStateBefore(this, line + 1, precise);
|
2829
2875
|
},
|
2830
2876
|
|
2831
2877
|
cursorCoords: function(start, mode) {
|
@@ -2845,6 +2891,19 @@ window.CodeMirror = (function() {
|
|
2845
2891
|
return coordsChar(this, coords.left, coords.top);
|
2846
2892
|
},
|
2847
2893
|
|
2894
|
+
lineAtHeight: function(height, mode) {
|
2895
|
+
height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
|
2896
|
+
return lineAtHeight(this.doc, height + this.display.viewOffset);
|
2897
|
+
},
|
2898
|
+
heightAtLine: function(line, mode) {
|
2899
|
+
var end = false, last = this.doc.first + this.doc.size - 1;
|
2900
|
+
if (line < this.doc.first) line = this.doc.first;
|
2901
|
+
else if (line > last) { line = last; end = true; }
|
2902
|
+
var lineObj = getLine(this.doc, line);
|
2903
|
+
return intoCoordSystem(this, getLine(this.doc, line), {top: 0, left: 0}, mode || "page").top +
|
2904
|
+
(end ? lineObj.height : 0);
|
2905
|
+
},
|
2906
|
+
|
2848
2907
|
defaultTextHeight: function() { return textHeight(this.display); },
|
2849
2908
|
defaultCharWidth: function() { return charWidth(this.display); },
|
2850
2909
|
|
@@ -2873,7 +2932,7 @@ window.CodeMirror = (function() {
|
|
2873
2932
|
return changeLine(this, handle, function(line) {
|
2874
2933
|
var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass";
|
2875
2934
|
if (!line[prop]) line[prop] = cls;
|
2876
|
-
else if (new RegExp("
|
2935
|
+
else if (new RegExp("(?:^|\\s)" + cls + "(?:$|\\s)").test(line[prop])) return false;
|
2877
2936
|
else line[prop] += " " + cls;
|
2878
2937
|
return true;
|
2879
2938
|
});
|
@@ -2886,9 +2945,10 @@ window.CodeMirror = (function() {
|
|
2886
2945
|
if (!cur) return false;
|
2887
2946
|
else if (cls == null) line[prop] = null;
|
2888
2947
|
else {
|
2889
|
-
var
|
2890
|
-
if (
|
2891
|
-
|
2948
|
+
var found = cur.match(new RegExp("(?:^|\\s+)" + cls + "(?:$|\\s+)"));
|
2949
|
+
if (!found) return false;
|
2950
|
+
var end = found.index + found[0].length;
|
2951
|
+
line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
|
2892
2952
|
}
|
2893
2953
|
return true;
|
2894
2954
|
});
|
@@ -2936,7 +2996,7 @@ window.CodeMirror = (function() {
|
|
2936
2996
|
if (left + node.offsetWidth > hspace)
|
2937
2997
|
left = hspace - node.offsetWidth;
|
2938
2998
|
}
|
2939
|
-
node.style.top =
|
2999
|
+
node.style.top = top + "px";
|
2940
3000
|
node.style.left = node.style.right = "";
|
2941
3001
|
if (horiz == "right") {
|
2942
3002
|
left = display.sizer.clientWidth - node.offsetWidth;
|
@@ -3281,6 +3341,10 @@ window.CodeMirror = (function() {
|
|
3281
3341
|
var l = cm.getCursor().line;
|
3282
3342
|
cm.replaceRange("", Pos(l, 0), Pos(l), "+delete");
|
3283
3343
|
},
|
3344
|
+
delLineLeft: function(cm) {
|
3345
|
+
var cur = cm.getCursor();
|
3346
|
+
cm.replaceRange("", Pos(cur.line, 0), cur, "+delete");
|
3347
|
+
},
|
3284
3348
|
undo: function(cm) {cm.undo();},
|
3285
3349
|
redo: function(cm) {cm.redo();},
|
3286
3350
|
goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},
|
@@ -3376,7 +3440,7 @@ window.CodeMirror = (function() {
|
|
3376
3440
|
"Alt-Right": "goGroupRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delGroupBefore",
|
3377
3441
|
"Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
|
3378
3442
|
"Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
|
3379
|
-
"Cmd-[": "indentLess", "Cmd-]": "indentMore",
|
3443
|
+
"Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delLineLeft",
|
3380
3444
|
fallthrough: ["basic", "emacsy"]
|
3381
3445
|
};
|
3382
3446
|
keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
|
@@ -3415,7 +3479,7 @@ window.CodeMirror = (function() {
|
|
3415
3479
|
|
3416
3480
|
for (var i = 0; i < maps.length; ++i) {
|
3417
3481
|
var done = lookup(maps[i]);
|
3418
|
-
if (done) return done;
|
3482
|
+
if (done) return done != "stop";
|
3419
3483
|
}
|
3420
3484
|
}
|
3421
3485
|
function isModifierKey(event) {
|
@@ -3597,7 +3661,7 @@ window.CodeMirror = (function() {
|
|
3597
3661
|
if (min != null && cm) regChange(cm, min, max + 1);
|
3598
3662
|
this.lines.length = 0;
|
3599
3663
|
this.explicitlyCleared = true;
|
3600
|
-
if (this.
|
3664
|
+
if (this.atomic && this.doc.cantEdit) {
|
3601
3665
|
this.doc.cantEdit = false;
|
3602
3666
|
if (cm) reCheckSelection(cm);
|
3603
3667
|
}
|
@@ -3660,6 +3724,7 @@ window.CodeMirror = (function() {
|
|
3660
3724
|
if (marker.replacedWith) {
|
3661
3725
|
marker.collapsed = true;
|
3662
3726
|
marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget");
|
3727
|
+
if (!options.handleMouseEvents) marker.replacedWith.ignoreEvents = true;
|
3663
3728
|
}
|
3664
3729
|
if (marker.collapsed) sawCollapsedSpans = true;
|
3665
3730
|
|
@@ -3833,6 +3898,13 @@ window.CodeMirror = (function() {
|
|
3833
3898
|
}
|
3834
3899
|
}
|
3835
3900
|
}
|
3901
|
+
if (sameLine && first) {
|
3902
|
+
// Make sure we didn't create any zero-length spans
|
3903
|
+
for (var i = 0; i < first.length; ++i)
|
3904
|
+
if (first[i].from != null && first[i].from == first[i].to && first[i].marker.type != "bookmark")
|
3905
|
+
first.splice(i--, 1);
|
3906
|
+
if (!first.length) first = null;
|
3907
|
+
}
|
3836
3908
|
|
3837
3909
|
var newMarkers = [first];
|
3838
3910
|
if (!sameLine) {
|
@@ -3927,6 +3999,7 @@ window.CodeMirror = (function() {
|
|
3927
3999
|
sp = sps[i];
|
3928
4000
|
if (!sp.marker.collapsed) continue;
|
3929
4001
|
if (sp.from == null) return true;
|
4002
|
+
if (sp.marker.replacedWith) continue;
|
3930
4003
|
if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
|
3931
4004
|
return true;
|
3932
4005
|
}
|
@@ -3940,7 +4013,7 @@ window.CodeMirror = (function() {
|
|
3940
4013
|
return true;
|
3941
4014
|
for (var sp, i = 0; i < line.markedSpans.length; ++i) {
|
3942
4015
|
sp = line.markedSpans[i];
|
3943
|
-
if (sp.marker.collapsed && sp.from == span.to &&
|
4016
|
+
if (sp.marker.collapsed && !sp.marker.replacedWith && sp.from == span.to &&
|
3944
4017
|
(sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
|
3945
4018
|
lineIsHiddenInner(doc, line, sp)) return true;
|
3946
4019
|
}
|
@@ -4052,7 +4125,7 @@ window.CodeMirror = (function() {
|
|
4052
4125
|
function runMode(cm, text, mode, state, f) {
|
4053
4126
|
var flattenSpans = mode.flattenSpans;
|
4054
4127
|
if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;
|
4055
|
-
var
|
4128
|
+
var curStart = 0, curStyle = null;
|
4056
4129
|
var stream = new StringStream(text, cm.options.tabSize), style;
|
4057
4130
|
if (text == "" && mode.blankLine) mode.blankLine(state);
|
4058
4131
|
while (!stream.eol()) {
|
@@ -4064,14 +4137,13 @@ window.CodeMirror = (function() {
|
|
4064
4137
|
} else {
|
4065
4138
|
style = mode.token(stream, state);
|
4066
4139
|
}
|
4067
|
-
var substr = stream.current();
|
4068
|
-
stream.start = stream.pos;
|
4069
4140
|
if (!flattenSpans || curStyle != style) {
|
4070
|
-
if (
|
4071
|
-
|
4072
|
-
}
|
4141
|
+
if (curStart < stream.start) f(stream.start, curStyle);
|
4142
|
+
curStart = stream.start; curStyle = style;
|
4143
|
+
}
|
4144
|
+
stream.start = stream.pos;
|
4073
4145
|
}
|
4074
|
-
if (
|
4146
|
+
if (curStart < stream.pos) f(stream.pos, curStyle);
|
4075
4147
|
}
|
4076
4148
|
|
4077
4149
|
function highlightLine(cm, line, state) {
|
@@ -4079,27 +4151,24 @@ window.CodeMirror = (function() {
|
|
4079
4151
|
// mode/overlays that it is based on (for easy invalidation).
|
4080
4152
|
var st = [cm.state.modeGen];
|
4081
4153
|
// Compute the base array of styles
|
4082
|
-
runMode(cm, line.text, cm.doc.mode, state, function(
|
4154
|
+
runMode(cm, line.text, cm.doc.mode, state, function(end, style) {st.push(end, style);});
|
4083
4155
|
|
4084
4156
|
// Run overlays, adjust style array.
|
4085
4157
|
for (var o = 0; o < cm.state.overlays.length; ++o) {
|
4086
|
-
var overlay = cm.state.overlays[o], i = 1;
|
4087
|
-
runMode(cm, line.text, overlay.mode, true, function(
|
4088
|
-
var start = i
|
4158
|
+
var overlay = cm.state.overlays[o], i = 1, at = 0;
|
4159
|
+
runMode(cm, line.text, overlay.mode, true, function(end, style) {
|
4160
|
+
var start = i;
|
4089
4161
|
// Ensure there's a token end at the current position, and that i points at it
|
4090
|
-
while (
|
4091
|
-
var
|
4092
|
-
if (
|
4093
|
-
|
4094
|
-
} else {
|
4095
|
-
st.splice(i, 1, cur.slice(0, len), st[i+1], cur.slice(len));
|
4096
|
-
len = 0;
|
4097
|
-
}
|
4162
|
+
while (at < end) {
|
4163
|
+
var i_end = st[i];
|
4164
|
+
if (i_end > end)
|
4165
|
+
st.splice(i, 1, end, st[i+1], i_end);
|
4098
4166
|
i += 2;
|
4167
|
+
at = Math.min(end, i_end);
|
4099
4168
|
}
|
4100
4169
|
if (!style) return;
|
4101
4170
|
if (overlay.opaque) {
|
4102
|
-
st.splice(start, i - start,
|
4171
|
+
st.splice(start, i - start, end, style);
|
4103
4172
|
i = start + 2;
|
4104
4173
|
} else {
|
4105
4174
|
for (; start < i; start += 2) {
|
@@ -4139,37 +4208,31 @@ window.CodeMirror = (function() {
|
|
4139
4208
|
}
|
4140
4209
|
|
4141
4210
|
function lineContent(cm, realLine, measure) {
|
4142
|
-
var merged, line = realLine,
|
4143
|
-
while (merged = collapsedSpanAtStart(line))
|
4144
|
-
simple = false;
|
4211
|
+
var merged, line = realLine, empty = true;
|
4212
|
+
while (merged = collapsedSpanAtStart(line))
|
4145
4213
|
line = getLine(cm.doc, merged.find().from.line);
|
4146
|
-
if (!lineBefore) lineBefore = line;
|
4147
|
-
}
|
4148
4214
|
|
4149
4215
|
var builder = {pre: elt("pre"), col: 0, pos: 0, display: !measure,
|
4150
|
-
measure: null,
|
4216
|
+
measure: null, measuredSomething: false, cm: cm};
|
4151
4217
|
if (line.textClass) builder.pre.className = line.textClass;
|
4152
4218
|
|
4153
4219
|
do {
|
4220
|
+
if (line.text) empty = false;
|
4154
4221
|
builder.measure = line == realLine && measure;
|
4155
4222
|
builder.pos = 0;
|
4156
4223
|
builder.addToken = builder.measure ? buildTokenMeasure : buildToken;
|
4157
4224
|
if ((ie || webkit) && cm.getOption("lineWrapping"))
|
4158
4225
|
builder.addToken = buildTokenSplitSpaces(builder.addToken);
|
4159
|
-
if (measure && sawBefore && line != realLine && !builder.addedOne) {
|
4160
|
-
measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure));
|
4161
|
-
builder.addedOne = true;
|
4162
|
-
}
|
4163
4226
|
var next = insertLineContent(line, builder, getLineStyles(cm, line));
|
4164
|
-
|
4165
|
-
|
4166
|
-
|
4167
|
-
simple = false;
|
4227
|
+
if (measure && line == realLine && !builder.measuredSomething) {
|
4228
|
+
measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure));
|
4229
|
+
builder.measuredSomething = true;
|
4168
4230
|
}
|
4231
|
+
if (next) line = getLine(cm.doc, next.to.line);
|
4169
4232
|
} while (next);
|
4170
4233
|
|
4171
|
-
if (measure && !builder.
|
4172
|
-
measure[0] = builder.pre.appendChild(
|
4234
|
+
if (measure && !builder.measuredSomething && !measure[0])
|
4235
|
+
measure[0] = builder.pre.appendChild(empty ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure));
|
4173
4236
|
if (!builder.pre.firstChild && !lineIsHidden(cm.doc, realLine))
|
4174
4237
|
builder.pre.appendChild(document.createTextNode("\u00a0"));
|
4175
4238
|
|
@@ -4252,7 +4315,7 @@ window.CodeMirror = (function() {
|
|
4252
4315
|
span.style.whiteSpace = "normal";
|
4253
4316
|
builder.pos += ch.length;
|
4254
4317
|
}
|
4255
|
-
if (text.length) builder.
|
4318
|
+
if (text.length) builder.measuredSomething = true;
|
4256
4319
|
}
|
4257
4320
|
|
4258
4321
|
function buildTokenSplitSpaces(inner) {
|
@@ -4270,11 +4333,12 @@ window.CodeMirror = (function() {
|
|
4270
4333
|
function buildCollapsedSpan(builder, size, widget) {
|
4271
4334
|
if (widget) {
|
4272
4335
|
if (!builder.display) widget = widget.cloneNode(true);
|
4273
|
-
builder.
|
4274
|
-
|
4275
|
-
|
4276
|
-
builder.
|
4336
|
+
if (builder.measure) {
|
4337
|
+
builder.measure[builder.pos] = size ? widget
|
4338
|
+
: builder.pre.appendChild(zeroWidthElement(builder.cm.display.measure));
|
4339
|
+
builder.measuredSomething = true;
|
4277
4340
|
}
|
4341
|
+
builder.pre.appendChild(widget);
|
4278
4342
|
}
|
4279
4343
|
builder.pos += size;
|
4280
4344
|
}
|
@@ -4282,15 +4346,14 @@ window.CodeMirror = (function() {
|
|
4282
4346
|
// Outputs a number of spans to make up a line, taking highlighting
|
4283
4347
|
// and marked text into account.
|
4284
4348
|
function insertLineContent(line, builder, styles) {
|
4285
|
-
var spans = line.markedSpans;
|
4349
|
+
var spans = line.markedSpans, allText = line.text, at = 0;
|
4286
4350
|
if (!spans) {
|
4287
4351
|
for (var i = 1; i < styles.length; i+=2)
|
4288
|
-
builder.addToken(builder, styles[i], styleToClass(styles[i+1]));
|
4352
|
+
builder.addToken(builder, allText.slice(at, at = styles[i]), styleToClass(styles[i+1]));
|
4289
4353
|
return;
|
4290
4354
|
}
|
4291
4355
|
|
4292
|
-
var
|
4293
|
-
var pos = 0, i = 1, text = "", style;
|
4356
|
+
var len = allText.length, pos = 0, i = 1, text = "", style;
|
4294
4357
|
var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed;
|
4295
4358
|
for (;;) {
|
4296
4359
|
if (nextChange == pos) { // Update current marker set
|
@@ -4304,7 +4367,7 @@ window.CodeMirror = (function() {
|
|
4304
4367
|
if (m.className) spanStyle += " " + m.className;
|
4305
4368
|
if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
|
4306
4369
|
if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle;
|
4307
|
-
if (m.collapsed && (!collapsed || collapsed.marker.
|
4370
|
+
if (m.collapsed && (!collapsed || collapsed.marker.size < m.size))
|
4308
4371
|
collapsed = sp;
|
4309
4372
|
} else if (sp.from > pos && nextChange > sp.from) {
|
4310
4373
|
nextChange = sp.from;
|
@@ -4334,7 +4397,8 @@ window.CodeMirror = (function() {
|
|
4334
4397
|
pos = end;
|
4335
4398
|
spanStartStyle = "";
|
4336
4399
|
}
|
4337
|
-
text =
|
4400
|
+
text = allText.slice(at, at = styles[i++]);
|
4401
|
+
style = styleToClass(styles[i++]);
|
4338
4402
|
}
|
4339
4403
|
}
|
4340
4404
|
}
|
@@ -4526,6 +4590,7 @@ window.CodeMirror = (function() {
|
|
4526
4590
|
this.scrollTop = this.scrollLeft = 0;
|
4527
4591
|
this.cantEdit = false;
|
4528
4592
|
this.history = makeHistory();
|
4593
|
+
this.cleanGeneration = 1;
|
4529
4594
|
this.frontier = firstLine;
|
4530
4595
|
var start = Pos(firstLine, 0);
|
4531
4596
|
this.sel = {from: start, to: start, head: start, anchor: start, shift: false, extend: false, goalColumn: null};
|
@@ -4626,20 +4691,25 @@ window.CodeMirror = (function() {
|
|
4626
4691
|
var hist = this.history;
|
4627
4692
|
return {undo: hist.done.length, redo: hist.undone.length};
|
4628
4693
|
},
|
4629
|
-
clearHistory: function() {this.history = makeHistory();},
|
4694
|
+
clearHistory: function() {this.history = makeHistory(this.history.maxGeneration);},
|
4630
4695
|
|
4631
4696
|
markClean: function() {
|
4632
|
-
this.
|
4697
|
+
this.cleanGeneration = this.changeGeneration();
|
4698
|
+
},
|
4699
|
+
changeGeneration: function() {
|
4633
4700
|
this.history.lastOp = this.history.lastOrigin = null;
|
4701
|
+
return this.history.generation;
|
4702
|
+
},
|
4703
|
+
isClean: function (gen) {
|
4704
|
+
return this.history.generation == (gen || this.cleanGeneration);
|
4634
4705
|
},
|
4635
|
-
isClean: function () {return this.history.dirtyCounter == 0;},
|
4636
4706
|
|
4637
4707
|
getHistory: function() {
|
4638
4708
|
return {done: copyHistoryArray(this.history.done),
|
4639
4709
|
undone: copyHistoryArray(this.history.undone)};
|
4640
4710
|
},
|
4641
4711
|
setHistory: function(histData) {
|
4642
|
-
var hist = this.history = makeHistory();
|
4712
|
+
var hist = this.history = makeHistory(this.history.maxGeneration);
|
4643
4713
|
hist.done = histData.done.slice(0);
|
4644
4714
|
hist.undone = histData.undone.slice(0);
|
4645
4715
|
},
|
@@ -4869,7 +4939,7 @@ window.CodeMirror = (function() {
|
|
4869
4939
|
|
4870
4940
|
// HISTORY
|
4871
4941
|
|
4872
|
-
function makeHistory() {
|
4942
|
+
function makeHistory(startGen) {
|
4873
4943
|
return {
|
4874
4944
|
// Arrays of history events. Doing something adds an event to
|
4875
4945
|
// done and clears undo. Undoing moves events from done to
|
@@ -4879,7 +4949,7 @@ window.CodeMirror = (function() {
|
|
4879
4949
|
// event
|
4880
4950
|
lastTime: 0, lastOp: null, lastOrigin: null,
|
4881
4951
|
// Used by the isClean() method
|
4882
|
-
|
4952
|
+
generation: startGen || 1, maxGeneration: startGen || 1
|
4883
4953
|
};
|
4884
4954
|
}
|
4885
4955
|
|
@@ -4923,17 +4993,13 @@ window.CodeMirror = (function() {
|
|
4923
4993
|
} else {
|
4924
4994
|
// Can not be merged, start a new event.
|
4925
4995
|
cur = {changes: [historyChangeFromChange(doc, change)],
|
4996
|
+
generation: hist.generation,
|
4926
4997
|
anchorBefore: doc.sel.anchor, headBefore: doc.sel.head,
|
4927
4998
|
anchorAfter: selAfter.anchor, headAfter: selAfter.head};
|
4928
4999
|
hist.done.push(cur);
|
5000
|
+
hist.generation = ++hist.maxGeneration;
|
4929
5001
|
while (hist.done.length > hist.undoDepth)
|
4930
5002
|
hist.done.shift();
|
4931
|
-
if (hist.dirtyCounter < 0)
|
4932
|
-
// The user has made a change after undoing past the last clean state.
|
4933
|
-
// We can never get back to a clean state now until markClean() is called.
|
4934
|
-
hist.dirtyCounter = NaN;
|
4935
|
-
else
|
4936
|
-
hist.dirtyCounter++;
|
4937
5003
|
}
|
4938
5004
|
hist.lastTime = time;
|
4939
5005
|
hist.lastOp = opId;
|
@@ -5048,6 +5114,9 @@ window.CodeMirror = (function() {
|
|
5048
5114
|
if (e.stopPropagation) e.stopPropagation();
|
5049
5115
|
else e.cancelBubble = true;
|
5050
5116
|
}
|
5117
|
+
function e_defaultPrevented(e) {
|
5118
|
+
return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;
|
5119
|
+
}
|
5051
5120
|
function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
|
5052
5121
|
CodeMirror.e_stop = e_stop;
|
5053
5122
|
CodeMirror.e_preventDefault = e_preventDefault;
|
@@ -5114,6 +5183,11 @@ window.CodeMirror = (function() {
|
|
5114
5183
|
delayedCallbacks.push(bnd(arr[i]));
|
5115
5184
|
}
|
5116
5185
|
|
5186
|
+
function signalDOMEvent(cm, e) {
|
5187
|
+
signal(cm, e.type, cm, e);
|
5188
|
+
return e_defaultPrevented(e);
|
5189
|
+
}
|
5190
|
+
|
5117
5191
|
function fireDelayed() {
|
5118
5192
|
--delayedCallbackDepth;
|
5119
5193
|
var delayed = delayedCallbacks;
|
@@ -5168,7 +5242,11 @@ window.CodeMirror = (function() {
|
|
5168
5242
|
if (ios) { // Mobile Safari apparently has a bug where select() is broken.
|
5169
5243
|
node.selectionStart = 0;
|
5170
5244
|
node.selectionEnd = node.value.length;
|
5171
|
-
} else
|
5245
|
+
} else {
|
5246
|
+
// Suppress mysterious IE10 errors
|
5247
|
+
try { node.select(); }
|
5248
|
+
catch(_e) {}
|
5249
|
+
}
|
5172
5250
|
}
|
5173
5251
|
|
5174
5252
|
function indexOf(collection, elt) {
|
@@ -5279,7 +5357,7 @@ window.CodeMirror = (function() {
|
|
5279
5357
|
spanAffectsWrapping = function(str, i) {
|
5280
5358
|
if (i > 1 && str.charCodeAt(i - 1) == 45 && /\w/.test(str.charAt(i - 2)) && /[^\-?\.]/.test(str.charAt(i)))
|
5281
5359
|
return true;
|
5282
|
-
return /[~!#%&*)=+}\]|\"\.>,:;][({[<]|\?[\w~`@#$%\^&*(_=+{[|><]/.test(str.slice(i - 1, i + 1));
|
5360
|
+
return /[~!#%&*)=+}\]|\"\.>,:;][({[<]|-[^\-?\.\u2010-\u201f\u2026]|\?[\w~`@#$%\^&*(_=+{[|><]|…[\w~`@#$%\^&*(_=+{[><]/.test(str.slice(i - 1, i + 1));
|
5283
5361
|
};
|
5284
5362
|
|
5285
5363
|
var knownScrollbarWidth;
|
@@ -5631,7 +5709,7 @@ window.CodeMirror = (function() {
|
|
5631
5709
|
|
5632
5710
|
// THE END
|
5633
5711
|
|
5634
|
-
CodeMirror.version = "3.
|
5712
|
+
CodeMirror.version = "3.14.0";
|
5635
5713
|
|
5636
5714
|
return CodeMirror;
|
5637
5715
|
})();
|