codemirror-rails 5.5 → 5.6

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +54 -20
  4. data/vendor/assets/javascripts/codemirror/addons/display/autorefresh.js +47 -0
  5. data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +6 -3
  6. data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +1 -1
  7. data/vendor/assets/javascripts/codemirror/addons/lint/html-lint.js +46 -0
  8. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +8 -2
  9. data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +2 -2
  10. data/vendor/assets/javascripts/codemirror/addons/search/search.js +11 -0
  11. data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +6 -5
  12. data/vendor/assets/javascripts/codemirror/modes/css.js +26 -10
  13. data/vendor/assets/javascripts/codemirror/modes/cypher.js +2 -2
  14. data/vendor/assets/javascripts/codemirror/modes/dockerfile.js +4 -1
  15. data/vendor/assets/javascripts/codemirror/modes/go.js +1 -1
  16. data/vendor/assets/javascripts/codemirror/modes/javascript.js +1 -6
  17. data/vendor/assets/javascripts/codemirror/modes/php.js +6 -5
  18. data/vendor/assets/javascripts/codemirror/modes/rust.js +39 -432
  19. data/vendor/assets/javascripts/codemirror/modes/stylus.js +10 -9
  20. data/vendor/assets/stylesheets/codemirror.css +12 -10
  21. data/vendor/assets/stylesheets/codemirror/themes/3024-day.css +20 -20
  22. data/vendor/assets/stylesheets/codemirror/themes/3024-night.css +20 -20
  23. data/vendor/assets/stylesheets/codemirror/themes/abcdef.css +32 -0
  24. data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +7 -9
  25. data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +24 -24
  26. data/vendor/assets/stylesheets/codemirror/themes/base16-light.css +24 -24
  27. data/vendor/assets/stylesheets/codemirror/themes/blackboard.css +5 -5
  28. data/vendor/assets/stylesheets/codemirror/themes/cobalt.css +4 -4
  29. data/vendor/assets/stylesheets/codemirror/themes/colorforth.css +3 -3
  30. data/vendor/assets/stylesheets/codemirror/themes/dracula.css +25 -71
  31. data/vendor/assets/stylesheets/codemirror/themes/eclipse.css +21 -21
  32. data/vendor/assets/stylesheets/codemirror/themes/elegant.css +12 -12
  33. data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +4 -4
  34. data/vendor/assets/stylesheets/codemirror/themes/icecoder.css +29 -29
  35. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +14 -14
  36. data/vendor/assets/stylesheets/codemirror/themes/liquibyte.css +5 -5
  37. data/vendor/assets/stylesheets/codemirror/themes/material.css +28 -80
  38. data/vendor/assets/stylesheets/codemirror/themes/mbo.css +23 -23
  39. data/vendor/assets/stylesheets/codemirror/themes/mdn-like.css +6 -6
  40. data/vendor/assets/stylesheets/codemirror/themes/midnight.css +22 -24
  41. data/vendor/assets/stylesheets/codemirror/themes/monokai.css +21 -21
  42. data/vendor/assets/stylesheets/codemirror/themes/neat.css +3 -3
  43. data/vendor/assets/stylesheets/codemirror/themes/neo.css +7 -7
  44. data/vendor/assets/stylesheets/codemirror/themes/night.css +4 -4
  45. data/vendor/assets/stylesheets/codemirror/themes/paraiso-dark.css +24 -24
  46. data/vendor/assets/stylesheets/codemirror/themes/paraiso-light.css +24 -24
  47. data/vendor/assets/stylesheets/codemirror/themes/pastel-on-dark.css +3 -3
  48. data/vendor/assets/stylesheets/codemirror/themes/rubyblue.css +3 -3
  49. data/vendor/assets/stylesheets/codemirror/themes/seti.css +25 -69
  50. data/vendor/assets/stylesheets/codemirror/themes/solarized.css +7 -9
  51. data/vendor/assets/stylesheets/codemirror/themes/the-matrix.css +21 -21
  52. data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-bright.css +24 -24
  53. data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-eighties.css +24 -24
  54. data/vendor/assets/stylesheets/codemirror/themes/ttcn.css +45 -46
  55. data/vendor/assets/stylesheets/codemirror/themes/twilight.css +7 -7
  56. data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +9 -9
  57. data/vendor/assets/stylesheets/codemirror/themes/xq-dark.css +20 -20
  58. data/vendor/assets/stylesheets/codemirror/themes/xq-light.css +18 -18
  59. data/vendor/assets/stylesheets/codemirror/themes/yeti.css +24 -66
  60. data/vendor/assets/stylesheets/codemirror/themes/zenburn.css +3 -3
  61. metadata +5 -2
@@ -12,13 +12,16 @@
12
12
  "use strict";
13
13
 
