LaravelTest

Форк
0
178 строк · 5.7 Кб
1
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2
// Distributed under an MIT license: https://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
});
179

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.