Mercurial
comparison .cms/lib/codemirror/mode/livescript/livescript.js @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others | |
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE | |
3 | |
4 /** | |
5 * Link to the project's GitHub page: | |
6 * https://github.com/duralog/CodeMirror | |
7 */ | |
8 | |
9 (function(mod) { | |
10 if (typeof exports == "object" && typeof module == "object") // CommonJS | |
11 mod(require("../../lib/codemirror")); | |
12 else if (typeof define == "function" && define.amd) // AMD | |
13 define(["../../lib/codemirror"], mod); | |
14 else // Plain browser env | |
15 mod(CodeMirror); | |
16 })(function(CodeMirror) { | |
17 "use strict"; | |
18 | |
19 CodeMirror.defineMode('livescript', function(){ | |
20 var tokenBase = function(stream, state) { | |
21 var next_rule = state.next || "start"; | |
22 if (next_rule) { | |
23 state.next = state.next; | |
24 var nr = Rules[next_rule]; | |
25 if (nr.splice) { | |
26 for (var i$ = 0; i$ < nr.length; ++i$) { | |
27 var r = nr[i$]; | |
28 if (r.regex && stream.match(r.regex)) { | |
29 state.next = r.next || state.next; | |
30 return r.token; | |
31 } | |
32 } | |
33 stream.next(); | |
34 return 'error'; | |
35 } | |
36 if (stream.match(r = Rules[next_rule])) { | |
37 if (r.regex && stream.match(r.regex)) { | |
38 state.next = r.next; | |
39 return r.token; | |
40 } else { | |
41 stream.next(); | |
42 return 'error'; | |
43 } | |
44 } | |
45 } | |
46 stream.next(); | |
47 return 'error'; | |
48 }; | |
49 var external = { | |
50 startState: function(){ | |
51 return { | |
52 next: 'start', | |
53 lastToken: {style: null, indent: 0, content: ""} | |
54 }; | |
55 }, | |
56 token: function(stream, state){ | |
57 while (stream.pos == stream.start) | |
58 var style = tokenBase(stream, state); | |
59 state.lastToken = { | |
60 style: style, | |
61 indent: stream.indentation(), | |
62 content: stream.current() | |
63 }; | |
64 return style.replace(/\./g, ' '); | |
65 }, | |
66 indent: function(state){ | |
67 var indentation = state.lastToken.indent; | |
68 if (state.lastToken.content.match(indenter)) { | |
69 indentation += 2; | |
70 } | |
71 return indentation; | |
72 } | |
73 }; | |
74 return external; | |
75 }); | |
76 | |
77 var identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*'; | |
78 var indenter = RegExp('(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*' + identifier + ')?))\\s*$'); | |
79 var keywordend = '(?![$\\w]|-[A-Za-z]|\\s*:(?![:=]))'; | |
80 var stringfill = { | |
81 token: 'string', | |
82 regex: '.+' | |
83 }; | |
84 var Rules = { | |
85 start: [ | |
86 { | |
87 token: 'comment.doc', | |
88 regex: '/\\*', | |
89 next: 'comment' | |
90 }, { | |
91 token: 'comment', | |
92 regex: '#.*' | |
93 }, { | |
94 token: 'keyword', | |
95 regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend | |
96 }, { | |
97 token: 'constant.language', | |
98 regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend | |
99 }, { | |
100 token: 'invalid.illegal', | |
101 regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend | |
102 }, { | |
103 token: 'language.support.class', | |
104 regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend | |
105 }, { | |
106 token: 'language.support.function', | |
107 regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend | |
108 }, { | |
109 token: 'variable.language', | |
110 regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend | |
111 }, { | |
112 token: 'identifier', | |
113 regex: identifier + '\\s*:(?![:=])' | |
114 }, { | |
115 token: 'variable', | |
116 regex: identifier | |
117 }, { | |
118 token: 'keyword.operator', | |
119 regex: '(?:\\.{3}|\\s+\\?)' | |
120 }, { | |
121 token: 'keyword.variable', | |
122 regex: '(?:@+|::|\\.\\.)', | |
123 next: 'key' | |
124 }, { | |
125 token: 'keyword.operator', | |
126 regex: '\\.\\s*', | |
127 next: 'key' | |
128 }, { | |
129 token: 'string', | |
130 regex: '\\\\\\S[^\\s,;)}\\]]*' | |
131 }, { | |
132 token: 'string.doc', | |
133 regex: '\'\'\'', | |
134 next: 'qdoc' | |
135 }, { | |
136 token: 'string.doc', | |
137 regex: '"""', | |
138 next: 'qqdoc' | |
139 }, { | |
140 token: 'string', | |
141 regex: '\'', | |
142 next: 'qstring' | |
143 }, { | |
144 token: 'string', | |
145 regex: '"', | |
146 next: 'qqstring' | |
147 }, { | |
148 token: 'string', | |
149 regex: '`', | |
150 next: 'js' | |
151 }, { | |
152 token: 'string', | |
153 regex: '<\\[', | |
154 next: 'words' | |
155 }, { | |
156 token: 'string.regex', | |
157 regex: '//', | |
158 next: 'heregex' | |
159 }, { | |
160 token: 'string.regex', | |
161 regex: '\\/(?:[^[\\/\\n\\\\]*(?:(?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[\\/\\n\\\\]*)*)\\/[gimy$]{0,4}', | |
162 next: 'key' | |
163 }, { | |
164 token: 'constant.numeric', | |
165 regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[\\w$]*)' | |
166 }, { | |
167 token: 'lparen', | |
168 regex: '[({[]' | |
169 }, { | |
170 token: 'rparen', | |
171 regex: '[)}\\]]', | |
172 next: 'key' | |
173 }, { | |
174 token: 'keyword.operator', | |
175 regex: '\\S+' | |
176 }, { | |
177 token: 'text', | |
178 regex: '\\s+' | |
179 } | |
180 ], | |
181 heregex: [ | |
182 { | |
183 token: 'string.regex', | |
184 regex: '.*?//[gimy$?]{0,4}', | |
185 next: 'start' | |
186 }, { | |
187 token: 'string.regex', | |
188 regex: '\\s*#{' | |
189 }, { | |
190 token: 'comment.regex', | |
191 regex: '\\s+(?:#.*)?' | |
192 }, { | |
193 token: 'string.regex', | |
194 regex: '\\S+' | |
195 } | |
196 ], | |
197 key: [ | |
198 { | |
199 token: 'keyword.operator', | |
200 regex: '[.?@!]+' | |
201 }, { | |
202 token: 'identifier', | |
203 regex: identifier, | |
204 next: 'start' | |
205 }, { | |
206 token: 'text', | |
207 regex: '', | |
208 next: 'start' | |
209 } | |
210 ], | |
211 comment: [ | |
212 { | |
213 token: 'comment.doc', | |
214 regex: '.*?\\*/', | |
215 next: 'start' | |
216 }, { | |
217 token: 'comment.doc', | |
218 regex: '.+' | |
219 } | |
220 ], | |
221 qdoc: [ | |
222 { | |
223 token: 'string', | |
224 regex: ".*?'''", | |
225 next: 'key' | |
226 }, stringfill | |
227 ], | |
228 qqdoc: [ | |
229 { | |
230 token: 'string', | |
231 regex: '.*?"""', | |
232 next: 'key' | |
233 }, stringfill | |
234 ], | |
235 qstring: [ | |
236 { | |
237 token: 'string', | |
238 regex: '[^\\\\\']*(?:\\\\.[^\\\\\']*)*\'', | |
239 next: 'key' | |
240 }, stringfill | |
241 ], | |
242 qqstring: [ | |
243 { | |
244 token: 'string', | |
245 regex: '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', | |
246 next: 'key' | |
247 }, stringfill | |
248 ], | |
249 js: [ | |
250 { | |
251 token: 'string', | |
252 regex: '[^\\\\`]*(?:\\\\.[^\\\\`]*)*`', | |
253 next: 'key' | |
254 }, stringfill | |
255 ], | |
256 words: [ | |
257 { | |
258 token: 'string', | |
259 regex: '.*?\\]>', | |
260 next: 'key' | |
261 }, stringfill | |
262 ] | |
263 }; | |
264 for (var idx in Rules) { | |
265 var r = Rules[idx]; | |
266 if (r.splice) { | |
267 for (var i = 0, len = r.length; i < len; ++i) { | |
268 var rr = r[i]; | |
269 if (typeof rr.regex === 'string') { | |
270 Rules[idx][i].regex = new RegExp('^' + rr.regex); | |
271 } | |
272 } | |
273 } else if (typeof rr.regex === 'string') { | |
274 Rules[idx].regex = new RegExp('^' + r.regex); | |
275 } | |
276 } | |
277 | |
278 CodeMirror.defineMIME('text/x-livescript', 'livescript'); | |
279 | |
280 }); |