codemirror-rails 5.6 → 5.7

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 (25) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +30 -17
  4. data/vendor/assets/javascripts/codemirror/addons/display/placeholder.js +3 -1
  5. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +10 -0
  6. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +21 -3
  7. data/vendor/assets/javascripts/codemirror/addons/search/search.js +29 -14
  8. data/vendor/assets/javascripts/codemirror/keymaps/sublime.js +11 -3
  9. data/vendor/assets/javascripts/codemirror/modes/clike.js +15 -0
  10. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +14 -17
  11. data/vendor/assets/javascripts/codemirror/modes/css.js +66 -15
  12. data/vendor/assets/javascripts/codemirror/modes/elm.js +1 -1
  13. data/vendor/assets/javascripts/codemirror/modes/gfm.js +23 -17
  14. data/vendor/assets/javascripts/codemirror/modes/haxe.js +68 -80
  15. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +125 -96
  16. data/vendor/assets/javascripts/codemirror/modes/javascript.js +14 -5
  17. data/vendor/assets/javascripts/codemirror/modes/markdown.js +40 -29
  18. data/vendor/assets/javascripts/codemirror/modes/mscgen.js +169 -0
  19. data/vendor/assets/javascripts/codemirror/modes/oz.js +252 -0
  20. data/vendor/assets/javascripts/codemirror/modes/php.js +6 -3
  21. data/vendor/assets/javascripts/codemirror/modes/ruby.js +1 -1
  22. data/vendor/assets/javascripts/codemirror/modes/vhdl.js +1 -1
  23. data/vendor/assets/javascripts/codemirror/modes/vue.js +69 -0
  24. data/vendor/assets/stylesheets/codemirror/themes/icecoder.css +1 -0
  25. metadata +6 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 95aed5d670b225a60a9b6fe42757c35fc4f2e57e
4
- data.tar.gz: d016c556fb97792a9a7e5006c8b9e4e829cc8605
3
+ metadata.gz: a5b46bf2cc4d84c5328446d21e4413549fd7c9ac
4
+ data.tar.gz: 88eb7a4719bf7581129e309f5c95878abd1e2938
5
5
  SHA512:
6
- metadata.gz: 3fb0a350ed05a56863602cd6b7a140c04357358d428f19b0579b101b12d335cbc76e1672768bdce2750a66f92bafb79d74720828361f1ebfb9cced0c72f77419
7
- data.tar.gz: 5e7b240ff00353319fdb8e790ee58036ad32ddbd6f91b2e5de6b8cfb156dfbd053589fbd0da523a4d2037422029515701ffdb8d6a78754e01986b085f1926ebc
6
+ metadata.gz: 8ae50e29d8a8dd42eb29b620cf3a24634051bdff92b18ef65d4b7b3c2806f1e1cf6f87bced7b7564af06f96acd18b7964f35b3929825052d8467cffa24bfb48f
7
+ data.tar.gz: 3edf6831421146808b87717e34636a3bfa5d468cf90393802a853205368057e2417fa29d8c336dabedee41aa24b65ed0eb1ba3fca22bc9e0864667b67ce8e0bc
@@ -1,6 +1,6 @@
1
1
  module Codemirror
2
2
  module Rails
3
- VERSION = '5.6'
4
- CODEMIRROR_VERSION = '5.6'
3
+ VERSION = '5.7'
4
+ CODEMIRROR_VERSION = '5.7'
5
5
  end
6
6
  end
@@ -1285,6 +1285,7 @@
1285
1285
 
