codemirror-rails 4.12 → 4.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +45 -22
  4. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +6 -4
  5. data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +1 -1
  6. data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +12 -4
  7. data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +14 -9
  8. data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +94 -51
  9. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +2 -1
  10. data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +211 -123
  11. data/vendor/assets/javascripts/codemirror/addons/scroll/annotatescrollbar.js +36 -12
  12. data/vendor/assets/javascripts/codemirror/addons/search/matchesonscrollbar.js +9 -4
  13. data/vendor/assets/javascripts/codemirror/addons/selection/selection-pointer.js +3 -0
  14. data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +31 -4
  15. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +46 -7
  16. data/vendor/assets/javascripts/codemirror/modes/clike.js +5 -1
  17. data/vendor/assets/javascripts/codemirror/modes/css.js +104 -55
  18. data/vendor/assets/javascripts/codemirror/modes/cypher.js +1 -1
  19. data/vendor/assets/javascripts/codemirror/modes/forth.js +180 -0
  20. data/vendor/assets/javascripts/codemirror/modes/go.js +1 -0
  21. data/vendor/assets/javascripts/codemirror/modes/idl.js +1 -1
  22. data/vendor/assets/javascripts/codemirror/modes/javascript.js +1 -1
  23. data/vendor/assets/javascripts/codemirror/modes/sql.js +1 -1
  24. data/vendor/assets/javascripts/codemirror/modes/stylus.js +444 -0
  25. data/vendor/assets/javascripts/codemirror/modes/verilog.js +192 -19
  26. data/vendor/assets/stylesheets/codemirror/themes/colorforth.css +33 -0
  27. metadata +4 -1
