@@ -11,13 +11,7 @@ export default function(hljs) {
11
11
const regex = hljs . regex ;
12
12
const RUBY_METHOD_RE = '([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)' ;
13
13
// TODO: move concepts like CAMEL_CASE into `modes.js`
14
- const CLASS_NAME_RE = regex . either (
15
- / \b ( [ A - Z ] + [ a - z 0 - 9 ] + ) + / ,
16
- // ends in caps
17
- / \b ( [ A - Z ] + [ a - z 0 - 9 ] + ) + [ A - Z ] + / ,
18
- )
19
- ;
20
- const CLASS_NAME_WITH_NAMESPACE_RE = regex . concat ( CLASS_NAME_RE , / ( : : \w + ) * / )
14
+ const CLASS_NAME_RE = / \b ( [ A - Z ] + [ a - z 0 - 9 _ ] + ) + [ A - Z ] * / ;
21
15
// very popular ruby built-ins that one might even assume
22
16
// are actual keywords (despite that not being the case)
23
17
const PSEUDO_KWS = [
@@ -120,19 +114,16 @@ export default function(hljs) {
120
114
className : 'subst' ,
121
115
begin : / # \{ / ,
122
116
end : / \} / ,
123
- keywords : RUBY_KEYWORDS
117
+ keywords : RUBY_KEYWORDS ,
118
+ relevance : 10
124
119
} ;
125
- const STRING = {
120
+ const STRING_INTERPOLABLE = {
126
121
className : 'string' ,
127
122
contains : [
128
123
hljs . BACKSLASH_ESCAPE ,
129
124
SUBST
130
125
] ,
131
126
variants : [
132
- {
133
- begin : / ' / ,
134
- end : / ' /
135
- } ,
136
127
{
137
128
begin : / " / ,
138
129
end : / " /
@@ -142,45 +133,45 @@ export default function(hljs) {
142
133
end : / ` /
143
134
} ,
144
135
{
145
- begin : / % [ q Q w W x ] ? \( / ,
146
- end : / \) /
136
+ begin : / % [ Q W x ] ? \( / ,
137
+ end : / \) / ,
138
+ relevance : 2
147
139
} ,
148
140
{
149
- begin : / % [ q Q w W x ] ? \[ / ,
150
- end : / \] /
141
+ begin : / % [ Q W x ] ? \[ / ,
142
+ end : / \] / ,
143
+ relevance : 2
151
144
} ,
152
145
{
153
- begin : / % [ q Q w W x ] ? \{ / ,
154
- end : / \} /
146
+ begin : / % [ Q W x ] ? \{ / ,
147
+ end : / \} / ,
148
+ relevance : 2
155
149
} ,
156
150
{
157
- begin : / % [ q Q w W x ] ? < / ,
158
- end : / > /
151
+ begin : / % [ Q W x ] ? < / ,
152
+ end : / > / ,
153
+ relevance : 2
159
154
} ,
160
155
{
161
- begin : / % [ q Q w W x ] ? \/ / ,
162
- end : / \/ /
156
+ begin : / % [ Q W x ] ? \/ / ,
157
+ end : / \/ / ,
158
+ relevance : 2
163
159
} ,
164
160
{
165
- begin : / % [ q Q w W x ] ? % / ,
166
- end : / % /
161
+ begin : / % [ Q W x ] ? % / ,
162
+ end : / % / ,
163
+ relevance : 2
167
164
} ,
168
165
{
169
- begin : / % [ q Q w W x ] ? - / ,
170
- end : / - /
166
+ begin : / % [ Q W x ] ? - / ,
167
+ end : / - / ,
168
+ relevance : 2
171
169
} ,
172
170
{
173
- begin : / % [ q Q w W x ] ? \| / ,
174
- end : / \| /
171
+ begin : / % [ Q W x ] ? \| / ,
172
+ end : / \| / ,
173
+ relevance : 2
175
174
} ,
176
- // in the following expressions, \B in the beginning suppresses recognition of ?-sequences
177
- // where ? is the last character of a preceding identifier, as in: `func?4`
178
- { begin : / \B \? ( \\ \d { 1 , 3 } ) / } ,
179
- { begin : / \B \? ( \\ x [ A - F a - f 0 - 9 ] { 1 , 2 } ) / } ,
180
- { begin : / \B \? ( \\ u \{ ? [ A - F a - f 0 - 9 ] { 1 , 6 } \} ? ) / } ,
181
- { begin : / \B \? ( \\ M - \\ C - | \\ M - \\ c | \\ c \\ M - | \\ M - | \\ C - \\ M - ) [ \x20 - \x7e ] / } ,
182
- { begin : / \B \? \\ ( c | C - ) [ \x20 - \x7e ] / } ,
183
- { begin : / \B \? \\ ? \S / } ,
184
175
// heredocs
185
176
{
186
177
// this guard makes sure that we have an entire heredoc and not a false
@@ -202,6 +193,63 @@ export default function(hljs) {
202
193
}
203
194
]
204
195
} ;
196
+ const STRING_NONINTERPOLABLE = {
197
+ className : 'string' ,
198
+ variants : [
199
+ {
200
+ begin : / ' / ,
201
+ end : / ' /
202
+ } ,
203
+ {
204
+ begin : / % [ q w ] ? \( / ,
205
+ end : / \) / ,
206
+ relevance : 2
207
+ } ,
208
+ {
209
+ begin : / % [ q w ] ? \[ / ,
210
+ end : / \] / ,
211
+ relevance : 2
212
+ } ,
213
+ {
214
+ begin : / % [ q w ] ? \{ / ,
215
+ end : / \} / ,
216
+ relevance : 2
217
+ } ,
218
+ {
219
+ begin : / % [ q w ] ? < / ,
220
+ end : / > / ,
221
+ relevance : 2
222
+ } ,
223
+ {
224
+ begin : / % [ q w ] ? \/ / ,
225
+ end : / \/ / ,
226
+ relevance : 2
227
+ } ,
228
+ {
229
+ begin : / % [ q w ] ? % / ,
230
+ end : / % / ,
231
+ relevance : 2
232
+ } ,
233
+ {
234
+ begin : / % [ q w ] ? - / ,
235
+ end : / - / ,
236
+ relevance : 2
237
+ } ,
238
+ {
239
+ begin : / % [ q w ] ? \| / ,
240
+ end : / \| / ,
241
+ relevance : 2
242
+ } ,
243
+ // in the following expressions, \B in the beginning suppresses recognition of ?-sequences
244
+ // where ? is the last character of a preceding identifier, as in: `func?4`
245
+ { begin : / \B \? ( \\ \d { 1 , 3 } ) / } ,
246
+ { begin : / \B \? ( \\ x [ A - F a - f 0 - 9 ] { 1 , 2 } ) / } ,
247
+ { begin : / \B \? ( \\ u \{ ? [ A - F a - f 0 - 9 ] { 1 , 6 } \} ? ) / } ,
248
+ { begin : / \B \? ( \\ M - \\ C - | \\ M - \\ c | \\ c \\ M - | \\ M - | \\ C - \\ M - ) [ \x20 - \x7e ] / } ,
249
+ { begin : / \B \? \\ ( c | C - ) [ \x20 - \x7e ] / } ,
250
+ { begin : / \B \? \\ ? \S / }
251
+ ]
252
+ } ;
205
253
206
254
// Ruby syntax is underdocumented, but this grammar seems to be accurate
207
255
// as of version 2.7.2 (confirmed with (irb and `Ripper.sexp(...)`)
@@ -246,7 +294,7 @@ export default function(hljs) {
246
294
const INCLUDE_EXTEND = {
247
295
match : [
248
296
/ ( i n c l u d e | e x t e n d ) \s + / ,
249
- CLASS_NAME_WITH_NAMESPACE_RE
297
+ CLASS_NAME_RE
250
298
] ,
251
299
scope : {
252
300
2 : "title.class"
@@ -259,15 +307,15 @@ export default function(hljs) {
259
307
{
260
308
match : [
261
309
/ c l a s s \s + / ,
262
- CLASS_NAME_WITH_NAMESPACE_RE ,
310
+ CLASS_NAME_RE ,
263
311
/ \s + < \s + / ,
264
- CLASS_NAME_WITH_NAMESPACE_RE
312
+ CLASS_NAME_RE
265
313
]
266
314
} ,
267
315
{
268
316
match : [
269
317
/ \b ( c l a s s | m o d u l e ) \s + / ,
270
- CLASS_NAME_WITH_NAMESPACE_RE
318
+ CLASS_NAME_RE
271
319
]
272
320
}
273
321
] ,
@@ -301,7 +349,7 @@ export default function(hljs) {
301
349
const OBJECT_CREATION = {
302
350
relevance : 0 ,
303
351
match : [
304
- CLASS_NAME_WITH_NAMESPACE_RE ,
352
+ CLASS_NAME_RE ,
305
353
/ \. n e w [ . ( ] /
306
354
] ,
307
355
scope : {
@@ -317,7 +365,8 @@ export default function(hljs) {
317
365
} ;
318
366
319
367
const RUBY_DEFAULT_CONTAINS = [
320
- STRING ,
368
+ STRING_INTERPOLABLE ,
369
+ STRING_NONINTERPOLABLE ,
321
370
CLASS_DEFINITION ,
322
371
INCLUDE_EXTEND ,
323
372
OBJECT_CREATION ,
@@ -326,20 +375,28 @@ export default function(hljs) {
326
375
METHOD_DEFINITION ,
327
376
{
328
377
// swallow namespace qualifiers before symbols
329
- begin : hljs . IDENT_RE + '::' } ,
378
+ begin : hljs . IDENT_RE + '::'
379
+ } ,
330
380
{
331
381
className : 'symbol' ,
332
382
begin : hljs . UNDERSCORE_IDENT_RE + '(!|\\?)?:' ,
333
383
relevance : 0
334
384
} ,
335
385
{
336
386
className : 'symbol' ,
337
- begin : ': (?!\\s)' ,
387
+ begin : '(?<!:): (?!\\s|: )' ,
338
388
contains : [
339
- STRING ,
340
- { begin : RUBY_METHOD_RE }
389
+ { begin : / ' / , end : / ' / } ,
390
+ {
391
+ begin : / " / , end : / " / ,
392
+ contains : [
393
+ hljs . BACKSLASH_ESCAPE ,
394
+ SUBST
395
+ ]
396
+ } ,
397
+ { begin : hljs . UNDERSCORE_IDENT_RE }
341
398
] ,
342
- relevance : 0
399
+ relevance : 1
343
400
} ,
344
401
NUMBER ,
345
402
{
0 commit comments