1286
1286
  on(te, "compositionstart", function() {
1287
1287
  var start = cm.getCursor("from");
1288
+ if (input.composing) input.composing.range.clear()
1288
1289
  input.composing = {
1289
1290
  start: start,
1290
1291
  range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"})
@@ -1533,6 +1534,10 @@
1533
1534
  }
1534
1535
  },
1535
1536
 
1537
+ readOnlyChanged: function(val) {
1538
+ if (!val) this.reset();
1539
+ },
1540
+
1536
1541
  setUneditable: nothing,
1537
1542
 
1538
1543
  needsContentAttribute: false
@@ -1551,7 +1556,6 @@
1551
1556
  init: function(display) {
1552
1557
  var input = this, cm = input.cm;
1553
1558
  var div = input.div = display.lineDiv;
1554
- div.contentEditable = "true";
1555
1559
  disableBrowserMagic(div);
1556
1560
 
1557
1561
  on(div, "paste", function(e) { handlePaste(e, cm); })
@@ -1592,7 +1596,7 @@
1592
1596
 
1593
1597
  on(div, "input", function() {
1594
1598
  if (input.composing) return;
1595
- if (!input.pollContent())
1599
+ if (isReadOnly(cm) || !input.pollContent())
1596
1600
  runInOp(input.cm, function() {regChange(cm);});
1597
1601
  });
1598
1602
 
@@ -1817,17 +1821,24 @@
1817
1821
  this.div.focus();
1818
1822
  },
1819
1823
  applyComposition: function(composing) {
1820
- if (composing.data && composing.data != composing.startData)
1824
+ if (isReadOnly(this.cm))
1825
+ operation(this.cm, regChange)(this.cm)
1826
+ else if (composing.data && composing.data != composing.startData)
1821
1827
  operation(this.cm, applyTextInput)(this.cm, composing.data, 0, composing.sel);
1822
1828
  },
1823
1829
 
1824
1830
  setUneditable: function(node) {
1825
- node.setAttribute("contenteditable", "false");
1831
+ node.contentEditable = "false"
1826
1832
  },
1827
1833
 
1828
1834
  onKeyPress: function(e) {
1829
1835
  e.preventDefault();
1830
- operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0);
1836
+ if (!isReadOnly(this.cm))
1837
+ operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0);
1838
+ },
1839
+
1840
+ readOnlyChanged: function(val) {
1841
+ this.div.contentEditable = String(val != "nocursor")
1831
1842
  },
1832
1843
 
1833
1844
  onContextMenu: nothing,
@@ -5388,8 +5399,8 @@
5388
5399
  cm.display.disabled = true;
5389
5400
  } else {
5390
5401
  cm.display.disabled = false;
5391
- if (!val) cm.display.input.reset();
5392
5402
  }
5403
+ cm.display.input.readOnlyChanged(val)
5393
5404
  });
5394
5405
  option("disableInput", false, function(cm, val) {if (!val) cm.display.input.reset();}, true);
5395
5406
  option("dragDrop", true, dragDropChanged);
@@ -6952,7 +6963,7 @@
6952
6963
  txt.setAttribute("cm-text", "\t");
6953
6964
  builder.col += tabWidth;
6954
6965
  } else if (m[0] == "\r" || m[0] == "\n") {
6955
- var txt = content.appendChild(elt("span", m[0] == "\r" ? "" : "", "cm-invalidchar"));
6966
+ var txt = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
6956
6967
  txt.setAttribute("cm-text", m[0]);
6957
6968
  builder.col += 1;
6958
6969
  } else {
@@ -8211,7 +8222,7 @@
8211
8222
 
8212
8223
  // The inverse of countColumn -- find the offset that corresponds to
8213
8224
  // a particular column.
8214
- function findColumn(string, goal, tabSize) {
8225
+ var findColumn = CodeMirror.findColumn = function(string, goal, tabSize) {
8215
8226
  for (var pos = 0, col = 0;;) {
8216
8227
  var nextTab = string.indexOf("\t", pos);
8217
8228
  if (nextTab == -1) nextTab = string.length;
@@ -8504,14 +8515,16 @@
8504
8515
 
8505
8516
  // KEY NAMES
8506
8517
 
8507
- var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
8508
- 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
8509
- 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
8510
- 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", 107: "=", 109: "-", 127: "Delete",
8511
- 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
8512
- 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
8513
- 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"};
8514
- CodeMirror.keyNames = keyNames;
8518
+ var keyNames = CodeMirror.keyNames = {
8519
+ 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
8520
+ 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
8521
+ 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
8522
+ 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod",
8523
+ 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete",
8524
+ 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
8525
+ 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
8526
+ 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
8527
+ };
8515
8528
  (function() {
8516
8529
  // Number keys
8517
8530
  for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);
@@ -8816,7 +8829,7 @@
8816
8829
 
8817
8830
  // THE END
8818
8831
 
8819
- CodeMirror.version = "5.6.0";
8832
+ CodeMirror.version = "5.7.0";
8820
8833
 
8821
8834
  return CodeMirror;
8822
8835
  });
@@ -37,7 +37,9 @@
37
37
  var elt = cm.state.placeholder = document.createElement("pre");
38
38
  elt.style.cssText = "height: 0; overflow: visible";
39
39
  elt.className = "CodeMirror-placeholder";
40
- elt.appendChild(document.createTextNode(cm.getOption("placeholder")));
40
+ var placeHolder = cm.getOption("placeholder")
41
+ if (typeof placeHolder == "string") placeHolder = document.createTextNode(placeHolder)
42
+ elt.appendChild(placeHolder)
41
43
  cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);
42
44
  }
43
45
 
@@ -90,6 +90,12 @@
90
90
  });
