codemirror-rails 2.32 → 2.33

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/codemirror-rails.gemspec +1 -1
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +355 -349
  4. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +6 -5
  5. data/vendor/assets/javascripts/codemirror/modes/clike.js +6 -2
  6. data/vendor/assets/javascripts/codemirror/modes/clojure.js +1 -1
  7. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +3 -3
  8. data/vendor/assets/javascripts/codemirror/modes/css.js +52 -2
  9. data/vendor/assets/javascripts/codemirror/modes/ecl.js +1 -1
  10. data/vendor/assets/javascripts/codemirror/modes/gfm.js +4 -3
  11. data/vendor/assets/javascripts/codemirror/modes/go.js +2 -2
  12. data/vendor/assets/javascripts/codemirror/modes/groovy.js +1 -1
  13. data/vendor/assets/javascripts/codemirror/modes/haskell.js +2 -2
  14. data/vendor/assets/javascripts/codemirror/modes/haxe.js +4 -4
  15. data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +3 -3
  16. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +1 -1
  17. data/vendor/assets/javascripts/codemirror/modes/javascript.js +2 -2
  18. data/vendor/assets/javascripts/codemirror/modes/less.js +94 -60
  19. data/vendor/assets/javascripts/codemirror/modes/markdown.js +4 -4
  20. data/vendor/assets/javascripts/codemirror/modes/ntriples.js +4 -4
  21. data/vendor/assets/javascripts/codemirror/modes/ocaml.js +1 -1
  22. data/vendor/assets/javascripts/codemirror/modes/pascal.js +1 -1
  23. data/vendor/assets/javascripts/codemirror/modes/perl.js +71 -71
  24. data/vendor/assets/javascripts/codemirror/modes/php.js +3 -3
  25. data/vendor/assets/javascripts/codemirror/modes/pig.js +3 -3
  26. data/vendor/assets/javascripts/codemirror/modes/python.js +1 -1
  27. data/vendor/assets/javascripts/codemirror/modes/scheme.js +1 -1
  28. data/vendor/assets/javascripts/codemirror/modes/shell.js +1 -1
  29. data/vendor/assets/javascripts/codemirror/modes/sieve.js +156 -0
  30. data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +2 -2
  31. data/vendor/assets/javascripts/codemirror/modes/smarty.js +2 -2
  32. data/vendor/assets/javascripts/codemirror/modes/stex.js +1 -1
  33. data/vendor/assets/javascripts/codemirror/modes/tiki.js +4 -4
  34. data/vendor/assets/javascripts/codemirror/modes/velocity.js +1 -1
  35. data/vendor/assets/javascripts/codemirror/modes/verilog.js +1 -1
  36. data/vendor/assets/javascripts/codemirror/modes/xml.js +2 -2
  37. data/vendor/assets/javascripts/codemirror/modes/xquery.js +7 -4
  38. data/vendor/assets/javascripts/codemirror/utils/dialog.js +4 -1
  39. data/vendor/assets/javascripts/codemirror/utils/formatting.js +1 -1
  40. data/vendor/assets/javascripts/codemirror/utils/javascript-hint.js +3 -3
  41. data/vendor/assets/javascripts/codemirror/utils/loadmode.js +1 -1
  42. data/vendor/assets/javascripts/codemirror/utils/multiplex.js +1 -1
  43. data/vendor/assets/javascripts/codemirror/utils/pig-hint.js +1 -1
  44. data/vendor/assets/javascripts/codemirror/utils/runmode.js +8 -4
  45. data/vendor/assets/javascripts/codemirror/utils/search.js +4 -4
  46. data/vendor/assets/javascripts/codemirror/utils/searchcursor.js +13 -11
  47. data/vendor/assets/javascripts/codemirror/utils/simple-hint.js +89 -68
  48. data/vendor/assets/javascripts/codemirror/utils/xml-hint.js +8 -8
  49. data/vendor/assets/stylesheets/codemirror.css +15 -11
  50. metadata +13 -13
@@ -70,7 +70,7 @@
70
70
  for (var prop in o) if (o.hasOwnProperty(prop)) f(prop, o[prop]);
71
71
  }
72
72
  function iterList(l, f) {
73
- for (var i in l) f(l[i]);
73
+ for (var i = 0; i < l.length; ++i) f(l[i]);
74
74
  }
75
75
  function toLetter(ch) {
76
76
  // T -> t, Shift-T -> T, '*' -> *, "Space" -> " "
@@ -229,7 +229,8 @@
229
229
  else f(prompt(shortText, ""));
230
230
  }
