| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | // CodeMirror, copyright (c) by Marijn Haverbeke and others// Distributed under an MIT license: http://codemirror.net/LICENSE(function(mod) {  if (typeof exports == "object" && typeof module == "object") // CommonJS    mod(require("../../lib/codemirror"));  else if (typeof define == "function" && define.amd) // AMD    define(["../../lib/codemirror"], mod);  else // Plain browser env    mod(CodeMirror);})(function(CodeMirror) {  "use strict";  CodeMirror.defineMode("elm", function() {    function switchState(source, setState, f) {      setState(f);      return f(source, setState);    }    // These should all be Unicode extended, as per the Haskell 2010 report    var smallRE = /[a-z_]/;    var largeRE = /[A-Z]/;    var digitRE = /[0-9]/;    var hexitRE = /[0-9A-Fa-f]/;    var octitRE = /[0-7]/;    var idRE = /[a-z_A-Z0-9\']/;    var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:\u03BB\u2192]/;    var specialRE = /[(),;[\]`{}]/;    var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer    function normal() {      return function (source, setState) {        if (source.eatWhile(whiteCharRE)) {          return null;        }        var ch = source.next();        if (specialRE.test(ch)) {          if (ch == '{' && source.eat('-')) {            var t = "comment";            if (source.eat('#')) t = "meta";            return switchState(source, setState, ncomment(t, 1));          }          return null;        }        if (ch == '\'') {          if (source.eat('\\'))            source.next();  // should handle other escapes here          else            source.next();          if (source.eat('\''))            return "string";          return "error";        }        if (ch == '"') {          return switchState(source, setState, stringLiteral);        }        if (largeRE.test(ch)) {          source.eatWhile(idRE);          if (source.eat('.'))            return "qualifier";          return "variable-2";        }        if (smallRE.test(ch)) {          var isDef = source.pos === 1;          source.eatWhile(idRE);          return isDef ? "variable-3" : "variable";        }        if (digitRE.test(ch)) {          if (ch == '0') {            if (source.eat(/[xX]/)) {              source.eatWhile(hexitRE); // should require at least 1              return "integer";            }            if (source.eat(/[oO]/)) {              source.eatWhile(octitRE); // should require at least 1              return "number";            }          }          source.eatWhile(digitRE);          var t = "number";          if (source.eat('.')) {            t = "number";            source.eatWhile(digitRE); // should require at least 1          }          if (source.eat(/[eE]/)) {            t = "number";            source.eat(/[-+]/);            source.eatWhile(digitRE); // should require at least 1          }          return t;        }        if (symbolRE.test(ch)) {          if (ch == '-' && source.eat(/-/)) {            source.eatWhile(/-/);            if (!source.eat(symbolRE)) {              source.skipToEnd();              return "comment";            }          }          source.eatWhile(symbolRE);          return "builtin";        }        return "error";      }    }    function ncomment(type, nest) {      if (nest == 0) {        return normal();      }      return function(source, setState) {        var currNest = nest;        while (!source.eol()) {          var ch = source.next();          if (ch == '{' && source.eat('-')) {            ++currNest;          } else if (ch == '-' && source.eat('}')) {            --currNest;            if (currNest == 0) {              setState(normal());              return type;            }          }        }        setState(ncomment(type, currNest));        return type;      }    }    function stringLiteral(source, setState) {      while (!source.eol()) {        var ch = source.next();        if (ch == '"') {          setState(normal());          return "string";        }        if (ch == '\\') {          if (source.eol() || source.eat(whiteCharRE)) {            setState(stringGap);            return "string";          }          if (!source.eat('&')) source.next(); // should handle other escapes here        }      }      setState(normal());      return "error";    }    function stringGap(source, setState) {      if (source.eat('\\')) {        return switchState(source, setState, stringLiteral);      }      source.next();      setState(normal());      return "error";    }    var wellKnownWords = (function() {      var wkw = {};      var keywords = [        "case", "of", "as",        "if", "then", "else",        "let", "in",        "infix", "infixl", "infixr",        "type", "alias",        "input", "output", "foreign", "loopback",        "module", "where", "import", "exposing",        "_", "..", "|", ":", "=", "\\", "\"", "->", "<-"      ];      for (var i = keywords.length; i--;)        wkw[keywords[i]] = "keyword";      return wkw;    })();    return {      startState: function ()  { return { f: normal() }; },      copyState:  function (s) { return { f: s.f }; },      token: function(stream, state) {        var t = state.f(stream, function(s) { state.f = s; });        var w = stream.current();        return (wellKnownWords.hasOwnProperty(w)) ? wellKnownWords[w] : t;      }    };  });  CodeMirror.defineMIME("text/x-elm", "elm");});
 |