GPQAPP

Форк
0
206 строк · 8.6 Кб
1
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2
// Distributed under an MIT license: https://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("ecl", function(config) {
15

16
  function words(str) {
17
    var obj = {}, words = str.split(" ");
18
    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
19
    return obj;
20
  }
21

22
  function metaHook(stream, state) {
23
    if (!state.startOfLine) return false;
24
    stream.skipToEnd();
25
    return "meta";
26
  }
27

28
  var indentUnit = config.indentUnit;
29
  var keyword = words("abs acos allnodes ascii asin asstring atan atan2 ave case choose choosen choosesets clustersize combine correlation cos cosh count covariance cron dataset dedup define denormalize distribute distributed distribution ebcdic enth error evaluate event eventextra eventname exists exp failcode failmessage fetch fromunicode getisvalid global graph group hash hash32 hash64 hashcrc hashmd5 having if index intformat isvalid iterate join keyunicode length library limit ln local log loop map matched matchlength matchposition matchtext matchunicode max merge mergejoin min nolocal nonempty normalize parse pipe power preload process project pull random range rank ranked realformat recordof regexfind regexreplace regroup rejected rollup round roundup row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt stepped stored sum table tan tanh thisnode topn tounicode transfer trim truncate typeof ungroup unicodeorder variance which workunit xmldecode xmlencode xmltext xmlunicode");
30
  var variable = words("apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait");
31
  var variable_2 = words("__compressed__ all and any as atmost before beginc++ best between case const counter csv descend encrypt end endc++ endmacro except exclusive expire export extend false few first flat from full function group header heading hole ifblock import in interface joined keep keyed last left limit load local locale lookup macro many maxcount maxlength min skew module named nocase noroot noscan nosort not of only opt or outer overwrite packed partition penalty physicallength pipe quote record relationship repeat return right scan self separator service shared skew skip sql store terminator thor threshold token transform trim true type unicodeorder unsorted validate virtual whole wild within xml xpath");
32
  var variable_3 = words("ascii big_endian boolean data decimal ebcdic integer pattern qstring real record rule set of string token udecimal unicode unsigned varstring varunicode");
33
  var builtin = words("checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when");
34
  var blockKeywords = words("catch class do else finally for if switch try while");
35
  var atoms = words("true false null");
36
  var hooks = {"#": metaHook};
37
  var isOperatorChar = /[+\-*&%=<>!?|\/]/;
38

39
  var curPunc;
40

41
  function tokenBase(stream, state) {
42
    var ch = stream.next();
43
    if (hooks[ch]) {
44
      var result = hooks[ch](stream, state);
45
      if (result !== false) return result;
46
    }
47
    if (ch == '"' || ch == "'") {
48
      state.tokenize = tokenString(ch);
49
      return state.tokenize(stream, state);
50
    }
51
    if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
52
      curPunc = ch;
53
      return null;
54
    }
55
    if (/\d/.test(ch)) {
56
      stream.eatWhile(/[\w\.]/);
57
      return "number";
58
    }
59
    if (ch == "/") {
60
      if (stream.eat("*")) {
61
        state.tokenize = tokenComment;
62
        return tokenComment(stream, state);
63
      }
64
      if (stream.eat("/")) {
65
        stream.skipToEnd();
66
        return "comment";
67
      }
68
    }
69
    if (isOperatorChar.test(ch)) {
70
      stream.eatWhile(isOperatorChar);
71
      return "operator";
72
    }
73
    stream.eatWhile(/[\w\$_]/);
74
    var cur = stream.current().toLowerCase();
