codemirror-rails 3.12 → 3.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/codemirror-rails.gemspec +1 -1
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +168 -116
- data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +144 -0
- data/vendor/assets/javascripts/codemirror/addons/display/placeholder.js +4 -4
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +2 -2
- data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +9 -3
- data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +13 -13
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.js +5 -1
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +13 -1
- data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +4 -4
- data/vendor/assets/javascripts/codemirror/addons/search/search.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/search/searchcursor.js +15 -5
- data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +6 -6
- data/vendor/assets/javascripts/codemirror/addons/selection/mark-selection.js +89 -15
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +451 -187
- data/vendor/assets/javascripts/codemirror/modes/clike.js +6 -3
- data/vendor/assets/javascripts/codemirror/modes/clojure.js +3 -1
- data/vendor/assets/javascripts/codemirror/modes/cobol.js +240 -0
- data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/commonlisp.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/css.js +63 -24
- data/vendor/assets/javascripts/codemirror/modes/erlang.js +3 -2
- data/vendor/assets/javascripts/codemirror/modes/gas.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/go.js +4 -1
- data/vendor/assets/javascripts/codemirror/modes/haml.js +153 -0
- data/vendor/assets/javascripts/codemirror/modes/haskell.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/less.js +0 -8
- data/vendor/assets/javascripts/codemirror/modes/lua.js +5 -1
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +2 -2
- data/vendor/assets/javascripts/codemirror/modes/ocaml.js +4 -1
- data/vendor/assets/javascripts/codemirror/modes/php.js +3 -0
- data/vendor/assets/javascripts/codemirror/modes/python.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/ruby.js +2 -1
- data/vendor/assets/javascripts/codemirror/modes/rust.js +4 -1
- data/vendor/assets/javascripts/codemirror/modes/sass.js +8 -27
- data/vendor/assets/javascripts/codemirror/modes/scheme.js +3 -1
- data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +6 -4
- data/vendor/assets/javascripts/codemirror/modes/sql.js +3 -4
- data/vendor/assets/javascripts/codemirror/modes/stex.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/xml.js +2 -0
- data/vendor/assets/javascripts/codemirror/modes/yaml.js +3 -1
- data/vendor/assets/stylesheets/codemirror.css +7 -4
- data/vendor/assets/stylesheets/codemirror/addons/lint/lint.css +3 -3
- data/vendor/assets/stylesheets/codemirror/themes/rubyblue.css +1 -1
- metadata +14 -6
- data/vendor/assets/javascripts/codemirror/modes/test.js +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f5ff9291537f44a79316e34c24d2d354e2f29c6
|
4
|
+
data.tar.gz: dc676429b0b8522bb08b194d5b65715b0f58af6c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca0624b4dc29f738fe94f05c8e3b9f01d2f4aeee92432a5080d64d999700b82b98b05473e4e5cb450fb1631fb733eb5bfd609e796474638acc8639764b216611
|
7
|
+
data.tar.gz: 7d91163dcafa7486d50bb46ab2c499129fc9ed74f6c969a460f99ebb47e469c513eda6c3316aff62f1552a834b93d6be530616ee525c59071876689f627ffe79
|
data/codemirror-rails.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
|
13
13
|
s.files = `git ls-files`.split("\n")
|
14
14
|
|
15
|
-
s.add_runtime_dependency 'railties', '
|
15
|
+
s.add_runtime_dependency 'railties', '>= 3.0', '< 5'
|
16
16
|
|
17
17
|
s.add_development_dependency 'rails', '~> 3.0'
|
18
18
|
s.add_development_dependency 'sqlite3'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// CodeMirror version 3.
|
1
|
+
// CodeMirror version 3.13
|
2
2
|
//
|
3
3
|
// CodeMirror is the only global var we claim
|
4
4
|
window.CodeMirror = (function() {
|
@@ -99,7 +99,7 @@ window.CodeMirror = (function() {
|
|
99
99
|
else input.setAttribute("wrap", "off");
|
100
100
|
// if border: 0; -- iOS fails to open keyboard (issue #1287)
|
101
101
|
if (ios) input.style.border = "1px solid black";
|
102
|
-
input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off");
|
102
|
+
input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); input.setAttribute("spellcheck", "false");
|
103
103
|
|
104
104
|
// Wraps and hides input textarea
|
105
105
|
d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
|
@@ -107,8 +107,9 @@ window.CodeMirror = (function() {
|
|
107
107
|
d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar");
|
108
108
|
d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar");
|
109
109
|
d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
|
110
|
+
d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
|
110
111
|
// DIVs containing the selection and the actual code
|
111
|
-
d.lineDiv = elt("div");
|
112
|
+
d.lineDiv = elt("div", null, "CodeMirror-code");
|
112
113
|
d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
|
113
114
|
// Blinky cursor, and element used to ensure cursor fits at the end of a line
|
114
115
|
d.cursor = elt("div", "\u00a0", "CodeMirror-cursor");
|
@@ -128,14 +129,12 @@ window.CodeMirror = (function() {
|
|
128
129
|
// Will contain the gutters, if any
|
129
130
|
d.gutters = elt("div", null, "CodeMirror-gutters");
|
130
131
|
d.lineGutter = null;
|
131
|
-
// Helper element to properly size the gutter backgrounds
|
132
|
-
var scrollerInner = elt("div", [d.sizer, d.heightForcer, d.gutters], null, "position: relative; min-height: 100%");
|
133
132
|
// Provides scrolling
|
134
|
-
d.scroller = elt("div", [
|
133
|
+
d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
|
135
134
|
d.scroller.setAttribute("tabIndex", "-1");
|
136
135
|
// The element in which the editor lives.
|
137
136
|
d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV,
|
138
|
-
d.scrollbarFiller, d.scroller], "CodeMirror");
|
137
|
+
d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
|
139
138
|
// Work around IE7 z-index bug
|
140
139
|
if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
|
141
140
|
if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper);
|
@@ -214,7 +213,7 @@ window.CodeMirror = (function() {
|
|
214
213
|
estimateLineHeights(cm);
|
215
214
|
regChange(cm);
|
216
215
|
clearCaches(cm);
|
217
|
-
setTimeout(function(){updateScrollbars(cm
|
216
|
+
setTimeout(function(){updateScrollbars(cm);}, 100);
|
218
217
|
}
|
219
218
|
|
220
219
|
function estimateHeight(cm) {
|
@@ -253,6 +252,7 @@ window.CodeMirror = (function() {
|
|
253
252
|
function guttersChanged(cm) {
|
254
253
|
updateGutters(cm);
|
255
254
|
regChange(cm);
|
255
|
+
setTimeout(function(){alignHorizontally(cm);}, 20);
|
256
256
|
}
|
257
257
|
|
258
258
|
function updateGutters(cm) {
|
@@ -319,9 +319,11 @@ window.CodeMirror = (function() {
|
|
319
319
|
|
320
320
|
// Re-synchronize the fake scrollbars with the actual size of the
|
321
321
|
// content. Optionally force a scrollTop.
|
322
|
-
function updateScrollbars(
|
322
|
+
function updateScrollbars(cm) {
|
323
|
+
var d = cm.display, docHeight = cm.doc.height;
|
323
324
|
var totalHeight = docHeight + paddingVert(d);
|
324
325
|
d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px";
|
326
|
+
d.gutters.style.height = Math.max(totalHeight, d.scroller.clientHeight - scrollerCutOff) + "px";
|
325
327
|
var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight);
|
326
328
|
var needsH = d.scroller.scrollWidth > d.scroller.clientWidth;
|
327
329
|
var needsV = scrollHeight > d.scroller.clientHeight;
|
@@ -341,6 +343,11 @@ window.CodeMirror = (function() {
|
|
341
343
|
d.scrollbarFiller.style.display = "block";
|
342
344
|
d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px";
|
343
345
|
} else d.scrollbarFiller.style.display = "";
|
346
|
+
if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
|
347
|
+
d.gutterFiller.style.display = "block";
|
348
|
+
d.gutterFiller.style.height = scrollbarWidth(d.measure) + "px";
|
349
|
+
d.gutterFiller.style.width = d.gutters.offsetWidth + "px";
|
350
|
+
} else d.gutterFiller.style.display = "";
|
344
351
|
|
345
352
|
if (mac_geLion && scrollbarWidth(d.measure) === 0)
|
346
353
|
d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px";
|
@@ -399,14 +406,10 @@ window.CodeMirror = (function() {
|
|
399
406
|
var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo, updated;
|
400
407
|
var visible = visibleLines(cm.display, cm.doc, viewPort);
|
401
408
|
for (;;) {
|
402
|
-
if (updateDisplayInner(cm, changes, visible))
|
403
|
-
|
404
|
-
signalLater(cm, "update", cm);
|
405
|
-
if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo)
|
406
|
-
signalLater(cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo);
|
407
|
-
} else break;
|
409
|
+
if (!updateDisplayInner(cm, changes, visible)) break;
|
410
|
+
updated = true;
|
408
411
|
updateSelection(cm);
|
409
|
-
updateScrollbars(cm
|
412
|
+
updateScrollbars(cm);
|
410
413
|
|
411
414
|
// Clip forced viewport to actual scrollable area
|
412
415
|
if (viewPort)
|
@@ -418,6 +421,11 @@ window.CodeMirror = (function() {
|
|
418
421
|
changes = [];
|
419
422
|
}
|
420
423
|
|
424
|
+
if (updated) {
|
425
|
+
signalLater(cm, "update", cm);
|
426
|
+
if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo)
|
427
|
+
signalLater(cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo);
|
428
|
+
}
|
421
429
|
return updated;
|
422
430
|
}
|
423
431
|
|
@@ -978,23 +986,28 @@ window.CodeMirror = (function() {
|
|
978
986
|
if (memo.text == line.text && memo.markedSpans == line.markedSpans &&
|
979
987
|
cm.display.scroller.clientWidth == memo.width &&
|
980
988
|
memo.classes == line.textClass + "|" + line.bgClass + "|" + line.wrapClass)
|
981
|
-
return memo
|
989
|
+
return memo;
|
982
990
|
}
|
983
991
|
}
|
984
992
|
|
993
|
+
function clearCachedMeasurement(cm, line) {
|
994
|
+
var exists = findCachedMeasurement(cm, line);
|
995
|
+
if (exists) exists.text = exists.measure = exists.markedSpans = null;
|
996
|
+
}
|
997
|
+
|
985
998
|
function measureLine(cm, line) {
|
986
999
|
// First look in the cache
|
987
|
-
var
|
988
|
-
if (
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
997
|
-
|
1000
|
+
var cached = findCachedMeasurement(cm, line);
|
1001
|
+
if (cached) return cached.measure;
|
1002
|
+
|
1003
|
+
// Failing that, recompute and store result in cache
|
1004
|
+
var measure = measureLineInner(cm, line);
|
1005
|
+
var cache = cm.display.measureLineCache;
|
1006
|
+
var memo = {text: line.text, width: cm.display.scroller.clientWidth,
|
1007
|
+
markedSpans: line.markedSpans, measure: measure,
|
1008
|
+
classes: line.textClass + "|" + line.bgClass + "|" + line.wrapClass};
|
1009
|
+
if (cache.length == 16) cache[++cm.display.measureLineCachePos % 16] = memo;
|
1010
|
+
else cache.push(memo);
|
998
1011
|
return measure;
|
999
1012
|
}
|
1000
1013
|
|
@@ -1070,7 +1083,7 @@ window.CodeMirror = (function() {
|
|
1070
1083
|
if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true;
|
1071
1084
|
}
|
1072
1085
|
var cached = !hasBadSpan && findCachedMeasurement(cm, line);
|
1073
|
-
if (cached) return measureChar(cm, line, line.text.length, cached).right;
|
1086
|
+
if (cached) return measureChar(cm, line, line.text.length, cached.measure).right;
|
1074
1087
|
|
1075
1088
|
var pre = lineContent(cm, line);
|
1076
1089
|
var end = pre.appendChild(zeroWidthElement(cm.display.measure));
|
@@ -1138,32 +1151,26 @@ window.CodeMirror = (function() {
|
|
1138
1151
|
if (right) m.left = m.right; else m.right = m.left;
|
1139
1152
|
return intoCoordSystem(cm, lineObj, m, context);
|
1140
1153
|
}
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1151
|
-
// level. So we try to use the side with the higher level.
|
1152
|
-
if (i && part.level < (nb = order[i-1]).level) here = get(nb.level % 2 ? nb.from : nb.to - 1, true);
|
1153
|
-
else here = get(rtl && part.from != part.to ? ch - 1 : ch);
|
1154
|
-
if (rtl == linedir) main = here; else other = here;
|
1155
|
-
} else if (right == ch) {
|
1156
|
-
var nb = i < order.length - 1 && order[i+1];
|
1157
|
-
if (!rtl && nb && nb.from == nb.to) continue;
|
1158
|
-
if (nb && part.level < nb.level) here = get(nb.level % 2 ? nb.to - 1 : nb.from);
|
1159
|
-
else here = get(rtl ? ch : ch - 1, true);
|
1160
|
-
if (rtl == linedir) main = here; else other = here;
|
1154
|
+
function getBidi(ch, partPos) {
|
1155
|
+
var part = order[partPos], right = part.level % 2;
|
1156
|
+
if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
|
1157
|
+
part = order[--partPos];
|
1158
|
+
ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
|
1159
|
+
right = true;
|
1160
|
+
} else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
|
1161
|
+
part = order[++partPos];
|
1162
|
+
ch = bidiLeft(part) - part.level % 2;
|
1163
|
+
right = false;
|
1161
1164
|
}
|
1165
|
+
if (right && ch == part.to && ch > part.from) return get(ch - 1);
|
1166
|
+
return get(ch, right);
|
1162
1167
|
}
|
1163
|
-
|
1164
|
-
if (!
|
1165
|
-
|
1166
|
-
|
1168
|
+
var order = getOrder(lineObj), ch = pos.ch;
|
1169
|
+
if (!order) return get(ch);
|
1170
|
+
var partPos = getBidiPartAt(order, ch);
|
1171
|
+
var val = getBidi(ch, partPos);
|
1172
|
+
if (bidiOther != null) val.other = getBidi(ch, bidiOther);
|
1173
|
+
return val;
|
1167
1174
|
}
|
1168
1175
|
|
1169
1176
|
function PosMaybeOutside(line, ch, outside) {
|
@@ -1587,7 +1594,7 @@ window.CodeMirror = (function() {
|
|
1587
1594
|
var target = e_target(e);
|
1588
1595
|
if (target == display.scrollbarH || target == display.scrollbarH.firstChild ||
|
1589
1596
|
target == display.scrollbarV || target == display.scrollbarV.firstChild ||
|
1590
|
-
target == display.scrollbarFiller) return null;
|
1597
|
+
target == display.scrollbarFiller || target == display.gutterFiller) return null;
|
1591
1598
|
}
|
1592
1599
|
var x, y, space = getRect(display.lineSpace);
|
1593
1600
|
// Fails unpredictably on IE[67] when mouse is dragged around quickly.
|
@@ -2092,6 +2099,13 @@ window.CodeMirror = (function() {
|
|
2092
2099
|
// Adds "Select all" to context menu in FF
|
2093
2100
|
if (posEq(sel.from, sel.to)) display.input.value = display.prevInput = " ";
|
2094
2101
|
|
2102
|
+
function prepareSelectAllHack() {
|
2103
|
+
if (display.input.selectionStart != null) {
|
2104
|
+
var extval = display.input.value = " " + (posEq(sel.from, sel.to) ? "" : display.input.value);
|
2105
|
+
display.prevInput = " ";
|
2106
|
+
display.input.selectionStart = 1; display.input.selectionEnd = extval.length;
|
2107
|
+
}
|
2108
|
+
}
|
2095
2109
|
function rehide() {
|
2096
2110
|
display.inputDiv.style.position = "relative";
|
2097
2111
|
display.input.style.cssText = oldCSS;
|
@@ -2099,12 +2113,10 @@ window.CodeMirror = (function() {
|
|
2099
2113
|
slowPoll(cm);
|
2100
2114
|
|
2101
2115
|
// Try to detect the user choosing select-all
|
2102
|
-
if (display.input.selectionStart != null
|
2116
|
+
if (display.input.selectionStart != null) {
|
2117
|
+
if (!ie || ie_lt9) prepareSelectAllHack();
|
2103
2118
|
clearTimeout(detectingSelectAll);
|
2104
|
-
var
|
2105
|
-
display.prevInput = " ";
|
2106
|
-
display.input.selectionStart = 1; display.input.selectionEnd = extval.length;
|
2107
|
-
var poll = function(){
|
2119
|
+
var i = 0, poll = function(){
|
2108
2120
|
if (display.prevInput == " " && display.input.selectionStart == 0)
|
2109
2121
|
operation(cm, commands.selectAll)(cm);
|
2110
2122
|
else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500);
|
@@ -2114,6 +2126,7 @@ window.CodeMirror = (function() {
|
|
2114
2126
|
}
|
2115
2127
|
}
|
2116
2128
|
|
2129
|
+
if (ie && !ie_lt9) prepareSelectAllHack();
|
2117
2130
|
if (captureMiddleClick) {
|
2118
2131
|
e_stop(e);
|
2119
2132
|
var mouseup = function() {
|
@@ -2514,7 +2527,7 @@ window.CodeMirror = (function() {
|
|
2514
2527
|
// SCROLLING
|
2515
2528
|
|
2516
2529
|
function scrollCursorIntoView(cm) {
|
2517
|
-
var coords = scrollPosIntoView(cm, cm.doc.sel.head);
|
2530
|
+
var coords = scrollPosIntoView(cm, cm.doc.sel.head, cm.options.cursorScrollMargin);
|
2518
2531
|
if (!cm.state.focused) return;
|
2519
2532
|
var display = cm.display, box = getRect(display.sizer), doScroll = null, pTop = paddingTop(cm.display);
|
2520
2533
|
if (coords.top + pTop + box.top < 0) doScroll = true;
|
@@ -2645,7 +2658,7 @@ window.CodeMirror = (function() {
|
|
2645
2658
|
}
|
2646
2659
|
|
2647
2660
|
function findPosH(doc, pos, dir, unit, visually) {
|
2648
|
-
var line = pos.line, ch = pos.ch;
|
2661
|
+
var line = pos.line, ch = pos.ch, origDir = dir;
|
2649
2662
|
var lineObj = getLine(doc, line);
|
2650
2663
|
var possible = true;
|
2651
2664
|
function findNextLine() {
|
@@ -2684,7 +2697,7 @@ window.CodeMirror = (function() {
|
|
2684
2697
|
if (dir > 0 && !moveOnce(!first)) break;
|
2685
2698
|
}
|
2686
2699
|
}
|
2687
|
-
var result = skipAtomic(doc, Pos(line, ch),
|
2700
|
+
var result = skipAtomic(doc, Pos(line, ch), origDir, true);
|
2688
2701
|
if (!possible) result.hitSide = true;
|
2689
2702
|
return result;
|
2690
2703
|
}
|
@@ -2730,6 +2743,7 @@ window.CodeMirror = (function() {
|
|
2730
2743
|
// 'wrap f in an operation, performed on its `this` parameter'
|
2731
2744
|
|
2732
2745
|
CodeMirror.prototype = {
|
2746
|
+
constructor: CodeMirror,
|
2733
2747
|
focus: function(){window.focus(); focusInput(this); onFocus(this); fastPoll(this);},
|
2734
2748
|
|
2735
2749
|
setOption: function(option, value) {
|
@@ -2990,7 +3004,8 @@ window.CodeMirror = (function() {
|
|
2990
3004
|
sel.goalColumn = pos.left;
|
2991
3005
|
}),
|
2992
3006
|
|
2993
|
-
toggleOverwrite: function() {
|
3007
|
+
toggleOverwrite: function(value) {
|
3008
|
+
if (value != null && value == this.state.overwrite) return;
|
2994
3009
|
if (this.state.overwrite = !this.state.overwrite)
|
2995
3010
|
this.display.cursor.className += " CodeMirror-overwrite";
|
2996
3011
|
else
|
@@ -3113,6 +3128,7 @@ window.CodeMirror = (function() {
|
|
3113
3128
|
cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
|
3114
3129
|
cm.refresh();
|
3115
3130
|
}, true);
|
3131
|
+
option("coverGutterNextToScrollbar", false, updateScrollbars, true);
|
3116
3132
|
option("lineNumbers", false, function(cm) {
|
3117
3133
|
setGuttersForLineNumbers(cm.options);
|
3118
3134
|
guttersChanged(cm);
|
@@ -3128,6 +3144,7 @@ window.CodeMirror = (function() {
|
|
3128
3144
|
option("dragDrop", true);
|
3129
3145
|
|
3130
3146
|
option("cursorBlinkRate", 530);
|
3147
|
+
option("cursorScrollMargin", 0);
|
3131
3148
|
option("cursorHeight", 1);
|
3132
3149
|
option("workTime", 100);
|
3133
3150
|
option("workDelay", 100);
|
@@ -3165,10 +3182,15 @@ window.CodeMirror = (function() {
|
|
3165
3182
|
};
|
3166
3183
|
|
3167
3184
|
CodeMirror.resolveMode = function(spec) {
|
3168
|
-
if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
|
3185
|
+
if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
|
3169
3186
|
spec = mimeModes[spec];
|
3170
|
-
else if (typeof spec == "string" &&
|
3187
|
+
} else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
|
3188
|
+
var found = mimeModes[spec.name];
|
3189
|
+
spec = createObj(found, spec);
|
3190
|
+
spec.name = found.name;
|
3191
|
+
} else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
|
3171
3192
|
return CodeMirror.resolveMode("application/xml");
|
3193
|
+
}
|
3172
3194
|
if (typeof spec == "string") return {name: spec};
|
3173
3195
|
else return spec || {name: "null"};
|
3174
3196
|
};
|
@@ -3598,15 +3620,18 @@ window.CodeMirror = (function() {
|
|
3598
3620
|
return from && {from: from, to: to};
|
3599
3621
|
};
|
3600
3622
|
|
3601
|
-
TextMarker.prototype.
|
3602
|
-
var
|
3603
|
-
|
3604
|
-
|
3605
|
-
|
3606
|
-
|
3607
|
-
|
3608
|
-
|
3609
|
-
|
3623
|
+
TextMarker.prototype.changed = function() {
|
3624
|
+
var pos = this.find(), cm = this.doc.cm;
|
3625
|
+
if (!pos || !cm) return;
|
3626
|
+
var line = getLine(this.doc, pos.from.line);
|
3627
|
+
clearCachedMeasurement(cm, line);
|
3628
|
+
if (pos.from.line >= cm.display.showingFrom && pos.from.line < cm.display.showingTo) {
|
3629
|
+
for (var node = cm.display.lineDiv.firstChild; node; node = node.nextSibling) if (node.lineObj == line) {
|
3630
|
+
if (node.offsetHeight != line.height) updateLineHeight(line, node.offsetHeight);
|
3631
|
+
break;
|
3632
|
+
}
|
3633
|
+
runInOp(cm, function() { cm.curOp.selectionChanged = true; });
|
3634
|
+
}
|
3610
3635
|
};
|
3611
3636
|
|
3612
3637
|
TextMarker.prototype.attachLine = function(line) {
|
@@ -3706,11 +3731,6 @@ window.CodeMirror = (function() {
|
|
3706
3731
|
SharedTextMarker.prototype.find = function() {
|
3707
3732
|
return this.primary.find();
|
3708
3733
|
};
|
3709
|
-
SharedTextMarker.prototype.getOptions = function(copyWidget) {
|
3710
|
-
var inner = this.primary.getOptions(copyWidget);
|
3711
|
-
inner.shared = true;
|
3712
|
-
return inner;
|
3713
|
-
};
|
3714
3734
|
|
3715
3735
|
function markTextShared(doc, from, to, options, type) {
|
3716
3736
|
options = copyObj(options);
|
@@ -4218,8 +4238,7 @@ window.CodeMirror = (function() {
|
|
4218
4238
|
if (ch >= "\ud800" && ch < "\udbff" && i < text.length - 1) {
|
4219
4239
|
ch = text.slice(i, i + 2);
|
4220
4240
|
++i;
|
4221
|
-
} else if (i && wrapping &&
|
4222
|
-
spanAffectsWrapping.test(text.slice(i - 1, i + 1))) {
|
4241
|
+
} else if (i && wrapping && spanAffectsWrapping(text, i)) {
|
4223
4242
|
builder.pre.appendChild(elt("wbr"));
|
4224
4243
|
}
|
4225
4244
|
var span = builder.measure[builder.pos] =
|
@@ -4518,6 +4537,7 @@ window.CodeMirror = (function() {
|
|
4518
4537
|
};
|
4519
4538
|
|
4520
4539
|
Doc.prototype = createObj(BranchChunk.prototype, {
|
4540
|
+
constructor: Doc,
|
4521
4541
|
iter: function(from, to, op) {
|
4522
4542
|
if (op) this.iterN(from - this.first, to - from, op);
|
4523
4543
|
else this.iterN(this.first, this.first + this.size, from);
|
@@ -5182,7 +5202,7 @@ window.CodeMirror = (function() {
|
|
5182
5202
|
return function(){return f.apply(null, args);};
|
5183
5203
|
}
|
5184
5204
|
|
5185
|
-
var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc]/;
|
5205
|
+
var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
|
5186
5206
|
function isWordChar(ch) {
|
5187
5207
|
return /\w/.test(ch) || ch > "\x80" &&
|
5188
5208
|
(ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
|
@@ -5243,13 +5263,24 @@ window.CodeMirror = (function() {
|
|
5243
5263
|
// word wrapping between certain characters *only* if a new inline
|
5244
5264
|
// element is started between them. This makes it hard to reliably
|
5245
5265
|
// measure the position of things, since that requires inserting an
|
5246
|
-
// extra span. This terribly fragile set of
|
5266
|
+
// extra span. This terribly fragile set of tests matches the
|
5247
5267
|
// character combinations that suffer from this phenomenon on the
|
5248
5268
|
// various browsers.
|
5249
|
-
|
5250
|
-
if (gecko)
|
5251
|
-
|
5252
|
-
|
5269
|
+
function spanAffectsWrapping() { return false; }
|
5270
|
+
if (gecko) // Only for "$'"
|
5271
|
+
spanAffectsWrapping = function(str, i) {
|
5272
|
+
return str.charCodeAt(i - 1) == 36 && str.charCodeAt(i) == 39;
|
5273
|
+
};
|
5274
|
+
else if (safari && !/Version\/([6-9]|\d\d)\b/.test(navigator.userAgent))
|
5275
|
+
spanAffectsWrapping = function(str, i) {
|
5276
|
+
return /\-[^ \-?]|\?[^ !\'\"\),.\-\/:;\?\]\}]/.test(str.slice(i - 1, i + 1));
|
5277
|
+
};
|
5278
|
+
else if (webkit)
|
5279
|
+
spanAffectsWrapping = function(str, i) {
|
5280
|
+
if (i > 1 && str.charCodeAt(i - 1) == 45 && /\w/.test(str.charAt(i - 2)) && /[^\-?\.]/.test(str.charAt(i)))
|
5281
|
+
return true;
|
5282
|
+
return /[~!#%&*)=+}\]|\"\.>,:;][({[<]|\?[\w~`@#$%\^&*(_=+{[|><]/.test(str.slice(i - 1, i + 1));
|
5283
|
+
};
|
5253
5284
|
|
5254
5285
|
var knownScrollbarWidth;
|
5255
5286
|
function scrollbarWidth(measure) {
|
@@ -5368,6 +5399,40 @@ window.CodeMirror = (function() {
|
|
5368
5399
|
return Pos(lineN, ch);
|
5369
5400
|
}
|
5370
5401
|
|
5402
|
+
function compareBidiLevel(order, a, b) {
|
5403
|
+
var linedir = order[0].level;
|
5404
|
+
if (a == linedir) return true;
|
5405
|
+
if (b == linedir) return false;
|
5406
|
+
return a < b;
|
5407
|
+
}
|
5408
|
+
var bidiOther;
|
5409
|
+
function getBidiPartAt(order, pos) {
|
5410
|
+
for (var i = 0, found; i < order.length; ++i) {
|
5411
|
+
var cur = order[i];
|
5412
|
+
if (cur.from < pos && cur.to > pos) { bidiOther = null; return i; }
|
5413
|
+
if (cur.from == pos || cur.to == pos) {
|
5414
|
+
if (found == null) {
|
5415
|
+
found = i;
|
5416
|
+
} else if (compareBidiLevel(order, cur.level, order[found].level)) {
|
5417
|
+
bidiOther = found;
|
5418
|
+
return i;
|
5419
|
+
} else {
|
5420
|
+
bidiOther = i;
|
5421
|
+
return found;
|
5422
|
+
}
|
5423
|
+
}
|
5424
|
+
}
|
5425
|
+
bidiOther = null;
|
5426
|
+
return found;
|
5427
|
+
}
|
5428
|
+
|
5429
|
+
function moveInLine(line, pos, dir, byUnit) {
|
5430
|
+
if (!byUnit) return pos + dir;
|
5431
|
+
do pos += dir;
|
5432
|
+
while (pos > 0 && isExtendingChar.test(line.text.charAt(pos)));
|
5433
|
+
return pos;
|
5434
|
+
}
|
5435
|
+
|
5371
5436
|
// This is somewhat involved. It is needed in order to move
|
5372
5437
|
// 'visually' through bi-directional text -- i.e., pressing left
|
5373
5438
|
// should make the cursor go left, even when in RTL text. The
|
@@ -5377,37 +5442,24 @@ window.CodeMirror = (function() {
|
|
5377
5442
|
function moveVisually(line, start, dir, byUnit) {
|
5378
5443
|
var bidi = getOrder(line);
|
5379
5444
|
if (!bidi) return moveLogically(line, start, dir, byUnit);
|
5380
|
-
var
|
5381
|
-
|
5382
|
-
|
5383
|
-
|
5384
|
-
|
5385
|
-
|
5386
|
-
|
5387
|
-
|
5388
|
-
|
5389
|
-
(sticky && (part.from == start || part.to == start))) break;
|
5390
|
-
}
|
5391
|
-
var target = moveOneUnit(start, part.level % 2 ? -dir : dir);
|
5392
|
-
|
5393
|
-
while (target != null) {
|
5394
|
-
if (part.level % 2 == linedir) {
|
5395
|
-
if (target < part.from || target > part.to) {
|
5396
|
-
part = bidi[i += dir];
|
5397
|
-
target = part && (dir > 0 == part.level % 2 ? moveOneUnit(part.to, -1) : moveOneUnit(part.from, 1));
|
5398
|
-
} else break;
|
5445
|
+
var pos = getBidiPartAt(bidi, start), part = bidi[pos];
|
5446
|
+
var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);
|
5447
|
+
|
5448
|
+
for (;;) {
|
5449
|
+
if (target > part.from && target < part.to) return target;
|
5450
|
+
if (target == part.from || target == part.to) {
|
5451
|
+
if (getBidiPartAt(bidi, target) == pos) return target;
|
5452
|
+
part = bidi[pos += dir];
|
5453
|
+
return (dir > 0) == part.level % 2 ? part.to : part.from;
|
5399
5454
|
} else {
|
5400
|
-
|
5401
|
-
|
5402
|
-
|
5403
|
-
|
5404
|
-
|
5405
|
-
target = part
|
5406
|
-
} else break;
|
5455
|
+
part = bidi[pos += dir];
|
5456
|
+
if (!part) return null;
|
5457
|
+
if ((dir > 0) == part.level % 2)
|
5458
|
+
target = moveInLine(line, part.to, -1, byUnit);
|
5459
|
+
else
|
5460
|
+
target = moveInLine(line, part.from, 1, byUnit);
|
5407
5461
|
}
|
5408
5462
|
}
|
5409
|
-
|
5410
|
-
return target < 0 || target > line.text.length ? null : target;
|
5411
5463
|
}
|
5412
5464
|
|
5413
5465
|
function moveLogically(line, start, dir, byUnit) {
|
@@ -5579,7 +5631,7 @@ window.CodeMirror = (function() {
|
|
5579
5631
|
|
5580
5632
|
// THE END
|
5581
5633
|
|
5582
|
-
CodeMirror.version = "3.
|
5634
|
+
CodeMirror.version = "3.13";
|
5583
5635
|
|
5584
5636
|
return CodeMirror;
|
5585
5637
|
})();
|