annotate .cms/lib/codemirror/mode/ecl/ecl.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 mod(require("../../lib/codemirror"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 define(["../../lib/codemirror"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 CodeMirror.defineMode("ecl", function(config) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 function words(str) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 var obj = {}, words = str.split(" ");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 return obj;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 function metaHook(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 if (!state.startOfLine) return false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 return "meta";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 var indentUnit = config.indentUnit;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
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");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 var variable = words("apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
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");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
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");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 var builtin = words("checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 var blockKeywords = words("catch class do else finally for if switch try while");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 var atoms = words("true false null");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 var hooks = {"#": metaHook};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 var isOperatorChar = /[+\-*&%=<>!?|\/]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 var curPunc;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 function tokenBase(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 var ch = stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 if (hooks[ch]) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 var result = hooks[ch](stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 if (result !== false) return result;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 if (ch == '"' || ch == "'") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 state.tokenize = tokenString(ch);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 return state.tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 curPunc = ch;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 if (/\d/.test(ch)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 stream.eatWhile(/[\w\.]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 return "number";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 if (ch == "/") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 if (stream.eat("*")) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 state.tokenize = tokenComment;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 return tokenComment(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 if (stream.eat("/")) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 return "comment";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 if (isOperatorChar.test(ch)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 stream.eatWhile(isOperatorChar);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 return "operator";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 stream.eatWhile(/[\w\$_]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 var cur = stream.current().toLowerCase();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 if (keyword.propertyIsEnumerable(cur)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 return "keyword";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 } else if (variable.propertyIsEnumerable(cur)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 return "variable";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 } else if (variable_2.propertyIsEnumerable(cur)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 return "variable-2";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 } else if (variable_3.propertyIsEnumerable(cur)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 return "variable-3";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 } else if (builtin.propertyIsEnumerable(cur)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 return "builtin";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 } else { //Data types are of from KEYWORD##
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 var i = cur.length - 1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_'))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 --i;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 if (i > 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 var cur2 = cur.substr(0, i + 1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 if (variable_3.propertyIsEnumerable(cur2)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = "newstatement";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 return "variable-3";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 if (atoms.propertyIsEnumerable(cur)) return "atom";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 function tokenString(quote) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 return function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 var escaped = false, next, end = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 while ((next = stream.next()) != null) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 if (next == quote && !escaped) {end = true; break;}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 escaped = !escaped && next == "\\";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 if (end || !escaped)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 state.tokenize = tokenBase;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 function tokenComment(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 var maybeEnd = false, ch;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 while (ch = stream.next()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 if (ch == "/" && maybeEnd) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 state.tokenize = tokenBase;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 maybeEnd = (ch == "*");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 return "comment";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 function Context(indented, column, type, align, prev) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 this.indented = indented;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 this.column = column;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 this.type = type;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 this.align = align;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 this.prev = prev;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 function pushContext(state, col, type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 return state.context = new Context(state.indented, col, type, null, state.context);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 function popContext(state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 var t = state.context.type;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 if (t == ")" || t == "]" || t == "}")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 state.indented = state.context.indented;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 return state.context = state.context.prev;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 // Interface
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 startState: function(basecolumn) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 tokenize: null,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 indented: 0,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 startOfLine: true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 token: function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 var ctx = state.context;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 if (stream.sol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 if (ctx.align == null) ctx.align = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 state.indented = stream.indentation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 state.startOfLine = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 if (stream.eatSpace()) return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 curPunc = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 var style = (state.tokenize || tokenBase)(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 if (style == "comment" || style == "meta") return style;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 if (ctx.align == null) ctx.align = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 else if (curPunc == "{") pushContext(state, stream.column(), "}");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 else if (curPunc == "[") pushContext(state, stream.column(), "]");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 else if (curPunc == "(") pushContext(state, stream.column(), ")");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 else if (curPunc == "}") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 while (ctx.type == "statement") ctx = popContext(state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 if (ctx.type == "}") ctx = popContext(state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 while (ctx.type == "statement") ctx = popContext(state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 else if (curPunc == ctx.type) popContext(state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement"))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 pushContext(state, stream.column(), "statement");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 state.startOfLine = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 return style;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 indent: function(state, textAfter) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 if (state.tokenize != tokenBase && state.tokenize != null) return 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 var closing = firstChar == ctx.type;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196 else if (ctx.align) return ctx.column + (closing ? 0 : 1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 else return ctx.indented + (closing ? 0 : indentUnit);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 electricChars: "{}"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 CodeMirror.defineMIME("text/x-ecl", "ecl");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 });