14
14
  CodeMirror.defineMode("css", function(config, parserConfig) {
15
+ var provided = parserConfig;
15
16
  if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css");
17
+ parserConfig.inline = provided.inline;
16
18
 
17
19
  var indentUnit = config.indentUnit,
18
20
  tokenHooks = parserConfig.tokenHooks,
19
21
  documentTypes = parserConfig.documentTypes || {},
20
22
  mediaTypes = parserConfig.mediaTypes || {},
21
23
  mediaFeatures = parserConfig.mediaFeatures || {},
24
+ mediaValueKeywords = parserConfig.mediaValueKeywords || {},
22
25
  propertyKeywords = parserConfig.propertyKeywords || {},
23
26
  nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},
24
27
  fontProperties = parserConfig.fontProperties || {},
@@ -267,6 +270,8 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
267
270
  override = "attribute";
268
271
  else if (mediaFeatures.hasOwnProperty(word))
269
272
  override = "property";
273
+ else if (mediaValueKeywords.hasOwnProperty(word))
274
+ override = "keyword";
270
275
  else if (propertyKeywords.hasOwnProperty(word))
271
276
  override = "property";
272
277
  else if (nonStandardPropertyKeywords.hasOwnProperty(word))
@@ -338,9 +343,9 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
338
343
  return {
339
344
  startState: function(base) {
340
345
  return {tokenize: null,
341
- state: "top",
346
+ state: parserConfig.inline ? "block" : "top",
342
347
  stateArg: null,
343
- context: new Context("top", base || 0, null)};
348
+ context: new Context(parserConfig.inline ? "block" : "top", base || 0, null)};
344
349
  },
345
350
 
346
351
  token: function(stream, state) {
@@ -401,9 +406,16 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
401
406
  "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color",
402
407
  "max-color", "color-index", "min-color-index", "max-color-index",
403
408
  "monochrome", "min-monochrome", "max-monochrome", "resolution",
404
- "min-resolution", "max-resolution", "scan", "grid"
409
+ "min-resolution", "max-resolution", "scan", "grid", "orientation",
410
+ "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio",
411
+ "pointer", "any-pointer", "hover", "any-hover"
405
412
  ], mediaFeatures = keySet(mediaFeatures_);
406
413
 
414
+ var mediaValueKeywords_ = [
415
+ "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover",
416
+ "interlace", "progressive"
417
+ ], mediaValueKeywords = keySet(mediaValueKeywords_);
418
+
407
419
  var propertyKeywords_ = [
408
420
  "align-content", "align-items", "align-self", "alignment-adjust",
409
421
  "alignment-baseline", "anchor-point", "animation", "animation-delay",
@@ -555,7 +567,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
555
567
  "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret",
556
568
  "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch",
557
569
  "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote",
558
- "col-resize", "collapse", "column", "compact", "condensed", "contain", "content",
570
+ "col-resize", "collapse", "column", "column-reverse", "compact", "condensed", "contain", "content",
559
571
  "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop",
560
572
  "cross", "crosshair", "currentcolor", "cursive", "cyclic", "dashed", "decimal",
561
573
  "decimal-leading-zero", "default", "default-button", "destination-atop",
@@ -571,7 +583,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
571
583
  "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et",
572
584
  "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig",
573
585
  "ethiopic-numeric", "ew-resize", "expanded", "extends", "extra-condensed",
574
- "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "footnotes",
586
+ "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes",
575
587
  "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove",
576
588
  "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew",
577
589
  "help", "hidden", "hide", "higher", "highlight", "highlighttext",
@@ -608,7 +620,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
608
620
  "relative", "repeat", "repeating-linear-gradient",
609
621
  "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse",
610
622
  "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY",
611
- "rotateZ", "round", "row-resize", "rtl", "run-in", "running",
623
+ "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running",
612
624
  "s-resize", "sans-serif", "scale", "scale3d", "scaleX", "scaleY", "scaleZ",
613
625
  "scroll", "scrollbar", "se-resize", "searchfield",
614
626
  "searchfield-cancel-button", "searchfield-decoration",
@@ -618,7 +630,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
618
630
  "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal",
619
631
  "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
620
632
  "small", "small-caps", "small-caption", "smaller", "solid", "somali",
621
- "source-atop", "source-in", "source-out", "source-over", "space", "spell-out", "square",
633
+ "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "spell-out", "square",
622
634
  "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub",
623
635
  "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table",
624
636
  "table-caption", "table-cell", "table-column", "table-column-group",
@@ -635,12 +647,13 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
635
647
  "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url",
636
648
  "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted",
637
649
  "visibleStroke", "visual", "w-resize", "wait", "wave", "wider",
638
- "window", "windowframe", "windowtext", "words", "x-large", "x-small", "xor",
650
+ "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor",
639
651
  "xx-large", "xx-small"
640
652
  ], valueKeywords = keySet(valueKeywords_);
641
653
 
642
- var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(propertyKeywords_)
643
- .concat(nonStandardPropertyKeywords_).concat(colorKeywords_).concat(valueKeywords_);
654
+ var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_)
655
+ .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_)
656
+ .concat(valueKeywords_);
644
657
  CodeMirror.registerHelper("hintWords", "css", allWords);
