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