231
231
  function showAlert(cm, text) {
232
- if (cm.openDialog) cm.openDialog(CodeMirror.htmlEscape(text) + " <button type=button>OK</button>");
232
+ var esc = text.replace(/[<&]/, function(ch) { return ch == "<" ? "&lt;" : "&amp;"; });
233
+ if (cm.openDialog) cm.openDialog(esc + " <button type=button>OK</button>");
233
234
  else alert(text);
234
235
  }
235
236
 
@@ -502,9 +503,9 @@
502
503
  setupPrefixBindingForKey(toCombo(ch));
503
504
  setupPrefixBindingForKey(toCombo(ch.toLowerCase()));
504
505
  }
505
- iterList(SPECIAL_SYMBOLS, function (ch) {
506
- setupPrefixBindingForKey(toCombo(ch));
507
- });
506
+ for (var i = 0; i < SPECIAL_SYMBOLS.length; ++i) {
507
+ setupPrefixBindingForKey(toCombo(SPECIAL_SYMBOLS.charAt(i)));
508
+ }
508
509
  setupPrefixBindingForKey("Space");
509
510
 
510
511
  CodeMirror.keyMap["vim-prefix-y"] = {
@@ -181,14 +181,18 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
181
181
  return "string";
182
182
  }
183
183
 