@@ -11,27 +11,46 @@
11
11
  })(function(CodeMirror) {
12
12
  "use strict";
13
13
 
14
- CodeMirror.defineExtension("annotateScrollbar", function(className) {
15
- return new Annotation(this, className);
14
+ CodeMirror.defineExtension("annotateScrollbar", function(options) {
15
+ if (typeof options == "string") options = {className: options};
16
+ return new Annotation(this, options);
16
17
  });
17
18
 
18
- function Annotation(cm, className) {
19
+ CodeMirror.defineOption("scrollButtonHeight", 0);
20
+
21
+ function Annotation(cm, options) {
19
22
  this.cm = cm;
20
- this.className = className;
23
+ this.options = options;
24
+ this.buttonHeight = options.scrollButtonHeight || cm.getOption("scrollButtonHeight");
21
25
  this.annotations = [];
26
+ this.doRedraw = this.doUpdate = null;
22
27
  this.div = cm.getWrapperElement().appendChild(document.createElement("div"));
23
28
  this.div.style.cssText = "position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none";
24
29
  this.computeScale();
25
30
 
31
+ function scheduleRedraw(delay) {
32
+ clearTimeout(self.doRedraw);
33
+ self.doRedraw = setTimeout(function() { self.redraw(); }, delay);
34
+ }
35
+
26
36
  var self = this;
27
- cm.on("refresh", this.resizeHandler = function(){
28
- if (self.computeScale()) self.redraw();
37
+ cm.on("refresh", this.resizeHandler = function() {
38
+ clearTimeout(self.doUpdate);
39
+ self.doUpdate = setTimeout(function() {
40
+ if (self.computeScale()) scheduleRedraw(20);
41
+ }, 100);
29
42
  });
43
+ cm.on("markerAdded", this.resizeHandler);
44
+ cm.on("markerCleared", this.resizeHandler);
45
+ if (options.listenForChanges !== false)
46
+ cm.on("change", this.changeHandler = function() {
47
+ scheduleRedraw(250);
48
+ });
30
49
  }
31
50
 
32
51
  Annotation.prototype.computeScale = function() {
33
52
  var cm = this.cm;
34
- var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight) /
53
+ var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) /
35
54
  cm.heightAtLine(cm.lastLine() + 1, "local");
36
55
  if (hScale != this.hScale) {
37
56
  this.hScale = hScale;
@@ -44,12 +63,12 @@
44
63
  this.redraw();
45
64
  };
46
65
 
47
- Annotation.prototype.redraw = function() {
66
+ Annotation.prototype.redraw = function(compute) {
67
+ if (compute !== false) this.computeScale();
48
68
  var cm = this.cm, hScale = this.hScale;
49
- if (!cm.display.barWidth) return;
50
69
 
51
70
  var frag = document.createDocumentFragment(), anns = this.annotations;
52
- for (var i = 0, nextTop; i < anns.length; i++) {
71
+ if (cm.display.barWidth) for (var i = 0, nextTop; i < anns.length; i++) {
53
72
  var ann = anns[i];
54
73
  var top = nextTop || cm.charCoords(ann.from, "local").top * hScale;
55
74
  var bottom = cm.charCoords(ann.to, "local").bottom * hScale;
@@ -59,11 +78,13 @@
59
78
  ann = anns[++i];
60
79
  bottom = cm.charCoords(ann.to, "local").bottom * hScale;
61
80
  }
81
+ if (bottom == top) continue;
62
82
  var height = Math.max(bottom - top, 3);
63
83
 
64
84
  var elt = frag.appendChild(document.createElement("div"));
65
- elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: " + top + "px; height: " + height + "px";
66
- elt.className = this.className;
85
+ elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: "
86
+ + (top + this.buttonHeight) + "px; height: " + height + "px";
87
+ elt.className = this.options.className;
67
88
  }
68
89
  this.div.textContent = "";
69
90
  this.div.appendChild(frag);
@@ -71,6 +92,9 @@
71
92
 
72
93
  Annotation.prototype.clear = function() {
73
94
  this.cm.off("refresh", this.resizeHandler);
95
+ this.cm.off("markerAdded", this.resizeHandler);
96
+ this.cm.off("markerCleared", this.resizeHandler);
97
+ if (this.changeHandler) this.cm.off("change", this.changeHandler);
74
98
  this.div.parentNode.removeChild(this.div);
75
99
  };
76
100
  });
@@ -11,13 +11,18 @@
11
11
  })(function(CodeMirror) {
12
12
  "use strict";
13
13
 
14
- CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, className) {
15
- return new SearchAnnotation(this, query, caseFold, className);
14
+ CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, options) {
15
+ if (typeof options == "string") options = {className: options};
16
+ if (!options) options = {};
17
+ return new SearchAnnotation(this, query, caseFold, options);
16
18
  });
17
19
 
18
- function SearchAnnotation(cm, query, caseFold, className) {
20
+ function SearchAnnotation(cm, query, caseFold, options) {
19
21
  this.cm = cm;
20
- this.annotation = cm.annotateScrollbar(className || "CodeMirror-search-match");
22
+ var annotateOptions = {listenForChanges: false};
23
+ for (var prop in options) annotateOptions[prop] = options[prop];
24
+ if (!annotateOptions.className) annotateOptions.className = "CodeMirror-search-match";
25
+ this.annotation = cm.annotateScrollbar(annotateOptions);
21
26
  this.query = query;
22
27
  this.caseFold = caseFold;
23
28
  this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1};
@@ -16,6 +16,7 @@
16
16
  if (data) {
17
17
  CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove);
18
18
  CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout);
19
+ CodeMirror.off(window, "scroll", data.windowScroll);
19
20
  cm.off("cursorActivity", reset);
20
21
  cm.off("scroll", reset);
21
22
  cm.state.selectionPointer = null;
@@ -26,12 +27,14 @@
26
27
  value: typeof val == "string" ? val : "default",
27
28
  mousemove: function(event) { mousemove(cm, event); },
28
29
  mouseout: function(event) { mouseout(cm, event); },
30
+ windowScroll: function() { reset(cm); },
29
31
  rects: null,
30
32
  mouseX: null, mouseY: null,
31
33
  willUpdate: false
32
34
  };
33
35
  CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove);
34
36
  CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout);
37
+ CodeMirror.on(window, "scroll", data.windowScroll);
35
38
  cm.on("cursorActivity", reset);
36
39
  cm.on("scroll", reset);
37
40
  }
@@ -130,6 +130,13 @@
130
130
  data = self.options.responseFilter(doc, query, request, error, data);
131
131
  c(error, data);
132
132
  });
