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