codemirror-rails 3.21 → 3.22

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +89 -43
  4. data/vendor/assets/javascripts/codemirror/addons/comment/continuecomment.js +16 -3
  5. data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +1 -0
  6. data/vendor/assets/javascripts/codemirror/addons/display/rulers.js +47 -0
  7. data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +1 -0
  8. data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +6 -0
  9. data/vendor/assets/javascripts/codemirror/addons/fold/markdown-fold.js +34 -0
  10. data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +2 -2
  11. data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +0 -0
  12. data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +25 -18
  13. data/vendor/assets/javascripts/codemirror/addons/lint/yaml-lint.js +14 -0
  14. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +2 -2
  15. data/vendor/assets/javascripts/codemirror/addons/scroll/scrollpastend.js +2 -0
  16. data/vendor/assets/javascripts/codemirror/addons/search/search.js +9 -3
  17. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +126 -54
  18. data/vendor/assets/javascripts/codemirror/modes/clojure.js +6 -5
  19. data/vendor/assets/javascripts/codemirror/modes/css.js +19 -9
  20. data/vendor/assets/javascripts/codemirror/modes/gas.js +1 -1
  21. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +4 -1
  22. data/vendor/assets/javascripts/codemirror/modes/javascript.js +11 -3
  23. data/vendor/assets/javascripts/codemirror/modes/julia.js +47 -23
  24. data/vendor/assets/javascripts/codemirror/modes/markdown.js +5 -3
  25. data/vendor/assets/javascripts/codemirror/modes/octave.js +6 -4
  26. data/vendor/assets/javascripts/codemirror/modes/puppet.js +204 -0
  27. data/vendor/assets/javascripts/codemirror/modes/python.js +4 -0
  28. data/vendor/assets/javascripts/codemirror/modes/rst.js +520 -517
  29. data/vendor/assets/javascripts/codemirror/modes/ruby.js +1 -0
  30. data/vendor/assets/javascripts/codemirror/modes/solr.js +89 -0
  31. data/vendor/assets/javascripts/codemirror/modes/sql.js +2 -2
  32. data/vendor/assets/javascripts/codemirror/modes/xml.js +2 -1
  33. data/vendor/assets/stylesheets/codemirror.css +12 -11
  34. data/vendor/assets/stylesheets/codemirror/themes/mdn-like.css +44 -0
  35. data/vendor/assets/stylesheets/codemirror/themes/solarized.css +1 -0
  36. metadata +8 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8680d4179ae33590e39ba128f1345d74e83722db
4
- data.tar.gz: 2cda7f5da857f741036521f93736630ede8ec6dc
3
+ metadata.gz: 4503a996155c96877d36e19f5e461db92383dbf4
4
+ data.tar.gz: 5abe2e7b9dc2f39f4ec1185d220e3dc8ab9a8eb9
5
5
  SHA512:
6
- metadata.gz: 8690cdf5554a8108e8c60956b196c91b121e3939e919ad030e0e76981f5bd0d126907049db5b2bef7014bca84b73ce2b36975eb7ce5e50dcc93e9e2296f77e50
7
- data.tar.gz: a1afa46266825c3491100c691a11ec0ab1b21c3f9f9c4ac3901f5acd5f485a06b7e87f8a87636d84f6a058b039c5c5d50a1da6bbf5b16dcec3125c731b53df33
6
+ metadata.gz: 22aef71a6f3827e6f71a38213649a0ad7d081d2b5fc8831ccfadf726246f2d5d59435823dbc6b2119685c98e4d859381a7429debbae6622f3cf655cbc404e4d4
7
+ data.tar.gz: 12642596e377573cdcad5b977aa648310069efd0c2278e192aff0758bce6ce9e2d2f81f295a9d942148028eb392c1594f684f685aeb151bb15b52ee1d54c3dc2
@@ -1,6 +1,6 @@
1
1
  module Codemirror
2
2
  module Rails
3
- VERSION = '3.21'
4
- CODEMIRROR_VERSION = '3.21'
3
+ VERSION = '3.22'
4
+ CODEMIRROR_VERSION = '3.22'
5
5
  end
6
6
  end
@@ -1,3 +1,5 @@
1
+ // CodeMirror version 3.22
2
+ //
1
3
  // CodeMirror is the only global var we claim