184
- CodeMirror.defineMIME("text/x-csrc", {
184
+ function mimes(ms, mode) {
185
+ for (var i = 0; i < ms.length; ++i) CodeMirror.defineMIME(ms[i], mode);
186
+ }
187
+
188
+ mimes(["text/x-csrc", "text/x-c", "text/x-chdr"], {
185
189
  name: "clike",
186
190
  keywords: words(cKeywords),
187
191
  blockKeywords: words("case do else for if switch while struct"),
188
192
  atoms: words("null"),
189
193
  hooks: {"#": cppHook}
190
194
  });
191
- CodeMirror.defineMIME("text/x-c++src", {
195
+ mimes(["text/x-c++src", "text/x-c++hdr"], {
192
196
  name: "clike",
193
197
  keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try bool explicit new " +
194
198
  "static_cast typeid catch operator template typename class friend private " +
@@ -145,7 +145,7 @@ CodeMirror.defineMode("clojure", function (config, mode) {
145
145
  } else if (isNumber(ch,stream)){
146
146
  returnType = NUMBER;
147
147
  } else if (ch == "(" || ch == "[") {
148
- var keyWord = ''; var indentTemp = stream.column();
148
+ var keyWord = '', indentTemp = stream.column(), letter;
149
149
  /**
150
150
  Either
151
151
  (indent-word ..
@@ -187,7 +187,7 @@ CodeMirror.defineMode('coffeescript', function(conf) {
187
187
  }
188
188
  if (singleline) {
189
189
  if (conf.mode.singleLineStringErrors) {
190
- outclass = ERRORCLASS
190
+ outclass = ERRORCLASS;
191
191
  } else {
192
192
  state.tokenize = tokenBase;
193
193
  }
@@ -205,7 +205,7 @@ CodeMirror.defineMode('coffeescript', function(conf) {
205
205
  }
206
206
  stream.eatWhile("#");
207
207
  }
208
- return "comment"
208
+ return "comment";
209
209
  }
210
210
 
211
211
  function indent(stream, state, type) {
@@ -244,7 +244,7 @@ CodeMirror.defineMode('coffeescript', function(conf) {
244
244
  while (state.scopes[0].offset !== _indent) {
245
245
  state.scopes.shift();
246
246
  }
247
- return false
247
+ return false;
248
248
  } else {
249
249
  state.scopes.shift();
250
250
  return false;
@@ -1,5 +1,55 @@
1
1
  CodeMirror.defineMode("css", function(config) {
2
2
  var indentUnit = config.indentUnit, type;
3
+
4
+ var keywords = keySet(["above", "absolute", "activeborder", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll",
5
+ "alternate", "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", "arabic-indic", "armenian", "asterisks",
6
+ "auto", "avoid", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "blink",
7
+ "block", "block-axis", "bold", "bolder", "border", "border-box", "both", "bottom", "break-all", "break-word", "button",
8
+ "button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian", "capitalize", "caps-lock-indicator",
9
+ "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic",
10
+ "clear", "clip", "close-quote", "col-resize", "collapse", "compact", "condensed", "contain", "content", "content-box", "context-menu",
11
+ "continuous", "copy", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal", "decimal-leading-zero", "default",
12
+ "default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "disc", "discard", "document",
13
+ "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element",
14
+ "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez",
15
+ "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et",
16
+ "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et",
17
+ "ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ew-resize", "expanded",
18
+ "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "footnotes", "forwards", "from", "geometricPrecision",
19
+ "georgian", "graytext", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help",
20
+ "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore",
21
+ "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline",
22
+ "inline-axis", "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "justify", "kannada", "katakana",
23
+ "katakana-iroha", "khmer", "landscape", "lao", "large", "larger", "left", "level", "lighter", "line-through", "linear", "lines",
24
+ "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "lower-greek",
25
+ "lower-hexadecimal", "lower-latin", "lower-norwegian", "lower-roman", "lowercase", "ltr", "malayalam", "match", "media-controls-background",
26
+ "media-current-time-display", "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button",
27
+ "media-rewind-button", "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display",
28
+ "media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button",
29
+ "menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple",
30
+ "myanmar", "n-resize", "narrower", "navy", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none",
31
+ "normal", "not-allowed", "nowrap", "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", "optimizeLegibility",
32
+ "optimizeSpeed", "oriya", "oromo", "outset", "outside", "overlay", "overline", "padding", "padding-box", "painted", "paused",
33
+ "persian", "plus-darker", "plus-lighter", "pointer", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress",
34
+ "push-button", "radio", "read-only", "read-write", "read-write-plaintext-only", "relative", "repeat", "repeat-x",
35
+ "repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "round", "row-resize", "rtl", "run-in", "running", "s-resize", "sans-serif",
36
+ "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button",
37
+ "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "single",
38
+ "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
39
+ "small", "small-caps", "small-caption", "smaller", "solid", "somali", "source-atop", "source-in", "source-out", "source-over",
40
+ "space", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super",
41
+ "sw-resize", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group",
42
+ "table-row", "table-row-group", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin",
43
+ "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede",
44
+ "tigrinya-et", "tigrinya-et-abegede", "to", "top", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-armenian",
45
+ "upper-greek", "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "vertical", "vertical-text", "visible",
46
+ "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "white", "wider", "window", "windowframe", "windowtext",
47
+ "x-large", "x-small", "xor", "xx-large", "xx-small", "yellow", "-wap-marquee", "-webkit-activelink", "-webkit-auto", "-webkit-baseline-middle",
48
+ "-webkit-body", "-webkit-box", "-webkit-center", "-webkit-control", "-webkit-focus-ring-color", "-webkit-grab", "-webkit-grabbing",
49
+ "-webkit-gradient", "-webkit-inline-box", "-webkit-left", "-webkit-link", "-webkit-marquee", "-webkit-mini-control", "-webkit-nowrap", "-webkit-pictograph",
50
+ "-webkit-right", "-webkit-small-control", "-webkit-text", "-webkit-xxx-large", "-webkit-zoom-in", "-webkit-zoom-out"]);
51
+
52
+ function keySet(array) { var keys = {}; for (var i = 0; i < array.length; ++i) keys[array[i]] = true; return keys; }
3
53
  function ret(style, tp) {type = tp; return style;}
4
54
 
5
55
  function tokenBase(stream, state) {
@@ -34,7 +84,7 @@ CodeMirror.defineMode("css", function(config) {
34
84
  else if (/[,.+>*\/]/.test(ch)) {
35
85
  return ret(null, "select-op");
36
86
  }
37
- else if (/[;{}:\[\]]/.test(ch)) {
87
+ else if (/[;{}:\[\]\(\)]/.test(ch)) {
38
88
  return ret(null, ch);
39
89
  }
40
90
  else {
@@ -94,7 +144,7 @@ CodeMirror.defineMode("css", function(config) {
94
144
  var context = state.stack[state.stack.length-1];
95
145
  if (type == "hash" && context != "rule") style = "string-2";
96
146
  else if (style == "variable") {
97
- if (context == "rule") style = "number";
147
+ if (context == "rule") style = keywords[stream.current()] ? "keyword" : "number";
98
148
  else if (!context || context == "@media{") style = "tag";
99
149
  }
100
150
 
@@ -49,7 +49,7 @@ CodeMirror.defineMode("ecl", function(config) {
49
49
  }
50
50
  if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
51
51
  curPunc = ch;
52
- return null
52
+ return null;
53
53
  }
54
54
  if (/\d/.test(ch)) {
55
55
  stream.eatWhile(/[\w\.]/);
@@ -32,14 +32,14 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
32
32
 
33
33
  return function (lang) {
34
34
  return modes[lang] ? CodeMirror.getMode(config, modes[lang]) : null;
35
- }
35
+ };
36
36
  }());
37
37
 
38
38
  function markdown(stream, state) {
39
39
  // intercept fenced code blocks
40
40
  if (stream.sol() && stream.match(/^```([\w+#]*)/)) {
41
41
  // try switching mode
42
- state.localMode = getMode(RegExp.$1)
42
+ state.localMode = getMode(RegExp.$1);
43
43
  if (state.localMode)
44
44
  state.localState = state.localMode.startState();
45
45
 
@@ -103,6 +103,7 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
103
103
 
104
104
  token: function(stream, state) {
105
105
  /* Parse GFM double bracket links */
106
+ var ch;
106
107
  if ((ch = stream.peek()) != undefined && ch == '[') {
107
108
  stream.next(); // Advance the stream
108
109
 
@@ -140,5 +141,5 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
140
141
 
141
142
  return state.token(stream, state);
142
143
  }
143
- }
144
+ };
144
145
  }, "markdown");
@@ -47,7 +47,7 @@ CodeMirror.defineMode("go", function(config, parserConfig) {
47
47
  }
48
48
  if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
49
49
  curPunc = ch;
50
- return null
50
+ return null;
51
51
  }
52
52
  if (ch == "/") {
53
53
  if (stream.eat("*")) {
@@ -144,7 +144,7 @@ CodeMirror.defineMode("go", function(config, parserConfig) {
144
144
  if (curPunc == "{") pushContext(state, stream.column(), "}");
145
145
  else if (curPunc == "[") pushContext(state, stream.column(), "]");
146
146
  else if (curPunc == "(") pushContext(state, stream.column(), ")");
147
- else if (curPunc == "case") ctx.type = "case"
147
+ else if (curPunc == "case") ctx.type = "case";
148
148
  else if (curPunc == "}" && ctx.type == "}") ctx = popContext(state);
149
149
  else if (curPunc == ctx.type) popContext(state);
150
150
  state.startOfLine = false;
@@ -21,7 +21,7 @@ CodeMirror.defineMode("groovy", function(config, parserConfig) {
21
21
  }
22
22
  if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
23
23
  curPunc = ch;
24
- return null
24
+ return null;
25
25
  }
26
26
  if (/\d/.test(ch)) {
27
27
  stream.eatWhile(/[\w\.]/);
@@ -128,7 +128,7 @@ CodeMirror.defineMode("haskell", function(cmCfg, modeCfg) {
128
128
  }
129
129
  setState(ncomment(type, currNest));
130
130
  return type;
131
- }
131
+ };
132
132
  }
133
133
 
134
134
  function stringLiteral(source, setState) {
@@ -170,7 +170,7 @@ CodeMirror.defineMode("haskell", function(cmCfg, modeCfg) {
170
170
  return function () {
171
171
  for (var i = 0; i < arguments.length; i++)
172
172
  wkw[arguments[i]] = t;
173
- }
173
+ };
174
174
  }
175
175
 
176
176
  setType("keyword")(
@@ -6,7 +6,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
6
6
  var keywords = function(){
7
7
  function kw(type) {return {type: type, style: "keyword"};}
8
8
  var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
9
- var operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"}
9
+ var operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"};
10
10
  var type = kw("typedef");
11
11
  return {
12
12
  "if": A, "while": A, "else": B, "do": B, "try": B,
@@ -219,7 +219,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
219
219
  function pushlex(type, info) {
220
220
  var result = function() {
221
221
  var state = cx.state;
222
- state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
222
+ state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info);
223
223
  };
224
224
  result.lex = true;
225
225
  return result;
@@ -243,7 +243,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
243
243
  }
244
244
 
245
245
  function statement(type) {
246
- if (type == "@") return cont(metadef)
246
+ if (type == "@") return cont(metadef);
247
247
  if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
248
248
  if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
249
249
  if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
@@ -297,7 +297,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
297
297
  function metadef(type, value) {
298
298
  if(type == ":") return cont(metadef);
299
299
  if(type == "variable") return cont(metadef);
300
- if(type == "(") return cont(pushlex(")"), comasep(metaargs, ")"), poplex, statement)
300
+ if(type == "(") return cont(pushlex(")"), comasep(metaargs, ")"), poplex, statement);
301
301
  }
302
302
  function metaargs(type, value) {
303
303
  if(typ == "variable") return cont();
@@ -36,7 +36,7 @@ CodeMirror.defineMode("htmlembedded", function(config, parserConfig) {
36
36
  token : parserConfig.startOpen ? scriptingDispatch : htmlDispatch,
37
37
  htmlState : htmlMixedMode.startState(),
38
38
  scriptState : scriptingMode.startState()
39
- }
39
+ };
40
40
  },
41
41
 
42
42
  token: function(stream, state) {
@@ -55,12 +55,12 @@ CodeMirror.defineMode("htmlembedded", function(config, parserConfig) {
55
55
  token : state.token,
56
56
  htmlState : CodeMirror.copyState(htmlMixedMode, state.htmlState),
57
57
  scriptState : CodeMirror.copyState(scriptingMode, state.scriptState)
58
- }
58
+ };
59
59
  },
60
60
 
61
61
 
62
62
  electricChars: "/{}:"
63
- }
63
+ };
64
64
  }, "htmlmixed");
65
65
 
66
66
  CodeMirror.defineMIME("application/x-ejs", { name: "htmlembedded", scriptingModeSpec:"javascript"});
@@ -79,7 +79,7 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
79
79
  },
80
80
 
81
81
  electricChars: "/{}:"
82
- }
82
+ };
83
83
  }, "xml", "javascript", "css");
84
84
 
85
85
  CodeMirror.defineMIME("text/html", "htmlmixed");
@@ -185,7 +185,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
185
185
  function pushlex(type, info) {
186
186
  var result = function() {
187
187
  var state = cx.state;
188
- state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
188
+ state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info);
189
189
  };
190
190
  result.lex = true;
191
191
  return result;
@@ -243,7 +243,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
243
243
 
244
244
  function maybeoperator(type, value) {
245
245
  if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
246
- if (type == "operator" || type == ":") return cont(expression);
246
+ if (type == "operator" && value == "?") return cont(expression, expect(":"), expression);
247
247
  if (type == ";") return;
248
248
  if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
249
249
  if (type == ".") return cont(property, maybeoperator);
@@ -1,25 +1,24 @@
1
1
  /*
2
2
  LESS mode - http://www.lesscss.org/
3
- Ported to CodeMirror by Peter Kroon
3
+ Ported to CodeMirror by Peter Kroon <plakroon@gmail.com>
4
+ Report bugs/issues here: https://github.com/marijnh/CodeMirror/issues GitHub: @peterkroon
4
5
  */
5
6
 
6
7
  CodeMirror.defineMode("less", function(config) {
7
8
  var indentUnit = config.indentUnit, type;
8
9
  function ret(style, tp) {type = tp; return style;}
9
- //html5 tags
10
- var tags = ["a","abbr","acronym","address","applet","area","article","aside","audio","b","base","basefont","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","dir","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","legend","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","tt","u","ul","var","video","wbr"];
10
+ //html tags
11
+ var tags = "a abbr acronym address applet area article aside audio b base basefont bdi bdo big blockquote body br button canvas caption cite code col colgroup command datalist dd del details dfn dir div dl dt em embed fieldset figcaption figure font footer form frame frameset h1 h2 h3 h4 h5 h6 head header hgroup hr html i iframe img input ins keygen kbd label legend li link map mark menu meta meter nav noframes noscript object ol optgroup option output p param pre progress q rp rt ruby s samp script section select small source span strike strong style sub summary sup table tbody td textarea tfoot th thead time title tr track tt u ul var video wbr".split(' ');
11
12
 
12
13
  function inTagsArray(val){
13
- for(var i=0; i<tags.length; i++){
14
- if(val === tags[i]){
15
- return true;
16
- }
17
- }
14
+ for(var i=0; i<tags.length; i++)if(val === tags[i])return true;
18
15
  }
19
-
16
+
17
+ var selectors = /(^\:root$|^\:nth\-child$|^\:nth\-last\-child$|^\:nth\-of\-type$|^\:nth\-last\-of\-type$|^\:first\-child$|^\:last\-child$|^\:first\-of\-type$|^\:last\-of\-type$|^\:only\-child$|^\:only\-of\-type$|^\:empty$|^\:link|^\:visited$|^\:active$|^\:hover$|^\:focus$|^\:target$|^\:lang$|^\:enabled^\:disabled$|^\:checked$|^\:first\-line$|^\:first\-letter$|^\:before$|^\:after$|^\:not$|^\:required$|^\:invalid$)/;
18
+
20
19
  function tokenBase(stream, state) {
21
20
  var ch = stream.next();
22
-
21
+
23
22
  if (ch == "@") {stream.eatWhile(/[\w\-]/); return ret("meta", stream.current());}
24
23
  else if (ch == "/" && stream.eat("*")) {
25
24
  state.tokenize = tokenCComment;
@@ -30,19 +29,20 @@ CodeMirror.defineMode("less", function(config) {
30
29
  return tokenSGMLComment(stream, state);
31
30
  }
32
31
  else if (ch == "=") ret(null, "compare");
33
- else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
32
+ else if (ch == "|" && stream.eat("=")) return ret(null, "compare");
34
33
  else if (ch == "\"" || ch == "'") {
35
34
  state.tokenize = tokenString(ch);
36
35
  return state.tokenize(stream, state);
37
36
  }
38
- else if (ch == "/") { // lesscss e.g.: .png will not be parsed as a class
37
+ else if (ch == "/") { // e.g.: .png will not be parsed as a class
39
38
  if(stream.eat("/")){
40
39
  state.tokenize = tokenSComment;
41
40
  return tokenSComment(stream, state);
42
41
  }else{
43
- stream.eatWhile(/[\a-zA-Z0-9\-_.\s]/);
44
- if(/\/|\)|#/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == ")")))return ret("string", "string");//let url(/images/logo.png) without quotes return as string
45
- return ret("number", "unit");
42
+ if(type == "string" || type == "(")return ret("string", "string");
43
+ if(state.stack[state.stack.length-1] != undefined)return ret(null, ch);
44
+ stream.eatWhile(/[\a-zA-Z0-9\-_.\s]/);
45
+ if( /\/|\)|#/.test(stream.peek() || (stream.eatSpace() && stream.peek() == ")")) || stream.eol() )return ret("string", "string"); // let url(/images/logo.png) without quotes return as string
46
46
  }
47
47
  }
48
48
  else if (ch == "!") {
@@ -53,30 +53,42 @@ CodeMirror.defineMode("less", function(config) {
53
53
  stream.eatWhile(/[\w.%]/);
54
54
  return ret("number", "unit");
55
55
  }
56
- else if (/[,+<>*\/]/.test(ch)) {//removed . dot character original was [,.+>*\/]
56
+ else if (/[,+<>*\/]/.test(ch)) {
57
+ if(stream.peek() == "=" || type == "a")return ret("string", "string");
57
58
  return ret(null, "select-op");
58
59
  }
59
- else if (/[;{}:\[\]()]/.test(ch)) { //added () char for lesscss original was [;{}:\[\]]
60
- if(ch == ":"){
61
- stream.eatWhile(/[active|hover|link|visited]/);
62
- if( stream.current().match(/active|hover|link|visited/)){
60
+ else if (/[;{}:\[\]()~\|]/.test(ch)) {
61
+ if(ch == ":"){
62
+ stream.eatWhile(/[a-z\\\-]/);
63
+ if( selectors.test(stream.current()) ){
63
64
  return ret("tag", "tag");
65
+ }else if(stream.peek() == ":"){//::-webkit-search-decoration
66
+ stream.next();
67
+ stream.eatWhile(/[a-z\\\-]/);
68
+ if(stream.current().match(/\:\:\-(o|ms|moz|webkit)\-/))return ret("string", "string");
69
+ if( selectors.test(stream.current().substring(1)) )return ret("tag", "tag");
70
+ return ret(null, ch);
64
71
  }else{
65
72
  return ret(null, ch);
66
73
  }
74
+ }else if(ch == "~"){
75
+ if(type == "r")return ret("string", "string");
67
76
  }else{
68
77
  return ret(null, ch);
69
78
  }
70
79
  }
71
- else if (ch == ".") { // lesscss
80
+ else if (ch == ".") {
81
+ if(type == "(" || type == "string")return ret("string", "string"); // allow url(../image.png)
72
82
  stream.eatWhile(/[\a-zA-Z0-9\-_]/);
83
+ if(stream.peek() == " ")stream.eatSpace();
84
+ if(stream.peek() == ")")return ret("number", "unit");//rgba(0,0,0,.25);
73
85
  return ret("tag", "tag");
74
86
  }
75
- else if (ch == "#") { // lesscss
87
+ else if (ch == "#") {
76
88
  //we don't eat white-space, we want the hex color and or id only
77
89
  stream.eatWhile(/[A-Za-z0-9]/);
78
90
  //check if there is a proper hex color length e.g. #eee || #eeeEEE
79
- if(stream.current().length ===4 || stream.current().length ===7){
91
+ if(stream.current().length == 4 || stream.current().length == 7){
80
92
  if(stream.current().match(/[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/,false) != null){//is there a valid hex color value present in the current stream
81
93
  //when not a valid hex value, parse as id
82
94
  if(stream.current().substring(1) != stream.current().match(/[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/,false))return ret("atom", "tag");
@@ -96,8 +108,8 @@ CodeMirror.defineMode("less", function(config) {
96
108
  stream.eatWhile(/[\w\\\-]/);
97
109
  return ret("atom", "tag");
98
110
  }
99
- }else{
100
- stream.eatWhile(/[\w\\\-]/);
111
+ }else{//when not a valid hexvalue length
112
+ stream.eatWhile(/[\w\\\-]/);
101
113
  return ret("atom", "tag");
102
114
  }
103
115
  }
@@ -107,39 +119,62 @@ CodeMirror.defineMode("less", function(config) {
107
119
  }
108
120
  else {
109
121
  stream.eatWhile(/[\w\\\-_%.{]/);
110
- if(stream.current().match(/http|https/) != null){
122
+ if(type == "string"){
123
+ return ret("string", "string");
124
+ }else if(stream.current().match(/(^http$|^https$)/) != null){
111
125
  stream.eatWhile(/[\w\\\-_%.{:\/]/);
112
126
  return ret("string", "string");
113
127
  }else if(stream.peek() == "<" || stream.peek() == ">"){
114
128
  return ret("tag", "tag");
115
- }else if( stream.peek().match(/\(/) != null ){// lessc
129
+ }else if( /\(/.test(stream.peek()) ){
116
130
  return ret(null, ch);
117
131
  }else if (stream.peek() == "/" && state.stack[state.stack.length-1] != undefined){ // url(dir/center/image.png)
118
132
  return ret("string", "string");
119
- }else if( stream.current().match(/\-\d|\-.\d/) ){ // lesscss match e.g.: -5px -0.4 etc... only colorize the minus sign
120
- //stream.backUp(stream.current().length-1); //commment out these 2 comment if you want the minus sign to be parsed as null -500px
121
- //return ret(null, ch);
133
+ }else if( stream.current().match(/\-\d|\-.\d/) ){ // match e.g.: -5px -0.4 etc... only colorize the minus sign
134
+ //commment out these 2 comment if you want the minus sign to be parsed as null -500px
135
+ //stream.backUp(stream.current().length-1);
136
+ //return ret(null, ch); //console.log( stream.current() );
122
137
  return ret("number", "unit");
123
- }else if( inTagsArray(stream.current()) ){ // lesscss match html tags
138
+ }else if( inTagsArray(stream.current().toLowerCase()) ){ // match html tags
124
139
  return ret("tag", "tag");
125
140
  }else if( /\/|[\s\)]/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == "/")) && stream.current().indexOf(".") !== -1){
126
- if(stream.current().substring(stream.current().length-1,stream.current().length) == "{"){
127
- stream.backUp(1);
128
- return ret("tag", "tag");
129
- }//end if
130
- if( (stream.eatSpace() && stream.peek().match(/[{<>.a-zA-Z]/) != null) || stream.eol() )return ret("tag", "tag");//e.g. button.icon-plus
131
- return ret("string", "string");//let url(/images/logo.png) without quotes return as string
132
- }else if( stream.eol() ){
133
- if(stream.current().substring(stream.current().length-1,stream.current().length) == "{")stream.backUp(1);
134
- return ret("tag", "tag");
135
- }else{
136
- return ret("variable", "variable");
141
+ if(stream.current().substring(stream.current().length-1,stream.current().length) == "{"){
142
+ stream.backUp(1);
143
+ return ret("tag", "tag");
144
+ }//end if
145
+ stream.eatSpace();
146
+ if( /[{<>.a-zA-Z\/]/.test(stream.peek()) || stream.eol() )return ret("tag", "tag"); // e.g. button.icon-plus
147
+ return ret("string", "string"); // let url(/images/logo.png) without quotes return as string
148
+ }else if( stream.eol() || stream.peek() == "[" || stream.peek() == "#" || type == "tag" ){
149
+ if(stream.current().substring(stream.current().length-1,stream.current().length) == "{")stream.backUp(1);
150
+ return ret("tag", "tag");
151
+ }else if(type == "compare" || type == "a" || type == "("){
152
+ return ret("string", "string");
153
+ }else if(type == "|" || stream.current() == "-" || type == "["){
154
+ return ret(null, ch);
155
+ }else if(stream.peek() == ":") {
156
+ stream.next();
157
+ var t_v = stream.peek() == ":" ? true : false;
158
+ if(!t_v){
159
+ var old_pos = stream.pos;
160
+ var sc = stream.current().length;
161
+ stream.eatWhile(/[a-z\\\-]/);
162
+ var new_pos = stream.pos;
163
+ if(stream.current().substring(sc-1).match(selectors) != null){
164
+ stream.backUp(new_pos-(old_pos-1));
165
+ return ret("tag", "tag");
166
+ } else stream.backUp(new_pos-(old_pos-1));
167
+ }else{
168
+ stream.backUp(1);
169
+ }
170
+ if(t_v)return ret("tag", "tag"); else return ret("variable", "variable");
171
+ }else{
172
+ return ret("variable", "variable");
137
173
  }
138
- }
139
-
174
+ }
140
175
  }
141
-
142
- function tokenSComment(stream, state) {// SComment = Slash comment
176
+
177
+ function tokenSComment(stream, state) { // SComment = Slash comment
143
178
  stream.skipToEnd();
144
179
  state.tokenize = tokenBase;
145
180
  return ret("comment", "comment");
@@ -156,7 +191,7 @@ CodeMirror.defineMode("less", function(config) {
156
191
  }
157
192
  return ret("comment", "comment");
158
193
  }
159
-
194
+
160
195
  function tokenSGMLComment(stream, state) {
161
196
  var dashes = 0, ch;
162
197
  while ((ch = stream.next()) != null) {
@@ -168,7 +203,7 @@ CodeMirror.defineMode("less", function(config) {
168
203
  }
169
204
  return ret("comment", "comment");
170
205
  }
171
-
206
+
172
207
  function tokenString(quote) {
173
208
  return function(stream, state) {
174
209
  var escaped = false, ch;
@@ -181,29 +216,28 @@ CodeMirror.defineMode("less", function(config) {
181
216
  return ret("string", "string");
182
217
  };
183
218
  }
184
-
219
+
185
220
  return {
186
221
  startState: function(base) {
187
222
  return {tokenize: tokenBase,
188
223
  baseIndent: base || 0,
189
224
  stack: []};
190
225
  },
191
-
226
+
192
227
  token: function(stream, state) {
193
228
  if (stream.eatSpace()) return null;
194
229
  var style = state.tokenize(stream, state);
195
-
230
+
196
231
  var context = state.stack[state.stack.length-1];
197
232
  if (type == "hash" && context == "rule") style = "atom";
198
233
  else if (style == "variable") {
199
234
  if (context == "rule") style = null; //"tag"
200
- else if (!context || context == "@media{"){
201
- style = stream.current() == "when" ? "variable" :
202
- stream.string.match(/#/g) != undefined ? null :
203
- /[\s,|\s\)]/.test(stream.peek()) ? "tag" : null;
204
- }
235
+ else if (!context || context == "@media{") {
236
+ style = stream.current() == "when" ? "variable" :
237
+ /[\s,|\s\)|\s]/.test(stream.peek()) ? "tag" : type;
238
+ }
205
239
  }
206
-
240
+
207
241
  if (context == "rule" && /^[\{\};]$/.test(type))
208
242
  state.stack.pop();
209
243
  if (type == "{") {
@@ -215,18 +249,18 @@ CodeMirror.defineMode("less", function(config) {
215
249
  else if (context == "{" && type != "comment") state.stack.push("rule");
216
250
  return style;
217
251
  },
218
-
252
+
219
253
  indent: function(state, textAfter) {
220
254
  var n = state.stack.length;
221
255
  if (/^\}/.test(textAfter))
222
256
  n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
223
257
  return state.baseIndent + n * indentUnit;
224
258
  },
225
-
259
+
226
260
  electricChars: "}"
227
261
  };
228
262
  });
229
263
 
230
264
  CodeMirror.defineMIME("text/x-less", "less");
231
265
  if (!CodeMirror.mimeModes.hasOwnProperty("text/css"))
232
- CodeMirror.defineMIME("text/css", "less");
266
+ CodeMirror.defineMIME("text/css", "less");