scripts/CodeMirror/mode/mllike/mllike.js (view raw)
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
14CodeMirror.defineMode('mllike', function(_config, parserConfig) {
15 var words = {
16 'as': 'keyword',
17 'do': 'keyword',
18 'else': 'keyword',
19 'end': 'keyword',
20 'exception': 'keyword',
21 'fun': 'keyword',
22 'functor': 'keyword',
23 'if': 'keyword',
24 'in': 'keyword',
25 'include': 'keyword',
26 'let': 'keyword',
27 'of': 'keyword',
28 'open': 'keyword',
29 'rec': 'keyword',
30 'struct': 'keyword',
31 'then': 'keyword',
32 'type': 'keyword',
33 'val': 'keyword',
34 'while': 'keyword',
35 'with': 'keyword'
36 };
37
38 var extraWords = parserConfig.extraWords || {};
39 for (var prop in extraWords) {
40 if (extraWords.hasOwnProperty(prop)) {
41 words[prop] = parserConfig.extraWords[prop];
42 }
43 }
44 var hintWords = [];
45 for (var k in words) { hintWords.push(k); }
46 CodeMirror.registerHelper("hintWords", "mllike", hintWords);
47
48 function tokenBase(stream, state) {
49 var ch = stream.next();
50
51 if (ch === '"') {
52 state.tokenize = tokenString;
53 return state.tokenize(stream, state);
54 }
55 if (ch === '{') {
56 if (stream.eat('|')) {
57 state.longString = true;
58 state.tokenize = tokenLongString;
59 return state.tokenize(stream, state);
60 }
61 }
62 if (ch === '(') {
63 if (stream.eat('*')) {
64 state.commentLevel++;
65 state.tokenize = tokenComment;
66 return state.tokenize(stream, state);
67 }
68 }
69 if (ch === '~' || ch === '?') {
70 stream.eatWhile(/\w/);
71 return 'variable-2';
72 }
73 if (ch === '`') {
74 stream.eatWhile(/\w/);
75 return 'quote';
76 }
77 if (ch === '/' && parserConfig.slashComments && stream.eat('/')) {
78 stream.skipToEnd();
79 return 'comment';
80 }
81 if (/\d/.test(ch)) {
82 if (ch === '0' && stream.eat(/[bB]/)) {
83 stream.eatWhile(/[01]/);
84 } if (ch === '0' && stream.eat(/[xX]/)) {
85 stream.eatWhile(/[0-9a-fA-F]/)
86 } if (ch === '0' && stream.eat(/[oO]/)) {
87 stream.eatWhile(/[0-7]/);
88 } else {
89 stream.eatWhile(/[\d_]/);
90 if (stream.eat('.')) {
91 stream.eatWhile(/[\d]/);
92 }
93 if (stream.eat(/[eE]/)) {
94 stream.eatWhile(/[\d\-+]/);
95 }
96 }
97 return 'number';
98 }
99 if ( /[+\-*&%=<>!?|@\.~:]/.test(ch)) {
100 return 'operator';
101 }
102 if (/[\w\xa1-\uffff]/.test(ch)) {
103 stream.eatWhile(/[\w\xa1-\uffff]/);
104 var cur = stream.current();
105 return words.hasOwnProperty(cur) ? words[cur] : 'variable';
106 }
107 return null
108 }
109
110 function tokenString(stream, state) {
111 var next, end = false, escaped = false;
112 while ((next = stream.next()) != null) {
113 if (next === '"' && !escaped) {
114 end = true;
115 break;
116 }
117 escaped = !escaped && next === '\\';
118 }
119 if (end && !escaped) {
120 state.tokenize = tokenBase;
121 }
122 return 'string';
123 };
124
125 function tokenComment(stream, state) {
126 var prev, next;
127 while(state.commentLevel > 0 && (next = stream.next()) != null) {
128 if (prev === '(' && next === '*') state.commentLevel++;
129 if (prev === '*' && next === ')') state.commentLevel--;
130 prev = next;
131 }
132 if (state.commentLevel <= 0) {
133 state.tokenize = tokenBase;
134 }
135 return 'comment';
136 }
137
138 function tokenLongString(stream, state) {
139 var prev, next;
140 while (state.longString && (next = stream.next()) != null) {
141 if (prev === '|' && next === '}') state.longString = false;
142 prev = next;
143 }
144 if (!state.longString) {
145 state.tokenize = tokenBase;
146 }
147 return 'string';
148 }
149
150 return {
151 startState: function() {return {tokenize: tokenBase, commentLevel: 0, longString: false};},
152 token: function(stream, state) {
153 if (stream.eatSpace()) return null;
154 return state.tokenize(stream, state);
155 },
156
157 blockCommentStart: "(*",
158 blockCommentEnd: "*)",
159 lineComment: parserConfig.slashComments ? "//" : null
160 };
161});
162
163CodeMirror.defineMIME('text/x-ocaml', {
164 name: 'mllike',
165 extraWords: {
166 'and': 'keyword',
167 'assert': 'keyword',
168 'begin': 'keyword',
169 'class': 'keyword',
170 'constraint': 'keyword',
171 'done': 'keyword',
172 'downto': 'keyword',
173 'external': 'keyword',
174 'function': 'keyword',
175 'initializer': 'keyword',
176 'lazy': 'keyword',
177 'match': 'keyword',
178 'method': 'keyword',
179 'module': 'keyword',
180 'mutable': 'keyword',
181 'new': 'keyword',
182 'nonrec': 'keyword',
183 'object': 'keyword',
184 'private': 'keyword',
185 'sig': 'keyword',
186 'to': 'keyword',
187 'try': 'keyword',
188 'value': 'keyword',
189 'virtual': 'keyword',
190 'when': 'keyword',
191
192 // builtins
193 'raise': 'builtin',
194 'failwith': 'builtin',
195 'true': 'builtin',
196 'false': 'builtin',
197
198 // Pervasives builtins
199 'asr': 'builtin',
200 'land': 'builtin',
201 'lor': 'builtin',
202 'lsl': 'builtin',
203 'lsr': 'builtin',
204 'lxor': 'builtin',
205 'mod': 'builtin',
206 'or': 'builtin',
207
208 // More Pervasives
209 'raise_notrace': 'builtin',
210 'trace': 'builtin',
211 'exit': 'builtin',
212 'print_string': 'builtin',
213 'print_endline': 'builtin',
214
215 'int': 'type',
216 'float': 'type',
217 'bool': 'type',
218 'char': 'type',
219 'string': 'type',
220 'unit': 'type',
221
222 // Modules
223 'List': 'builtin'
224 }
225});
226
227CodeMirror.defineMIME('text/x-fsharp', {
228 name: 'mllike',
229 extraWords: {
230 'abstract': 'keyword',
231 'assert': 'keyword',
232 'base': 'keyword',
233 'begin': 'keyword',
234 'class': 'keyword',
235 'default': 'keyword',
236 'delegate': 'keyword',
237 'do!': 'keyword',
238 'done': 'keyword',
239 'downcast': 'keyword',
240 'downto': 'keyword',
241 'elif': 'keyword',
242 'extern': 'keyword',
243 'finally': 'keyword',
244 'for': 'keyword',
245 'function': 'keyword',
246 'global': 'keyword',
247 'inherit': 'keyword',
248 'inline': 'keyword',
249 'interface': 'keyword',
250 'internal': 'keyword',
251 'lazy': 'keyword',
252 'let!': 'keyword',
253 'match': 'keyword',
254 'member': 'keyword',
255 'module': 'keyword',
256 'mutable': 'keyword',
257 'namespace': 'keyword',
258 'new': 'keyword',
259 'null': 'keyword',
260 'override': 'keyword',
261 'private': 'keyword',
262 'public': 'keyword',
263 'return!': 'keyword',
264 'return': 'keyword',
265 'select': 'keyword',
266 'static': 'keyword',
267 'to': 'keyword',
268 'try': 'keyword',
269 'upcast': 'keyword',
270 'use!': 'keyword',
271 'use': 'keyword',
272 'void': 'keyword',
273 'when': 'keyword',
274 'yield!': 'keyword',
275 'yield': 'keyword',
276
277 // Reserved words
278 'atomic': 'keyword',
279 'break': 'keyword',
280 'checked': 'keyword',
281 'component': 'keyword',
282 'const': 'keyword',
283 'constraint': 'keyword',
284 'constructor': 'keyword',
285 'continue': 'keyword',
286 'eager': 'keyword',
287 'event': 'keyword',
288 'external': 'keyword',
289 'fixed': 'keyword',
290 'method': 'keyword',
291 'mixin': 'keyword',
292 'object': 'keyword',
293 'parallel': 'keyword',
294 'process': 'keyword',
295 'protected': 'keyword',
296 'pure': 'keyword',
297 'sealed': 'keyword',
298 'tailcall': 'keyword',
299 'trait': 'keyword',
300 'virtual': 'keyword',
301 'volatile': 'keyword',
302
303 // builtins
304 'List': 'builtin',
305 'Seq': 'builtin',
306 'Map': 'builtin',
307 'Set': 'builtin',
308 'Option': 'builtin',
309 'int': 'builtin',
310 'string': 'builtin',
311 'not': 'builtin',
312 'true': 'builtin',
313 'false': 'builtin',
314
315 'raise': 'builtin',
316 'failwith': 'builtin'
317 },
318 slashComments: true
319});
320
321
322CodeMirror.defineMIME('text/x-sml', {
323 name: 'mllike',
324 extraWords: {
325 'abstype': 'keyword',
326 'and': 'keyword',
327 'andalso': 'keyword',
328 'case': 'keyword',
329 'datatype': 'keyword',
330 'fn': 'keyword',
331 'handle': 'keyword',
332 'infix': 'keyword',
333 'infixr': 'keyword',
334 'local': 'keyword',
335 'nonfix': 'keyword',
336 'op': 'keyword',
337 'orelse': 'keyword',
338 'raise': 'keyword',
339 'withtype': 'keyword',
340 'eqtype': 'keyword',
341 'sharing': 'keyword',
342 'sig': 'keyword',
343 'signature': 'keyword',
344 'structure': 'keyword',
345 'where': 'keyword',
346 'true': 'keyword',
347 'false': 'keyword',
348
349 // types
350 'int': 'builtin',
351 'real': 'builtin',
352 'string': 'builtin',
353 'char': 'builtin',
354 'bool': 'builtin'
355 },
356 slashComments: true
357});
358
359});