resin 0.3.1 → 0.4.0

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 (84) hide show
  1. data/amber/bin/amberc +10 -350
  2. data/amber/js/Benchfib.deploy.js +80 -89
  3. data/amber/js/Benchfib.js +80 -89
  4. data/amber/js/Canvas.deploy.js +558 -545
  5. data/amber/js/Canvas.js +563 -545
  6. data/amber/js/Compiler-AST.deploy.js +431 -243
  7. data/amber/js/Compiler-AST.js +487 -244
  8. data/amber/js/Compiler-Core.deploy.js +201 -1045
  9. data/amber/js/Compiler-Core.js +208 -1207
  10. data/amber/js/Compiler-Exceptions.deploy.js +37 -18
  11. data/amber/js/Compiler-Exceptions.js +42 -18
  12. data/amber/js/Compiler-IR.deploy.js +1071 -774
  13. data/amber/js/Compiler-IR.js +1194 -848
  14. data/amber/js/Compiler-Inlining.deploy.js +395 -373
  15. data/amber/js/Compiler-Inlining.js +395 -373
  16. data/amber/js/Compiler-Interpreter.deploy.js +1202 -0
  17. data/amber/js/Compiler-Interpreter.js +1631 -0
  18. data/amber/js/Compiler-Semantic.deploy.js +695 -600
  19. data/amber/js/Compiler-Semantic.js +721 -611
  20. data/amber/js/Compiler-Tests.deploy.js +699 -376
  21. data/amber/js/Compiler-Tests.js +834 -381
  22. data/amber/js/Compiler.deploy.js +8563 -1805
  23. data/amber/js/Compiler.js +11476 -2633
  24. data/amber/js/Examples.deploy.js +29 -29
  25. data/amber/js/Examples.js +29 -29
  26. data/amber/js/IDE.deploy.js +3292 -2649
  27. data/amber/js/IDE.js +3318 -2710
  28. data/amber/js/Importer-Exporter.deploy.js +393 -349
  29. data/amber/js/Importer-Exporter.js +398 -354
  30. data/amber/js/Kernel-Announcements.deploy.js +53 -44
  31. data/amber/js/Kernel-Announcements.js +55 -44
  32. data/amber/js/Kernel-Classes.deploy.js +566 -368
  33. data/amber/js/Kernel-Classes.js +660 -402
  34. data/amber/js/Kernel-Collections.deploy.js +1149 -1098
  35. data/amber/js/Kernel-Collections.js +1183 -1116
  36. data/amber/js/Kernel-Exceptions.deploy.js +173 -75
  37. data/amber/js/Kernel-Exceptions.js +215 -77
  38. data/amber/js/Kernel-Methods.deploy.js +530 -313
  39. data/amber/js/Kernel-Methods.js +632 -338
  40. data/amber/js/Kernel-Objects.deploy.js +1734 -1577
  41. data/amber/js/Kernel-Objects.js +1867 -1654
  42. data/amber/js/Kernel-Tests.deploy.js +1416 -973
  43. data/amber/js/Kernel-Tests.js +1495 -981
  44. data/amber/js/Kernel-Transcript.deploy.js +23 -24
  45. data/amber/js/Kernel-Transcript.js +25 -26
  46. data/amber/js/SUnit-Tests.deploy.js +402 -0
  47. data/amber/js/SUnit-Tests.js +518 -0
  48. data/amber/js/SUnit.deploy.js +535 -237
  49. data/amber/js/SUnit.js +634 -246
  50. data/amber/js/amber.js +90 -53
  51. data/amber/js/boot.js +441 -255
  52. data/amber/js/init.js +1 -3
  53. data/amber/js/lib/CodeMirror/codemirror.css +3 -0
  54. data/amber/js/lib/CodeMirror/codemirror.js +104 -55
  55. data/amber/js/lib/peg-0.7.0.min.js +9 -0
  56. data/amber/js/parser.js +1504 -802
  57. data/amber/js/parser.pegjs +170 -165
  58. data/amber/st/Canvas.st +6 -0
  59. data/amber/st/Compiler-AST.st +54 -3
  60. data/amber/st/Compiler-Core.st +6 -551
  61. data/amber/st/Compiler-Exceptions.st +4 -0
  62. data/amber/st/Compiler-IR.st +205 -87
  63. data/amber/st/Compiler-Interpreter.st +597 -0
  64. data/amber/st/Compiler-Semantic.st +46 -21
  65. data/amber/st/Compiler-Tests.st +254 -7
  66. data/amber/st/Compiler.st +3172 -1541
  67. data/amber/st/IDE.st +57 -93
  68. data/amber/st/Importer-Exporter.st +4 -7
  69. data/amber/st/Kernel-Announcements.st +8 -0
  70. data/amber/st/Kernel-Classes.st +149 -40
  71. data/amber/st/Kernel-Collections.st +43 -32
  72. data/amber/st/Kernel-Exceptions.st +70 -1
  73. data/amber/st/Kernel-Methods.st +165 -27
  74. data/amber/st/Kernel-Objects.st +215 -140
  75. data/amber/st/Kernel-Tests.st +195 -10
  76. data/amber/st/Kernel-Transcript.st +1 -3
  77. data/amber/st/SUnit-Tests.st +186 -0
  78. data/amber/st/SUnit.st +186 -14
  79. data/bin/resin +6 -0
  80. data/lib/resin/cli.rb +19 -0
  81. metadata +41 -25
  82. data/amber/js/lib/peg-0.6.2.min.js +0 -2
  83. data/bin/resin-compile +0 -6
  84. data/bin/runresin +0 -12
