@@ -6,12 +6,12 @@ Website: https://crystal-lang.org
6
6
7
7
/** @type LanguageFn */
8
8
export default function ( hljs ) {
9
- var INT_SUFFIX = '(_?[ui](8|16|32|64|128))?' ;
10
- var FLOAT_SUFFIX = '(_?f(32|64))?' ;
11
- var CRYSTAL_IDENT_RE = '[a-zA-Z_]\\w*[!?=]?' ;
12
- var CRYSTAL_METHOD_RE = '[a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|[=!]~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~|]|//|//=|&[-+*]=?|&\\*\\*|\\[\\][=?]?' ;
13
- var CRYSTAL_PATH_RE = '[A-Za-z_]\\w*(::\\w+)*(\\?|!)?' ;
14
- var CRYSTAL_KEYWORDS = {
9
+ const INT_SUFFIX = '(_?[ui](8|16|32|64|128))?' ;
10
+ const FLOAT_SUFFIX = '(_?f(32|64))?' ;
11
+ const CRYSTAL_IDENT_RE = '[a-zA-Z_]\\w*[!?=]?' ;
12
+ const CRYSTAL_METHOD_RE = '[a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|[=!]~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~|]|//|//=|&[-+*]=?|&\\*\\*|\\[\\][=?]?' ;
13
+ const CRYSTAL_PATH_RE = '[A-Za-z_]\\w*(::\\w+)*(\\?|!)?' ;
14
+ const CRYSTAL_KEYWORDS = {
15
15
$pattern : CRYSTAL_IDENT_RE ,
16
16
keyword :
17
17
'abstract alias annotation as as? asm begin break case class def do else elsif end ensure enum extend for fun if ' +
@@ -20,89 +20,191 @@ export default function(hljs) {
20
20
'__DIR__ __END_LINE__ __FILE__ __LINE__' ,
21
21
literal : 'false nil true'
22
22
} ;
23
- var SUBST = {
23
+ const SUBST = {
24
24
className : 'subst' ,
25
- begin : / # \{ / , end : / \} / ,
25
+ begin : / # \{ / ,
26
+ end : / \} / ,
26
27
keywords : CRYSTAL_KEYWORDS
27
28
} ;
28
- var EXPANSION = {
29
+ const EXPANSION = {
29
30
className : 'template-variable' ,
30
31
variants : [
31
- { begin : '\\{\\{' , end : '\\}\\}' } ,
32
- { begin : '\\{%' , end : '%\\}' }
32
+ {
33
+ begin : '\\{\\{' ,
34
+ end : '\\}\\}'
35
+ } ,
36
+ {
37
+ begin : '\\{%' ,
38
+ end : '%\\}'
39
+ }
33
40
] ,
34
41
keywords : CRYSTAL_KEYWORDS
35
42
} ;
36
43
37
44
function recursiveParen ( begin , end ) {
38
- var
39
- contains = [ { begin : begin , end : end } ] ;
45
+ const
46
+ contains = [
47
+ {
48
+ begin : begin ,
49
+ end : end
50
+ }
51
+ ] ;
40
52
contains [ 0 ] . contains = contains ;
41
53
return contains ;
42
54
}
43
- var STRING = {
55
+ const STRING = {
44
56
className : 'string' ,
45
- contains : [ hljs . BACKSLASH_ESCAPE , SUBST ] ,
57
+ contains : [
58
+ hljs . BACKSLASH_ESCAPE ,
59
+ SUBST
60
+ ] ,
46
61
variants : [
47
- { begin : / ' / , end : / ' / } ,
48
- { begin : / " / , end : / " / } ,
49
- { begin : / ` / , end : / ` / } ,
50
- { begin : '%[Qwi]?\\(' , end : '\\)' , contains : recursiveParen ( '\\(' , '\\)' ) } ,
51
- { begin : '%[Qwi]?\\[' , end : '\\]' , contains : recursiveParen ( '\\[' , '\\]' ) } ,
52
- { begin : '%[Qwi]?\\{' , end : / \} / , contains : recursiveParen ( / \{ / , / \} / ) } ,
53
- { begin : '%[Qwi]?<' , end : '>' , contains : recursiveParen ( '<' , '>' ) } ,
54
- { begin : '%[Qwi]?\\|' , end : '\\|' } ,
55
- { begin : / < < - \w + $ / , end : / ^ \s * \w + $ / } ,
62
+ {
63
+ begin : / ' / ,
64
+ end : / ' /
65
+ } ,
66
+ {
67
+ begin : / " / ,
68
+ end : / " /
69
+ } ,
70
+ {
71
+ begin : / ` / ,
72
+ end : / ` /
73
+ } ,
74
+ {
75
+ begin : '%[Qwi]?\\(' ,
76
+ end : '\\)' ,
77
+ contains : recursiveParen ( '\\(' , '\\)' )
78
+ } ,
79
+ {
80
+ begin : '%[Qwi]?\\[' ,
81
+ end : '\\]' ,
82
+ contains : recursiveParen ( '\\[' , '\\]' )
83
+ } ,
84
+ {
85
+ begin : '%[Qwi]?\\{' ,
86
+ end : / \} / ,
87
+ contains : recursiveParen ( / \{ / , / \} / )
88
+ } ,
89
+ {
90
+ begin : '%[Qwi]?<' ,
91
+ end : '>' ,
92
+ contains : recursiveParen ( '<' , '>' )
93
+ } ,
94
+ {
95
+ begin : '%[Qwi]?\\|' ,
96
+ end : '\\|'
97
+ } ,
98
+ {
99
+ begin : / < < - \w + $ / ,
100
+ end : / ^ \s * \w + $ /
101
+ }
56
102
] ,
57
- relevance : 0 ,
103
+ relevance : 0
58
104
} ;
59
- var Q_STRING = {
105
+ const Q_STRING = {
60
106
className : 'string' ,
61
107
variants : [
62
- { begin : '%q\\(' , end : '\\)' , contains : recursiveParen ( '\\(' , '\\)' ) } ,
63
- { begin : '%q\\[' , end : '\\]' , contains : recursiveParen ( '\\[' , '\\]' ) } ,
64
- { begin : '%q\\{' , end : / \} / , contains : recursiveParen ( / \{ / , / \} / ) } ,
65
- { begin : '%q<' , end : '>' , contains : recursiveParen ( '<' , '>' ) } ,
66
- { begin : '%q\\|' , end : '\\|' } ,
67
- { begin : / < < - ' \w + ' $ / , end : / ^ \s * \w + $ / } ,
108
+ {
109
+ begin : '%q\\(' ,
110
+ end : '\\)' ,
111
+ contains : recursiveParen ( '\\(' , '\\)' )
112
+ } ,
113
+ {
114
+ begin : '%q\\[' ,
115
+ end : '\\]' ,
116
+ contains : recursiveParen ( '\\[' , '\\]' )
117
+ } ,
118
+ {
119
+ begin : '%q\\{' ,
120
+ end : / \} / ,
121
+ contains : recursiveParen ( / \{ / , / \} / )
122
+ } ,
123
+ {
124
+ begin : '%q<' ,
125
+ end : '>' ,
126
+ contains : recursiveParen ( '<' , '>' )
127
+ } ,
128
+ {
129
+ begin : '%q\\|' ,
130
+ end : '\\|'
131
+ } ,
132
+ {
133
+ begin : / < < - ' \w + ' $ / ,
134
+ end : / ^ \s * \w + $ /
135
+ }
68
136
] ,
69
- relevance : 0 ,
137
+ relevance : 0
70
138
} ;
71
- var REGEXP = {
139
+ const REGEXP = {
72
140
begin : '(?!%\\})(' + hljs . RE_STARTERS_RE + '|\\n|\\b(case|if|select|unless|until|when|while)\\b)\\s*' ,
73
141
keywords : 'case if select unless until when while' ,
74
142
contains : [
75
143
{
76
144
className : 'regexp' ,
77
- contains : [ hljs . BACKSLASH_ESCAPE , SUBST ] ,
145
+ contains : [
146
+ hljs . BACKSLASH_ESCAPE ,
147
+ SUBST
148
+ ] ,
78
149
variants : [
79
- { begin : '//[a-z]*' , relevance : 0 } ,
80
- { begin : '/(?!\\/)' , end : '/[a-z]*' } ,
150
+ {
151
+ begin : '//[a-z]*' ,
152
+ relevance : 0
153
+ } ,
154
+ {
155
+ begin : '/(?!\\/)' ,
156
+ end : '/[a-z]*'
157
+ }
81
158
]
82
159
}
83
160
] ,
84
161
relevance : 0
85
162
} ;
86
- var REGEXP2 = {
163
+ const REGEXP2 = {
87
164
className : 'regexp' ,
88
- contains : [ hljs . BACKSLASH_ESCAPE , SUBST ] ,
165
+ contains : [
166
+ hljs . BACKSLASH_ESCAPE ,
167
+ SUBST
168
+ ] ,
89
169
variants : [
90
- { begin : '%r\\(' , end : '\\)' , contains : recursiveParen ( '\\(' , '\\)' ) } ,
91
- { begin : '%r\\[' , end : '\\]' , contains : recursiveParen ( '\\[' , '\\]' ) } ,
92
- { begin : '%r\\{' , end : / \} / , contains : recursiveParen ( / \{ / , / \} / ) } ,
93
- { begin : '%r<' , end : '>' , contains : recursiveParen ( '<' , '>' ) } ,
94
- { begin : '%r\\|' , end : '\\|' } ,
170
+ {
171
+ begin : '%r\\(' ,
172
+ end : '\\)' ,
173
+ contains : recursiveParen ( '\\(' , '\\)' )
174
+ } ,
175
+ {
176
+ begin : '%r\\[' ,
177
+ end : '\\]' ,
178
+ contains : recursiveParen ( '\\[' , '\\]' )
179
+ } ,
180
+ {
181
+ begin : '%r\\{' ,
182
+ end : / \} / ,
183
+ contains : recursiveParen ( / \{ / , / \} / )
184
+ } ,
185
+ {
186
+ begin : '%r<' ,
187
+ end : '>' ,
188
+ contains : recursiveParen ( '<' , '>' )
189
+ } ,
190
+ {
191
+ begin : '%r\\|' ,
192
+ end : '\\|'
193
+ }
95
194
] ,
96
195
relevance : 0
97
196
} ;
98
- var ATTRIBUTE = {
197
+ const ATTRIBUTE = {
99
198
className : 'meta' ,
100
- begin : '@\\[' , end : '\\]' ,
199
+ begin : '@\\[' ,
200
+ end : '\\]' ,
101
201
contains : [
102
- hljs . inherit ( hljs . QUOTE_STRING_MODE , { className : 'meta-string' } )
202
+ hljs . inherit ( hljs . QUOTE_STRING_MODE , {
203
+ className : 'meta-string'
204
+ } )
103
205
]
104
206
} ;
105
- var CRYSTAL_DEFAULT_CONTAINS = [
207
+ const CRYSTAL_DEFAULT_CONTAINS = [
106
208
EXPANSION ,
107
209
STRING ,
108
210
Q_STRING ,
@@ -112,36 +214,48 @@ export default function(hljs) {
112
214
hljs . HASH_COMMENT_MODE ,
113
215
{
114
216
className : 'class' ,
115
- beginKeywords : 'class module struct' , end : '$|;' ,
217
+ beginKeywords : 'class module struct' ,
218
+ end : '$|;' ,
116
219
illegal : / = / ,
117
220
contains : [
118
221
hljs . HASH_COMMENT_MODE ,
119
- hljs . inherit ( hljs . TITLE_MODE , { begin : CRYSTAL_PATH_RE } ) ,
120
- { begin : '<' } // relevance booster for inheritance
222
+ hljs . inherit ( hljs . TITLE_MODE , {
223
+ begin : CRYSTAL_PATH_RE
224
+ } ) ,
225
+ { // relevance booster for inheritance
226
+ begin : '<'
227
+ }
121
228
]
122
229
} ,
123
230
{
124
231
className : 'class' ,
125
- beginKeywords : 'lib enum union' , end : '$|;' ,
232
+ beginKeywords : 'lib enum union' ,
233
+ end : '$|;' ,
126
234
illegal : / = / ,
127
235
contains : [
128
236
hljs . HASH_COMMENT_MODE ,
129
- hljs . inherit ( hljs . TITLE_MODE , { begin : CRYSTAL_PATH_RE } ) ,
237
+ hljs . inherit ( hljs . TITLE_MODE , {
238
+ begin : CRYSTAL_PATH_RE
239
+ } )
130
240
] ,
131
241
relevance : 10
132
242
} ,
133
243
{
134
- beginKeywords : 'annotation' , end : '$|;' ,
244
+ beginKeywords : 'annotation' ,
245
+ end : '$|;' ,
135
246
illegal : / = / ,
136
247
contains : [
137
248
hljs . HASH_COMMENT_MODE ,
138
- hljs . inherit ( hljs . TITLE_MODE , { begin : CRYSTAL_PATH_RE } ) ,
249
+ hljs . inherit ( hljs . TITLE_MODE , {
250
+ begin : CRYSTAL_PATH_RE
251
+ } )
139
252
] ,
140
253
relevance : 10
141
254
} ,
142
255
{
143
256
className : 'function' ,
144
- beginKeywords : 'def' , end : / \B \b / ,
257
+ beginKeywords : 'def' ,
258
+ end : / \B \b / ,
145
259
contains : [
146
260
hljs . inherit ( hljs . TITLE_MODE , {
147
261
begin : CRYSTAL_METHOD_RE ,
@@ -151,7 +265,8 @@ export default function(hljs) {
151
265
} ,
152
266
{
153
267
className : 'function' ,
154
- beginKeywords : 'fun macro' , end : / \B \b / ,
268
+ beginKeywords : 'fun macro' ,
269
+ end : / \B \b / ,
155
270
contains : [
156
271
hljs . inherit ( hljs . TITLE_MODE , {
157
272
begin : CRYSTAL_METHOD_RE ,
@@ -168,17 +283,32 @@ export default function(hljs) {
168
283
{
169
284
className : 'symbol' ,
170
285
begin : ':' ,
171
- contains : [ STRING , { begin : CRYSTAL_METHOD_RE } ] ,
286
+ contains : [
287
+ STRING ,
288
+ {
289
+ begin : CRYSTAL_METHOD_RE
290
+ }
291
+ ] ,
172
292
relevance : 0
173
293
} ,
174
294
{
175
295
className : 'number' ,
176
296
variants : [
177
- { begin : '\\b0b([01_]+)' + INT_SUFFIX } ,
178
- { begin : '\\b0o([0-7_]+)' + INT_SUFFIX } ,
179
- { begin : '\\b0x([A-Fa-f0-9_]+)' + INT_SUFFIX } ,
180
- { begin : '\\b([1-9][0-9_]*[0-9]|[0-9])(\\.[0-9][0-9_]*)?([eE]_?[-+]?[0-9_]*)?' + FLOAT_SUFFIX + '(?!_)' } ,
181
- { begin : '\\b([1-9][0-9_]*|0)' + INT_SUFFIX }
297
+ {
298
+ begin : '\\b0b([01_]+)' + INT_SUFFIX
299
+ } ,
300
+ {
301
+ begin : '\\b0o([0-7_]+)' + INT_SUFFIX
302
+ } ,
303
+ {
304
+ begin : '\\b0x([A-Fa-f0-9_]+)' + INT_SUFFIX
305
+ } ,
306
+ {
307
+ begin : '\\b([1-9][0-9_]*[0-9]|[0-9])(\\.[0-9][0-9_]*)?([eE]_?[-+]?[0-9_]*)?' + FLOAT_SUFFIX + '(?!_)'
308
+ } ,
309
+ {
310
+ begin : '\\b([1-9][0-9_]*|0)' + INT_SUFFIX
311
+ }
182
312
] ,
183
313
relevance : 0
184
314
}
@@ -188,7 +318,7 @@ export default function(hljs) {
188
318
189
319
return {
190
320
name : 'Crystal' ,
191
- aliases : [ 'cr' ] ,
321
+ aliases : [ 'cr' ] ,
192
322
keywords : CRYSTAL_KEYWORDS ,
193
323
contains : CRYSTAL_DEFAULT_CONTAINS
194
324
} ;
0 commit comments