github.com/elliott5/community@v0.14.1-0.20160709191136-823126fb026a/app/public/codemirror/mode/eiffel/eiffel.js (about)

     1  // CodeMirror, copyright (c) by Marijn Haverbeke and others
     2  // Distributed under an MIT license: http://codemirror.net/LICENSE
     3  
     4  (function(mod) {
     5    if (typeof exports == "object" && typeof module == "object") // CommonJS
     6      mod(require("../../lib/codemirror"));
     7    else if (typeof define == "function" && define.amd) // AMD
     8      define(["../../lib/codemirror"], mod);
     9    else // Plain browser env
    10      mod(CodeMirror);
    11  })(function(CodeMirror) {
    12  "use strict";
    13  
    14  CodeMirror.defineMode("eiffel", function() {
    15    function wordObj(words) {
    16      var o = {};
    17      for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true;
    18      return o;
    19    }
    20    var keywords = wordObj([
    21      'note',
    22      'across',
    23      'when',
    24      'variant',
    25      'until',
    26      'unique',
    27      'undefine',
    28      'then',
    29      'strip',
    30      'select',
    31      'retry',
    32      'rescue',
    33      'require',
    34      'rename',
    35      'reference',
    36      'redefine',
    37      'prefix',
    38      'once',
    39      'old',
    40      'obsolete',
    41      'loop',
    42      'local',
    43      'like',
    44      'is',
    45      'inspect',
    46      'infix',
    47      'include',
    48      'if',
    49      'frozen',
    50      'from',
    51      'external',
    52      'export',
    53      'ensure',
    54      'end',
    55      'elseif',
    56      'else',
    57      'do',
    58      'creation',
    59      'create',
    60      'check',
    61      'alias',
    62      'agent',
    63      'separate',
    64      'invariant',
    65      'inherit',
    66      'indexing',
    67      'feature',
    68      'expanded',
    69      'deferred',
    70      'class',
    71      'Void',
    72      'True',
    73      'Result',
    74      'Precursor',
    75      'False',
    76      'Current',
    77      'create',
    78      'attached',
    79      'detachable',
    80      'as',
    81      'and',
    82      'implies',
    83      'not',
    84      'or'
    85    ]);
    86    var operators = wordObj([":=", "and then","and", "or","<<",">>"]);
    87  
    88    function chain(newtok, stream, state) {
    89      state.tokenize.push(newtok);
    90      return newtok(stream, state);
    91    }
    92  
    93    function tokenBase(stream, state) {
    94      if (stream.eatSpace()) return null;
    95      var ch = stream.next();
    96      if (ch == '"'||ch == "'") {
    97        return chain(readQuoted(ch, "string"), stream, state);
    98      } else if (ch == "-"&&stream.eat("-")) {
    99        stream.skipToEnd();
   100        return "comment";
   101      } else if (ch == ":"&&stream.eat("=")) {
   102        return "operator";
   103      } else if (/[0-9]/.test(ch)) {
   104        stream.eatWhile(/[xXbBCc0-9\.]/);
   105        stream.eat(/[\?\!]/);
   106        return "ident";
   107      } else if (/[a-zA-Z_0-9]/.test(ch)) {
   108        stream.eatWhile(/[a-zA-Z_0-9]/);
   109        stream.eat(/[\?\!]/);
   110        return "ident";
   111      } else if (/[=+\-\/*^%<>~]/.test(ch)) {
   112        stream.eatWhile(/[=+\-\/*^%<>~]/);
   113        return "operator";
   114      } else {
   115        return null;
   116      }
   117    }
   118  
   119    function readQuoted(quote, style,  unescaped) {
   120      return function(stream, state) {
   121        var escaped = false, ch;
   122        while ((ch = stream.next()) != null) {
   123          if (ch == quote && (unescaped || !escaped)) {
   124            state.tokenize.pop();
   125            break;
   126          }
   127          escaped = !escaped && ch == "%";
   128        }
   129        return style;
   130      };
   131    }
   132  
   133    return {
   134      startState: function() {
   135        return {tokenize: [tokenBase]};
   136      },
   137  
   138      token: function(stream, state) {
   139        var style = state.tokenize[state.tokenize.length-1](stream, state);
   140        if (style == "ident") {
   141          var word = stream.current();
   142          style = keywords.propertyIsEnumerable(stream.current()) ? "keyword"
   143            : operators.propertyIsEnumerable(stream.current()) ? "operator"
   144            : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag"
   145            : /^0[bB][0-1]+$/g.test(word) ? "number"
   146            : /^0[cC][0-7]+$/g.test(word) ? "number"
   147            : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number"
   148            : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number"
   149            : /^[0-9]+$/g.test(word) ? "number"
   150            : "variable";
   151        }
   152        return style;
   153      },
   154      lineComment: "--"
   155    };
   156  });
   157  
   158  CodeMirror.defineMIME("text/x-eiffel", "eiffel");
   159  
   160  });