@@ -1,6 +1,4 @@
1
- smalltalk.init(smalltalk.Object); //metaclasses are in through Class
2
- smalltalk.classes()._do_(function(each) {
3
- each._initialize()});
1
+ smalltalk.initialize();
4
2
 
5
3
  /* Similar to jQuery(document).ready() */
6
4
 
@@ -80,6 +80,7 @@
80
80
  word-wrap: normal;
81
81
  line-height: inherit;
82
82
  color: inherit;
83
+ overflow: visible;
83
84
  }
84
85
 
85
86
  .CodeMirror-wrap pre {
@@ -152,6 +153,8 @@ div.CodeMirror-selected { background: #d9d9d9; }
152
153
  .cm-s-default span.cm-quote {color: #090;}
153
154
  .cm-s-default span.cm-hr {color: #999;}
154
155
  .cm-s-default span.cm-link {color: #00c;}
156
+ span.cm-negative {color: #d44;}
157
+ span.cm-positive {color: #292;}
155
158
 
156
159
  span.cm-header, span.cm-strong {font-weight: bold;}
157
160
  span.cm-em {font-style: italic;}
@@ -1,4 +1,4 @@
1
- // CodeMirror version 2.34
1
+ // CodeMirror version 2.37
2
2
 
3
3
  // All functions that need access to the editor's state live inside
4
4
  // the CodeMirror function. Below that, at the bottom of the file,
@@ -77,7 +77,7 @@ window.CodeMirror = (function() {
77
77
  // Selection-related flags. shiftSelecting obviously tracks
78
78
  // whether the user is holding shift.
79
79
  var shiftSelecting, lastClick, lastDoubleClick, lastScrollTop = 0, draggingText,
80
- overwrite = false, suppressEdits = false;
80
+ overwrite = false, suppressEdits = false, pasteIncoming = false;
81
81
  // Variables used by startOperation/endOperation to track what
82
82
  // happened during the operation.
83
83
  var updateInput, userSelChange, changes, textChanged, selectionChanged,
@@ -130,7 +130,7 @@ window.CodeMirror = (function() {
130
130
  connect(scroller, "drop", operation(onDrop));
131
131
  }
132
132
  connect(scroller, "paste", function(){focusInput(); fastPoll();});
133
- connect(input, "paste", fastPoll);
133
+ connect(input, "paste", function(){pasteIncoming = true; fastPoll();});
134
134
  connect(input, "cut", operation(function(){
135
135
  if (!options.readOnly) replaceSelection("");
136
136
  }));
@@ -169,6 +169,8 @@ window.CodeMirror = (function() {
169
169
  else if (option == "lineWrapping" && oldVal != value) operation(wrappingChanged)();
170
170
  else if (option == "tabSize") updateDisplay(true);
171
171
  else if (option == "keyMap") keyMapChanged();
172
+ else if (option == "tabindex") input.tabIndex = value;
173
+ else if (option == "showCursorWhenSelecting") updateSelection();
172
174
  if (option == "lineNumbers" || option == "gutter" || option == "firstLineNumber" ||
173
175
  option == "theme" || option == "lineNumberFormatter") {
174
176
  gutterChanged();
@@ -231,6 +233,7 @@ window.CodeMirror = (function() {
231
233
  var off = eltOffset(lineSpace);
232
234
  return coordsChar(coords.x - off.left, coords.y - off.top);
233
235
  },
236
+ defaultTextHeight: function() { return textHeight(); },
234
237
  markText: operation(markText),
235
238
  setBookmark: setBookmark,
236
239
  findMarksAt: findMarksAt,
@@ -280,7 +283,9 @@ window.CodeMirror = (function() {
280
283
  lineCount: function() {return doc.size;},
281
284
  clipPos: clipPos,
282
285
  getCursor: function(start) {
283
- if (start == null) start = sel.inverted;
286
+ if (start == null || start == "head") start = sel.inverted;
287
+ if (start == "anchor") start = !sel.inverted;
288
+ if (start == "end") start = false;
284
289
  return copyPos(start ? sel.from : sel.to);
285
290
  },
286
291
  somethingSelected: function() {return !posEq(sel.from, sel.to);},
@@ -345,6 +350,11 @@ window.CodeMirror = (function() {
345
350
  return {x: scroller.scrollLeft, y: scrollbar.scrollTop,
346
351
  height: scrollbar.scrollHeight, width: scroller.scrollWidth};
347
352
  },
353
+ scrollIntoView: function(pos) {
354
+ var coords = localCoords(pos ? clipPos(pos) : sel.inverted ? sel.from : sel.to);
355
+ scrollIntoView(coords.x, coords.y, coords.x, coords.yBot);
356
+ },
357
+
348
358
  setSize: function(width, height) {
349
359
  function interpret(val) {
350
360
  val = String(val);
@@ -394,7 +404,7 @@ window.CodeMirror = (function() {
394
404
  }
395
405
 
396
406
  function onScrollBar(e) {
397
- if (scrollbar.scrollTop != lastScrollTop) {
407
+ if (Math.abs(scrollbar.scrollTop - lastScrollTop) > 1) {
398
408
  lastScrollTop = scroller.scrollTop = scrollbar.scrollTop;
399
409
  updateDisplay([]);
400
410
  }
@@ -403,7 +413,7 @@ window.CodeMirror = (function() {
403
413
  function onScrollMain(e) {
404
414
  if (options.fixedGutter && gutter.style.left != scroller.scrollLeft + "px")
405
415
  gutter.style.left = scroller.scrollLeft + "px";
406
- if (scroller.scrollTop != lastScrollTop) {
416
+ if (Math.abs(scroller.scrollTop - lastScrollTop) > 1) {
407
417
  lastScrollTop = scroller.scrollTop;
408
418
  if (scrollbar.scrollTop != lastScrollTop)
409
419
  scrollbar.scrollTop = lastScrollTop;
@@ -488,8 +498,12 @@ window.CodeMirror = (function() {
488
498
 
489
499
  function doSelect(cur) {
490
500
  if (type == "single") {
491
- setSelectionUser(start, cur);
492
- } else if (type == "double") {
501
+ setSelectionUser(clipPos(start), cur);
502
+ return;
503
+ }
504
+ startstart = clipPos(startstart);
505
+ startend = clipPos(startend);
506
+ if (type == "double") {
493
507
  var word = findWordAt(cur);
494
508
  if (posLess(cur, startstart)) setSelectionUser(word.from, startend);
495
509
  else setSelectionUser(startstart, word.to);
@@ -614,7 +628,6 @@ window.CodeMirror = (function() {
614
628
  }, 50);
615
629
 
616
630
  var name = keyNames[e_prop(e, "keyCode")], handled = false;
617
- var flipCtrlCmd = opera && mac;
618
631
  if (name == null || e.altGraphKey) return false;
619
632
  if (e_prop(e, "altKey")) name = "Alt-" + name;
620
633
  if (e_prop(e, flipCtrlCmd ? "metaKey" : "ctrlKey")) name = "Ctrl-" + name;
@@ -636,7 +649,7 @@ window.CodeMirror = (function() {
636
649
  if (handled) {
637
650
  e_preventDefault(e);
638
651
  restartBlink();
639
- if (ie) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
652
+ if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
640
653
  }
641
654
  return handled;
642
655
  }
@@ -956,12 +969,13 @@ window.CodeMirror = (function() {
956
969
  while (same < l && prevInput[same] == text[same]) ++same;
957
970
  if (same < prevInput.length)
958
971
  sel.from = {line: sel.from.line, ch: sel.from.ch - (prevInput.length - same)};
959
- else if (overwrite && posEq(sel.from, sel.to))
972
+ else if (overwrite && posEq(sel.from, sel.to) && !pasteIncoming)
960
973
  sel.to = {line: sel.to.line, ch: Math.min(getLine(sel.to.line).text.length, sel.to.ch + (text.length - same))};
961
974
  replaceSelection(text.slice(same), "end");
962
975
  if (text.length > 1000) { input.value = prevInput = ""; }
963
976
  else prevInput = text;
964
977
  if (!nestedOperation) endOperation();
978
+ pasteIncoming = false;
965
979
  return true;
966
980
  }
967
981
  function resetInput(user) {
@@ -973,7 +987,8 @@ window.CodeMirror = (function() {
973
987
  }
974
988
 
975
989
  function focusInput() {
976
- if (options.readOnly != "nocursor") input.focus();
990
+ if (options.readOnly != "nocursor" && (ie_lt9 || document.activeElement != input))
991
+ input.focus();
977
992
  }
978
993
 
979
994
  function scrollCursorIntoView() {
@@ -1238,18 +1253,20 @@ window.CodeMirror = (function() {
1238
1253
  var wrapOff = eltOffset(wrapper), lineOff = eltOffset(lineDiv);
1239
1254
  inputDiv.style.top = Math.max(0, Math.min(scroller.offsetHeight, headPos.y + lineOff.top - wrapOff.top)) + "px";
1240
1255
  inputDiv.style.left = Math.max(0, Math.min(scroller.offsetWidth, headPos.x + lineOff.left - wrapOff.left)) + "px";
1241
- if (collapsed) {
1256
+ if (collapsed || options.showCursorWhenSelecting) {
1242
1257
  cursor.style.top = headPos.y + "px";
1243
1258
  cursor.style.left = (options.lineWrapping ? Math.min(headPos.x, lineSpace.offsetWidth) : headPos.x) + "px";
1244
1259
  cursor.style.display = "";
1245
- selectionDiv.style.display = "none";
1246
1260
  } else {
1261
+ cursor.style.display = "none";
1262
+ }
1263
+ if (!collapsed) {
1247
1264
  var sameLine = fromPos.y == toPos.y, fragment = document.createDocumentFragment();
1248
1265
  var clientWidth = lineSpace.clientWidth || lineSpace.offsetWidth;
1249
1266
  var clientHeight = lineSpace.clientHeight || lineSpace.offsetHeight;
1250
1267
  var add = function(left, top, right, height) {
1251
1268
  var rstyle = quirksMode ? "width: " + (!right ? clientWidth : clientWidth - right - left) + "px"
1252
- : "right: " + right + "px";
1269
+ : "right: " + (right - 1) + "px";
1253
1270
  fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
1254
1271
  "px; top: " + top + "px; " + rstyle + "; height: " + height + "px"));
1255
1272
  };
@@ -1264,8 +1281,9 @@ window.CodeMirror = (function() {
1264
1281
  if ((!sameLine || !sel.from.ch) && toPos.y < clientHeight - .5 * th)
1265
1282
  add(0, toPos.y, clientWidth - toPos.x, th);
1266
1283
  removeChildrenAndAdd(selectionDiv, fragment);
1267
- cursor.style.display = "none";
1268
1284
  selectionDiv.style.display = "";
1285
+ } else {
1286
+ selectionDiv.style.display = "none";
1269
1287
  }
1270
1288
  }
1271
1289
 
@@ -1418,7 +1436,7 @@ window.CodeMirror = (function() {
1418
1436
  var startChar = line.charAt(start);
1419
1437
  var check = isWordChar(startChar) ? isWordChar :
1420
1438
  /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} :
1421
- function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
1439
+ function(ch) {return !/\s/.test(ch) && isWordChar(ch);};
1422
1440
  while (start > 0 && check(line.charAt(start - 1))) --start;
1423
1441
  while (end < line.length && check(line.charAt(end))) ++end;
1424
1442
  }
@@ -1462,6 +1480,7 @@ window.CodeMirror = (function() {
1462
1480
 
1463
1481
  if (indentString != curSpaceString)
1464
1482
  replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length});
1483
+ line.stateAfter = null;
1465
1484
  }
1466
1485
 
1467
1486
  function loadMode() {
@@ -1507,18 +1526,17 @@ window.CodeMirror = (function() {
1507
1526
 
1508
1527
  function TextMarker(type, style) { this.lines = []; this.type = type; if (style) this.style = style; }
1509
1528
  TextMarker.prototype.clear = operation(function() {
1510
- var min = Infinity, max = -Infinity;
1529
+ var min, max;
1511
1530
  for (var i = 0; i < this.lines.length; ++i) {
1512
1531
  var line = this.lines[i];
1513
- var span = getMarkedSpanFor(line.markedSpans, this, true);
1514
- if (span.from != null || span.to != null) {
1515
- var lineN = lineNo(line);
1516
- min = Math.min(min, lineN); max = Math.max(max, lineN);
1517
- }
1532
+ var span = getMarkedSpanFor(line.markedSpans, this);
1533
+ if (span.from != null) min = lineNo(line);
1534
+ if (span.to != null) max = lineNo(line);
1535
+ line.markedSpans = removeMarkedSpan(line.markedSpans, span);
1518
1536
  }
1519
- if (min != Infinity)
1520
- changes.push({from: min, to: max + 1});
1537
+ if (min != null) changes.push({from: min, to: max + 1});
1521
1538
  this.lines.length = 0;
1539
+ this.explicitlyCleared = true;
1522
1540
  });
1523
1541
  TextMarker.prototype.find = function() {
1524
1542
  var from, to;
@@ -1545,7 +1563,7 @@ window.CodeMirror = (function() {
1545
1563
  var span = {from: curLine == from.line ? from.ch : null,
1546
1564
  to: curLine == to.line ? to.ch : null,
1547
1565
  marker: marker};
1548
- (line.markedSpans || (line.markedSpans = [])).push(span);
1566
+ line.markedSpans = (line.markedSpans || []).concat([span]);
1549
1567
  marker.lines.push(line);
1550
1568
  ++curLine;
1551
1569
  });
@@ -1556,8 +1574,9 @@ window.CodeMirror = (function() {
1556
1574
  function setBookmark(pos) {
1557
1575
  pos = clipPos(pos);
1558
1576
  var marker = new TextMarker("bookmark"), line = getLine(pos.line);
1577
+ history.addChange(pos.line, 1, [newHL(line.text, line.markedSpans)], true);
1559
1578
  var span = {from: pos.ch, to: pos.ch, marker: marker};
1560
- (line.markedSpans || (line.markedSpans = [])).push(span);
1579
+ line.markedSpans = (line.markedSpans || []).concat([span]);
1561
1580
  marker.lines.push(line);
1562
1581
  return marker;
1563
1582
  }
@@ -1646,8 +1665,6 @@ window.CodeMirror = (function() {
1646
1665
 
1647
1666
  function measureLine(line, ch) {
1648
1667
  if (ch == 0) return {top: 0, left: 0};
1649
- var wbr = options.lineWrapping && ch < line.text.length &&
1650
- spanAffectsWrapping.test(line.text.slice(ch - 1, ch + 1));
1651
1668
  var pre = lineContent(line, ch);
1652
1669
  removeChildrenAndAdd(measure, pre);
1653
1670
  var anchor = pre.anchor;
@@ -1980,6 +1997,7 @@ window.CodeMirror = (function() {
1980
1997
  if (extensions.propertyIsEnumerable(ext) &&
1981
1998
  !instance.propertyIsEnumerable(ext))
1982
1999
  instance[ext] = extensions[ext];
2000
+ for (var i = 0; i < initHooks.length; ++i) initHooks[i](instance);
1983
2001
  return instance;
1984
2002
  } // (end of function CodeMirror)
1985
2003
 
@@ -2003,6 +2021,7 @@ window.CodeMirror = (function() {
2003
2021
  gutter: false,
2004
2022
  fixedGutter: false,
2005
2023
  firstLineNumber: 1,
2024
+ showCursorWhenSelecting: false,
2006
2025
  readOnly: false,
2007
2026
  dragDrop: true,
2008
2027
  onChange: null,
@@ -2054,7 +2073,11 @@ window.CodeMirror = (function() {
2054
2073
  var modeObj = mfactory(options, spec);
2055
2074
  if (modeExtensions.hasOwnProperty(spec.name)) {
2056
2075
  var exts = modeExtensions[spec.name];
2057
- for (var prop in exts) if (exts.hasOwnProperty(prop)) modeObj[prop] = exts[prop];
2076
+ for (var prop in exts) {
2077
+ if (!exts.hasOwnProperty(prop)) continue;
2078
+ if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];
2079
+ modeObj[prop] = exts[prop];
2080
+ }
2058
2081
  }
2059
2082
  modeObj.name = spec.name;
2060
2083
  return modeObj;
@@ -2077,6 +2100,9 @@ window.CodeMirror = (function() {
2077
2100
  extensions[name] = func;
2078
2101
  };
2079
2102
 
2103
+ var initHooks = [];
2104
+ CodeMirror.defineInitHook = function(f) {initHooks.push(f);};
2105
+
2080
2106
  var modeExtensions = CodeMirror.modeExtensions = {};
2081
2107
  CodeMirror.extendMode = function(mode, properties) {
2082
2108
  var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
@@ -2169,7 +2195,7 @@ window.CodeMirror = (function() {
2169
2195
  keyMap.emacsy = {
2170
2196
  "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
2171
2197
  "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
2172
- "Ctrl-V": "goPageUp", "Shift-Ctrl-V": "goPageDown", "Ctrl-D": "delCharRight", "Ctrl-H": "delCharLeft",
2198
+ "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharRight", "Ctrl-H": "delCharLeft",
2173
2199
  "Alt-D": "delWordRight", "Alt-Backspace": "delWordLeft", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
2174
2200
  };
2175
2201
 
@@ -2206,6 +2232,7 @@ window.CodeMirror = (function() {
2206
2232
  var name = keyNames[e_prop(event, "keyCode")];
2207
2233
  return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
2208
2234
  }
2235
+ CodeMirror.isModifierKey = isModifierKey;
2209
2236
 
2210
2237
  CodeMirror.fromTextArea = function(textarea, options) {
2211
2238
  if (!options) options = {};
@@ -2226,15 +2253,13 @@ window.CodeMirror = (function() {
2226
2253
  if (textarea.form) {
2227
2254
  // Deplorable hack to make the submit method do the right thing.
2228
2255
  var rmSubmit = connect(textarea.form, "submit", save, true);
2229
- if (typeof textarea.form.submit == "function") {
2230
- var realSubmit = textarea.form.submit;
2231
- textarea.form.submit = function wrappedSubmit() {
2232
- save();
2233
- textarea.form.submit = realSubmit;
2234
- textarea.form.submit();
2235
- textarea.form.submit = wrappedSubmit;
2236
- };
2237
- }
2256
+ var form = textarea.form, realSubmit = form.submit;
2257
+ textarea.form.submit = function wrappedSubmit() {
2258
+ save();
2259
+ form.submit = realSubmit;
2260
+ form.submit();
2261
+ form.submit = wrappedSubmit;
2262
+ };
2238
2263
  }
2239
2264
 
2240
2265
  textarea.style.display = "none";
@@ -2256,18 +2281,24 @@ window.CodeMirror = (function() {
2256
2281
  return instance;
2257
2282
  };
2258
2283
 
2259
- var gecko = /gecko\/\d{7}/i.test(navigator.userAgent);
2284
+ var gecko = /gecko\/\d/i.test(navigator.userAgent);
2260
2285
  var ie = /MSIE \d/.test(navigator.userAgent);
2261
2286
  var ie_lt8 = /MSIE [1-7]\b/.test(navigator.userAgent);
2262
2287
  var ie_lt9 = /MSIE [1-8]\b/.test(navigator.userAgent);
2263
2288
  var quirksMode = ie && document.documentMode == 5;
2264
2289
  var webkit = /WebKit\//.test(navigator.userAgent);
2290
+ var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent);
2265
2291
  var chrome = /Chrome\//.test(navigator.userAgent);
2266
2292
  var opera = /Opera\//.test(navigator.userAgent);
2267
2293
  var safari = /Apple Computer/.test(navigator.vendor);
2268
2294
  var khtml = /KHTML\//.test(navigator.userAgent);
2269
2295
  var mac_geLion = /Mac OS X 10\D([7-9]|\d\d)\D/.test(navigator.userAgent);
2270
2296
 
2297
+ var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/);
2298
+ if (opera_version) opera_version = Number(opera_version[1]);
2299
+ // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
2300
+ var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11));
2301
+
2271
2302
  // Utility functions for working with state. Exported because modes
2272
2303
  // sometimes need to do this.
2273
2304
  function copyState(mode, state) {
@@ -2355,16 +2386,20 @@ window.CodeMirror = (function() {
2355
2386
  this.from = from; this.to = to; this.marker = marker;
2356
2387
  }
2357
2388
 
2358
- function getMarkedSpanFor(spans, marker, del) {
2389
+ function getMarkedSpanFor(spans, marker) {
2359
2390
  if (spans) for (var i = 0; i < spans.length; ++i) {
2360
2391
  var span = spans[i];
2361
- if (span.marker == marker) {
2362
- if (del) spans.splice(i, 1);
2363
- return span;
2364
- }
2392
+ if (span.marker == marker) return span;
2365
2393
  }
2366
2394
  }
2367
2395
 
2396
+ function removeMarkedSpan(spans, span) {
2397
+ var r;
2398
+ for (var i = 0; i < spans.length; ++i)
2399
+ if (spans[i] != span) (r || (r = [])).push(spans[i]);
2400
+ return r;
2401
+ }
2402
+
2368
2403
  function markedSpansBefore(old, startCh, endCh) {
2369
2404
  if (old) for (var i = 0, nw; i < old.length; ++i) {
2370
2405
  var span = old[i], marker = span.marker;
@@ -2448,7 +2483,15 @@ window.CodeMirror = (function() {
2448
2483
  // hl stands for history-line, a data structure that can be either a
2449
2484
  // string (line without markers) or a {text, markedSpans} object.
2450
2485
  function hlText(val) { return typeof val == "string" ? val : val.text; }
2451
- function hlSpans(val) { return typeof val == "string" ? null : val.markedSpans; }
2486
+ function hlSpans(val) {
2487
+ if (typeof val == "string") return null;
2488
+ var spans = val.markedSpans, out = null;
2489
+ for (var i = 0; i < spans.length; ++i) {
2490
+ if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }
2491
+ else if (out) out.push(spans[i]);
2492
+ }
2493
+ return !out ? spans : out.length ? out : null;
2494
+ }
2452
2495
  function newHL(text, spans) { return spans ? {text: text, markedSpans: spans} : text; }
2453
2496
 
2454
2497
  function detachMarkedSpans(line) {
@@ -2584,13 +2627,17 @@ window.CodeMirror = (function() {
2584
2627
  span = function(html, text, style) {
2585
2628
  var l = text.length;
2586
2629
  if (wrapAt >= outPos && wrapAt < outPos + l) {
2587
- if (wrapAt > outPos) {
2588
- span_(html, text.slice(0, wrapAt - outPos), style);
2630
+ var cut = wrapAt - outPos;
2631
+ if (cut) {
2632
+ span_(html, text.slice(0, cut), style);
2589
2633
  // See comment at the definition of spanAffectsWrapping
2590
- if (compensateForWrapping) html.appendChild(elt("wbr"));
2634
+ if (compensateForWrapping) {
2635
+ var view = text.slice(cut - 1, cut + 1);
2636
+ if (spanAffectsWrapping.test(view)) html.appendChild(elt("wbr"));
2637
+ else if (!ie_lt8 && /\w\w/.test(view)) html.appendChild(document.createTextNode("\u200d"));
2638
+ }
2591
2639
  }
2592
2640
  html.appendChild(anchor);
2593
- var cut = wrapAt - outPos;
2594
2641
  span_(anchor, opera ? text.slice(cut, cut + 1) : text.slice(cut), style);
2595
2642
  if (opera) span_(html, text.slice(cut + 1), style);
2596
2643
  wrapAt--;
@@ -2820,7 +2867,7 @@ window.CodeMirror = (function() {
2820
2867
  if (line.parent == null) return null;
2821
2868
  var cur = line.parent, no = indexOf(cur.lines, line);
2822
2869
  for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
2823
- for (var i = 0, e = chunk.children.length; ; ++i) {
2870
+ for (var i = 0; ; ++i) {
2824
2871
  if (chunk.children[i] == cur) break;
2825
2872
  no += chunk.children[i].chunkSize();
2826
2873
  }
@@ -2874,7 +2921,7 @@ window.CodeMirror = (function() {
2874
2921
  var time = +new Date, cur = lst(this.done), last = cur && lst(cur);
2875
2922
  var dtime = time - this.time;
2876
2923
 
2877
- if (this.compound && cur && !this.closed) {
2924
+ if (cur && !this.closed && this.compound) {
2878
2925
  cur.push({start: start, added: added, old: old});
2879
2926
  } else if (dtime > 400 || !last || this.closed ||
2880
2927
  last.start > start + old.length || last.start + last.added < start) {
@@ -3080,8 +3127,10 @@ window.CodeMirror = (function() {
3080
3127
  if (collection[i] == elt) return i;
3081
3128
  return -1;
3082
3129
  }
3130
+ var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc]/;
3083
3131
  function isWordChar(ch) {
3084
- return /\w/.test(ch) || ch.toUpperCase() != ch.toLowerCase();
3132
+ return /\w/.test(ch) || ch > "\x80" &&
3133
+ (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
3085
3134
  }
3086
3135
 
3087
3136
  // See if "".split is the broken IE version, if so, provide an
@@ -3137,7 +3186,7 @@ window.CodeMirror = (function() {
3137
3186
  for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
3138
3187
  })();
3139
3188
 
3140
- CodeMirror.version = "2.34";
3189
+ CodeMirror.version = "2.37";
3141
3190
 
3142
3191
  return CodeMirror;
3143
3192
  })();