annotate .cms/lib/codemirror/mode/julia/julia.js @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents 78edf6b517a0
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("julia", function(config, parserConf) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 function wordRegexp(words, end, pre) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 if (typeof pre === "undefined") { pre = ""; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 if (typeof end === "undefined") { end = "\\b"; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 return new RegExp("^" + pre + "((" + words.join(")|(") + "))" + end);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 var octChar = "\\\\[0-7]{1,3}";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 var hexChar = "\\\\x[A-Fa-f0-9]{1,2}";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 var sChar = "\\\\[abefnrtv0%?'\"\\\\]";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 var uChar = "([^\\u0027\\u005C\\uD800-\\uDFFF]|[\\uD800-\\uDFFF][\\uDC00-\\uDFFF])";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 var asciiOperatorsList = [
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 "[<>]:", "[<>=]=", "<<=?", ">>>?=?", "=>", "--?>", "<--[->]?", "\\/\\/",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 "\\.{2,3}", "[\\.\\\\%*+\\-<>!\\/^|&]=?", "\\?", "\\$", "~", ":"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 ];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 var operators = parserConf.operators || wordRegexp([
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 "[<>]:", "[<>=]=", "[!=]==", "<<=?", ">>>?=?", "=>?", "--?>", "<--[->]?", "\\/\\/",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 "[\\\\%*+\\-<>!\\/^|&\\u00F7\\u22BB]=?", "\\?", "\\$", "~", ":",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 "\\u00D7", "\\u2208", "\\u2209", "\\u220B", "\\u220C", "\\u2218",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 "\\u221A", "\\u221B", "\\u2229", "\\u222A", "\\u2260", "\\u2264",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 "\\u2265", "\\u2286", "\\u2288", "\\u228A", "\\u22C5",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 "\\b(in|isa)\\b(?!\.?\\()"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 ], "");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 var delimiters = parserConf.delimiters || /^[;,()[\]{}]/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 var identifiers = parserConf.identifiers ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 /^[_A-Za-z\u00A1-\u2217\u2219-\uFFFF][\w\u00A1-\u2217\u2219-\uFFFF]*!*/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 var chars = wordRegexp([octChar, hexChar, sChar, uChar], "'");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 var openersList = ["begin", "function", "type", "struct", "immutable", "let",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 "macro", "for", "while", "quote", "if", "else", "elseif", "try",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 "finally", "catch", "do"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 var closersList = ["end", "else", "elseif", "catch", "finally"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 var keywordsList = ["if", "else", "elseif", "while", "for", "begin", "let",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 "end", "do", "try", "catch", "finally", "return", "break", "continue",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 "global", "local", "const", "export", "import", "importall", "using",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 "function", "where", "macro", "module", "baremodule", "struct", "type",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 "mutable", "immutable", "quote", "typealias", "abstract", "primitive",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 "bitstype"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 var builtinsList = ["true", "false", "nothing", "NaN", "Inf"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 CodeMirror.registerHelper("hintWords", "julia", keywordsList.concat(builtinsList));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 var openers = wordRegexp(openersList);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 var closers = wordRegexp(closersList);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 var keywords = wordRegexp(keywordsList);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 var builtins = wordRegexp(builtinsList);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 var macro = /^@[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 var symbol = /^:[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 var stringPrefixes = /^(`|([_A-Za-z\u00A1-\uFFFF]*"("")?))/;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 var macroOperators = wordRegexp(asciiOperatorsList, "", "@");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 var symbolOperators = wordRegexp(asciiOperatorsList, "", ":");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 function inArray(state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 return (state.nestedArrays > 0);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 function inGenerator(state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 return (state.nestedGenerators > 0);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 function currentScope(state, n) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 if (typeof(n) === "undefined") { n = 0; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 if (state.scopes.length <= n) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 return state.scopes[state.scopes.length - (n + 1)];
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 // tokenizers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 function tokenBase(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 // Handle multiline comments
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 if (stream.match('#=', false)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 state.tokenize = tokenComment;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 return state.tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 // Handle scope changes
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 var leavingExpr = state.leavingExpr;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 if (stream.sol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 leavingExpr = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 state.leavingExpr = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 if (leavingExpr) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 if (stream.match(/^'+/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 return "operator";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 if (stream.match(/\.{4,}/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 return "error";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 } else if (stream.match(/\.{1,3}/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 return "operator";
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 (stream.eatSpace()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 return null;
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 var ch = stream.peek();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 // Handle single line comments
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 if (ch === '#') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 return "comment";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 if (ch === '[') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 state.scopes.push('[');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 state.nestedArrays++;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 if (ch === '(') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 state.scopes.push('(');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 state.nestedGenerators++;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 if (inArray(state) && ch === ']') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 while (state.scopes.length && currentScope(state) !== "[") { state.scopes.pop(); }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 state.scopes.pop();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 state.nestedArrays--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 state.leavingExpr = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 if (inGenerator(state) && ch === ')') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 while (state.scopes.length && currentScope(state) !== "(") { state.scopes.pop(); }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 state.scopes.pop();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 state.nestedGenerators--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 state.leavingExpr = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 if (inArray(state)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 if (state.lastToken == "end" && stream.match(':')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 return "operator";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 if (stream.match('end')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 return "number";
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 var match;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 if (match = stream.match(openers, false)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 state.scopes.push(match[0]);
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 if (stream.match(closers, false)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 state.scopes.pop();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 // Handle type annotations
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 if (stream.match(/^::(?![:\$])/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 state.tokenize = tokenAnnotation;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 return state.tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 // Handle symbols
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 if (!leavingExpr && (stream.match(symbol) || stream.match(symbolOperators))) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 return "builtin";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 // Handle parametric types
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 //if (stream.match(/^{[^}]*}(?=\()/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 // return "builtin";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 //}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 // Handle operators and Delimiters
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 if (stream.match(operators)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 return "operator";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 // Handle Number Literals
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 if (stream.match(/^\.?\d/, false)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 var imMatcher = RegExp(/^im\b/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 var numberLiteral = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 if (stream.match(/^0x\.[0-9a-f_]+p[\+\-]?[_\d]+/i)) { numberLiteral = true; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196 // Integers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 if (stream.match(/^0x[0-9a-f_]+/i)) { numberLiteral = true; } // Hex
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 if (stream.match(/^0b[01_]+/i)) { numberLiteral = true; } // Binary
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199 if (stream.match(/^0o[0-7_]+/i)) { numberLiteral = true; } // Octal
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 // Floats
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 if (stream.match(/^(?:(?:\d[_\d]*)?\.(?!\.)(?:\d[_\d]*)?|\d[_\d]*\.(?!\.)(?:\d[_\d]*))?([Eef][\+\-]?[_\d]+)?/i)) { numberLiteral = true; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 if (stream.match(/^\d[_\d]*(e[\+\-]?\d+)?/i)) { numberLiteral = true; } // Decimal
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 if (numberLiteral) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 // Integer literals may be "long"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 stream.match(imMatcher);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 state.leavingExpr = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 return "number";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 }
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 // Handle Chars
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 if (stream.match('\'')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213 state.tokenize = tokenChar;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 return state.tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217 // Handle Strings
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
218 if (stream.match(stringPrefixes)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
219 state.tokenize = tokenStringFactory(stream.current());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
220 return state.tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
221 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
222
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
223 if (stream.match(macro) || stream.match(macroOperators)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
224 return "meta";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
225 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
226
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
227 if (stream.match(delimiters)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
228 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
229 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
230
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
231 if (stream.match(keywords)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
232 return "keyword";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
233 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
234
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
235 if (stream.match(builtins)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
236 return "builtin";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
237 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
238
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
239 var isDefinition = state.isDefinition || state.lastToken == "function" ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
240 state.lastToken == "macro" || state.lastToken == "type" ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
241 state.lastToken == "struct" || state.lastToken == "immutable";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
242
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
243 if (stream.match(identifiers)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
244 if (isDefinition) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
245 if (stream.peek() === '.') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
246 state.isDefinition = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
247 return "variable";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
248 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
249 state.isDefinition = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
250 return "def";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
251 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
252 state.leavingExpr = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
253 return "variable";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
254 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
255
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
256 // Handle non-detected items
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
257 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
258 return "error";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
259 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
260
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
261 function tokenAnnotation(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
262 stream.match(/.*?(?=[,;{}()=\s]|$)/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
263 if (stream.match('{')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
264 state.nestedParameters++;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
265 } else if (stream.match('}') && state.nestedParameters > 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
266 state.nestedParameters--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
267 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
268 if (state.nestedParameters > 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
269 stream.match(/.*?(?={|})/) || stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
270 } else if (state.nestedParameters == 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
271 state.tokenize = tokenBase;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
272 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
273 return "builtin";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
274 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
275
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
276 function tokenComment(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
277 if (stream.match('#=')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
278 state.nestedComments++;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
279 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
280 if (!stream.match(/.*?(?=(#=|=#))/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
281 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
282 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
283 if (stream.match('=#')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
284 state.nestedComments--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
285 if (state.nestedComments == 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
286 state.tokenize = tokenBase;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
287 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
288 return "comment";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
289 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
290
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
291 function tokenChar(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
292 var isChar = false, match;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
293 if (stream.match(chars)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
294 isChar = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
295 } else if (match = stream.match(/\\u([a-f0-9]{1,4})(?=')/i)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
296 var value = parseInt(match[1], 16);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
297 if (value <= 55295 || value >= 57344) { // (U+0,U+D7FF), (U+E000,U+FFFF)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
298 isChar = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
299 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
300 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
301 } else if (match = stream.match(/\\U([A-Fa-f0-9]{5,8})(?=')/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
302 var value = parseInt(match[1], 16);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
303 if (value <= 1114111) { // U+10FFFF
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
304 isChar = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
305 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
306 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
307 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
308 if (isChar) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
309 state.leavingExpr = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
310 state.tokenize = tokenBase;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
311 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
312 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
313 if (!stream.match(/^[^']+(?=')/)) { stream.skipToEnd(); }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
314 if (stream.match('\'')) { state.tokenize = tokenBase; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
315 return "error";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
316 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
317
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
318 function tokenStringFactory(delimiter) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
319 if (delimiter.substr(-3) === '"""') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
320 delimiter = '"""';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
321 } else if (delimiter.substr(-1) === '"') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
322 delimiter = '"';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
323 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
324 function tokenString(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
325 if (stream.eat('\\')) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
326 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
327 } else if (stream.match(delimiter)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
328 state.tokenize = tokenBase;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
329 state.leavingExpr = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
330 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
331 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
332 stream.eat(/[`"]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
333 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
334 stream.eatWhile(/[^\\`"]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
335 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
336 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
337 return tokenString;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
338 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
339
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
340 var external = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
341 startState: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
342 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
343 tokenize: tokenBase,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
344 scopes: [],
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
345 lastToken: null,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
346 leavingExpr: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
347 isDefinition: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
348 nestedArrays: 0,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
349 nestedComments: 0,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
350 nestedGenerators: 0,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
351 nestedParameters: 0,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
352 firstParenPos: -1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
353 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
354 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
355
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
356 token: function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
357 var style = state.tokenize(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
358 var current = stream.current();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
359
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
360 if (current && style) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
361 state.lastToken = current;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
362 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
363
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
364 return style;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
365 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
366
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
367 indent: function(state, textAfter) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
368 var delta = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
369 if ( textAfter === ']' || textAfter === ')' || /^end\b/.test(textAfter) ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
370 /^else/.test(textAfter) || /^catch\b/.test(textAfter) || /^elseif\b/.test(textAfter) ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
371 /^finally/.test(textAfter) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
372 delta = -1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
373 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
374 return (state.scopes.length + delta) * config.indentUnit;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
375 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
376
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
377 electricInput: /\b(end|else|catch|finally)\b/,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
378 blockCommentStart: "#=",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
379 blockCommentEnd: "=#",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
380 lineComment: "#",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
381 closeBrackets: "()[]{}\"\"",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
382 fold: "indent"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
383 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
384 return external;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
385 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
386
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
387
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
388 CodeMirror.defineMIME("text/x-julia", "julia");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
389
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
390 });