| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 | // CodeMirror, copyright (c) by Marijn Haverbeke and others// Distributed under an MIT license: https://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("eiffel", function() {  function wordObj(words) {    var o = {};    for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true;    return o;  }  var keywords = wordObj([    'note',    'across',    'when',    'variant',    'until',    'unique',    'undefine',    'then',    'strip',    'select',    'retry',    'rescue',    'require',    'rename',    'reference',    'redefine',    'prefix',    'once',    'old',    'obsolete',    'loop',    'local',    'like',    'is',    'inspect',    'infix',    'include',    'if',    'frozen',    'from',    'external',    'export',    'ensure',    'end',    'elseif',    'else',    'do',    'creation',    'create',    'check',    'alias',    'agent',    'separate',    'invariant',    'inherit',    'indexing',    'feature',    'expanded',    'deferred',    'class',    'Void',    'True',    'Result',    'Precursor',    'False',    'Current',    'create',    'attached',    'detachable',    'as',    'and',    'implies',    'not',    'or'  ]);  var operators = wordObj([":=", "and then","and", "or","<<",">>"]);  function chain(newtok, stream, state) {    state.tokenize.push(newtok);    return newtok(stream, state);  }  function tokenBase(stream, state) {    if (stream.eatSpace()) return null;    var ch = stream.next();    if (ch == '"'||ch == "'") {      return chain(readQuoted(ch, "string"), stream, state);    } else if (ch == "-"&&stream.eat("-")) {      stream.skipToEnd();      return "comment";    } else if (ch == ":"&&stream.eat("=")) {      return "operator";    } else if (/[0-9]/.test(ch)) {      stream.eatWhile(/[xXbBCc0-9\.]/);      stream.eat(/[\?\!]/);      return "ident";    } else if (/[a-zA-Z_0-9]/.test(ch)) {      stream.eatWhile(/[a-zA-Z_0-9]/);      stream.eat(/[\?\!]/);      return "ident";    } else if (/[=+\-\/*^%<>~]/.test(ch)) {      stream.eatWhile(/[=+\-\/*^%<>~]/);      return "operator";    } else {      return null;    }  }  function readQuoted(quote, style,  unescaped) {    return function(stream, state) {      var escaped = false, ch;      while ((ch = stream.next()) != null) {        if (ch == quote && (unescaped || !escaped)) {          state.tokenize.pop();          break;        }        escaped = !escaped && ch == "%";      }      return style;    };  }  return {    startState: function() {      return {tokenize: [tokenBase]};    },    token: function(stream, state) {      var style = state.tokenize[state.tokenize.length-1](stream, state);      if (style == "ident") {        var word = stream.current();        style = keywords.propertyIsEnumerable(stream.current()) ? "keyword"          : operators.propertyIsEnumerable(stream.current()) ? "operator"          : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag"          : /^0[bB][0-1]+$/g.test(word) ? "number"          : /^0[cC][0-7]+$/g.test(word) ? "number"          : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number"          : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number"          : /^[0-9]+$/g.test(word) ? "number"          : "variable";      }      return style;    },    lineComment: "--"  };});CodeMirror.defineMIME("text/x-eiffel", "eiffel");});
 |