33
33
SLASH_STAR_STAR,
34
34
TICK,
35
35
TICK_BACKSLASH,
36
+ TICK_DOLLAR,
36
37
REGEX,
37
38
REGEX_BACKSLASH,
38
39
REGEX_SQUARE,
@@ -99,18 +100,26 @@ void HighlightJs::feed(std::string *r, std::string_view input) {
99
100
} else if (c == ' \' ' ) {
100
101
t_ = QUOTE;
101
102
*r += HI_STRING;
102
- lf::append_wchar (r, c) ;
103
+ *r += ' \' ' ;
103
104
expect_ = EXPECT_OPERATOR;
104
105
} else if (c == ' "' ) {
105
106
t_ = DQUOTE;
106
107
*r += HI_STRING;
107
- lf::append_wchar (r, c) ;
108
+ *r += ' " ' ;
108
109
expect_ = EXPECT_OPERATOR;
109
110
} else if (c == ' `' ) {
110
111
t_ = TICK;
111
112
*r += HI_STRING;
112
- lf::append_wchar (r, c) ;
113
+ *r += ' ` ' ;
113
114
expect_ = EXPECT_OPERATOR;
115
+ } else if (c == ' {' && nesti_ && nesti_ < sizeof (nest_)) {
116
+ expect_ = EXPECT_VALUE;
117
+ *r += ' {' ;
118
+ nest_[nesti_++] = NORMAL;
119
+ } else if (c == ' }' && nesti_) {
120
+ if ((t_ = nest_[--nesti_]) != NORMAL)
121
+ *r += HI_STRING;
122
+ *r += ' }' ;
114
123
} else if (c == ' )' || c == ' }' || c == ' ]' ) {
115
124
expect_ = EXPECT_OPERATOR;
116
125
lf::append_wchar (r, c);
@@ -240,13 +249,19 @@ void HighlightJs::feed(std::string *r, std::string_view input) {
240
249
t_ = DQUOTE;
241
250
break ;
242
251
252
+ Tick:
243
253
case TICK:
244
- lf::append_wchar (r, c);
245
254
if (c == ' `' ) {
255
+ *r += ' `' ;
246
256
*r += HI_RESET;
247
257
t_ = NORMAL;
258
+ } else if (c == ' $' ) {
259
+ t_ = TICK_DOLLAR;
248
260
} else if (c == ' \\ ' ) {
261
+ *r += ' \\ ' ;
249
262
t_ = TICK_BACKSLASH;
263
+ } else {
264
+ lf::append_wchar (r, c);
250
265
}
251
266
break ;
252
267
@@ -255,6 +270,27 @@ void HighlightJs::feed(std::string *r, std::string_view input) {
255
270
t_ = TICK;
256
271
break ;
257
272
273
+ case TICK_DOLLAR:
274
+ if (c == ' {' && nesti_ < sizeof (nest_)) {
275
+ *r += HI_BOLD;
276
+ *r += ' $' ;
277
+ *r += HI_UNBOLD;
278
+ *r += HI_STRING;
279
+ *r += ' {' ;
280
+ *r += HI_RESET;
281
+ expect_ = EXPECT_VALUE;
282
+ nest_[nesti_++] = TICK;
283
+ t_ = NORMAL;
284
+ } else {
285
+ *r += HI_WARNING;
286
+ *r += ' $' ;
287
+ *r += HI_UNBOLD;
288
+ *r += HI_STRING;
289
+ t_ = TICK;
290
+ goto Tick;
291
+ }
292
+ break ;
293
+
258
294
case REGEX:
259
295
lf::append_wchar (r, c);
260
296
if (c == ' /' ) {
@@ -316,6 +352,10 @@ void HighlightJs::flush(std::string *r) {
316
352
case SLASH:
317
353
*r += ' /' ;
318
354
break ;
355
+ case TICK_DOLLAR:
356
+ *r += ' $' ;
357
+ *r += HI_RESET;
358
+ break ;
319
359
case TICK:
320
360
case TICK_BACKSLASH:
321
361
case QUOTE:
@@ -337,4 +377,5 @@ void HighlightJs::flush(std::string *r) {
337
377
c_ = 0 ;
338
378
u_ = 0 ;
339
379
t_ = NORMAL;
380
+ nesti_ = 0 ;
340
381
}
0 commit comments