annotate .cms/lib/codemirror/mode/elm/elm.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: http://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("elm", function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 function switchState(source, setState, f)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 setState(f);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 return f(source, setState);
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 var lowerRE = /[a-z]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 var upperRE = /[A-Z]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 var innerRE = /[a-zA-Z0-9_]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 var digitRE = /[0-9]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 var hexRE = /[0-9A-Fa-f]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 var symbolRE = /[-&*+.\\/<>=?^|:]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 var specialRE = /[(),[\]{}]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 var spacesRE = /[ \v\f]/; // newlines are handled in tokenizer
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 function normal()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 return function(source, setState)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 if (source.eatWhile(spacesRE))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 var char = source.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 if (specialRE.test(char))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 return (char === '{' && source.eat('-'))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 ? switchState(source, setState, chompMultiComment(1))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 : (char === '[' && source.match('glsl|'))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 ? switchState(source, setState, chompGlsl)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 : 'builtin';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 if (char === '\'')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 return switchState(source, setState, chompChar);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 if (char === '"')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 return source.eat('"')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 ? source.eat('"')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 ? switchState(source, setState, chompMultiString)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 : 'string'
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 : switchState(source, setState, chompSingleString);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 if (upperRE.test(char))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 source.eatWhile(innerRE);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 return 'variable-2';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 if (lowerRE.test(char))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 var isDef = source.pos === 1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 source.eatWhile(innerRE);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 return isDef ? "def" : "variable";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 if (digitRE.test(char))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 if (char === '0')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 if (source.eat(/[xX]/))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 source.eatWhile(hexRE); // should require at least 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 return "number";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 source.eatWhile(digitRE);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 if (source.eat('.'))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 source.eatWhile(digitRE); // should require at least 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 if (source.eat(/[eE]/))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 source.eat(/[-+]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 source.eatWhile(digitRE); // should require at least 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 return "number";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 if (symbolRE.test(char))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 if (char === '-' && source.eat('-'))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 source.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 return "comment";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 source.eatWhile(symbolRE);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 return "keyword";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 if (char === '_')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 return "keyword";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 return "error";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 function chompMultiComment(nest)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 if (nest == 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 return normal();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 return function(source, setState)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 while (!source.eol())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 var char = source.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 if (char == '{' && source.eat('-'))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 ++nest;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 else if (char == '-' && source.eat('}'))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 --nest;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 if (nest === 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 setState(normal());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 return 'comment';
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 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 setState(chompMultiComment(nest));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 return 'comment';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 function chompMultiString(source, setState)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 while (!source.eol())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 var char = source.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 if (char === '"' && source.eat('"') && source.eat('"'))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 setState(normal());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 return 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 return 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 function chompSingleString(source, setState)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 while (source.skipTo('\\"')) { source.next(); source.next(); }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 if (source.skipTo('"'))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 source.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 setState(normal());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 return 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 source.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 setState(normal());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 return 'error';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 function chompChar(source, setState)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 while (source.skipTo("\\'")) { source.next(); source.next(); }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 if (source.skipTo("'"))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 source.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 setState(normal());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 return 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 source.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 setState(normal());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 return 'error';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 function chompGlsl(source, setState)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199 while (!source.eol())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 var char = source.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 if (char === '|' && source.eat(']'))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 setState(normal());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 return 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 return 'string';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 var wellKnownWords = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 case: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213 of: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 as: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 if: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216 then: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217 else: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
218 let: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
219 in: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
220 type: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
221 alias: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
222 module: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
223 where: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
224 import: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
225 exposing: 1,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
226 port: 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
227 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
228
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
229 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
230 startState: function () { return { f: normal() }; },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
231 copyState: function (s) { return { f: s.f }; },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
232
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
233 lineComment: '--',
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
234
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
235 token: function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
236 var type = state.f(stream, function(s) { state.f = s; });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
237 var word = stream.current();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
238 return (wellKnownWords.hasOwnProperty(word)) ? 'keyword' : type;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
239 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
240 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
241
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
242 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
243
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
244 CodeMirror.defineMIME("text/x-elm", "elm");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
245 });