@@ -14,6 +14,7 @@ enum TokenType {
14
14
BLOCK_COMMENT_CONTENT ,
15
15
LINE_DOC_CONTENT ,
16
16
FRONTMATTER_START ,
17
+ FRONTMATTER_INFO_STRING ,
17
18
FRONTMATTER_CONTENT ,
18
19
FRONTMATTER_END ,
19
20
ERROR_SENTINEL
@@ -22,6 +23,7 @@ enum TokenType {
22
23
typedef struct {
23
24
uint8_t opening_hash_count ;
24
25
uint8_t frontmatter_dashes ;
26
+ bool frontmatter_has_info_string ;
25
27
} Scanner ;
26
28
27
29
void * tree_sitter_rust_external_scanner_create () { return ts_calloc (1 , sizeof (Scanner )); }
@@ -32,16 +34,19 @@ unsigned tree_sitter_rust_external_scanner_serialize(void *payload, char *buffer
32
34
Scanner * scanner = (Scanner * )payload ;
33
35
buffer [0 ] = (char )scanner -> opening_hash_count ;
34
36
buffer [1 ] = (char )scanner -> frontmatter_dashes ;
35
- return 2 ;
37
+ buffer [2 ] = (char )scanner -> frontmatter_has_info_string ;
38
+ return 3 ;
36
39
}
37
40
38
41
void tree_sitter_rust_external_scanner_deserialize (void * payload , const char * buffer , unsigned length ) {
39
42
Scanner * scanner = (Scanner * )payload ;
40
43
scanner -> opening_hash_count = 0 ;
41
44
scanner -> frontmatter_dashes = 0 ;
42
- if (length == 2 ) {
45
+ scanner -> frontmatter_has_info_string = false;
46
+ if (length == 3 ) {
43
47
scanner -> opening_hash_count = buffer [0 ];
44
48
scanner -> frontmatter_dashes = buffer [1 ];
49
+ scanner -> frontmatter_has_info_string = buffer [2 ];
45
50
}
46
51
}
47
52
@@ -350,16 +355,38 @@ static inline bool process_frontmatter_start(TSLexer *lexer, Scanner *scanner) {
350
355
scanner -> frontmatter_dashes = amount ;
351
356
lexer -> result_symbol = FRONTMATTER_START ;
352
357
358
+ while (!lexer -> eof (lexer ) && iswspace (lexer -> lookahead ) && lexer -> lookahead != '\n' ) {
359
+ advance (lexer );
360
+ }
361
+
353
362
// parse optional info string after the initial fence
354
- while (lexer -> lookahead != '\n' && !lexer -> eof (lexer )) {
363
+ if (lexer -> eof (lexer ) || lexer -> lookahead == '\n' ) {
364
+ scanner -> frontmatter_has_info_string = false;
355
365
advance (lexer );
366
+ } else {
367
+ scanner -> frontmatter_has_info_string = true;
356
368
}
357
- advance (lexer );
358
369
359
370
return true;
360
371
}
361
372
}
362
373
374
+ static inline bool process_frontmatter_info_string (TSLexer * lexer , Scanner * scanner ) {
375
+ if (scanner -> frontmatter_has_info_string ) {
376
+ while (!lexer -> eof (lexer ) && lexer -> lookahead != '\n' ) {
377
+ advance (lexer );
378
+ }
379
+
380
+ lexer -> result_symbol = FRONTMATTER_INFO_STRING ;
381
+ lexer -> mark_end (lexer );
382
+
383
+ advance (lexer );
384
+ return true;
385
+ } else {
386
+ return false;
387
+ }
388
+ }
389
+
363
390
static inline bool process_frontmatter (TSLexer * lexer , Scanner * scanner ) {
364
391
// seperately parse empty frontmatter, as tree-sitter strips all whitespace,
365
392
// including newlines, so i can't rely on parsing only after a newline in this case.
@@ -472,6 +499,12 @@ bool tree_sitter_rust_external_scanner_scan(void *payload, TSLexer *lexer, const
472
499
return process_frontmatter_start (lexer , scanner );
473
500
}
474
501
502
+ if (valid_symbols [FRONTMATTER_INFO_STRING ]) {
503
+ if (process_frontmatter_info_string (lexer , scanner )) {
504
+ return true;
505
+ }
506
+ }
507
+
475
508
if (valid_symbols [FRONTMATTER_CONTENT ]) {
476
509
return process_frontmatter (lexer , scanner );
477
510
}
0 commit comments