645
658
 
646
659
  function tokenCComment(stream, state) {
@@ -659,6 +672,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
659
672
  documentTypes: documentTypes,
660
673
  mediaTypes: mediaTypes,
661
674
  mediaFeatures: mediaFeatures,
675
+ mediaValueKeywords: mediaValueKeywords,
662
676
  propertyKeywords: propertyKeywords,
663
677
  nonStandardPropertyKeywords: nonStandardPropertyKeywords,
664
678
  fontProperties: fontProperties,
@@ -678,6 +692,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
678
692
  CodeMirror.defineMIME("text/x-scss", {
679
693
  mediaTypes: mediaTypes,
680
694
  mediaFeatures: mediaFeatures,
695
+ mediaValueKeywords: mediaValueKeywords,
681
696
  propertyKeywords: propertyKeywords,
682
697
  nonStandardPropertyKeywords: nonStandardPropertyKeywords,
683
698
  colorKeywords: colorKeywords,
@@ -719,6 +734,7 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
719
734
  CodeMirror.defineMIME("text/x-less", {
720
735
  mediaTypes: mediaTypes,
721
736
  mediaFeatures: mediaFeatures,
737
+ mediaValueKeywords: mediaValueKeywords,
722
738
  propertyKeywords: propertyKeywords,
723
739
  nonStandardPropertyKeywords: nonStandardPropertyKeywords,
724
740
  colorKeywords: colorKeywords,
@@ -61,8 +61,8 @@
61
61
  var indentUnit = config.indentUnit;
62
62
  var curPunc;
63
63
  var funcs = wordRegexp(["abs", "acos", "allShortestPaths", "asin", "atan", "atan2", "avg", "ceil", "coalesce", "collect", "cos", "cot", "count", "degrees", "e", "endnode", "exp", "extract", "filter", "floor", "haversin", "head", "id", "keys", "labels", "last", "left", "length", "log", "log10", "lower", "ltrim", "max", "min", "node", "nodes", "percentileCont", "percentileDisc", "pi", "radians", "rand", "range", "reduce", "rel", "relationship", "relationships", "replace", "right", "round", "rtrim", "shortestPath", "sign", "sin", "split", "sqrt", "startnode", "stdev", "stdevp", "str", "substring", "sum", "tail", "tan", "timestamp", "toFloat", "toInt", "trim", "type", "upper"]);
64
- var preds = wordRegexp(["all", "and", "any", "has", "in", "none", "not", "or", "single", "xor"]);
65
- var keywords = wordRegexp(["as", "asc", "ascending", "assert", "by", "case", "commit", "constraint", "create", "csv", "cypher", "delete", "desc", "descending", "distinct", "drop", "else", "end", "explain", "false", "fieldterminator", "foreach", "from", "headers", "in", "index", "is", "limit", "load", "match", "merge", "null", "on", "optional", "order", "periodic", "profile", "remove", "return", "scan", "set", "skip", "start", "then", "true", "union", "unique", "unwind", "using", "when", "where", "with"]);
64
+ var preds = wordRegexp(["all", "and", "any", "has", "in", "none", "not", "or", "single", "xor", "like", "ilike", "exists"]);
65
+ var keywords = wordRegexp(["as", "asc", "ascending", "assert", "by", "case", "commit", "constraint", "create", "csv", "cypher", "delete", "desc", "descending", "distinct", "drop", "else", "end", "explain", "false", "fieldterminator", "foreach", "from", "headers", "in", "index", "is", "join", "limit", "load", "match", "merge", "null", "on", "optional", "order", "periodic", "profile", "remove", "return", "scan", "set", "skip", "start", "then", "true", "union", "unique", "unwind", "using", "when", "where", "with"]);
66
66
  var operatorChars = /[*+\-<>=&|~%^]/;
67
67
 
68
68
  return {
@@ -69,7 +69,10 @@
69
69
  token: null,
70
70
  next: "start"
71
71
  }
72
- ]
72
+ ],
73
+ meta: {
74
+ lineComment: "#"
75
+ }
73
76
  });
74
77
 
75
78
  CodeMirror.defineMIME("text/x-dockerfile", "dockerfile");
@@ -86,7 +86,7 @@ CodeMirror.defineMode("go", function(config) {
86
86
  var escaped = false, next, end = false;
87
87
  while ((next = stream.next()) != null) {
88
88
  if (next == quote && !escaped) {end = true; break;}
89
- escaped = !escaped && next == "\\";
89
+ escaped = !escaped && quote != "`" && next == "\\";
90
90
  }
91
91
  if (end || !(escaped || quote == "`"))
92
92
  state.tokenize = tokenBase;
@@ -36,7 +36,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
36
36
  "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
37
37
  "in": operator, "typeof": operator, "instanceof": operator,
38
38
  "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,
39
- "this": kw("this"), "module": kw("module"), "class": kw("class"), "super": kw("atom"),
39
+ "this": kw("this"), "class": kw("class"), "super": kw("atom"),
40
40
  "yield": C, "export": kw("export"), "import": kw("import"), "extends": C
41
41
  };
42
42
 
@@ -347,7 +347,6 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
347
347
  if (type == "default") return cont(expect(":"));
348
348
  if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
349
349
  statement, poplex, popcontext);
350
- if (type == "module") return cont(pushlex("form"), pushcontext, afterModule, popcontext, poplex);
351
350
  if (type == "class") return cont(pushlex("form"), className, poplex);
352
351
  if (type == "export") return cont(pushlex("form"), afterExport, poplex);
353
352
  if (type == "import") return cont(pushlex("form"), afterImport, poplex);
@@ -572,10 +571,6 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
572
571
  cx.marked = "property";
573
572
  return cont();
574
573
  }