91
91
  }
92
92
 
93
+ function contractSelection(sel) {
94
+ var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;
95
+ return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),
96
+ head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))};
97
+ }
98
+
93
99
  function handleChar(cm, ch) {
94
100
  var conf = getConfig(cm);
95
101
  if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
@@ -145,6 +151,10 @@
145
151
  for (var i = 0; i < sels.length; i++)
146
152
  sels[i] = left + sels[i] + right;
147
153
  cm.replaceSelections(sels, "around");
154
+ sels = cm.listSelections().slice();
155
+ for (var i = 0; i < sels.length; i++)
156
+ sels[i] = contractSelection(sels[i]);
157
+ cm.setSelections(sels);
148
158
  } else if (type == "both") {
149
159
  cm.replaceSelection(left + right, null);
150
160
  cm.triggerElectric(left + right);
@@ -61,6 +61,7 @@
61
61
  this.timeout = null;
62
62
  this.hasGutter = hasGutter;
63
63
  this.onMouseOver = function(e) { onMouseOver(cm, e); };
64
+ this.waitingFor = 0
64
65
  }
65
66
 
66
67
  function parseOptions(_cm, options) {
@@ -115,15 +116,32 @@
115
116
  return tip;
116
117
  }
117
118
 
119
+ function lintAsync(cm, getAnnotations, passOptions) {
120
+ var state = cm.state.lint
121
+ var id = ++state.waitingFor
122
+ function abort() {
123
+ id = -1
124
+ cm.off("change", abort)
125
+ }
126
+ cm.on("change", abort)
127
+ getAnnotations(cm.getValue(), function(annotations, arg2) {
128
+ cm.off("change", abort)
129
+ if (state.waitingFor != id) return
130
+ if (arg2 && annotations instanceof CodeMirror) annotations = arg2
131
+ updateLinting(cm, annotations)
132
+ }, passOptions, cm);
133
+ }
134
+
118
135
  function startLinting(cm) {
119
136
  var state = cm.state.lint, options = state.options;
120
137
  var passOptions = options.options || options; // Support deprecated passing of `options` property in options
121
138
  var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint");
122
139
  if (!getAnnotations) return;
123
- if (options.async || getAnnotations.async)
124
- getAnnotations(cm.getValue(), updateLinting, passOptions, cm);
125
- else
140
+ if (options.async || getAnnotations.async) {
141
+ lintAsync(cm, getAnnotations, passOptions)
142
+ } else {
126
143
  updateLinting(cm, getAnnotations(cm.getValue(), passOptions, cm));
144
+ }
127
145
  }
128
146
 
129
147
  function updateLinting(cm, annotationsNotSorted) {
@@ -117,11 +117,19 @@
117
117
  if (state.query) return findNext(cm, rev);
118
118
  var q = cm.getSelection() || state.lastQuery;
119
119
  if (persistent && cm.openDialog) {
120
+ var hiding = null
120
121
  persistentDialog(cm, queryDialog, q, function(query, event) {
121
122
  CodeMirror.e_stop(event);
122
123
  if (!query) return;
123
124
  if (query != state.queryText) startSearch(cm, state, query);
124
- findNext(cm, event.shiftKey);
125
+ if (hiding) hiding.style.opacity = 1
126
+ findNext(cm, event.shiftKey, function(_, to) {
127
+ var dialog
128
+ if (to.line < 3 && document.querySelector &&
129
+ (dialog = cm.display.wrapper.querySelector(".CodeMirror-dialog")) &&
130
+ dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, "window").top)
131
+ (hiding = dialog).style.opacity = .4
132
+ })
125
133
  });
126
134
  } else {
127
135
  dialog(cm, queryDialog, "Search for:", q, function(query) {
@@ -134,7 +142,7 @@
134
142
  }
135
143
  }
136
144
 
137
- function findNext(cm, rev) {cm.operation(function() {
145
+ function findNext(cm, rev, callback) {cm.operation(function() {
138
146
  var state = getSearchState(cm);
139
147
  var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);
140
148
  if (!cursor.find(rev)) {
@@ -144,6 +152,7 @@
144
152
  cm.setSelection(cursor.from(), cursor.to());
145
153
  cm.scrollIntoView({from: cursor.from(), to: cursor.to()}, 20);
146
154
  state.posFrom = cursor.from(); state.posTo = cursor.to();
155
+ if (callback) callback(cursor.from(), cursor.to())
147
156
  });}
148
157
 
149
158
  function clearSearch(cm) {cm.operation(function() {
@@ -156,27 +165,32 @@
156
165
  });}
157
166
 
158
167
  var replaceQueryDialog =
159
- 'Replace: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>';
168
+ ' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>';
160
169
  var replacementQueryDialog = 'With: <input type="text" style="width: 10em" class="CodeMirror-search-field"/>';
161
- var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
170
+ var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>All</button> <button>Stop</button>";
171
+
172
+ function replaceAll(cm, query, text) {
173
+ cm.operation(function() {
174
+ for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
175
+ if (typeof query != "string") {
176
+ var match = cm.getRange(cursor.from(), cursor.to()).match(query);
177
+ cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];}));
178
+ } else cursor.replace(text);
179
+ }
180
+ });
181
+ }
162
182
 
