codemirror-rails 4.0 → 4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/codemirror/rails/version.rb +2 -2
- data/vendor/assets/javascripts/codemirror.js +302 -115
- data/vendor/assets/javascripts/codemirror/addons/display/rulers.js +2 -2
- data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +35 -18
- data/vendor/assets/javascripts/codemirror/addons/edit/matchbrackets.js +18 -9
- data/vendor/assets/javascripts/codemirror/addons/hint/css-hint.js +1 -1
- data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +3 -1
- data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +31 -13
- data/vendor/assets/javascripts/codemirror/addons/lint/css-lint.js +1 -0
- data/vendor/assets/javascripts/codemirror/addons/lint/javascript-lint.js +1 -0
- data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +15 -10
- data/vendor/assets/javascripts/codemirror/addons/mode/overlay.js +8 -2
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +1 -0
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.js +1 -0
- data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +1 -0
- data/vendor/assets/javascripts/codemirror/addons/search/search.js +14 -14
- data/vendor/assets/javascripts/codemirror/keymaps/sublime.js +14 -2
- data/vendor/assets/javascripts/codemirror/keymaps/vim.js +212 -141
- data/vendor/assets/javascripts/codemirror/modes/clike.js +4 -5
- data/vendor/assets/javascripts/codemirror/modes/css.js +23 -6
- data/vendor/assets/javascripts/codemirror/modes/django.js +64 -0
- data/vendor/assets/javascripts/codemirror/modes/dylan.js +284 -0
- data/vendor/assets/javascripts/codemirror/modes/erlang.js +1 -1
- data/vendor/assets/javascripts/codemirror/modes/go.js +1 -0
- data/vendor/assets/javascripts/codemirror/modes/haml.js +3 -8
- data/vendor/assets/javascripts/codemirror/modes/haxe.js +75 -3
- data/vendor/assets/javascripts/codemirror/modes/javascript.js +14 -8
- data/vendor/assets/javascripts/codemirror/modes/jinja2.js +111 -35
- data/vendor/assets/javascripts/codemirror/modes/livescript.js +4 -4
- data/vendor/assets/javascripts/codemirror/modes/markdown.js +5 -2
- data/vendor/assets/javascripts/codemirror/modes/php.js +99 -9
- data/vendor/assets/javascripts/codemirror/modes/r.js +3 -1
- data/vendor/assets/javascripts/codemirror/modes/verilog.js +237 -78
- data/vendor/assets/javascripts/codemirror/modes/xml.js +61 -29
- data/vendor/assets/stylesheets/codemirror.css +5 -3
- data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +0 -1
- data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +0 -4
- data/vendor/assets/stylesheets/codemirror/themes/mdn-like.css +1 -1
- data/vendor/assets/stylesheets/codemirror/themes/pastel-on-dark.css +0 -1
- data/vendor/assets/stylesheets/codemirror/themes/rubyblue.css +0 -2
- data/vendor/assets/stylesheets/codemirror/themes/solarized.css +3 -17
- metadata +20 -18
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: dd16e48b5a4bf97bb9b7d6e9fe4369007477156a
|
|
4
|
+
data.tar.gz: e2cd3b0008e31a240d67416decca66fde5d62ec5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1a4dbd28831a7db000009ca3abf95ecda5f30352e637c49b26936ea258fbb9f5f8f2a2d0ef086bb4b5aff3c69211253985b47205e289365e02838dfa3900e020
|
|
7
|
+
data.tar.gz: 1006bd816e052f66e24cbfb00ac4500aca09d043b772880cd7b8445072f129fd27208a95172d9d53d6466fcf4a6f8b8052c22d62af167fb4c065c88ebb371d70
|
|
@@ -33,7 +33,6 @@
|
|
|
33
33
|
var presto = /Opera\//.test(navigator.userAgent);
|
|
34
34
|
var safari = /Apple Computer/.test(navigator.vendor);
|
|
35
35
|
var khtml = /KHTML\//.test(navigator.userAgent);
|
|
36
|
-
var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent);
|
|
37
36
|
var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);
|
|
38
37
|
var phantom = /PhantomJS/.test(navigator.userAgent);
|
|
39
38
|
|
|
@@ -63,8 +62,7 @@
|
|
|
63
62
|
|
|
64
63
|
this.options = options = options || {};
|
|
65
64
|
// Determine effective options based on given values and defaults.
|
|
66
|
-
|
|
67
|
-
options[opt] = defaults[opt];
|
|
65
|
+
copyObj(defaults, options, false);
|
|
68
66
|
setGuttersForLineNumbers(options);
|
|
69
67
|
|
|
70
68
|
var doc = options.value;
|
|
@@ -256,10 +254,10 @@
|
|
|
256
254
|
|
|
257
255
|
function wrappingChanged(cm) {
|
|
258
256
|
if (cm.options.lineWrapping) {
|
|
259
|
-
cm.display.wrapper
|
|
257
|
+
addClass(cm.display.wrapper, "CodeMirror-wrap");
|
|
260
258
|
cm.display.sizer.style.minWidth = "";
|
|
261
259
|
} else {
|
|
262
|
-
cm.display.wrapper
|
|
260
|
+
rmClass(cm.display.wrapper, "CodeMirror-wrap");
|
|
263
261
|
findMaxLine(cm);
|
|
264
262
|
}
|
|
265
263
|
estimateLineHeights(cm);
|
|
@@ -329,9 +327,13 @@
|
|
|
329
327
|
}
|
|
330
328
|
}
|
|
331
329
|
gutters.style.display = i ? "" : "none";
|
|
332
|
-
|
|
330
|
+
updateGutterSpace(cm);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function updateGutterSpace(cm) {
|
|
334
|
+
var width = cm.display.gutters.offsetWidth;
|
|
333
335
|
cm.display.sizer.style.marginLeft = width + "px";
|
|
334
|
-
|
|
336
|
+
cm.display.scrollbarH.style.left = cm.options.fixedGutter ? width + "px" : 0;
|
|
335
337
|
}
|
|
336
338
|
|
|
337
339
|
// Compute the character length of a line, taking into account
|
|
@@ -434,14 +436,18 @@
|
|
|
434
436
|
d.gutterFiller.style.width = d.gutters.offsetWidth + "px";
|
|
435
437
|
} else d.gutterFiller.style.display = "";
|
|
436
438
|
|
|
437
|
-
if (
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
439
|
+
if (!cm.state.checkedOverlayScrollbar && measure.clientHeight > 0) {
|
|
440
|
+
if (scrollbarWidth(d.measure) === 0) {
|
|
441
|
+
var w = mac && !mac_geMountainLion ? "12px" : "18px";
|
|
442
|
+
d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = w;
|
|
443
|
+
var barMouseDown = function(e) {
|
|
444
|
+
if (e_target(e) != d.scrollbarV && e_target(e) != d.scrollbarH)
|
|
445
|
+
operation(cm, onMouseDown)(e);
|
|
446
|
+
};
|
|
447
|
+
on(d.scrollbarV, "mousedown", barMouseDown);
|
|
448
|
+
on(d.scrollbarH, "mousedown", barMouseDown);
|
|
449
|
+
}
|
|
450
|
+
cm.state.checkedOverlayScrollbar = true;
|
|
445
451
|
}
|
|
446
452
|
}
|
|
447
453
|
|
|
@@ -503,9 +509,7 @@
|
|
|
503
509
|
display.lineNumWidth = display.lineNumInnerWidth + padding;
|
|
504
510
|
display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
|
|
505
511
|
display.lineGutter.style.width = display.lineNumWidth + "px";
|
|
506
|
-
|
|
507
|
-
display.scrollbarH.style.left = cm.options.fixedGutter ? width + "px" : 0;
|
|
508
|
-
display.sizer.style.marginLeft = width + "px";
|
|
512
|
+
updateGutterSpace(cm);
|
|
509
513
|
return true;
|
|
510
514
|
}
|
|
511
515
|
return false;
|
|
@@ -546,6 +550,8 @@
|
|
|
546
550
|
updateSelection(cm);
|
|
547
551
|
setDocumentHeight(cm, barMeasure);
|
|
548
552
|
updateScrollbars(cm, barMeasure);
|
|
553
|
+
if (webkit && cm.options.lineWrapping)
|
|
554
|
+
checkForWebkitWidthBug(cm, barMeasure); // (Issue #2420)
|
|
549
555
|
if (first && cm.options.lineWrapping && oldWidth != cm.display.scroller.clientWidth) {
|
|
550
556
|
forced = true;
|
|
551
557
|
continue;
|
|
@@ -653,6 +659,16 @@
|
|
|
653
659
|
cm.display.gutters.style.height = Math.max(measure.docHeight, measure.clientHeight - scrollerCutOff) + "px";
|
|
654
660
|
}
|
|
655
661
|
|
|
662
|
+
|
|
663
|
+
function checkForWebkitWidthBug(cm, measure) {
|
|
664
|
+
// Work around Webkit bug where it sometimes reserves space for a
|
|
665
|
+
// non-existing phantom scrollbar in the scroller (Issue #2420)
|
|
666
|
+
if (cm.display.sizer.offsetWidth + cm.display.gutters.offsetWidth < cm.display.scroller.clientWidth - 1) {
|
|
667
|
+
cm.display.sizer.style.minHeight = cm.display.heightForcer.style.top = "0px";
|
|
668
|
+
cm.display.gutters.style.height = measure.docHeight + "px";
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
|
|
656
672
|
// Read the actual heights of the rendered lines, and update their
|
|
657
673
|
// stored heights to match.
|
|
658
674
|
function updateHeightsInViewport(cm) {
|
|
@@ -1138,9 +1154,10 @@
|
|
|
1138
1154
|
|
|
1139
1155
|
doc.sel = sel;
|
|
1140
1156
|
|
|
1141
|
-
if (doc.cm)
|
|
1142
|
-
doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged =
|
|
1143
|
-
|
|
1157
|
+
if (doc.cm) {
|
|
1158
|
+
doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;
|
|
1159
|
+
signalCursorActivity(doc.cm);
|
|
1160
|
+
}
|
|
1144
1161
|
signalLater(doc, "cursorActivity", doc);
|
|
1145
1162
|
}
|
|
1146
1163
|
|
|
@@ -1229,9 +1246,9 @@
|
|
|
1229
1246
|
var range = doc.sel.ranges[i];
|
|
1230
1247
|
var collapsed = range.empty();
|
|
1231
1248
|
if (collapsed || cm.options.showCursorWhenSelecting)
|
|
1232
|
-
|
|
1249
|
+
drawSelectionCursor(cm, range, curFragment);
|
|
1233
1250
|
if (!collapsed)
|
|
1234
|
-
|
|
1251
|
+
drawSelectionRange(cm, range, selFragment);
|
|
1235
1252
|
}
|
|
1236
1253
|
|
|
1237
1254
|
// Move the hidden textarea near the cursor to prevent scrolling artifacts
|
|
@@ -1251,7 +1268,7 @@
|
|
|
1251
1268
|
}
|
|
1252
1269
|
|
|
1253
1270
|
// Draws a cursor for the given range
|
|
1254
|
-
function
|
|
1271
|
+
function drawSelectionCursor(cm, range, output) {
|
|
1255
1272
|
var pos = cursorCoords(cm, range.head, "div");
|
|
1256
1273
|
|
|
1257
1274
|
var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
|
|
@@ -1270,13 +1287,15 @@
|
|
|
1270
1287
|
}
|
|
1271
1288
|
|
|
1272
1289
|
// Draws the given range as a highlighted selection
|
|
1273
|
-
function
|
|
1290
|
+
function drawSelectionRange(cm, range, output) {
|
|
1274
1291
|
var display = cm.display, doc = cm.doc;
|
|
1275
1292
|
var fragment = document.createDocumentFragment();
|
|
1276
1293
|
var padding = paddingH(cm.display), leftSide = padding.left, rightSide = display.lineSpace.offsetWidth - padding.right;
|
|
1277
1294
|
|
|
1278
1295
|
function add(left, top, width, bottom) {
|
|
1279
1296
|
if (top < 0) top = 0;
|
|
1297
|
+
top = Math.round(top);
|
|
1298
|
+
bottom = Math.round(bottom);
|
|
1280
1299
|
fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
|
|
1281
1300
|
"px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) +
|
|
1282
1301
|
"px; height: " + (bottom - top) + "px"));
|
|
@@ -1372,7 +1391,10 @@
|
|
|
1372
1391
|
doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {
|
|
1373
1392
|
if (doc.frontier >= cm.display.viewFrom) { // Visible
|
|
1374
1393
|
var oldStyles = line.styles;
|
|
1375
|
-
|
|
1394
|
+
var highlighted = highlightLine(cm, line, state, true);
|
|
1395
|
+
line.styles = highlighted.styles;
|
|
1396
|
+
if (highlighted.classes) line.styleClasses = highlighted.classes;
|
|
1397
|
+
else if (line.styleClasses) line.styleClasses = null;
|
|
1376
1398
|
var ischange = !oldStyles || oldStyles.length != line.styles.length;
|
|
1377
1399
|
for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
|
|
1378
1400
|
if (ischange) regLineChange(cm, doc.frontier, "text");
|
|
@@ -1435,8 +1457,9 @@
|
|
|
1435
1457
|
if (display.cachedPaddingH) return display.cachedPaddingH;
|
|
1436
1458
|
var e = removeChildrenAndAdd(display.measure, elt("pre", "x"));
|
|
1437
1459
|
var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
|
|
1438
|
-
|
|
1439
|
-
|
|
1460
|
+
var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
|
|
1461
|
+
if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;
|
|
1462
|
+
return data;
|
|
1440
1463
|
}
|
|
1441
1464
|
|
|
1442
1465
|
// Ensure the lineView.wrapping.heights array is populated. This is
|
|
@@ -1870,7 +1893,7 @@
|
|
|
1870
1893
|
updateInput: null, // Whether to reset the input textarea
|
|
1871
1894
|
typing: false, // Whether this reset should be careful to leave existing text (for compositing)
|
|
1872
1895
|
changeObjs: null, // Accumulated changes, for firing change events
|
|
1873
|
-
|
|
1896
|
+
cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
|
|
1874
1897
|
selectionChanged: false, // Whether the selection needs to be redrawn
|
|
1875
1898
|
updateMaxLine: false, // Set when the widest line needs to be determined anew
|
|
1876
1899
|
scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
|
|
@@ -1935,13 +1958,12 @@
|
|
|
1935
1958
|
delayedCallbacks = null;
|
|
1936
1959
|
}
|
|
1937
1960
|
// Fire change events, and delayed event handlers
|
|
1938
|
-
if (op.changeObjs)
|
|
1939
|
-
for (var i = 0; i < op.changeObjs.length; i++)
|
|
1940
|
-
signal(cm, "change", cm, op.changeObjs[i]);
|
|
1961
|
+
if (op.changeObjs)
|
|
1941
1962
|
signal(cm, "changes", cm, op.changeObjs);
|
|
1942
|
-
}
|
|
1943
|
-
if (op.cursorActivity) signal(cm, "cursorActivity", cm);
|
|
1944
1963
|
if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();
|
|
1964
|
+
if (op.cursorActivityHandlers)
|
|
1965
|
+
for (var i = 0; i < op.cursorActivityHandlers.length; i++)
|
|
1966
|
+
op.cursorActivityHandlers[i](cm);
|
|
1945
1967
|
}
|
|
1946
1968
|
|
|
1947
1969
|
// Run the given function in an operation
|
|
@@ -2204,7 +2226,13 @@
|
|
|
2204
2226
|
// possible when it is clear that nothing happened. hasSelection
|
|
2205
2227
|
// will be the case when there is a lot of text in the textarea,
|
|
2206
2228
|
// in which case reading its value would be expensive.
|
|
2207
|
-
if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.options.disableInput)
|
|
2229
|
+
if (!cm.state.focused || (hasSelection(input) && !prevInput) || isReadOnly(cm) || cm.options.disableInput)
|
|
2230
|
+
return false;
|
|
2231
|
+
// See paste handler for more on the fakedLastChar kludge
|
|
2232
|
+
if (cm.state.pasteIncoming && cm.state.fakedLastChar) {
|
|
2233
|
+
input.value = input.value.substring(0, input.value.length - 1);
|
|
2234
|
+
cm.state.fakedLastChar = false;
|
|
2235
|
+
}
|
|
2208
2236
|
var text = input.value;
|
|
2209
2237
|
// If nothing changed, bail.
|
|
2210
2238
|
if (text == prevInput && !cm.somethingSelected()) return false;
|
|
@@ -2245,12 +2273,18 @@
|
|
|
2245
2273
|
if (inserted && !cm.state.pasteIncoming && cm.options.electricChars &&
|
|
2246
2274
|
cm.options.smartIndent && range.head.ch < 100 &&
|
|
2247
2275
|
(!i || doc.sel.ranges[i - 1].head.line != range.head.line)) {
|
|
2248
|
-
var
|
|
2249
|
-
if (
|
|
2250
|
-
|
|
2276
|
+
var mode = cm.getModeAt(range.head);
|
|
2277
|
+
if (mode.electricChars) {
|
|
2278
|
+
for (var j = 0; j < mode.electricChars.length; j++)
|
|
2279
|
+
if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
|
|
2280
|
+
indentLine(cm, range.head.line, "smart");
|
|
2281
|
+
break;
|
|
2282
|
+
}
|
|
2283
|
+
} else if (mode.electricInput) {
|
|
2284
|
+
var end = changeEnd(changeEvent);
|
|
2285
|
+
if (mode.electricInput.test(getLine(doc, end.line).text.slice(0, end.ch)))
|
|
2251
2286
|
indentLine(cm, range.head.line, "smart");
|
|
2252
|
-
|
|
2253
|
-
}
|
|
2287
|
+
}
|
|
2254
2288
|
}
|
|
2255
2289
|
}
|
|
2256
2290
|
ensureCursorVisible(cm);
|
|
@@ -2398,21 +2432,48 @@
|
|
|
2398
2432
|
fastPoll(cm);
|
|
2399
2433
|
});
|
|
2400
2434
|
on(d.input, "paste", function() {
|
|
2435
|
+
// Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206
|
|
2436
|
+
// Add a char to the end of textarea before paste occur so that
|
|
2437
|
+
// selection doesn't span to the end of textarea.
|
|
2438
|
+
if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {
|
|
2439
|
+
var start = d.input.selectionStart, end = d.input.selectionEnd;
|
|
2440
|
+
d.input.value += "$";
|
|
2441
|
+
d.input.selectionStart = start;
|
|
2442
|
+
d.input.selectionEnd = end;
|
|
2443
|
+
cm.state.fakedLastChar = true;
|
|
2444
|
+
}
|
|
2401
2445
|
cm.state.pasteIncoming = true;
|
|
2402
2446
|
fastPoll(cm);
|
|
2403
2447
|
});
|
|
2404
2448
|
|
|
2405
|
-
function
|
|
2406
|
-
if (
|
|
2407
|
-
d.
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
|
|
2449
|
+
function prepareCopyCut(e) {
|
|
2450
|
+
if (cm.somethingSelected()) {
|
|
2451
|
+
if (d.inaccurateSelection) {
|
|
2452
|
+
d.prevInput = "";
|
|
2453
|
+
d.inaccurateSelection = false;
|
|
2454
|
+
d.input.value = cm.getSelection();
|
|
2455
|
+
selectInput(d.input);
|
|
2456
|
+
}
|
|
2457
|
+
} else {
|
|
2458
|
+
var text = "", ranges = [];
|
|
2459
|
+
for (var i = 0; i < cm.doc.sel.ranges.length; i++) {
|
|
2460
|
+
var line = cm.doc.sel.ranges[i].head.line;
|
|
2461
|
+
var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};
|
|
2462
|
+
ranges.push(lineRange);
|
|
2463
|
+
text += cm.getRange(lineRange.anchor, lineRange.head);
|
|
2464
|
+
}
|
|
2465
|
+
if (e.type == "cut") {
|
|
2466
|
+
cm.setSelections(ranges, null, sel_dontScroll);
|
|
2467
|
+
} else {
|
|
2468
|
+
d.prevInput = "";
|
|
2469
|
+
d.input.value = text;
|
|
2470
|
+
selectInput(d.input);
|
|
2471
|
+
}
|
|
2411
2472
|
}
|
|
2412
2473
|
if (e.type == "cut") cm.state.cutIncoming = true;
|
|
2413
2474
|
}
|
|
2414
|
-
on(d.input, "cut",
|
|
2415
|
-
on(d.input, "copy",
|
|
2475
|
+
on(d.input, "cut", prepareCopyCut);
|
|
2476
|
+
on(d.input, "copy", prepareCopyCut);
|
|
2416
2477
|
|
|
2417
2478
|
// Needed to handle Tab key in KHTML
|
|
2418
2479
|
if (khtml) on(d.sizer, "mouseup", function() {
|
|
@@ -2449,7 +2510,7 @@
|
|
|
2449
2510
|
var coords = coordsChar(cm, x, y), line;
|
|
2450
2511
|
if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
|
|
2451
2512
|
var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
|
|
2452
|
-
coords = Pos(coords.line, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff);
|
|
2513
|
+
coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
|
|
2453
2514
|
}
|
|
2454
2515
|
return coords;
|
|
2455
2516
|
}
|
|
@@ -2552,7 +2613,7 @@
|
|
|
2552
2613
|
e_preventDefault(e);
|
|
2553
2614
|
|
|
2554
2615
|
var ourRange, ourIndex, startSel = doc.sel;
|
|
2555
|
-
if (addNew) {
|
|
2616
|
+
if (addNew && !e.shiftKey) {
|
|
2556
2617
|
ourIndex = doc.sel.contains(start);
|
|
2557
2618
|
if (ourIndex > -1)
|
|
2558
2619
|
ourRange = doc.sel.ranges[ourIndex];
|
|
@@ -2586,6 +2647,7 @@
|
|
|
2586
2647
|
if (!addNew) {
|
|
2587
2648
|
ourIndex = 0;
|
|
2588
2649
|
setSelection(doc, new Selection([ourRange], 0), sel_mouse);
|
|
2650
|
+
startSel = doc.sel;
|
|
2589
2651
|
} else if (ourIndex > -1) {
|
|
2590
2652
|
replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
|
|
2591
2653
|
} else {
|
|
@@ -2719,7 +2781,7 @@
|
|
|
2719
2781
|
if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
|
|
2720
2782
|
return;
|
|
2721
2783
|
e_preventDefault(e);
|
|
2722
|
-
if (
|
|
2784
|
+
if (ie) lastDrop = +new Date;
|
|
2723
2785
|
var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
|
|
2724
2786
|
if (!pos || isReadOnly(cm)) return;
|
|
2725
2787
|
// Might be a file drop, in which case we simply extract the text
|
|
@@ -2728,7 +2790,7 @@
|
|
|
2728
2790
|
var n = files.length, text = Array(n), read = 0;
|
|
2729
2791
|
var loadFile = function(file, i) {
|
|
2730
2792
|
var reader = new FileReader;
|
|
2731
|
-
reader.onload = function() {
|
|
2793
|
+
reader.onload = operation(cm, function() {
|
|
2732
2794
|
text[i] = reader.result;
|
|
2733
2795
|
if (++read == n) {
|
|
2734
2796
|
pos = clipPos(cm.doc, pos);
|
|
@@ -2736,7 +2798,7 @@
|
|
|
2736
2798
|
makeChange(cm.doc, change);
|
|
2737
2799
|
setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));
|
|
2738
2800
|
}
|
|
2739
|
-
};
|
|
2801
|
+
});
|
|
2740
2802
|
reader.readAsText(file);
|
|
2741
2803
|
};
|
|
2742
2804
|
for (var i = 0; i < n; ++i) loadFile(files[i], i);
|
|
@@ -2764,7 +2826,7 @@
|
|
|
2764
2826
|
}
|
|
2765
2827
|
|
|
2766
2828
|
function onDragStart(cm, e) {
|
|
2767
|
-
if (
|
|
2829
|
+
if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
|
|
2768
2830
|
if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
|
|
2769
2831
|
|
|
2770
2832
|
e.dataTransfer.setData("Text", cm.getSelection());
|
|
@@ -2999,6 +3061,25 @@
|
|
|
2999
3061
|
if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
|
|
3000
3062
|
cm.replaceSelection("", null, "cut");
|
|
3001
3063
|
}
|
|
3064
|
+
|
|
3065
|
+
// Turn mouse into crosshair when Alt is held on Mac.
|
|
3066
|
+
if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
|
|
3067
|
+
showCrossHair(cm);
|
|
3068
|
+
}
|
|
3069
|
+
|
|
3070
|
+
function showCrossHair(cm) {
|
|
3071
|
+
var lineDiv = cm.display.lineDiv;
|
|
3072
|
+
addClass(lineDiv, "CodeMirror-crosshair");
|
|
3073
|
+
|
|
3074
|
+
function up(e) {
|
|
3075
|
+
if (e.keyCode == 18 || !e.altKey) {
|
|
3076
|
+
rmClass(lineDiv, "CodeMirror-crosshair");
|
|
3077
|
+
off(document, "keyup", up);
|
|
3078
|
+
off(document, "mouseover", up);
|
|
3079
|
+
}
|
|
3080
|
+
}
|
|
3081
|
+
on(document, "keyup", up);
|
|
3082
|
+
on(document, "mouseover", up);
|
|
3002
3083
|
}
|
|
3003
3084
|
|
|
3004
3085
|
function onKeyUp(e) {
|
|
@@ -3025,9 +3106,11 @@
|
|
|
3025
3106
|
if (!cm.state.focused) {
|
|
3026
3107
|
signal(cm, "focus", cm);
|
|
3027
3108
|
cm.state.focused = true;
|
|
3028
|
-
|
|
3029
|
-
|
|
3030
|
-
|
|
3109
|
+
addClass(cm.display.wrapper, "CodeMirror-focused");
|
|
3110
|
+
// The prevInput test prevents this from firing when a context
|
|
3111
|
+
// menu is closed (since the resetInput would kill the
|
|
3112
|
+
// select-all detection hack)
|
|
3113
|
+
if (!cm.curOp && cm.display.selForContextMenu == cm.doc.sel) {
|
|
3031
3114
|
resetInput(cm);
|
|
3032
3115
|
if (webkit) setTimeout(bind(resetInput, cm, true), 0); // Issue #1730
|
|
3033
3116
|
}
|
|
@@ -3039,7 +3122,7 @@
|
|
|
3039
3122
|
if (cm.state.focused) {
|
|
3040
3123
|
signal(cm, "blur", cm);
|
|
3041
3124
|
cm.state.focused = false;
|
|
3042
|
-
cm.display.wrapper
|
|
3125
|
+
rmClass(cm.display.wrapper, "CodeMirror-focused");
|
|
3043
3126
|
}
|
|
3044
3127
|
clearInterval(cm.display.blinker);
|
|
3045
3128
|
setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);
|
|
@@ -3075,14 +3158,16 @@
|
|
|
3075
3158
|
resetInput(cm);
|
|
3076
3159
|
// Adds "Select all" to context menu in FF
|
|
3077
3160
|
if (!cm.somethingSelected()) display.input.value = display.prevInput = " ";
|
|
3161
|
+
display.selForContextMenu = cm.doc.sel;
|
|
3078
3162
|
|
|
3079
3163
|
// Select-all will be greyed out if there's nothing to select, so
|
|
3080
3164
|
// this adds a zero-width space so that we can later check whether
|
|
3081
3165
|
// it got selected.
|
|
3082
3166
|
function prepareSelectAllHack() {
|
|
3083
3167
|
if (display.input.selectionStart != null) {
|
|
3084
|
-
var
|
|
3085
|
-
display.
|
|
3168
|
+
var selected = cm.somethingSelected();
|
|
3169
|
+
var extval = display.input.value = "\u200b" + (selected ? display.input.value : "");
|
|
3170
|
+
display.prevInput = selected ? "" : "\u200b";
|
|
3086
3171
|
display.input.selectionStart = 1; display.input.selectionEnd = extval.length;
|
|
3087
3172
|
}
|
|
3088
3173
|
}
|
|
@@ -3096,8 +3181,8 @@
|
|
|
3096
3181
|
if (display.input.selectionStart != null) {
|
|
3097
3182
|
if (!ie || ie_upto8) prepareSelectAllHack();
|
|
3098
3183
|
clearTimeout(detectingSelectAll);
|
|
3099
|
-
var i = 0, poll = function(){
|
|
3100
|
-
if (display.
|
|
3184
|
+
var i = 0, poll = function() {
|
|
3185
|
+
if (display.selForContextMenu == cm.doc.sel && display.input.selectionStart == 0)
|
|
3101
3186
|
operation(cm, commands.selectAll)(cm);
|
|
3102
3187
|
else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500);
|
|
3103
3188
|
else resetInput(cm);
|
|
@@ -3373,7 +3458,7 @@
|
|
|
3373
3458
|
}
|
|
3374
3459
|
|
|
3375
3460
|
if (doc.sel.contains(change.from, change.to) > -1)
|
|
3376
|
-
cm
|
|
3461
|
+
signalCursorActivity(cm);
|
|
3377
3462
|
|
|
3378
3463
|
updateDoc(doc, change, spans, estimateHeight(cm));
|
|
3379
3464
|
|
|
@@ -3401,13 +3486,17 @@
|
|
|
3401
3486
|
else
|
|
3402
3487
|
regChange(cm, from.line, to.line + 1, lendiff);
|
|
3403
3488
|
|
|
3404
|
-
|
|
3405
|
-
|
|
3489
|
+
var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
|
|
3490
|
+
if (changeHandler || changesHandler) {
|
|
3491
|
+
var obj = {
|
|
3406
3492
|
from: from, to: to,
|
|
3407
3493
|
text: change.text,
|
|
3408
3494
|
removed: change.removed,
|
|
3409
3495
|
origin: change.origin
|
|
3410
|
-
}
|
|
3496
|
+
};
|
|
3497
|
+
if (changeHandler) signalLater(cm, "change", cm, obj);
|
|
3498
|
+
if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);
|
|
3499
|
+
}
|
|
3411
3500
|
}
|
|
3412
3501
|
|
|
3413
3502
|
function replaceRange(doc, code, from, to, origin) {
|
|
@@ -3613,7 +3702,6 @@
|
|
|
3613
3702
|
else no = lineNo(handle);
|
|
3614
3703
|
if (no == null) return null;
|
|
3615
3704
|
if (op(line, no)) regLineChange(cm, no, changeType);
|
|
3616
|
-
else return null;
|
|
3617
3705
|
return line;
|
|
3618
3706
|
}
|
|
3619
3707
|
|
|
@@ -3826,7 +3914,7 @@
|
|
|
3826
3914
|
var stream = new StringStream(line.text, this.options.tabSize);
|
|
3827
3915
|
while (stream.pos < pos.ch && !stream.eol()) {
|
|
3828
3916
|
stream.start = stream.pos;
|
|
3829
|
-
var style = mode
|
|
3917
|
+
var style = readToken(mode, stream, state);
|
|
3830
3918
|
}
|
|
3831
3919
|
return {start: stream.start,
|
|
3832
3920
|
end: stream.pos,
|
|
@@ -3839,13 +3927,16 @@
|
|
|
3839
3927
|
pos = clipPos(this.doc, pos);
|
|
3840
3928
|
var styles = getLineStyles(this, getLine(this.doc, pos.line));
|
|
3841
3929
|
var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
|
|
3842
|
-
|
|
3843
|
-
|
|
3930
|
+
var type;
|
|
3931
|
+
if (ch == 0) type = styles[2];
|
|
3932
|
+
else for (;;) {
|
|
3844
3933
|
var mid = (before + after) >> 1;
|
|
3845
3934
|
if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
|
|
3846
3935
|
else if (styles[mid * 2 + 1] < ch) before = mid + 1;
|
|
3847
|
-
else
|
|
3936
|
+
else { type = styles[mid * 2 + 2]; break; }
|
|
3848
3937
|
}
|
|
3938
|
+
var cut = type ? type.indexOf("cm-overlay ") : -1;
|
|
3939
|
+
return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);
|
|
3849
3940
|
},
|
|
3850
3941
|
|
|
3851
3942
|
getModeAt: function(pos) {
|
|
@@ -4098,9 +4189,9 @@
|
|
|
4098
4189
|
toggleOverwrite: function(value) {
|
|
4099
4190
|
if (value != null && value == this.state.overwrite) return;
|
|
4100
4191
|
if (this.state.overwrite = !this.state.overwrite)
|
|
4101
|
-
this.display.cursorDiv
|
|
4192
|
+
addClass(this.display.cursorDiv, "CodeMirror-overwrite");
|
|
4102
4193
|
else
|
|
4103
|
-
this.display.cursorDiv
|
|
4194
|
+
rmClass(this.display.cursorDiv, "CodeMirror-overwrite");
|
|
4104
4195
|
|
|
4105
4196
|
signal(this, "overwriteToggle", this, this.state.overwrite);
|
|
4106
4197
|
},
|
|
@@ -4158,8 +4249,10 @@
|
|
|
4158
4249
|
refresh: methodOp(function() {
|
|
4159
4250
|
var oldHeight = this.display.cachedTextHeight;
|
|
4160
4251
|
regChange(this);
|
|
4252
|
+
this.curOp.forceUpdate = true;
|
|
4161
4253
|
clearCaches(this);
|
|
4162
4254
|
this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);
|
|
4255
|
+
updateGutterSpace(this);
|
|
4163
4256
|
if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)
|
|
4164
4257
|
estimateLineHeights(this);
|
|
4165
4258
|
signal(this, "refresh", this);
|
|
@@ -4510,6 +4603,15 @@
|
|
|
4510
4603
|
indentMore: function(cm) {cm.indentSelection("add");},
|
|
4511
4604
|
indentLess: function(cm) {cm.indentSelection("subtract");},
|
|
4512
4605
|
insertTab: function(cm) {cm.replaceSelection("\t");},
|
|
4606
|
+
insertSoftTab: function(cm) {
|
|
4607
|
+
var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;
|
|
4608
|
+
for (var i = 0; i < ranges.length; i++) {
|
|
4609
|
+
var pos = ranges[i].from();
|
|
4610
|
+
var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
|
|
4611
|
+
spaces.push(new Array(tabSize - col % tabSize + 1).join(" "));
|
|
4612
|
+
}
|
|
4613
|
+
cm.replaceSelections(spaces);
|
|
4614
|
+
},
|
|
4513
4615
|
defaultTab: function(cm) {
|
|
4514
4616
|
if (cm.somethingSelected()) cm.indentSelection("add");
|
|
4515
4617
|
else cm.execCommand("insertTab");
|
|
@@ -4826,6 +4928,7 @@
|
|
|
4826
4928
|
}
|
|
4827
4929
|
if (cm) signalLater(cm, "markerCleared", cm, this);
|
|
4828
4930
|
if (withOp) endOperation(cm);
|
|
4931
|
+
if (this.parent) this.parent.clear();
|
|
4829
4932
|
};
|
|
4830
4933
|
|
|
4831
4934
|
// Find the position of the marker in the document. Returns a {from,
|
|
@@ -4905,7 +5008,7 @@
|
|
|
4905
5008
|
if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);
|
|
4906
5009
|
|
|
4907
5010
|
var marker = new TextMarker(doc, type), diff = cmp(from, to);
|
|
4908
|
-
if (options) copyObj(options, marker);
|
|
5011
|
+
if (options) copyObj(options, marker, false);
|
|
4909
5012
|
// Don't connect empty markers unless clearWhenEmpty is false
|
|
4910
5013
|
if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
|
|
4911
5014
|
return marker;
|
|
@@ -4973,10 +5076,8 @@
|
|
|
4973
5076
|
var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {
|
|
4974
5077
|
this.markers = markers;
|
|
4975
5078
|
this.primary = primary;
|
|
4976
|
-
for (var i = 0
|
|
5079
|
+
for (var i = 0; i < markers.length; ++i)
|
|
4977
5080
|
markers[i].parent = this;
|
|
4978
|
-
on(markers[i], "clear", function(){me.clear();});
|
|
4979
|
-
}
|
|
4980
5081
|
};
|
|
4981
5082
|
eventMixin(SharedTextMarker);
|
|
4982
5083
|
|
|
@@ -5006,6 +5107,37 @@
|
|
|
5006
5107
|
return new SharedTextMarker(markers, primary);
|
|
5007
5108
|
}
|
|
5008
5109
|
|
|
5110
|
+
function findSharedMarkers(doc) {
|
|
5111
|
+
return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),
|
|
5112
|
+
function(m) { return m.parent; });
|
|
5113
|
+
}
|
|
5114
|
+
|
|
5115
|
+
function copySharedMarkers(doc, markers) {
|
|
5116
|
+
for (var i = 0; i < markers.length; i++) {
|
|
5117
|
+
var marker = markers[i], pos = marker.find();
|
|
5118
|
+
var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);
|
|
5119
|
+
if (cmp(mFrom, mTo)) {
|
|
5120
|
+
var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);
|
|
5121
|
+
marker.markers.push(subMark);
|
|
5122
|
+
subMark.parent = marker;
|
|
5123
|
+
}
|
|
5124
|
+
}
|
|
5125
|
+
}
|
|
5126
|
+
|
|
5127
|
+
function detachSharedMarkers(markers) {
|
|
5128
|
+
for (var i = 0; i < markers.length; i++) {
|
|
5129
|
+
var marker = markers[i], linked = [marker.primary.doc];;
|
|
5130
|
+
linkedDocs(marker.primary.doc, function(d) { linked.push(d); });
|
|
5131
|
+
for (var j = 0; j < marker.markers.length; j++) {
|
|
5132
|
+
var subMarker = marker.markers[j];
|
|
5133
|
+
if (indexOf(linked, subMarker.doc) == -1) {
|
|
5134
|
+
subMarker.parent = null;
|
|
5135
|
+
marker.markers.splice(j--, 1);
|
|
5136
|
+
}
|
|
5137
|
+
}
|
|
5138
|
+
}
|
|
5139
|
+
}
|
|
5140
|
+
|
|
5009
5141
|
// TEXTMARKER SPANS
|
|
5010
5142
|
|
|
5011
5143
|
function MarkedSpan(marker, from, to) {
|
|
@@ -5430,13 +5562,41 @@
|
|
|
5430
5562
|
detachMarkedSpans(line);
|
|
5431
5563
|
}
|
|
5432
5564
|
|
|
5565
|
+
function extractLineClasses(type, output) {
|
|
5566
|
+
if (type) for (;;) {
|
|
5567
|
+
var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
|
|
5568
|
+
if (!lineClass) break;
|
|
5569
|
+
type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
|
|
5570
|
+
var prop = lineClass[1] ? "bgClass" : "textClass";
|
|
5571
|
+
if (output[prop] == null)
|
|
5572
|
+
output[prop] = lineClass[2];
|
|
5573
|
+
else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop]))
|
|
5574
|
+
output[prop] += " " + lineClass[2];
|
|
5575
|
+
}
|
|
5576
|
+
return type;
|
|
5577
|
+
}
|
|
5578
|
+
|
|
5579
|
+
function callBlankLine(mode, state) {
|
|
5580
|
+
if (mode.blankLine) return mode.blankLine(state);
|
|
5581
|
+
if (!mode.innerMode) return;
|
|
5582
|
+
var inner = CodeMirror.innerMode(mode, state);
|
|
5583
|
+
if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);
|
|
5584
|
+
}
|
|
5585
|
+
|
|
5586
|
+
function readToken(mode, stream, state) {
|
|
5587
|
+
var style = mode.token(stream, state);
|
|
5588
|
+
if (stream.pos <= stream.start)
|
|
5589
|
+
throw new Error("Mode " + mode.name + " failed to advance stream.");
|
|
5590
|
+
return style;
|
|
5591
|
+
}
|
|
5592
|
+
|
|
5433
5593
|
// Run the given mode's parser over a line, calling f for each token.
|
|
5434
|
-
function runMode(cm, text, mode, state, f, forceToEnd) {
|
|
5594
|
+
function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {
|
|
5435
5595
|
var flattenSpans = mode.flattenSpans;
|
|
5436
5596
|
if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;
|
|
5437
5597
|
var curStart = 0, curStyle = null;
|
|
5438
5598
|
var stream = new StringStream(text, cm.options.tabSize), style;
|
|
5439
|
-
if (text == ""
|
|
5599
|
+
if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses);
|
|
5440
5600
|
while (!stream.eol()) {
|
|
5441
5601
|
if (stream.pos > cm.options.maxHighlightLength) {
|
|
5442
5602
|
flattenSpans = false;
|
|
@@ -5444,7 +5604,7 @@
|
|
|
5444
5604
|
stream.pos = text.length;
|
|
5445
5605
|
style = null;
|
|
5446
5606
|
} else {
|
|
5447
|
-
style = mode
|
|
5607
|
+
style = extractLineClasses(readToken(mode, stream, state), lineClasses);
|
|
5448
5608
|
}
|
|
5449
5609
|
if (cm.options.addModeClass) {
|
|
5450
5610
|
var mName = CodeMirror.innerMode(mode, state).mode.name;
|
|
@@ -5471,11 +5631,11 @@
|
|
|
5471
5631
|
function highlightLine(cm, line, state, forceToEnd) {
|
|
5472
5632
|
// A styles array always starts with a number identifying the
|
|
5473
5633
|
// mode/overlays that it is based on (for easy invalidation).
|
|
5474
|
-
var st = [cm.state.modeGen];
|
|
5634
|
+
var st = [cm.state.modeGen], lineClasses = {};
|
|
5475
5635
|
// Compute the base array of styles
|
|
5476
5636
|
runMode(cm, line.text, cm.doc.mode, state, function(end, style) {
|
|
5477
5637
|
st.push(end, style);
|
|
5478
|
-
}, forceToEnd);
|
|
5638
|
+
}, lineClasses, forceToEnd);
|
|
5479
5639
|
|
|
5480
5640
|
// Run overlays, adjust style array.
|
|
5481
5641
|
for (var o = 0; o < cm.state.overlays.length; ++o) {
|
|
@@ -5492,23 +5652,27 @@
|
|
|
5492
5652
|
}
|
|
5493
5653
|
if (!style) return;
|
|
5494
5654
|
if (overlay.opaque) {
|
|
5495
|
-
st.splice(start, i - start, end, style);
|
|
5655
|
+
st.splice(start, i - start, end, "cm-overlay " + style);
|
|
5496
5656
|
i = start + 2;
|
|
5497
5657
|
} else {
|
|
5498
5658
|
for (; start < i; start += 2) {
|
|
5499
5659
|
var cur = st[start+1];
|
|
5500
|
-
st[start+1] = cur ? cur + " " +
|
|
5660
|
+
st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + style;
|
|
5501
5661
|
}
|
|
5502
5662
|
}
|
|
5503
|
-
});
|
|
5663
|
+
}, lineClasses);
|
|
5504
5664
|
}
|
|
5505
5665
|
|
|
5506
|
-
return st;
|
|
5666
|
+
return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};
|
|
5507
5667
|
}
|
|
5508
5668
|
|
|
5509
5669
|
function getLineStyles(cm, line) {
|
|
5510
|
-
if (!line.styles || line.styles[0] != cm.state.modeGen)
|
|
5511
|
-
|
|
5670
|
+
if (!line.styles || line.styles[0] != cm.state.modeGen) {
|
|
5671
|
+
var result = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line)));
|
|
5672
|
+
line.styles = result.styles;
|
|
5673
|
+
if (result.classes) line.styleClasses = result.classes;
|
|
5674
|
+
else if (line.styleClasses) line.styleClasses = null;
|
|
5675
|
+
}
|
|
5512
5676
|
return line.styles;
|
|
5513
5677
|
}
|
|
5514
5678
|
|
|
@@ -5519,9 +5683,9 @@
|
|
|
5519
5683
|
var mode = cm.doc.mode;
|
|
5520
5684
|
var stream = new StringStream(text, cm.options.tabSize);
|
|
5521
5685
|
stream.start = stream.pos = startAt || 0;
|
|
5522
|
-
if (text == ""
|
|
5686
|
+
if (text == "") callBlankLine(mode, state);
|
|
5523
5687
|
while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) {
|
|
5524
|
-
mode
|
|
5688
|
+
readToken(mode, stream, state);
|
|
5525
5689
|
stream.start = stream.pos;
|
|
5526
5690
|
}
|
|
5527
5691
|
}
|
|
@@ -5530,20 +5694,9 @@
|
|
|
5530
5694
|
// containing one or more styles) to a CSS style. This is cached,
|
|
5531
5695
|
// and also looks for line-wide styles.
|
|
5532
5696
|
var styleToClassCache = {}, styleToClassCacheWithMode = {};
|
|
5533
|
-
function interpretTokenStyle(style,
|
|
5534
|
-
if (!style) return null;
|
|
5535
|
-
|
|
5536
|
-
var lineClass = style.match(/(?:^|\s+)line-(background-)?(\S+)/);
|
|
5537
|
-
if (!lineClass) break;
|
|
5538
|
-
style = style.slice(0, lineClass.index) + style.slice(lineClass.index + lineClass[0].length);
|
|
5539
|
-
var prop = lineClass[1] ? "bgClass" : "textClass";
|
|
5540
|
-
if (builder[prop] == null)
|
|
5541
|
-
builder[prop] = lineClass[2];
|
|
5542
|
-
else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(builder[prop]))
|
|
5543
|
-
builder[prop] += " " + lineClass[2];
|
|
5544
|
-
}
|
|
5545
|
-
if (/^\s*$/.test(style)) return null;
|
|
5546
|
-
var cache = builder.cm.options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
|
|
5697
|
+
function interpretTokenStyle(style, options) {
|
|
5698
|
+
if (!style || /^\s*$/.test(style)) return null;
|
|
5699
|
+
var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
|
|
5547
5700
|
return cache[style] ||
|
|
5548
5701
|
(cache[style] = style.replace(/\S+/g, "cm-$&"));
|
|
5549
5702
|
}
|
|
@@ -5574,6 +5727,12 @@
|
|
|
5574
5727
|
builder.addToken = buildTokenBadBidi(builder.addToken, order);
|
|
5575
5728
|
builder.map = [];
|
|
5576
5729
|
insertLineContent(line, builder, getLineStyles(cm, line));
|
|
5730
|
+
if (line.styleClasses) {
|
|
5731
|
+
if (line.styleClasses.bgClass)
|
|
5732
|
+
builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || "");
|
|
5733
|
+
if (line.styleClasses.textClass)
|
|
5734
|
+
builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || "");
|
|
5735
|
+
}
|
|
5577
5736
|
|
|
5578
5737
|
// Ensure at least a single node is present, for measuring.
|
|
5579
5738
|
if (builder.map.length == 0)
|
|
@@ -5699,7 +5858,7 @@
|
|
|
5699
5858
|
var spans = line.markedSpans, allText = line.text, at = 0;
|
|
5700
5859
|
if (!spans) {
|
|
5701
5860
|
for (var i = 1; i < styles.length; i+=2)
|
|
5702
|
-
builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder));
|
|
5861
|
+
builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));
|
|
5703
5862
|
return;
|
|
5704
5863
|
}
|
|
5705
5864
|
|
|
@@ -5749,7 +5908,7 @@
|
|
|
5749
5908
|
spanStartStyle = "";
|
|
5750
5909
|
}
|
|
5751
5910
|
text = allText.slice(at, at = styles[i++]);
|
|
5752
|
-
style = interpretTokenStyle(styles[i++], builder);
|
|
5911
|
+
style = interpretTokenStyle(styles[i++], builder.cm.options);
|
|
5753
5912
|
}
|
|
5754
5913
|
}
|
|
5755
5914
|
}
|
|
@@ -6101,13 +6260,13 @@
|
|
|
6101
6260
|
}
|
|
6102
6261
|
return parts;
|
|
6103
6262
|
},
|
|
6104
|
-
replaceSelection:
|
|
6263
|
+
replaceSelection: function(code, collapse, origin) {
|
|
6105
6264
|
var dup = [];
|
|
6106
6265
|
for (var i = 0; i < this.sel.ranges.length; i++)
|
|
6107
6266
|
dup[i] = code;
|
|
6108
6267
|
this.replaceSelections(dup, collapse, origin || "+input");
|
|
6109
|
-
}
|
|
6110
|
-
replaceSelections: function(code, collapse, origin) {
|
|
6268
|
+
},
|
|
6269
|
+
replaceSelections: docMethodOp(function(code, collapse, origin) {
|
|
6111
6270
|
var changes = [], sel = this.sel;
|
|
6112
6271
|
for (var i = 0; i < sel.ranges.length; i++) {
|
|
6113
6272
|
var range = sel.ranges[i];
|
|
@@ -6118,7 +6277,7 @@
|
|
|
6118
6277
|
makeChange(this, changes[i]);
|
|
6119
6278
|
if (newSel) setSelectionReplaceHistory(this, newSel);
|
|
6120
6279
|
else if (this.cm) ensureCursorVisible(this.cm);
|
|
6121
|
-
},
|
|
6280
|
+
}),
|
|
6122
6281
|
undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),
|
|
6123
6282
|
redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
|
|
6124
6283
|
undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),
|
|
@@ -6178,7 +6337,7 @@
|
|
|
6178
6337
|
}
|
|
6179
6338
|
return markers;
|
|
6180
6339
|
},
|
|
6181
|
-
findMarks: function(from, to) {
|
|
6340
|
+
findMarks: function(from, to, filter) {
|
|
6182
6341
|
from = clipPos(this, from); to = clipPos(this, to);
|
|
6183
6342
|
var found = [], lineNo = from.line;
|
|
6184
6343
|
this.iter(from.line, to.line + 1, function(line) {
|
|
@@ -6187,7 +6346,8 @@
|
|
|
6187
6346
|
var span = spans[i];
|
|
6188
6347
|
if (!(lineNo == from.line && from.ch > span.to ||
|
|
6189
6348
|
span.from == null && lineNo != from.line||
|
|
6190
|
-
lineNo == to.line && span.from > to.ch)
|
|
6349
|
+
lineNo == to.line && span.from > to.ch) &&
|
|
6350
|
+
(!filter || filter(span.marker)))
|
|
6191
6351
|
found.push(span.marker.parent || span.marker);
|
|
6192
6352
|
}
|
|
6193
6353
|
++lineNo;
|
|
@@ -6245,6 +6405,7 @@
|
|
|
6245
6405
|
if (options.sharedHist) copy.history = this.history;
|
|
6246
6406
|
(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
|
|
6247
6407
|
copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
|
|
6408
|
+
copySharedMarkers(copy, findSharedMarkers(this));
|
|
6248
6409
|
return copy;
|
|
6249
6410
|
},
|
|
6250
6411
|
unlinkDoc: function(other) {
|
|
@@ -6254,6 +6415,7 @@
|
|
|
6254
6415
|
if (link.doc != other) continue;
|
|
6255
6416
|
this.linked.splice(i, 1);
|
|
6256
6417
|
other.unlinkDoc(this);
|
|
6418
|
+
detachSharedMarkers(findSharedMarkers(this));
|
|
6257
6419
|
break;
|
|
6258
6420
|
}
|
|
6259
6421
|
// If the histories were shared, split them again
|
|
@@ -6765,6 +6927,14 @@
|
|
|
6765
6927
|
return e_defaultPrevented(e) || e.codemirrorIgnore;
|
|
6766
6928
|
}
|
|
6767
6929
|
|
|
6930
|
+
function signalCursorActivity(cm) {
|
|
6931
|
+
var arr = cm._handlers && cm._handlers.cursorActivity;
|
|
6932
|
+
if (!arr) return;
|
|
6933
|
+
var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
|
|
6934
|
+
for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)
|
|
6935
|
+
set.push(arr[i]);
|
|
6936
|
+
}
|
|
6937
|
+
|
|
6768
6938
|
function hasHandler(emitter, type) {
|
|
6769
6939
|
var arr = emitter._handlers && emitter._handlers[type];
|
|
6770
6940
|
return arr && arr.length > 0;
|
|
@@ -6869,9 +7039,11 @@
|
|
|
6869
7039
|
return inst;
|
|
6870
7040
|
};
|
|
6871
7041
|
|
|
6872
|
-
function copyObj(obj, target) {
|
|
7042
|
+
function copyObj(obj, target, overwrite) {
|
|
6873
7043
|
if (!target) target = {};
|
|
6874
|
-
for (var prop in obj)
|
|
7044
|
+
for (var prop in obj)
|
|
7045
|
+
if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
|
|
7046
|
+
target[prop] = obj[prop];
|
|
6875
7047
|
return target;
|
|
6876
7048
|
}
|
|
6877
7049
|
|
|
@@ -6951,6 +7123,21 @@
|
|
|
6951
7123
|
catch(e) { return document.body; }
|
|
6952
7124
|
};
|
|
6953
7125
|
|
|
7126
|
+
function classTest(cls) { return new RegExp("\\b" + cls + "\\b\\s*"); }
|
|
7127
|
+
function rmClass(node, cls) {
|
|
7128
|
+
var test = classTest(cls);
|
|
7129
|
+
if (test.test(node.className)) node.className = node.className.replace(test, "");
|
|
7130
|
+
}
|
|
7131
|
+
function addClass(node, cls) {
|
|
7132
|
+
if (!classTest(cls).test(node.className)) node.className += " " + cls;
|
|
7133
|
+
}
|
|
7134
|
+
function joinClasses(a, b) {
|
|
7135
|
+
var as = a.split(" ");
|
|
7136
|
+
for (var i = 0; i < as.length; i++)
|
|
7137
|
+
if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i];
|
|
7138
|
+
return b;
|
|
7139
|
+
}
|
|
7140
|
+
|
|
6954
7141
|
// FEATURE DETECTION
|
|
6955
7142
|
|
|
6956
7143
|
// Detect drag-and-drop
|
|
@@ -7333,7 +7520,7 @@
|
|
|
7333
7520
|
|
|
7334
7521
|
// THE END
|
|
7335
7522
|
|
|
7336
|
-
CodeMirror.version = "4.0
|
|
7523
|
+
CodeMirror.version = "4.1.0";
|
|
7337
7524
|
|
|
7338
7525
|
return CodeMirror;
|
|
7339
7526
|
});
|