75
    if (keyword.propertyIsEnumerable(cur)) {
76
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
77
      return "keyword";
78
    } else if (variable.propertyIsEnumerable(cur)) {
79
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
80
      return "variable";
81
    } else if (variable_2.propertyIsEnumerable(cur)) {
82
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
83
      return "variable-2";
84
    } else if (variable_3.propertyIsEnumerable(cur)) {
85
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
86
      return "variable-3";
87
    } else if (builtin.propertyIsEnumerable(cur)) {
88
      if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
89
      return "builtin";
90
    } else { //Data types are of from KEYWORD##
91
                var i = cur.length - 1;
92
                while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_'))
93
                        --i;
94

95
                if (i > 0) {
96
                        var cur2 = cur.substr(0, i + 1);
97
                if (variable_3.propertyIsEnumerable(cur2)) {
98
                        if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = "newstatement";
99
                        return "variable-3";
100
                }
101
            }
102
    }
103
    if (atoms.propertyIsEnumerable(cur)) return "atom";
104
    return null;
105
  }
106

107
  function tokenString(quote) {
108
    return function(stream, state) {
109
      var escaped = false, next, end = false;
110
      while ((next = stream.next()) != null) {
111
        if (next == quote && !escaped) {end = true; break;}
112
        escaped = !escaped && next == "\\";
113
      }
114
      if (end || !escaped)
115
        state.tokenize = tokenBase;
116
      return "string";
117
    };
118
  }
119

120
  function tokenComment(stream, state) {
121
    var maybeEnd = false, ch;
122
    while (ch = stream.next()) {
123
      if (ch == "/" && maybeEnd) {
124
        state.tokenize = tokenBase;
125
        break;
126
      }
127
      maybeEnd = (ch == "*");
128
    }
129
    return "comment";
130
  }
131

132
  function Context(indented, column, type, align, prev) {
133
    this.indented = indented;
134
    this.column = column;
135
    this.type = type;
136
    this.align = align;
137
    this.prev = prev;
138
  }
139
  function pushContext(state, col, type) {
140
    return state.context = new Context(state.indented, col, type, null, state.context);
141
  }
142
  function popContext(state) {
143
    var t = state.context.type;
144
    if (t == ")" || t == "]" || t == "}")
145
      state.indented = state.context.indented;
146
    return state.context = state.context.prev;
147
  }
148

149
  // Interface
150

151
  return {
152
    startState: function(basecolumn) {
153
      return {
154
        tokenize: null,
155
        context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
156
        indented: 0,
157
        startOfLine: true
158
      };
159
    },
160

161
    token: function(stream, state) {
162
      var ctx = state.context;
163
      if (stream.sol()) {
164
        if (ctx.align == null) ctx.align = false;
165
        state.indented = stream.indentation();
166
        state.startOfLine = true;
167
      }
168
      if (stream.eatSpace()) return null;
169
      curPunc = null;
170
      var style = (state.tokenize || tokenBase)(stream, state);
171
      if (style == "comment" || style == "meta") return style;
172
      if (ctx.align == null) ctx.align = true;
173

174
      if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state);
175
      else if (curPunc == "{") pushContext(state, stream.column(), "}");
176
      else if (curPunc == "[") pushContext(state, stream.column(), "]");
177
      else if (curPunc == "(") pushContext(state, stream.column(), ")");
178
      else if (curPunc == "}") {
179
        while (ctx.type == "statement") ctx = popContext(state);
180
        if (ctx.type == "}") ctx = popContext(state);
181
        while (ctx.type == "statement") ctx = popContext(state);
182
      }
183
      else if (curPunc == ctx.type) popContext(state);
184
      else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement"))
185
        pushContext(state, stream.column(), "statement");
186
      state.startOfLine = false;
187
      return style;
188
    },
189

190
    indent: function(state, textAfter) {
191
      if (state.tokenize != tokenBase && state.tokenize != null) return 0;
192
      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
193
      if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
194
      var closing = firstChar == ctx.type;
195
      if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit);
196
      else if (ctx.align) return ctx.column + (closing ? 0 : 1);
197
      else return ctx.indented + (closing ? 0 : indentUnit);
198
    },
199

200
    electricChars: "{}"
201
  };
202
});
203

204
CodeMirror.defineMIME("text/x-ecl", "ecl");
205

206
});
207

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

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

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

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