133
+ },
134
+
135
+ destroy: function () {
136
+ if (this.worker) {
137
+ this.worker.terminate();
138
+ this.worker = null;
139
+ }
133
140
  }
134
141
  };
135
142
 
@@ -252,7 +259,9 @@
252
259
  tip.appendChild(document.createTextNode(" — " + data.doc));
253
260
  if (data.url) {
254
261
  tip.appendChild(document.createTextNode(" "));
255
- tip.appendChild(elt("a", null, "[docs]")).href = data.url;
262
+ var child = tip.appendChild(elt("a", null, "[docs]"));
263
+ child.href = data.url;
264
+ child.target = "_blank";
256
265
  }
257
266
  }
258
267
  tempTooltip(cm, tip);
@@ -582,15 +591,33 @@
582
591
  // Tooltips
583
592
 
584
593
  function tempTooltip(cm, content) {
594
+ if (cm.state.ternTooltip) remove(cm.state.ternTooltip);
585
595
  var where = cm.cursorCoords();
586
- var tip = makeTooltip(where.right + 1, where.bottom, content);
596
+ var tip = cm.state.ternTooltip = makeTooltip(where.right + 1, where.bottom, content);
597
+ function maybeClear() {
598
+ old = true;
599
+ if (!mouseOnTip) clear();
600
+ }
587
601
  function clear() {
602
+ cm.state.ternTooltip = null;
588
603
  if (!tip.parentNode) return;
589
604
  cm.off("cursorActivity", clear);
605
+ cm.off('blur', clear);
606
+ cm.off('scroll', clear);
590
607
  fadeOut(tip);
591
608
  }
592
- setTimeout(clear, 1700);
609
+ var mouseOnTip = false, old = false;
610
+ CodeMirror.on(tip, "mousemove", function() { mouseOnTip = true; });
611
+ CodeMirror.on(tip, "mouseout", function(e) {
612
+ if (!CodeMirror.contains(tip, e.relatedTarget || e.toElement)) {
613
+ if (old) clear();
614
+ else mouseOnTip = false;
615
+ }
616
+ });
617
+ setTimeout(maybeClear, 1700);
593
618
  cm.on("cursorActivity", clear);
619
+ cm.on('blur', clear);
620
+ cm.on('scroll', clear);
594
621
  }
595
622
 
596
623
  function makeTooltip(x, y, content) {
@@ -631,7 +658,7 @@
631
658
  // Worker wrapper
632
659
 
633
660
  function WorkerServer(ts) {
634
- var worker = new Worker(ts.options.workerScript);
661
+ var worker = ts.worker = new Worker(ts.options.workerScript);
635
662
  worker.postMessage({type: "init",
636
663
  defs: ts.options.defs,
637
664
  plugins: ts.options.plugins,
@@ -776,7 +776,16 @@
776
776
  },
777
777
  handleEx: function(cm, input) {
778
778
  exCommandDispatcher.processCommand(cm, input);
779
- }
779
+ },
780
+
781
+ defineMotion: defineMotion,
782
+ defineAction: defineAction,
783
+ defineOperator: defineOperator,
784
+ mapCommand: mapCommand,
785
+ _mapCommand: _mapCommand,
786
+
787
+ exitVisualMode: exitVisualMode,
788
+ exitInsertMode: exitInsertMode
780
789
  };
781
790
 
782
791
  // Represents the current input state.
@@ -1449,7 +1458,7 @@
1449
1458
  var operatorMoveTo = operators[operator](
1450
1459
  cm, operatorArgs, cmSel.ranges, oldAnchor, newHead);
1451
1460
  if (vim.visualMode) {
1452
- exitVisualMode(cm);
1461
+ exitVisualMode(cm, operatorMoveTo != null);
1453
1462
  }
1454
1463
  if (operatorMoveTo) {
1455
1464
  cm.setCursor(operatorMoveTo);
@@ -1817,6 +1826,10 @@
1817
1826
  }
1818
1827
  };
1819
1828
 