575
- function afterModule(type, value) {
576
- if (type == "string") return cont(statement);
577
- if (type == "variable") { register(value); return cont(maybeFrom); }
578
- }
579
574
  function afterExport(_type, value) {
580
575
  if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
581
576
  if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }
@@ -105,14 +105,15 @@
105
105
  return "variable-2";
106
106
  },
107
107
  "<": function(stream, state) {
108
- if (stream.match(/<</)) {
109
- var nowDoc = stream.eat("'");
108
+ var before;
109
+ if (before = stream.match(/<<\s*/)) {
110
+ var quoted = stream.eat(/['"]/);
110
111
  stream.eatWhile(/[\w\.]/);
111
- var delim = stream.current().slice(3 + (nowDoc ? 1 : 0));
112
- if (nowDoc) stream.eat("'");
112
+ var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));
113
+ if (quoted) stream.eat(quoted);
113
114
  if (delim) {
114
115
  (state.tokStack || (state.tokStack = [])).push(delim, 0);
115
- state.tokenize = phpString(delim, nowDoc ? false : true);
116
+ state.tokenize = phpString(delim, quoted != "'");
116
117
  return "string";
117
118
  }
118
119
  }
@@ -3,449 +3,56 @@
3
3
 
4
4
  (function(mod) {
5
5
  if (typeof exports == "object" && typeof module == "object") // CommonJS
6
- mod(require("../../lib/codemirror"));
6
+ mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
7
7
  else if (typeof define == "function" && define.amd) // AMD
8
- define(["../../lib/codemirror"], mod);
8
+ define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
9
9
  else // Plain browser env
10
10
  mod(CodeMirror);
11
11
  })(function(CodeMirror) {
12
12
  "use strict";
13
13
 
14
- CodeMirror.defineMode("rust", function() {
15
- var indentUnit = 4, altIndentUnit = 2;
16
- var valKeywords = {
17
- "if": "if-style", "while": "if-style", "loop": "else-style", "else": "else-style",
18
- "do": "else-style", "ret": "else-style", "fail": "else-style",
19
- "break": "atom", "cont": "atom", "const": "let", "resource": "fn",
20
- "let": "let", "fn": "fn", "for": "for", "alt": "alt", "iface": "iface",
21
- "impl": "impl", "type": "type", "enum": "enum", "mod": "mod",
22
- "as": "op", "true": "atom", "false": "atom", "assert": "op", "check": "op",
23
- "claim": "op", "native": "ignore", "unsafe": "ignore", "import": "else-style",
24
- "export": "else-style", "copy": "op", "log": "op", "log_err": "op",
25
- "use": "op", "bind": "op", "self": "atom", "struct": "enum"
26
- };
27
- var typeKeywords = function() {
28
- var keywords = {"fn": "fn", "block": "fn", "obj": "obj"};
29
- var atoms = "bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 str char isize usize".split(" ");
30
- for (var i = 0, e = atoms.length; i < e; ++i) keywords[atoms[i]] = "atom";
31
- return keywords;
32
- }();
33
- var operatorChar = /[+\-*&%=<>!?|\.@]/;
34
-
35
- // Tokenizer
36
-
37
- // Used as scratch variable to communicate multiple values without
38
- // consing up tons of objects.
39
- var tcat, content;
40
- function r(tc, style) {
41
- tcat = tc;
42
- return style;
43
- }
44
-
45
- function tokenBase(stream, state) {
46
- var ch = stream.next();
47
- if (ch == '"') {
48
- state.tokenize = tokenString;
49
- return state.tokenize(stream, state);
50
- }
51
- if (ch == "'") {
52
- tcat = "atom";
53
- if (stream.eat("\\")) {
54
- if (stream.skipTo("'")) { stream.next(); return "string"; }
55
- else { return "error"; }
56
- } else {
57
- stream.next();
58
- return stream.eat("'") ? "string" : "error";
59
- }
60
- }
61
- if (ch == "/") {
62
- if (stream.eat("/")) { stream.skipToEnd(); return "comment"; }
63
- if (stream.eat("*")) {
64
- state.tokenize = tokenComment(1);
65
- return state.tokenize(stream, state);
66
- }
67
- }
68
- if (ch == "#") {
69
- if (stream.eat("[")) { tcat = "open-attr"; return null; }
70
- stream.eatWhile(/\w/);
71
- return r("macro", "meta");
72
- }
73
- if (ch == ":" && stream.match(":<")) {
74
- return r("op", null);
75
- }
76
- if (ch.match(/\d/) || (ch == "." && stream.eat(/\d/))) {
77
- var flp = false;
78
- if (!stream.match(/^x[\da-f]+/i) && !stream.match(/^b[01]+/)) {
79
- stream.eatWhile(/\d/);
80
- if (stream.eat(".")) { flp = true; stream.eatWhile(/\d/); }
81
- if (stream.match(/^e[+\-]?\d+/i)) { flp = true; }
82
- }
83
- if (flp) stream.match(/^f(?:32|64)/);
84
- else stream.match(/^[ui](?:8|16|32|64)/);
85
- return r("atom", "number");
86
- }
87
- if (ch.match(/[()\[\]{}:;,]/)) return r(ch, null);
88
- if (ch == "-" && stream.eat(">")) return r("->", null);
89
- if (ch.match(operatorChar)) {
90
- stream.eatWhile(operatorChar);
91
- return r("op", null);
92
- }
93
- stream.eatWhile(/\w/);
94
- content = stream.current();
95
- if (stream.match(/^::\w/)) {
96
- stream.backUp(1);
97
- return r("prefix", "variable-2");
98
- }
99
- if (state.keywords.propertyIsEnumerable(content))
100
- return r(state.keywords[content], content.match(/true|false/) ? "atom" : "keyword");
101
- return r("name", "variable");
102
- }
103
-
104
- function tokenString(stream, state) {
105
- var ch, escaped = false;
106
- while (ch = stream.next()) {
107
- if (ch == '"' && !escaped) {
108
- state.tokenize = tokenBase;
109
- return r("atom", "string");
110
- }
111
- escaped = !escaped && ch == "\\";
112
- }
113
- // Hack to not confuse the parser when a string is split in
114
- // pieces.
115
- return r("op", "string");
116
- }
117
-
118
- function tokenComment(depth) {
119
- return function(stream, state) {
120
- var lastCh = null, ch;
121
- while (ch = stream.next()) {
122
- if (ch == "/" && lastCh == "*") {
123
- if (depth == 1) {
124
- state.tokenize = tokenBase;
125
- break;
126
- } else {
127
- state.tokenize = tokenComment(depth - 1);
128
- return state.tokenize(stream, state);
129
- }
130
- }
131
- if (ch == "*" && lastCh == "/") {
132
- state.tokenize = tokenComment(depth + 1);
133
- return state.tokenize(stream, state);
134
- }
135
- lastCh = ch;
136
- }
137
- return "comment";
138
- };
139
- }
140
-
141
- // Parser
142
-
143
- var cx = {state: null, stream: null, marked: null, cc: null};
144
- function pass() {
145
- for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
146
- }
147
- function cont() {
148
- pass.apply(null, arguments);
149
- return true;
150
- }
151
-
152
- function pushlex(type, info) {
153
- var result = function() {
154
- var state = cx.state;
155
- state.lexical = {indented: state.indented, column: cx.stream.column(),
156
- type: type, prev: state.lexical, info: info};
157
- };
158
- result.lex = true;
159
- return result;
160
- }
161
- function poplex() {
162
- var state = cx.state;
163
- if (state.lexical.prev) {
164
- if (state.lexical.type == ")")
165
- state.indented = state.lexical.indented;
166
- state.lexical = state.lexical.prev;
167
- }
168
- }
169
- function typecx() { cx.state.keywords = typeKeywords; }
170
- function valcx() { cx.state.keywords = valKeywords; }
171
- poplex.lex = typecx.lex = valcx.lex = true;
172
-
173
- function commasep(comb, end) {
174
- function more(type) {
175
- if (type == ",") return cont(comb, more);
176
- if (type == end) return cont();
177
- return cont(more);
178
- }
179
- return function(type) {
180
- if (type == end) return cont();
181
- return pass(comb, more);
182
- };
183
- }
184
-
185
- function stat_of(comb, tag) {
186
- return cont(pushlex("stat", tag), comb, poplex, block);
187
- }
188
- function block(type) {
189
- if (type == "}") return cont();
190
- if (type == "let") return stat_of(letdef1, "let");
191
- if (type == "fn") return stat_of(fndef);
192
- if (type == "type") return cont(pushlex("stat"), tydef, endstatement, poplex, block);
193
- if (type == "enum") return stat_of(enumdef);
194
- if (type == "mod") return stat_of(mod);
195
- if (type == "iface") return stat_of(iface);
196
- if (type == "impl") return stat_of(impl);
197
- if (type == "open-attr") return cont(pushlex("]"), commasep(expression, "]"), poplex);
198
- if (type == "ignore" || type.match(/[\]\);,]/)) return cont(block);
199
- return pass(pushlex("stat"), expression, poplex, endstatement, block);
200
- }
201
- function endstatement(type) {
202
- if (type == ";") return cont();
203
- return pass();
204
- }
205
- function expression(type) {
206
- if (type == "atom" || type == "name") return cont(maybeop);
207
- if (type == "{") return cont(pushlex("}"), exprbrace, poplex);
208
- if (type.match(/[\[\(]/)) return matchBrackets(type, expression);
209
- if (type.match(/[\]\)\};,]/)) return pass();
210
- if (type == "if-style") return cont(expression, expression);
211
- if (type == "else-style" || type == "op") return cont(expression);
212
- if (type == "for") return cont(pattern, maybetype, inop, expression, expression);
213
- if (type == "alt") return cont(expression, altbody);
214
- if (type == "fn") return cont(fndef);
215
- if (type == "macro") return cont(macro);
216
- return cont();
217
- }
218
- function maybeop(type) {
219
- if (content == ".") return cont(maybeprop);
220
- if (content == "::<"){return cont(typarams, maybeop);}
221
- if (type == "op" || content == ":") return cont(expression);
222
- if (type == "(" || type == "[") return matchBrackets(type, expression);
223
- return pass();
224
- }
225
- function maybeprop() {
226
- if (content.match(/^\w+$/)) {cx.marked = "variable"; return cont(maybeop);}
227
- return pass(expression);
228
- }
229
- function exprbrace(type) {
230
- if (type == "op") {
231
- if (content == "|") return cont(blockvars, poplex, pushlex("}", "block"), block);
232
- if (content == "||") return cont(poplex, pushlex("}", "block"), block);
233
- }
234
- if (content == "mutable" || (content.match(/^\w+$/) && cx.stream.peek() == ":"
235
- && !cx.stream.match("::", false)))
236
- return pass(record_of(expression));
237
- return pass(block);
238
- }
239
- function record_of(comb) {
240
- function ro(type) {
241
- if (content == "mutable" || content == "with") {cx.marked = "keyword"; return cont(ro);}
242
- if (content.match(/^\w*$/)) {cx.marked = "variable"; return cont(ro);}
243
- if (type == ":") return cont(comb, ro);
244
- if (type == "}") return cont();
245
- return cont(ro);
246
- }
247
- return ro;
248
- }
249
- function blockvars(type) {
250
- if (type == "name") {cx.marked = "def"; return cont(blockvars);}
251
- if (type == "op" && content == "|") return cont();
252
- return cont(blockvars);
253
- }
254
-
255
- function letdef1(type) {
256
- if (type.match(/[\]\)\};]/)) return cont();
257
- if (content == "=") return cont(expression, letdef2);
258
- if (type == ",") return cont(letdef1);
259
- return pass(pattern, maybetype, letdef1);
260
- }
261
- function letdef2(type) {
262
- if (type.match(/[\]\)\};,]/)) return pass(letdef1);
263
- else return pass(expression, letdef2);
264
- }
265
- function maybetype(type) {
266
- if (type == ":") return cont(typecx, rtype, valcx);
267
- return pass();
268
- }
269
- function inop(type) {
270
- if (type == "name" && content == "in") {cx.marked = "keyword"; return cont();}
271
- return pass();
272
- }
273
- function fndef(type) {
274
- if (content == "@" || content == "~") {cx.marked = "keyword"; return cont(fndef);}
275
- if (type == "name") {cx.marked = "def"; return cont(fndef);}
276
- if (content == "<") return cont(typarams, fndef);
277
- if (type == "{") return pass(expression);
278
- if (type == "(") return cont(pushlex(")"), commasep(argdef, ")"), poplex, fndef);
279
- if (type == "->") return cont(typecx, rtype, valcx, fndef);
280
- if (type == ";") return cont();
281
- return cont(fndef);
282
- }
283
- function tydef(type) {
284
- if (type == "name") {cx.marked = "def"; return cont(tydef);}
285
- if (content == "<") return cont(typarams, tydef);
286
- if (content == "=") return cont(typecx, rtype, valcx);
287
- return cont(tydef);
288
- }
289
- function enumdef(type) {
290
- if (type == "name") {cx.marked = "def"; return cont(enumdef);}
291
- if (content == "<") return cont(typarams, enumdef);
292
- if (content == "=") return cont(typecx, rtype, valcx, endstatement);
293
- if (type == "{") return cont(pushlex("}"), typecx, enumblock, valcx, poplex);
294
- return cont(enumdef);
295
- }
296
- function enumblock(type) {
297
- if (type == "}") return cont();
298
- if (type == "(") return cont(pushlex(")"), commasep(rtype, ")"), poplex, enumblock);
299
- if (content.match(/^\w+$/)) cx.marked = "def";
300
- return cont(enumblock);
301
- }
302
- function mod(type) {
303
- if (type == "name") {cx.marked = "def"; return cont(mod);}
304
- if (type == "{") return cont(pushlex("}"), block, poplex);
305
- return pass();
306
- }
307
- function iface(type) {
308
- if (type == "name") {cx.marked = "def"; return cont(iface);}
309
- if (content == "<") return cont(typarams, iface);
310
- if (type == "{") return cont(pushlex("}"), block, poplex);
311
- return pass();
312
- }
313
- function impl(type) {
314
- if (content == "<") return cont(typarams, impl);
315
- if (content == "of" || content == "for") {cx.marked = "keyword"; return cont(rtype, impl);}
316
- if (type == "name") {cx.marked = "def"; return cont(impl);}
317
- if (type == "{") return cont(pushlex("}"), block, poplex);
318
- return pass();
319
- }
320
- function typarams() {
321
- if (content == ">") return cont();
322
- if (content == ",") return cont(typarams);
323
- if (content == ":") return cont(rtype, typarams);
324
- return pass(rtype, typarams);
325
- }
326
- function argdef(type) {
327
- if (type == "name") {cx.marked = "def"; return cont(argdef);}
328
- if (type == ":") return cont(typecx, rtype, valcx);
329
- return pass();
330
- }
331
- function rtype(type) {
332
- if (type == "name") {cx.marked = "variable-3"; return cont(rtypemaybeparam); }
333
- if (content == "mutable") {cx.marked = "keyword"; return cont(rtype);}
334
- if (type == "atom") return cont(rtypemaybeparam);
335
- if (type == "op" || type == "obj") return cont(rtype);
336
- if (type == "fn") return cont(fntype);
337
- if (type == "{") return cont(pushlex("{"), record_of(rtype), poplex);
338
- return matchBrackets(type, rtype);
339
- }
340
- function rtypemaybeparam() {
341
- if (content == "<") return cont(typarams);
342
- return pass();
343
- }
344
- function fntype(type) {
345
- if (type == "(") return cont(pushlex("("), commasep(rtype, ")"), poplex, fntype);
346
- if (type == "->") return cont(rtype);
347
- return pass();
348
- }
349
- function pattern(type) {
350
- if (type == "name") {cx.marked = "def"; return cont(patternmaybeop);}
351
- if (type == "atom") return cont(patternmaybeop);
352
- if (type == "op") return cont(pattern);
353
- if (type.match(/[\]\)\};,]/)) return pass();
354
- return matchBrackets(type, pattern);
355
- }
356
- function patternmaybeop(type) {
357
- if (type == "op" && content == ".") return cont();
358
- if (content == "to") {cx.marked = "keyword"; return cont(pattern);}
359
- else return pass();
360
- }
361
- function altbody(type) {
362
- if (type == "{") return cont(pushlex("}", "alt"), altblock1, poplex);
363
- return pass();
364
- }
365
- function altblock1(type) {
366
- if (type == "}") return cont();
367
- if (type == "|") return cont(altblock1);
368
- if (content == "when") {cx.marked = "keyword"; return cont(expression, altblock2);}
369
- if (type.match(/[\]\);,]/)) return cont(altblock1);
370
- return pass(pattern, altblock2);
371
- }
372
- function altblock2(type) {
373
- if (type == "{") return cont(pushlex("}", "alt"), block, poplex, altblock1);
374
- else return pass(altblock1);
375
- }
376
-
377
- function macro(type) {
378
- if (type.match(/[\[\(\{]/)) return matchBrackets(type, expression);
379
- return pass();
380
- }
381
- function matchBrackets(type, comb) {
382
- if (type == "[") return cont(pushlex("]"), commasep(comb, "]"), poplex);
383
- if (type == "(") return cont(pushlex(")"), commasep(comb, ")"), poplex);
384
- if (type == "{") return cont(pushlex("}"), commasep(comb, "}"), poplex);
385
- return cont();
386
- }
387
-
388
- function parse(state, stream, style) {
389
- var cc = state.cc;
390
- // Communicate our context to the combinators.
391
- // (Less wasteful than consing up a hundred closures on every call.)
392
- cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
393
-
394
- while (true) {
395
- var combinator = cc.length ? cc.pop() : block;
396
- if (combinator(tcat)) {
397
- while(cc.length && cc[cc.length - 1].lex)
398
- cc.pop()();
399
- return cx.marked || style;
400
- }
401
- }
402
- }
403
-
404
- return {
405
- startState: function() {
406
- return {
407
- tokenize: tokenBase,
408
- cc: [],
409
- lexical: {indented: -indentUnit, column: 0, type: "top", align: false},
410
- keywords: valKeywords,
411
- indented: 0
412
- };
413
- },
414
-
415
- token: function(stream, state) {
416
- if (stream.sol()) {
417
- if (!state.lexical.hasOwnProperty("align"))
418
- state.lexical.align = false;
419
- state.indented = stream.indentation();
420
- }
421
- if (stream.eatSpace()) return null;
422
- tcat = content = null;
423
- var style = state.tokenize(stream, state);
424
- if (style == "comment") return style;
425
- if (!state.lexical.hasOwnProperty("align"))
426
- state.lexical.align = true;
427
- if (tcat == "prefix") return style;
428
- if (!content) content = stream.current();
429
- return parse(state, stream, style);
430
- },
431
-
432
- indent: function(state, textAfter) {
433
- if (state.tokenize != tokenBase) return 0;
434
- var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,
435
- type = lexical.type, closing = firstChar == type;
436
- if (type == "stat") return lexical.indented + indentUnit;
437
- if (lexical.align) return lexical.column + (closing ? 0 : 1);
438
- return lexical.indented + (closing ? 0 : (lexical.info == "alt" ? altIndentUnit : indentUnit));
439
- },
440
-
441
- electricChars: "{}",
14
+ CodeMirror.defineSimpleMode("rust",{
15
+ start:[
16
+ // string and byte string
17
+ {regex: /b?"(?:[^\\]|\\.)*?"/, token: "string"},
18
+ // raw string and raw byte string
19
+ {regex: /(b?r)(#*)(".*?)("\2)/, token: ["string", "string", "string", "string"]},
20
+ // character
21
+ {regex: /'(?:[^'\\]|\\(?:[nrt0'"]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\}))'/, token: "string-2"},
22
+ // byte
23
+ {regex: /b'(?:[^']|\\(?:['\\nrt0]|x[\da-fA-F]{2}))'/, token: "string-2"},
24
+
25
+ {regex: /(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/,
26
+ token: "number"},
27
+ {regex: /(let(?:\s+mut)?|fn|enum|mod|struct|type)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, token: ["keyword", null, "def"]},
28
+ {regex: /(?:abstract|alignof|as|box|break|continue|const|crate|do|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\b/, token: "keyword"},
29
+ {regex: /\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\b/, token: "atom"},
30
+ {regex: /\b(?:true|false|Some|None|Ok|Err)\b/, token: "builtin"},
31
+ {regex: /\b(fn)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,
32
+ token: ["keyword", null ,"def"]},
33
+ {regex: /#!?\[.*\]/, token: "meta"},
34
+ {regex: /\/\/.*/, token: "comment"},
35
+ {regex: /\/\*/, token: "comment", next: "comment"},
36
+ {regex: /[-+\/*=<>!]+/, token: "operator"},
37
+ {regex: /[a-zA-Z_]\w*!/,token: "variable-3"},
38
+ {regex: /[a-zA-Z_]\w*/, token: "variable"},
39
+ {regex: /[\{\[\(]/, indent: true},
40
+ {regex: /[\}\]\)]/, dedent: true}
41
+ ],
42
+ comment: [
43
+ {regex: /.*?\*\//, token: "comment", next: "start"},
44
+ {regex: /.*/, token: "comment"}
45
+ ],
46
+ meta: {
47
+ dontIndentStates: ["comment"],
48
+ electricInput: /^\s*\}$/,
442
49
  blockCommentStart: "/*",
443
50
  blockCommentEnd: "*/",
444
51
  lineComment: "//",
445
52
  fold: "brace"
446
- };
53
+ }
447
54
  });
448
55
 
449
- CodeMirror.defineMIME("text/x-rustsrc", "rust");
450
56
 
57
+ CodeMirror.defineMIME("text/x-rustsrc", "rust");
451
58
  });