2
4
  window.CodeMirror = (function() {
3
5
  "use strict";
@@ -13,6 +15,7 @@ window.CodeMirror = (function() {
13
15
  var old_ie = /MSIE \d/.test(navigator.userAgent);
14
16
  var ie_lt8 = old_ie && (document.documentMode == null || document.documentMode < 8);
15
17
  var ie_lt9 = old_ie && (document.documentMode == null || document.documentMode < 9);
18
+ var ie_lt10 = old_ie && (document.documentMode == null || document.documentMode < 10);
16
19
  var ie_gt10 = /Trident\/([7-9]|\d{2,})\./.test(navigator.userAgent);
17
20
  var ie = old_ie || ie_gt10;
18
21
  var webkit = /WebKit\//.test(navigator.userAgent);
@@ -36,7 +39,7 @@ window.CodeMirror = (function() {
36
39
  if (opera_version && opera_version >= 15) { opera = false; webkit = true; }
37
40
  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
38
41
  var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11));
39
- var captureMiddleClick = gecko || (old_ie && !ie_lt9);
42
+ var captureMiddleClick = gecko || (ie && !ie_lt9);
40
43
 
41
44
  // Optimize some code when these features are not used
42
45
  var sawReadOnlySpans = false, sawCollapsedSpans = false;
@@ -99,7 +102,7 @@ window.CodeMirror = (function() {
99
102
  function makeDisplay(place, docStart) {
100
103
  var d = {};
101
104
 
102
- var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none; font-size: 4px;");
105
+ var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none");
103
106
  if (webkit) input.style.width = "1000px";
104
107
  else input.setAttribute("wrap", "off");
105
108
  // if border: 0; -- iOS fails to open keyboard (issue #1287)
@@ -171,7 +174,7 @@ window.CodeMirror = (function() {
171
174
  // Self-resetting timeout for the poller
172
175
  d.poll = new Delayed();
173
176
 
174
- d.cachedCharWidth = d.cachedTextHeight = null;
177
+ d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
175
178
  d.measureLineCache = [];
176
179
  d.measureLineCachePos = 0;
177
180
 
@@ -337,8 +340,9 @@ window.CodeMirror = (function() {
337
340
  if (needsV) {
338
341
  d.scrollbarV.style.display = "block";
339
342
  d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0";
343
+ // A bug in IE8 can cause this value to be negative, so guard it.
340
344
  d.scrollbarV.firstChild.style.height =
341
- (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px";
345
+ Math.max(0, scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px";
342
346
  } else {
343
347
  d.scrollbarV.style.display = "";
344
348
  d.scrollbarV.firstChild.style.height = "0";
@@ -818,12 +822,12 @@ window.CodeMirror = (function() {
818
822
  function updateSelectionRange(cm) {
819
823
  var display = cm.display, doc = cm.doc, sel = cm.doc.sel;
820
824
  var fragment = document.createDocumentFragment();
821
- var clientWidth = display.lineSpace.offsetWidth, pl = paddingLeft(cm.display);
825
+ var padding = paddingH(cm.display), leftSide = padding.left, rightSide = display.lineSpace.offsetWidth - padding.right;
822
826
 
823
827
  function add(left, top, width, bottom) {
824
828
  if (top < 0) top = 0;
825
829
  fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
826
- "px; top: " + top + "px; width: " + (width == null ? clientWidth - left : width) +
830
+ "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) +
827
831
  "px; height: " + (bottom - top) + "px"));
828
832
  }
829
833
 
@@ -846,18 +850,18 @@ window.CodeMirror = (function() {
846
850
  left = leftPos.left;
847
851
  right = rightPos.right;
848
852
  }
849
- if (fromArg == null && from == 0) left = pl;
853
+ if (fromArg == null && from == 0) left = leftSide;
850
854
  if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
851
855
  add(left, leftPos.top, null, leftPos.bottom);
852
- left = pl;
856
+ left = leftSide;
853
857
  if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
854
858
  }
855
- if (toArg == null && to == lineLen) right = clientWidth;
859
+ if (toArg == null && to == lineLen) right = rightSide;
856
860
  if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
857
861
  start = leftPos;
858
862
  if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
859
863
  end = rightPos;
860
- if (left < pl + 1) left = pl;
864
+ if (left < leftSide + 1) left = leftSide;
861
865
  add(left, rightPos.top, right - left, rightPos.bottom);
862
866
  });
863
867
  return {start: start, end: end};
@@ -873,13 +877,13 @@ window.CodeMirror = (function() {
873
877
  if (singleVLine) {
874
878
  if (leftEnd.top < rightStart.top - 2) {
875
879
  add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
876
- add(pl, rightStart.top, rightStart.left, rightStart.bottom);
880
+ add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);
877
881
  } else {
878
882
  add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
879
883
  }
880
884
  }
881
885
  if (leftEnd.bottom < rightStart.top)
882
- add(pl, leftEnd.bottom, null, rightStart.top);
886
+ add(leftSide, leftEnd.bottom, null, rightStart.top);
883
887
  }
884
888
 
885
889
  removeChildrenAndAdd(display.selectionDiv, fragment);
@@ -982,9 +986,12 @@ window.CodeMirror = (function() {
982
986
 
983
987
  function paddingTop(display) {return display.lineSpace.offsetTop;}
984
988
  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
985
- function paddingLeft(display) {
986
- var e = removeChildrenAndAdd(display.measure, elt("pre", null, null, "text-align: left")).appendChild(elt("span", "x"));
987
- return e.offsetLeft;
989
+ function paddingH(display) {
990
+ if (display.cachedPaddingH) return display.cachedPaddingH;
991
+ var e = removeChildrenAndAdd(display.measure, elt("pre", "x"));
992
+ var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
993
+ return display.cachedPaddingH = {left: parseInt(style.paddingLeft),
994
+ right: parseInt(style.paddingRight)};
988
995
  }
989
996
 
990
997
  function measureChar(cm, line, ch, data, bias) {
@@ -1158,7 +1165,7 @@ window.CodeMirror = (function() {
1158
1165
 
1159
1166
  function clearCaches(cm) {
1160
1167
  cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0;
1161
- cm.display.cachedCharWidth = cm.display.cachedTextHeight = null;
1168
+ cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
1162
1169
  if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
1163
1170
  cm.display.lineNumChars = null;
1164
1171
  }
@@ -1374,7 +1381,7 @@ window.CodeMirror = (function() {
1374
1381
  if (op.updateMaxLine) computeMaxLength(cm);
1375
1382
  if (display.maxLineChanged && !cm.options.lineWrapping && display.maxLine) {
1376
1383
  var width = measureLineWidth(cm, display.maxLine);
1377
- display.sizer.style.minWidth = Math.max(0, width + 3 + scrollerCutOff) + "px";
1384
+ display.sizer.style.minWidth = Math.max(0, width + 3) + "px";
1378
1385
  display.maxLineChanged = false;
1379
1386
  var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth);
1380
1387
  if (maxScrollLeft < doc.scrollLeft && !op.updateScrollPos)
@@ -1556,6 +1563,10 @@ window.CodeMirror = (function() {
1556
1563
  cm.display.input.focus();
1557
1564
  }
1558
1565
 
1566
+ function ensureFocus(cm) {
1567
+ if (!cm.state.focused) { focusInput(cm); onFocus(cm); }
1568
+ }
1569
+
1559
1570
  function isReadOnly(cm) {
1560
1571
  return cm.options.readOnly || cm.doc.cantEdit;
1561
1572
  }
@@ -1612,7 +1623,7 @@ window.CodeMirror = (function() {
1612
1623
  if (resizeTimer == null) resizeTimer = setTimeout(function() {
1613
1624
  resizeTimer = null;
1614
1625
  // Might be a text scaling operation, clear size caches.
1615
- d.cachedCharWidth = d.cachedTextHeight = knownScrollbarWidth = null;
1626
+ d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = knownScrollbarWidth = null;
1616
1627
  clearCaches(cm);
1617
1628
  runInOp(cm, bind(regChange, cm));
1618
1629
  }, 100);
@@ -1628,10 +1639,7 @@ window.CodeMirror = (function() {
1628
1639
  }
1629
1640
  setTimeout(unregister, 5000);
1630
1641
 
1631
- on(d.input, "keyup", operation(cm, function(e) {
1632
- if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
1633
- if (e.keyCode == 16) cm.doc.sel.shift = false;
1634
- }));
1642
+ on(d.input, "keyup", operation(cm, onKeyUp));
1635
1643
  on(d.input, "input", function() {
1636
1644
  if (ie && !ie_lt9 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;
1637
1645
  fastPoll(cm);
@@ -1725,6 +1733,7 @@ window.CodeMirror = (function() {
1725
1733
  }
1726
1734
  if (clickInGutter(cm, e)) return;
1727
1735
  var start = posFromMouse(cm, e);
1736
+ window.focus();
1728
1737
 
1729
1738
  switch (e_button(e)) {
1730
1739
  case 3:
@@ -1742,7 +1751,7 @@ window.CodeMirror = (function() {
1742
1751
  // selection.
1743
1752
  if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;}
1744
1753
 
1745
- if (!cm.state.focused) onFocus(cm);
1754
+ setTimeout(bind(ensureFocus, cm), 0);
1746
1755
 
1747
1756
  var now = +new Date, type = "single";
1748
1757
  if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
@@ -1822,7 +1831,7 @@ window.CodeMirror = (function() {
1822
1831
  var cur = posFromMouse(cm, e, true);
1823
1832
  if (!cur) return;
1824
1833
  if (!posEq(cur, last)) {
1825
- if (!cm.state.focused) onFocus(cm);
1834
+ ensureFocus(cm);
1826
1835
  last = cur;
1827
1836
  doSelect(cur);
1828
1837
  var visible = visibleLines(display, doc);
@@ -1847,7 +1856,7 @@ window.CodeMirror = (function() {
1847
1856
  }
1848
1857
 
1849
1858
  var move = operation(cm, function(e) {
1850
- if (!old_ie && !e_button(e)) done(e);
1859
+ if ((ie && !ie_lt10) ? !e.buttons : !e_button(e)) done(e);
1851
1860
  else extend(e);
1852
1861
  });
1853
1862
  var up = operation(cm, done);
@@ -1992,7 +2001,7 @@ window.CodeMirror = (function() {
1992
2001
  // know one. These don't have to be accurate -- the result of them
1993
2002
  // being wrong would just be a slight flicker on the first wheel
1994
2003
  // scroll (if it is large enough).
1995
- if (old_ie) wheelPixelsPerUnit = -.53;
2004
+ if (ie) wheelPixelsPerUnit = -.53;
1996
2005
  else if (gecko) wheelPixelsPerUnit = 15;
1997
2006
  else if (chrome) wheelPixelsPerUnit = -.7;
1998
2007
  else if (safari) wheelPixelsPerUnit = -1/3;
@@ -2141,10 +2150,16 @@ window.CodeMirror = (function() {
2141
2150
  return handled;
2142
2151
  }
2143
2152
 
2153
+ function onKeyUp(e) {
2154
+ var cm = this;
2155
+ if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
2156
+ if (e.keyCode == 16) cm.doc.sel.shift = false;
2157
+ }
2158
+
2144
2159
  var lastStoppedKey = null;
2145
2160
  function onKeyDown(e) {
2146
2161
  var cm = this;
2147
- if (!cm.state.focused) onFocus(cm);
2162
+ ensureFocus(cm);
2148
2163
  if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
2149
2164
  if (old_ie && e.keyCode == 27) e.returnValue = false;
2150
2165
  var code = e.keyCode;
@@ -2237,7 +2252,7 @@ window.CodeMirror = (function() {
2237
2252
 
2238
2253
  // Try to detect the user choosing select-all
2239
2254
  if (display.input.selectionStart != null) {
2240
- if (!old_ie || ie_lt9) prepareSelectAllHack();
2255
+ if (!ie || ie_lt9) prepareSelectAllHack();
2241
2256
  clearTimeout(detectingSelectAll);
2242
2257
  var i = 0, poll = function(){
2243
2258
  if (display.prevInput == "\u200b" && display.input.selectionStart == 0)
@@ -2249,7 +2264,7 @@ window.CodeMirror = (function() {
2249
2264
  }
2250
2265
  }
2251
2266
 
2252
- if (old_ie && !ie_lt9) prepareSelectAllHack();
2267
+ if (ie && !ie_lt9) prepareSelectAllHack();
2253
2268
  if (captureMiddleClick) {
2254
2269
  e_stop(e);
2255
2270
  var mouseup = function() {
@@ -2746,15 +2761,16 @@ window.CodeMirror = (function() {
2746
2761
  // API UTILITIES
2747
2762
 
2748
2763
  function indentLine(cm, n, how, aggressive) {
2749
- var doc = cm.doc;
2764
+ var doc = cm.doc, state;
2750
2765
  if (how == null) how = "add";
2751
2766
  if (how == "smart") {
2752
2767
  if (!cm.doc.mode.indent) how = "prev";
2753
- else var state = getStateBefore(cm, n);
2768
+ else state = getStateBefore(cm, n);
2754
2769
  }
2755
2770
 
2756
2771
  var tabSize = cm.options.tabSize;
2757
2772
  var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
2773
+ if (line.stateAfter) line.stateAfter = null;
2758
2774
  var curSpaceString = line.text.match(/^\s*/)[0], indentation;
2759
2775
  if (!aggressive && !/\S/.test(line.text)) {
2760
2776
  indentation = 0;
@@ -2829,13 +2845,15 @@ window.CodeMirror = (function() {
2829
2845
  if (dir < 0 && !moveOnce(!first)) break;
2830
2846
  var cur = lineObj.text.charAt(ch) || "\n";
2831
2847
  var type = isWordChar(cur) ? "w"
2832
- : !group ? null
2833
- : /\s/.test(cur) ? null
2848
+ : group && cur == "\n" ? "n"
2849
+ : !group || /\s/.test(cur) ? null
2834
2850
  : "p";
2851
+ if (group && !first && !type) type = "s";
2835
2852
  if (sawType && sawType != type) {
2836
2853
  if (dir < 0) {dir = 1; moveOnce();}
2837
2854
  break;
2838
2855
  }
2856
+
2839
2857
  if (type) sawType = type;
2840
2858
  if (dir > 0 && !moveOnce(!first)) break;
2841
2859
  }
@@ -3156,6 +3174,8 @@ window.CodeMirror = (function() {
3156
3174
  },
3157
3175
 
3158
3176
  triggerOnKeyDown: operation(null, onKeyDown),
3177
+ triggerOnKeyPress: operation(null, onKeyPress),
3178
+ triggerOnKeyUp: operation(null, onKeyUp),
3159
3179
 
3160
3180
  execCommand: function(cmd) {
3161
3181
  if (commands.hasOwnProperty(cmd))
@@ -3222,8 +3242,10 @@ window.CodeMirror = (function() {
3222
3242
  this.display.cursor.className += " CodeMirror-overwrite";
3223
3243
  else
3224
3244
  this.display.cursor.className = this.display.cursor.className.replace(" CodeMirror-overwrite", "");
3245
+
3246
+ signal(this, "overwriteToggle", this, this.state.overwrite);
3225
3247
  },
3226
- hasFocus: function() { return this.state.focused; },
3248
+ hasFocus: function() { return document.activeElement == this.display.input; },
3227
3249
 
3228
3250
  scrollTo: operation(null, function(x, y) {
3229
3251
  updateScrollPos(this, x, y);
@@ -3264,16 +3286,19 @@ window.CodeMirror = (function() {
3264
3286
  if (this.options.lineWrapping)
3265
3287
  this.display.measureLineCache.length = this.display.measureLineCachePos = 0;
3266
3288
  this.curOp.forceUpdate = true;
3289
+ signal(this, "refresh", this);
3267
3290
  }),
3268
3291
 
3269
3292
  operation: function(f){return runInOp(this, f);},
3270
3293
 
3271
3294
  refresh: operation(null, function() {
3272
- var badHeight = this.display.cachedTextHeight == null;
3295
+ var oldHeight = this.display.cachedTextHeight;
3273
3296
  clearCaches(this);
3274
3297
  updateScrollPos(this, this.doc.scrollLeft, this.doc.scrollTop);
3275
3298
  regChange(this);
3276
- if (badHeight) estimateLineHeights(this);
3299
+ if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)
3300
+ estimateLineHeights(this);
3301
+ signal(this, "refresh", this);
3277
3302
  }),
3278
3303
 
3279
3304
  swapDoc: operation(null, function(doc) {
@@ -3424,6 +3449,7 @@ window.CodeMirror = (function() {
3424
3449
  spec = mimeModes[spec];
3425
3450
  } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
3426
3451
  var found = mimeModes[spec.name];
3452
+ if (typeof found == "string") found = {name: found};
3427
3453
  spec = createObj(found, spec);
3428
3454
  spec.name = found.name;
3429
3455
  } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
@@ -3536,7 +3562,7 @@ window.CodeMirror = (function() {
3536
3562
  },
3537
3563
  deleteLine: function(cm) {
3538
3564
  var l = cm.getCursor().line;
3539
- cm.replaceRange("", Pos(l, 0), Pos(l), "+delete");
3565
+ cm.replaceRange("", Pos(l, 0), Pos(l + 1, 0), "+delete");
3540
3566
  },
3541
3567
  delLineLeft: function(cm) {
3542
3568
  var cur = cm.getCursor();
@@ -3627,7 +3653,7 @@ window.CodeMirror = (function() {
3627
3653
  // default. Unknown commands are simply ignored.
3628
3654
  keyMap.pcDefault = {
3629
3655
  "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
3630
- "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
3656
+ "Ctrl-Home": "goDocStart", "Ctrl-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
3631
3657
  "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
3632
3658
  "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
3633
3659
  "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
@@ -4344,6 +4370,7 @@ window.CodeMirror = (function() {
4344
4370
  var aboveVisible = heightAtLine(cm, line) < cm.doc.scrollTop;
4345
4371
  updateLineHeight(line, line.height + widgetHeight(widget));
4346
4372
  if (aboveVisible) addToScrollPos(cm, 0, widget.height);
4373
+ cm.curOp.forceUpdate = true;
4347
4374
  }
4348
4375
  return true;
4349
4376
  });
@@ -4475,7 +4502,7 @@ window.CodeMirror = (function() {
4475
4502
  function interpretTokenStyle(style, builder) {
4476
4503
  if (!style) return null;
4477
4504
  for (;;) {
4478
- var lineClass = style.match(/(?:^|\s)line-(background-)?(\S+)/);
4505
+ var lineClass = style.match(/(?:^|\s+)line-(background-)?(\S+)/);
4479
4506
  if (!lineClass) break;
4480
4507
  style = style.slice(0, lineClass.index) + style.slice(lineClass.index + lineClass[0].length);
4481
4508
  var prop = lineClass[1] ? "bgClass" : "textClass";
@@ -4484,9 +4511,10 @@ window.CodeMirror = (function() {
4484
4511
  else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(builder[prop]))
4485
4512
  builder[prop] += " " + lineClass[2];
4486
4513
  }
4514
+ if (/^\s*$/.test(style)) return null;
4487
4515
  var cache = builder.cm.options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
4488
4516
  return cache[style] ||
4489
- (cache[style] = "cm-" + style.replace(/ +/g, " cm-"));
4517
+ (cache[style] = style.replace(/\S+/g, "cm-$&"));
4490
4518
  }
4491
4519
 
4492
4520
  function buildLineContent(cm, realLine, measure, copyWidgets) {
@@ -4503,7 +4531,7 @@ window.CodeMirror = (function() {
4503
4531
  builder.measure = line == realLine && measure;
4504
4532
  builder.pos = 0;
4505
4533
  builder.addToken = builder.measure ? buildTokenMeasure : buildToken;
4506
- if ((old_ie || webkit) && cm.getOption("lineWrapping"))
4534
+ if ((ie || webkit) && cm.getOption("lineWrapping"))
4507
4535
  builder.addToken = buildTokenSplitSpaces(builder.addToken);
4508
4536
  var next = insertLineContent(line, builder, getLineStyles(cm, line));
4509
4537
  if (measure && line == realLine && !builder.measuredSomething) {
@@ -5046,6 +5074,22 @@ window.CodeMirror = (function() {
5046
5074
  }
5047
5075
  return markers;
5048
5076
  },
5077
+ findMarks: function(from, to) {
5078
+ from = clipPos(this, from); to = clipPos(this, to);
5079
+ var found = [], lineNo = from.line;
5080
+ this.iter(from.line, to.line + 1, function(line) {
5081
+ var spans = line.markedSpans;
5082
+ if (spans) for (var i = 0; i < spans.length; i++) {
5083
+ var span = spans[i];
5084
+ if (!(lineNo == from.line && from.ch > span.to ||
5085
+ span.from == null && lineNo != from.line||
5086
+ lineNo == to.line && span.from > to.ch))
5087
+ found.push(span.marker.parent || span.marker);
5088
+ }
5089
+ ++lineNo;
5090
+ });
5091
+ return found;
5092
+ },
5049
5093
  getAllMarks: function() {
5050
5094
  var markers = [];
5051
5095
  this.iter(function(line) {
@@ -5319,6 +5363,8 @@ window.CodeMirror = (function() {
5319
5363
  hist.lastTime = time;
5320
5364
  hist.lastOp = opId;
5321
5365
  hist.lastOrigin = change.origin;
5366
+
5367
+ if (!last) signal(doc, "historyAdded");
5322
5368
  }
5323
5369
 
5324
5370
  function removeClearedSpans(spans) {
@@ -5600,7 +5646,7 @@ window.CodeMirror = (function() {
5600
5646
  return function(){return f.apply(null, args);};
5601
5647
  }
5602
5648
 
5603
- var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
5649
+ var nonASCIISingleCaseWordChar = /[\u00df\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
5604
5650
  function isWordChar(ch) {
5605
5651
  return /\w/.test(ch) || ch > "\x80" &&
5606
5652
  (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
@@ -6041,7 +6087,7 @@ window.CodeMirror = (function() {
6041
6087
 
6042
6088
  // THE END
6043
6089
 
6044
- CodeMirror.version = "3.21.0";
6090
+ CodeMirror.version = "3.22.0";
6045
6091
 
6046
6092
  return CodeMirror;
6047
6093
  })();
@@ -1,5 +1,6 @@
1
1
  (function() {
2
2
  var modes = ["clike", "css", "javascript"];
3
+
3
4
  for (var i = 0; i < modes.length; ++i)
4
5
  CodeMirror.extendMode(modes[i], {blockCommentContinue: " * "});
5
6
 
@@ -12,7 +13,7 @@
12
13
  if (mode.blockCommentStart && mode.blockCommentContinue) {
13
14
  var end = token.string.indexOf(mode.blockCommentEnd);
14
15
  var full = cm.getRange(CodeMirror.Pos(pos.line, 0), CodeMirror.Pos(pos.line, token.end)), found;
15
- if (end != -1 && end == token.string.length - mode.blockCommentEnd.length) {
16
+ if (end != -1 && end == token.string.length - mode.blockCommentEnd.length && pos.ch >= end) {
16
17
  // Comment ended, don't continue it
17
18
  } else if (token.string.indexOf(mode.blockCommentStart) == 0) {
18
19
  insert = full.slice(0, token.start);
@@ -27,7 +28,7 @@
27
28
  }
28
29
  if (insert != null) insert += mode.blockCommentContinue;
29
30
  }
30
- if (insert == null && mode.lineComment) {
31
+ if (insert == null && mode.lineComment && continueLineCommentEnabled(cm)) {
31
32
  var line = cm.getLine(pos.line), found = line.indexOf(mode.lineComment);
32
33
  if (found > -1) {
33
34
  insert = line.slice(0, found);
@@ -42,12 +43,24 @@
42
43
  return CodeMirror.Pass;
43
44
  }
44
45
 
46
+ function continueLineCommentEnabled(cm) {
47
+ var opt = cm.getOption("continueComments");
48
+ if (opt && typeof opt == "object")
49
+ return opt.continueLineComment !== false;
50
+ return true;
51
+ }
52
+
45
53
  CodeMirror.defineOption("continueComments", null, function(cm, val, prev) {
46
54
  if (prev && prev != CodeMirror.Init)
47
55
  cm.removeKeyMap("continueComment");
48
56
  if (val) {
57
+ var key = "Enter";
58
+ if (typeof val == "string")
59
+ key = val;
60
+ else if (typeof val == "object" && val.key)
61
+ key = val.key;
49
62
  var map = {name: "continueComment"};
50
- map[typeof val == "string" ? val : "Enter"] = continueComment;
63
+ map[key] = continueComment;
51
64
  cm.addKeyMap(map);
52
65
  }
53
66
  });