1829
+ function defineMotion(name, fn) {
1830
+ motions[name] = fn;
1831
+ }
1832
+
1820
1833
  function fillArray(val, times) {
1821
1834
  var arr = [];
1822
1835
  for (var i = 0; i < times; i++) {
@@ -1899,7 +1912,7 @@
1899
1912
  vimGlobalState.registerController.pushText(
1900
1913
  args.registerName, 'delete', text,
1901
1914
  args.linewise, vim.visualBlock);
1902
- return finalHead;
1915
+ return clipCursorToContent(cm, finalHead);
1903
1916
  },
1904
1917
  indent: function(cm, args, ranges) {
1905
1918
  var vim = cm.state.vim;
@@ -1967,6 +1980,10 @@
1967
1980
  }
1968
1981
  };
1969
1982
 
1983
+ function defineOperator(name, fn) {
1984
+ operators[name] = fn;
1985
+ }
1986
+
1970
1987
  var actions = {
1971
1988
  jumpListWalk: function(cm, actionArgs, vim) {
1972
1989
  if (vim.visualMode) {
@@ -2183,6 +2200,11 @@
2183
2200
  if (vim.visualMode) {
2184
2201
  curStart = cm.getCursor('anchor');
2185
2202
  curEnd = cm.getCursor('head');
2203
+ if (cursorIsBefore(curEnd, curStart)) {
2204
+ var tmp = curEnd;
2205
+ curEnd = curStart;
2206
+ curStart = tmp;
2207
+ }
2186
2208
  curEnd.ch = lineLength(cm, curEnd.line) - 1;
2187
2209
  } else {
2188
2210
  // Repeat is the number of lines to join. Minimum 2 lines.
@@ -2201,10 +2223,10 @@
2201
2223
  cm.replaceRange(text, curStart, tmp);
2202
2224
  }
2203
2225
  var curFinalPos = Pos(curStart.line, finalCh);
2204
- cm.setCursor(curFinalPos);
2205
2226
  if (vim.visualMode) {
2206
- exitVisualMode(cm);
2227
+ exitVisualMode(cm, false);
2207
2228
  }
2229
+ cm.setCursor(curFinalPos);
2208
2230
  },
2209
2231
  newLineAndEnterInsertMode: function(cm, actionArgs, vim) {
2210
2232
  vim.insertMode = true;
@@ -2367,7 +2389,7 @@
2367
2389
  }
2368
2390
  }
2369
2391
  if (vim.visualMode) {
2370
- exitVisualMode(cm);
2392
+ exitVisualMode(cm, false);
2371
2393
  }
2372
2394
  cm.setCursor(curPosFinal);
2373
2395
  },
@@ -2425,7 +2447,7 @@
2425
2447
  curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ?
2426
2448
  selections[0].anchor : selections[0].head;
2427
2449
  cm.setCursor(curStart);
2428
- exitVisualMode(cm);
2450
+ exitVisualMode(cm, false);
2429
2451
  } else {
2430
2452
  cm.setCursor(offsetCursor(curEnd, 0, -1));
2431
2453
  }
@@ -2473,6 +2495,10 @@
2473
2495
  exitInsertMode: exitInsertMode
2474
2496
  };
2475
2497
 
2498
+ function defineAction(name, fn) {
2499
+ actions[name] = fn;
2500
+ }
2501
+
2476
2502
  /*
2477
2503
  * Below are miscellaneous utility functions used by vim.js
2478
2504
  */
@@ -4627,6 +4653,19 @@
4627
4653
  }
4628
4654
  }
4629
4655
 
4656
+ function _mapCommand(command) {
4657
+ defaultKeymap.push(command);
4658
+ }
4659
+
4660
+ function mapCommand(keys, type, name, args, extra) {
4661
+ var command = {keys: keys, type: type};
4662
+ command[type] = name;
4663
+ command[type + "Args"] = args;
4664
+ for (var key in extra)
4665
+ command[key] = extra[key];
4666
+ _mapCommand(command);
4667
+ }
4668
+
4630
4669
  // The timeout in milliseconds for the two-character ESC keymap should be
4631
4670
  // adjusted according to your typing speed to prevent false positives.
4632
4671
  defineOption('insertModeEscKeysTimeout', 200, 'number');
@@ -354,7 +354,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
354
354
  state.tokenize = null;
355
355
  break;
