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

     1  // CodeMirror, copyright (c) by Marijn Haverbeke and others
     2  // Distributed under an MIT license: http://codemirror.net/LICENSE
     3  
     4  /*
     5   *      Pig Latin Mode for CodeMirror 2
     6   *      @author Prasanth Jayachandran
     7   *      @link   https://github.com/prasanthj/pig-codemirror-2
     8   *  This implementation is adapted from PL/SQL mode in CodeMirror 2.
     9   */
    10  (function(mod) {
    11    if (typeof exports == "object" && typeof module == "object") // CommonJS
    12      mod(require("../../lib/codemirror"));
    13    else if (typeof define == "function" && define.amd) // AMD
    14      define(["../../lib/codemirror"], mod);
    15    else // Plain browser env
    16      mod(CodeMirror);
    17  })(function(CodeMirror) {
    18  "use strict";
    19  
    20  CodeMirror.defineMode("pig", function(_config, parserConfig) {
    21    var keywords = parserConfig.keywords,
    22    builtins = parserConfig.builtins,
    23    types = parserConfig.types,
    24    multiLineStrings = parserConfig.multiLineStrings;
    25  
    26    var isOperatorChar = /[*+\-%<>=&?:\/!|]/;
    27  
    28    function chain(stream, state, f) {
    29      state.tokenize = f;
    30      return f(stream, state);
    31    }
    32  
    33    function tokenComment(stream, state) {
    34      var isEnd = false;
    35      var ch;
    36      while(ch = stream.next()) {
    37        if(ch == "/" && isEnd) {
    38          state.tokenize = tokenBase;
    39          break;
    40        }
    41        isEnd = (ch == "*");
    42      }
    43      return "comment";
    44    }
    45  
    46    function tokenString(quote) {
    47      return function(stream, state) {
    48        var escaped = false, next, end = false;
    49        while((next = stream.next()) != null) {
    50          if (next == quote && !escaped) {
    51            end = true; break;
    52          }
    53          escaped = !escaped && next == "\\";
    54        }
    55        if (end || !(escaped || multiLineStrings))
    56          state.tokenize = tokenBase;
    57        return "error";
    58      };
    59    }
    60  
    61  
    62    function tokenBase(stream, state) {
    63      var ch = stream.next();
    64  
    65      // is a start of string?
    66      if (ch == '"' || ch == "'")
    67        return chain(stream, state, tokenString(ch));
    68      // is it one of the special chars
    69      else if(/[\[\]{}\(\),;\.]/.test(ch))
    70        return null;
    71      // is it a number?
    72      else if(/\d/.test(ch)) {
    73        stream.eatWhile(/[\w\.]/);
    74        return "number";
    75      }
    76      // multi line comment or operator
    77      else if (ch == "/") {
    78        if (stream.eat("*")) {
    79          return chain(stream, state, tokenComment);
    80        }
    81        else {
    82          stream.eatWhile(isOperatorChar);
    83          return "operator";
    84        }
    85      }
    86      // single line comment or operator
    87      else if (ch=="-") {
    88        if(stream.eat("-")){
    89          stream.skipToEnd();
    90          return "comment";
    91        }
    92        else {
    93          stream.eatWhile(isOperatorChar);
    94          return "operator";
    95        }
    96      }
    97      // is it an operator
    98      else if (isOperatorChar.test(ch)) {
    99        stream.eatWhile(isOperatorChar);
   100        return "operator";
   101      }
   102      else {
   103        // get the while word
   104        stream.eatWhile(/[\w\$_]/);
   105        // is it one of the listed keywords?
   106        if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) {
   107          //keywords can be used as variables like flatten(group), group.$0 etc..
   108          if (!stream.eat(")") && !stream.eat("."))
   109            return "keyword";
   110        }
   111        // is it one of the builtin functions?
   112        if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase()))
   113          return "variable-2";
   114        // is it one of the listed types?
   115        if (types && types.propertyIsEnumerable(stream.current().toUpperCase()))
   116          return "variable-3";
   117        // default is a 'variable'
   118        return "variable";
   119      }
   120    }
   121  
   122    // Interface
   123    return {
   124      startState: function() {
   125        return {
   126          tokenize: tokenBase,
   127          startOfLine: true
   128        };
   129      },
   130  
   131      token: function(stream, state) {
   132        if(stream.eatSpace()) return null;
   133        var style = state.tokenize(stream, state);
   134        return style;
   135      }
   136    };
   137  });
   138  
   139  (function() {
   140    function keywords(str) {
   141      var obj = {}, words = str.split(" ");
   142      for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
   143      return obj;
   144    }
   145  
   146    // builtin funcs taken from trunk revision 1303237
   147    var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL "
   148      + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS "
   149      + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG "
   150      + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN "
   151      + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER "
   152      + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS "
   153      + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA  "
   154      + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE "
   155      + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG "
   156      + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER ";
   157  
   158    // taken from QueryLexer.g
   159    var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP "
   160      + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL "
   161      + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE "
   162      + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE "
   163      + "NEQ MATCHES TRUE FALSE DUMP";
   164  
   165    // data types
   166    var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP ";
   167  
   168    CodeMirror.defineMIME("text/x-pig", {
   169      name: "pig",
   170      builtins: keywords(pBuiltins),
   171      keywords: keywords(pKeywords),
   172      types: keywords(pTypes)
   173    });
   174  
   175    CodeMirror.registerHelper("hintWords", "pig", (pBuiltins + pTypes + pKeywords).split(" "));
   176  }());
   177  
   178  });