163
183
  function replace(cm, all) {
164
184
  if (cm.getOption("readOnly")) return;
165
185
  var query = cm.getSelection() || getSearchState(cm).lastQuery;
166
- dialog(cm, replaceQueryDialog, "Replace:", query, function(query) {
186
+ var dialogText = all ? "Replace all:" : "Replace:"
187
+ dialog(cm, dialogText + replaceQueryDialog, dialogText, query, function(query) {
167
188
  if (!query) return;
168
189
  query = parseQuery(query);
169
190
  dialog(cm, replacementQueryDialog, "Replace with:", "", function(text) {
170
191
  text = parseString(text)
171
192
  if (all) {
172
- cm.operation(function() {
173
- for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
174
- if (typeof query != "string") {
175
- var match = cm.getRange(cursor.from(), cursor.to()).match(query);
176
- cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];}));
177
- } else cursor.replace(text);
178
- }
179
- });
193
+ replaceAll(cm, query, text)
180
194
  } else {
181
195
  clearSearch(cm);
182
196
  var cursor = getSearchCursor(cm, query, cm.getCursor());
@@ -190,7 +204,8 @@
190
204
  cm.setSelection(cursor.from(), cursor.to());
191
205
  cm.scrollIntoView({from: cursor.from(), to: cursor.to()});
192
206
  confirmDialog(cm, doReplaceConfirm, "Replace?",
193
- [function() {doReplace(match);}, advance]);
207
+ [function() {doReplace(match);}, advance,
208
+ function() {replaceAll(cm, query, text)}]);
194
209
  };
195
210
  var doReplace = function(match) {
196
211
  cursor.replace(typeof query == "string" ? text :
@@ -417,11 +417,19 @@
417
417
  var cursor = cm.getCursor();
418
418
  var toStartOfLine = cm.getRange({line: cursor.line, ch: 0}, cursor);
419
419
  var column = CodeMirror.countColumn(toStartOfLine, null, cm.getOption("tabSize"));
420
+ var indentUnit = cm.getOption("indentUnit");
420
421
 
421
- if (toStartOfLine && !/\S/.test(toStartOfLine) && column % cm.getOption("indentUnit") == 0)
422
- return cm.indentSelection("subtract");
423
- else
422
+ if (toStartOfLine && !/\S/.test(toStartOfLine) && column % indentUnit == 0) {
423
+ var prevIndent = new Pos(cursor.line,
424
+ CodeMirror.findColumn(toStartOfLine, column - indentUnit, indentUnit));
425
+
426
+ // If no smart delete is happening (due to tab sizing) just do a regular delete
427
+ if (prevIndent.ch == cursor.ch) return CodeMirror.Pass;
428
+
429
+ return cm.replaceRange("", prevIndent, cursor, "+delete");
430
+ } else {
424
431
  return CodeMirror.Pass;
432
+ }
425
433
  };
426
434
 
427
435
  cmds[map[cK + ctrl + "K"] = "delLineRight"] = function(cm) {
@@ -266,6 +266,11 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
266
266
  return false;
267
267
  }
268
268
 
269
+ function cpp14Literal(stream) {
270
+ stream.eatWhile(/[\w\.']/);
271
+ return "number";
272
+ }
273
+
269
274
  function cpp11StringHook(stream, state) {
270
275
  stream.backUp(1);
271
276
  // Raw strings.
@@ -373,6 +378,16 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
373
378
  "U": cpp11StringHook,
374
379
  "L": cpp11StringHook,
375
380
  "R": cpp11StringHook,
381
+ "0": cpp14Literal,
382
+ "1": cpp14Literal,
383
+ "2": cpp14Literal,
384
+ "3": cpp14Literal,
385
+ "4": cpp14Literal,
386
+ "5": cpp14Literal,
387
+ "6": cpp14Literal,
388
+ "7": cpp14Literal,
389
+ "8": cpp14Literal,
390
+ "9": cpp14Literal,
376
391
  token: function(stream, state, style) {
377
392
  if (style == "variable" && stream.peek() == "(" &&
378
393
  (state.prevToken == ";" || state.prevToken == null ||
@@ -25,7 +25,7 @@ CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
25
25
  var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/;
26
26
  var delimiters = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/;
27
27
  var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/;
28
- var properties = /^(@|this\.)[_A-Za-z$][_A-Za-z$0-9]*/;
28
+ var atProp = /^@[_A-Za-z$][_A-Za-z$0-9]*/;
29
29
 
30
30
  var wordOperators = wordRegexp(["and", "or", "not",
31
31
  "is", "isnt", "in",
@@ -145,6 +145,8 @@ CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
145
145
  }
146
146
  }
147
147
 
148
+
149
+
148
150
  // Handle operators and delimiters
149
151
  if (stream.match(operators) || stream.match(wordOperators)) {
150
152
  return "operator";
@@ -157,6 +159,10 @@ CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
157
159
  return "atom";
158
160
  }
159
161
 
162
+ if (stream.match(atProp) || state.prop && stream.match(identifiers)) {
163
+ return "property";
164
+ }
165
+
160
166
  if (stream.match(keywords)) {
161
167
  return "keyword";
162
168
  }
@@ -165,10 +171,6 @@ CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
165
171
  return "variable";
166
172
  }
167
173
 
168
- if (stream.match(properties)) {
169
- return "property";
170
- }
171
-
172
174
  // Handle non-detected items
173
175
  stream.next();
174
176
  return ERRORCLASS;
@@ -266,7 +268,7 @@ CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
266
268
  var current = stream.current();
267
269
 
268
270
  // Handle "." connected identifiers
269
- if (current === ".") {
271
+ if (false && current === ".") {
270
272
  style = state.tokenize(stream, state);
271
273
  current = stream.current();
272
274
  if (/^\.[\w$]+$/.test(current)) {
@@ -280,9 +282,7 @@ CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
280
282
  if (current === "return") {
281
283
  state.dedent = true;
282
284
  }
283
- if (((current === "->" || current === "=>") &&
284
- !state.lambda &&
285
- !stream.peek())
285
+ if (((current === "->" || current === "=>") && stream.eol())
286
286
  || style === "indent") {
287
287
  indent(stream, state);
288
288
  }
@@ -324,8 +324,7 @@ CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
324
324
  return {
325
325
  tokenize: tokenBase,
326
326
  scope: {offset:basecolumn || 0, type:"coffee", prev: null, align: false},
327
- lastToken: null,
328
- lambda: false,
327
+ prop: false,
329
328
  dedent: 0
330
329
  };
331
330
  },
@@ -335,12 +334,9 @@ CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
335
334
  if (fillAlign && stream.sol()) fillAlign.align = false;
336
335
 
337
336
  var style = tokenLexer(stream, state);
338
- if (fillAlign && style && style != "comment") fillAlign.align = true;
339
-
340
- state.lastToken = {style:style, content: stream.current()};
341
-
342
- if (stream.eol() && stream.lambda) {
343
- state.lambda = false;
337
+ if (style && style != "comment") {
338
+ if (fillAlign) fillAlign.align = true;
339
+ state.prop = style == "punctuation" && stream.current() == "."
344
340
  }
345
341
 
346
342
  return style;
@@ -365,5 +361,6 @@ CodeMirror.defineMode("coffeescript", function(conf, parserConf) {
365
361
  });
366
362
 
367
363
  CodeMirror.defineMIME("text/x-coffeescript", "coffeescript");
364
+ CodeMirror.defineMIME("text/coffeescript", "coffeescript");
368
365
 
369
366
  });