356
356
  }
357
- escaped = stream.next() != "\\" && !escaped;
357
+ escaped = stream.next() == "\\" && !escaped;
358
358
  }
359
359
  return "string";
360
360
  }
@@ -398,6 +398,10 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
398
398
  if (!stream.match('""')) return false;
399
399
  state.tokenize = tokenTripleString;
400
400
  return state.tokenize(stream, state);
401
+ },
402
+ "'": function(stream) {
403
+ stream.eatWhile(/[\w\$_\xa1-\uffff]/);
404
+ return "atom";
401
405
  }
402
406
  }
403
407
  });
@@ -16,13 +16,15 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
16
16
 
17
17
  var indentUnit = config.indentUnit,
18
18
  tokenHooks = parserConfig.tokenHooks,
19
+ documentTypes = parserConfig.documentTypes || {},
19
20
  mediaTypes = parserConfig.mediaTypes || {},
20
21
  mediaFeatures = parserConfig.mediaFeatures || {},
21
22
  propertyKeywords = parserConfig.propertyKeywords || {},
22
23
  nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},
24
+ fontProperties = parserConfig.fontProperties || {},
25
+ counterDescriptors = parserConfig.counterDescriptors || {},
23
26
  colorKeywords = parserConfig.colorKeywords || {},
24
27
  valueKeywords = parserConfig.valueKeywords || {},
25
- fontProperties = parserConfig.fontProperties || {},
26
28
  allowNested = parserConfig.allowNested;
27
29
 
28
30
  var type, override;
@@ -57,6 +59,11 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
57
59
  if (/[\d.]/.test(stream.peek())) {
58
60
  stream.eatWhile(/[\w.%]/);
59
61
  return ret("number", "unit");
62
+ } else if (stream.match(/^-[\w\\\-]+/)) {
63
+ stream.eatWhile(/[\w\\\-]/);
64
+ if (stream.match(/^\s*:/, false))
65
+ return ret("variable-2", "variable-definition");
66
+ return ret("variable-2", "variable");
60
67
  } else if (stream.match(/^\w+-/)) {
61
68
  return ret("meta", "meta");
62
69
  }
@@ -66,7 +73,9 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
66
73
  return ret("qualifier", "qualifier");
67
74
  } else if (/[:;{}\[\]\(\)]/.test(ch)) {
68
75
  return ret(null, ch);
69
- } else if (ch == "u" && stream.match("rl(")) {
76
+ } else if ((ch == "u" && stream.match(/rl(-prefix)?\(/)) ||
77
+ (ch == "d" && stream.match("omain(")) ||
78
+ (ch == "r" && stream.match("egexp("))) {
70
79
  stream.backUp(1);
71
80
  state.tokenize = tokenParenthesized;
72
81
  return ret("property", "word");
@@ -148,10 +157,11 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
148
157
  return pushContext(state, stream, "block");
149
158
  } else if (type == "}" && state.context.prev) {
150
159
  return popContext(state);
151
- } else if (type == "@media") {
152
- return pushContext(state, stream, "media");
153
- } else if (type == "@font-face") {
154
- return "font_face_before";
160
+ } else if (/@(media|supports|(-moz-)?document)/.test(type)) {
161
+ return pushContext(state, stream, "atBlock");
162
+ } else if (/@(font-face|counter-style)/.test(type)) {
163
+ state.stateArg = type;
164
+ return "restricted_atBlock_before";
155
165
  } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {
156
166
  return "keyframes";
157
167
  } else if (type && type.charAt(0) == "@") {
@@ -241,47 +251,63 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
241
251
  return pass(type, stream, state);
242
252
  };
243
253
 
244
- states.media = function(type, stream, state) {
245
- if (type == "(") return pushContext(state, stream, "media_parens");
254
+ states.atBlock = function(type, stream, state) {
255
+ if (type == "(") return pushContext(state, stream, "atBlock_parens");
246
256
  if (type == "}") return popAndPass(type, stream, state);
247
257
  if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top");
248
258
 
249
259
  if (type == "word") {
250
260
  var word = stream.current().toLowerCase();
251
- if (word == "only" || word == "not" || word == "and")
261
+ if (word == "only" || word == "not" || word == "and" || word == "or")
252
262
  override = "keyword";
263
+ else if (documentTypes.hasOwnProperty(word))
264
+ override = "tag";
253
265
  else if (mediaTypes.hasOwnProperty(word))
254
266
  override = "attribute";
255
267
  else if (mediaFeatures.hasOwnProperty(word))
256
268
  override = "property";
269
+ else if (propertyKeywords.hasOwnProperty(word))
270
+ override = "property";
271
+ else if (nonStandardPropertyKeywords.hasOwnProperty(word))
272
+ override = "string-2";
273
+ else if (valueKeywords.hasOwnProperty(word))
274
+ override = "atom";
257
275
  else
258
276
  override = "error";
259
277
  }
260
278
  return state.context.type;
261
279
  };
262
280
 
263
- states.media_parens = function(type, stream, state) {
281
+ states.atBlock_parens = function(type, stream, state) {
264
282
  if (type == ")") return popContext(state);
265
283
  if (type == "{" || type == "}") return popAndPass(type, stream, state, 2);
266
- return states.media(type, stream, state);
284
+ return states.atBlock(type, stream, state);
267
285
  };
268
286
 
269
- states.font_face_before = function(type, stream, state) {
287
+ states.restricted_atBlock_before = function(type, stream, state) {
270
288
  if (type == "{")
271
- return pushContext(state, stream, "font_face");
289
+ return pushContext(state, stream, "restricted_atBlock");
290
+ if (type == "word" && state.stateArg == "@counter-style") {
291
+ override = "variable";
292
+ return "restricted_atBlock_before";
293
+ }
272
294
  return pass(type, stream, state);
273
295
  };
274
296
 
275
- states.font_face = function(type, stream, state) {
276
- if (type == "}") return popContext(state);
297
+ states.restricted_atBlock = function(type, stream, state) {
298
+ if (type == "}") {
299
+ state.stateArg = null;
300
+ return popContext(state);
301
+ }
277
302
  if (type == "word") {
278
- if (!fontProperties.hasOwnProperty(stream.current().toLowerCase()))
303
+ if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) ||
304
+ (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase())))
279
305
  override = "error";
280
306
  else
281
307
  override = "property";
282
308
  return "maybeprop";
283
309
  }
284
- return "font_face";
310
+ return "restricted_atBlock";
285
311
  };
286
312
 
287
313
  states.keyframes = function(type, stream, state) {
@@ -309,6 +335,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
309
335
  startState: function(base) {
310
336
  return {tokenize: null,
311
337
  state: "top",
338
+ stateArg: null,
312
339
  context: new Context("top", base || 0, null)};
313
340
  },
314
341
 
@@ -329,9 +356,9 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
329
356
  var indent = cx.indent;
330
357
  if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev;
331
358
  if (cx.prev &&
332
- (ch == "}" && (cx.type == "block" || cx.type == "top" || cx.type == "interpolation" || cx.type == "font_face") ||
333
- ch == ")" && (cx.type == "parens" || cx.type == "media_parens") ||
334
- ch == "{" && (cx.type == "at" || cx.type == "media"))) {
359
+ (ch == "}" && (cx.type == "block" || cx.type == "top" || cx.type == "interpolation" || cx.type == "restricted_atBlock") ||
360
+ ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") ||
361
+ ch == "{" && (cx.type == "at" || cx.type == "atBlock"))) {
335
362
  indent = cx.indent - indentUnit;
336
363
  cx = cx.prev;
337
364
  }
@@ -353,6 +380,10 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
353
380
  return keys;
354
381
  }
355
382
 
383
+ var documentTypes_ = [
384
+ "domain", "regexp", "url", "url-prefix"
385
+ ], documentTypes = keySet(documentTypes_);
386
+
356
387
  var mediaTypes_ = [
357
388
  "all", "aural", "braille", "handheld", "print", "projection", "screen",
358
389
  "tty", "tv", "embossed"
@@ -469,6 +500,16 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
469
500
  "searchfield-results-decoration", "zoom"
470
501
  ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);
471
502
 
503
+ var fontProperties_ = [
504
+ "font-family", "src", "unicode-range", "font-variant", "font-feature-settings",
505
+ "font-stretch", "font-weight", "font-style"
506
+ ], fontProperties = keySet(fontProperties_);
507
+
508
+ var counterDescriptors_ = [
509
+ "additive-symbols", "fallback", "negative", "pad", "prefix", "range",
510
+ "speak-as", "suffix", "symbols", "system"
511
+ ], counterDescriptors = keySet(counterDescriptors_);
512
+
472
513
  var colorKeywords_ = [
473
514
  "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige",
474
515
  "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown",
@@ -499,32 +540,33 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
499
540
  ], colorKeywords = keySet(colorKeywords_);
500
541
 
501
542
  var valueKeywords_ = [
502
- "above", "absolute", "activeborder", "activecaption", "afar",
503
- "after-white-space", "ahead", "alias", "all", "all-scroll", "alternate",
543
+ "above", "absolute", "activeborder", "additive", "activecaption", "afar",
544
+ "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate",
504
545
  "always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
505
- "arabic-indic", "armenian", "asterisks", "auto", "avoid", "avoid-column", "avoid-page",
546
+ "arabic-indic", "armenian", "asterisks", "attr", "auto", "avoid", "avoid-column", "avoid-page",
506
547
  "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary",
507
548
  "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
508
- "both", "bottom", "break", "break-all", "break-word", "button", "button-bevel",
509
- "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian",
549
+ "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel",
550
+ "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian",
510
551
  "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret",
511
- "cell", "center", "checkbox", "circle", "cjk-earthly-branch",
552
+ "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch",
512
553
  "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote",
513
554
  "col-resize", "collapse", "column", "compact", "condensed", "contain", "content",
514
- "content-box", "context-menu", "continuous", "copy", "cover", "crop",
515
- "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal",
555
+ "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop",
556
+ "cross", "crosshair", "currentcolor", "cursive", "cyclic", "dashed", "decimal",
516
557
  "decimal-leading-zero", "default", "default-button", "destination-atop",
517
558
  "destination-in", "destination-out", "destination-over", "devanagari",
518
- "disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted",
519
- "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out",
559
+ "disc", "discard", "disclosure-closed", "disclosure-open", "document",
560
+ "dot-dash", "dot-dot-dash",
561
+ "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out",
520
562
  "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede",
521
563
  "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er",
522
564
  "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er",
523
565
  "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et",
524
566
  "ethiopic-halehame-gez", "ethiopic-halehame-om-et",
525
567
  "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et",
526
- "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et",
527
- "ethiopic-halehame-tig", "ew-resize", "expanded", "extra-condensed",
568
+ "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig",
569
+ "ethiopic-numeric", "ew-resize", "expanded", "extends", "extra-condensed",
528
570
  "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "footnotes",
529
571
  "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove",
530
572
  "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew",
@@ -533,12 +575,14 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
533
575
  "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite",
534
576
  "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis",
535
577
  "inline-block", "inline-flex", "inline-table", "inset", "inside", "intrinsic", "invert",
536
- "italic", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer",
578
+ "italic", "japanese-formal", "japanese-informal", "justify", "kannada",
579
+ "katakana", "katakana-iroha", "keep-all", "khmer",
580
+ "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal",
537
581
  "landscape", "lao", "large", "larger", "left", "level", "lighter",
538
- "line-through", "linear", "lines", "list-item", "listbox", "listitem",
582
+ "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem",
539
583
  "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian",
540
584
  "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian",
541
- "lower-roman", "lowercase", "ltr", "malayalam", "match",
585
+ "lower-roman", "lowercase", "ltr", "malayalam", "match", "matrix", "matrix3d",
542
586
  "media-controls-background", "media-current-time-display",
543
587
  "media-fullscreen-button", "media-mute-button", "media-play-button",
544
588
  "media-return-to-realtime-button", "media-rewind-button",
@@ -550,45 +594,48 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
550
594
  "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize",
551
595
  "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop",
552
596
  "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap",
553
- "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote",
597
+ "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote",
554
598
  "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset",
555
599
  "outside", "outside-shape", "overlay", "overline", "padding", "padding-box",
556
- "painted", "page", "paused", "persian", "plus-darker", "plus-lighter", "pointer",
557
- "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button",
558
- "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region",
559
- "relative", "repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba",
560
- "ridge", "right", "round", "row-resize", "rtl", "run-in", "running",
561
- "s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield",
600
+ "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter",
601
+ "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d",
602
+ "progress", "push-button", "radial-gradient", "radio", "read-only",
603
+ "read-write", "read-write-plaintext-only", "rectangle", "region",
604
+ "relative", "repeat", "repeating-linear-gradient",
605
+ "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse",
606
+ "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY",
607
+ "rotateZ", "round", "row-resize", "rtl", "run-in", "running",
608
+ "s-resize", "sans-serif", "scale", "scale3d", "scaleX", "scaleY", "scaleZ",
609
+ "scroll", "scrollbar", "se-resize", "searchfield",
562
610
  "searchfield-cancel-button", "searchfield-decoration",
563
611
  "searchfield-results-button", "searchfield-results-decoration",
564
612
  "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama",
565
- "single", "skip-white-space", "slide", "slider-horizontal",
613
+ "simp-chinese-formal", "simp-chinese-informal", "single",
614
+ "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal",
566
615
  "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
567
616
  "small", "small-caps", "small-caption", "smaller", "solid", "somali",
568
- "source-atop", "source-in", "source-out", "source-over", "space", "square",
569
- "square-button", "start", "static", "status-bar", "stretch", "stroke",
570
- "sub", "subpixel-antialiased", "super", "sw-resize", "table",
617
+ "source-atop", "source-in", "source-out", "source-over", "space", "spell-out", "square",
618
+ "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub",
619
+ "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table",
571
620
  "table-caption", "table-cell", "table-column", "table-column-group",
572
621
  "table-footer-group", "table-header-group", "table-row", "table-row-group",
622
+ "tamil",
573
623
  "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai",
574
624
  "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight",
575
625
  "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er",
576
626
  "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top",
627
+ "trad-chinese-formal", "trad-chinese-informal",
628
+ "translate", "translate3d", "translateX", "translateY", "translateZ",
577
629
  "transparent", "ultra-condensed", "ultra-expanded", "underline", "up",
578
630
  "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal",
579
631
  "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url",
580
- "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted",
632
+ "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted",
581
633
  "visibleStroke", "visual", "w-resize", "wait", "wave", "wider",
582
- "window", "windowframe", "windowtext", "x-large", "x-small", "xor",
634
+ "window", "windowframe", "windowtext", "words", "x-large", "x-small", "xor",
583
635
  "xx-large", "xx-small"
584
636
  ], valueKeywords = keySet(valueKeywords_);
585
637
 
586
- var fontProperties_ = [
587
- "font-family", "src", "unicode-range", "font-variant", "font-feature-settings",
588
- "font-stretch", "font-weight", "font-style"
589
- ], fontProperties = keySet(fontProperties_);
590
-
591
- var allWords = mediaTypes_.concat(mediaFeatures_).concat(propertyKeywords_)
638
+ var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(propertyKeywords_)
592
639
  .concat(nonStandardPropertyKeywords_).concat(colorKeywords_).concat(valueKeywords_);
593
640
  CodeMirror.registerHelper("hintWords", "css", allWords);
594
641
 
@@ -615,13 +662,15 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
615
662
  }
616
663
 
617
664
  CodeMirror.defineMIME("text/css", {
665
+ documentTypes: documentTypes,
618
666
  mediaTypes: mediaTypes,
619
667
  mediaFeatures: mediaFeatures,
620
668
  propertyKeywords: propertyKeywords,
621
669
  nonStandardPropertyKeywords: nonStandardPropertyKeywords,
670
+ fontProperties: fontProperties,
671
+ counterDescriptors: counterDescriptors,
622
672
  colorKeywords: colorKeywords,
623
673
  valueKeywords: valueKeywords,
624
- fontProperties: fontProperties,
625
674
  tokenHooks: {
626
675
  "<": function(stream, state) {
627
676
  if (!stream.match("!--")) return false;