@@ -211,9 +211,18 @@ fn map_token(
211
211
}
212
212
Expr :: Numeric ( a) => constant_token ! ( doc, a, TokenKind :: Unlintable ) ,
213
213
Expr :: Str ( text) => {
214
- // Using `text.get()` doesn't work here, because it escapes quotes which throws off
215
- // the span
216
- parse_english ( doc. get ( doc. range ( text. span ( ) ) ?) ?, doc, parser, & text. span ( ) )
214
+ let offset = doc. range ( text. span ( ) ) . unwrap ( ) . start + 1 ;
215
+ let text = text. to_untyped ( ) . text ( ) ;
216
+ Some (
217
+ parser
218
+ . parse_str ( & text[ 1 ..text. len ( ) - 1 ] )
219
+ . into_iter ( )
220
+ . map ( |mut t| {
221
+ t. span . push_by ( offset) ;
222
+ t
223
+ } )
224
+ . collect_vec ( ) ,
225
+ )
217
226
}
218
227
Expr :: Code ( a) => constant_token ! ( doc, a, TokenKind :: Unlintable ) ,
219
228
Expr :: Content ( content_block) => {
@@ -378,7 +387,7 @@ mod tests {
378
387
let source = "doesn't" ;
379
388
380
389
let tokens = Typst . parse_str ( source) ;
381
- let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect :: < Vec < _ > > ( ) ;
390
+ let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect_vec ( ) ;
382
391
dbg ! ( & token_kinds) ;
383
392
384
393
assert_eq ! ( token_kinds. len( ) , 1 ) ;
@@ -390,7 +399,7 @@ mod tests {
390
399
let source = "person's" ;
391
400
392
401
let tokens = Typst . parse_str ( source) ;
393
- let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect :: < Vec < _ > > ( ) ;
402
+ let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect_vec ( ) ;
394
403
dbg ! ( & token_kinds) ;
395
404
396
405
assert_eq ! ( token_kinds. len( ) , 1 ) ;
@@ -413,7 +422,7 @@ mod tests {
413
422
let source = "12 is larger than 11, but much less than 11!" ;
414
423
415
424
let tokens = Typst . parse_str ( source) ;
416
- let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect :: < Vec < _ > > ( ) ;
425
+ let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect_vec ( ) ;
417
426
dbg ! ( & token_kinds) ;
418
427
419
428
assert ! ( matches!(
@@ -449,7 +458,7 @@ mod tests {
449
458
let source = "$12 > 11$, $12 << 11!$" ;
450
459
451
460
let tokens = Typst . parse_str ( source) ;
452
- let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect :: < Vec < _ > > ( ) ;
461
+ let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect_vec ( ) ;
453
462
dbg ! ( & token_kinds) ;
454
463
455
464
assert ! ( matches!(
@@ -471,21 +480,52 @@ mod tests {
471
480
)"# ;
472
481
473
482
let tokens = Typst . parse_str ( source) ;
474
- let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect :: < Vec < _ > > ( ) ;
483
+ let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect_vec ( ) ;
475
484
dbg ! ( & token_kinds) ;
476
485
477
486
let charslice = source. chars ( ) . collect_vec ( ) ;
478
- assert_eq ! ( tokens[ 3 ] . span. get_content_string( & charslice) , "Typst" ) ;
487
+ assert_eq ! ( tokens[ 2 ] . span. get_content_string( & charslice) , "Typst" ) ;
488
+
479
489
assert ! ( matches!(
480
490
token_kinds. as_slice( ) ,
481
491
& [
482
- TokenKind :: Word ( _) ,
483
- TokenKind :: Word ( _) ,
484
- TokenKind :: Punctuation ( Punctuation :: Quote { .. } ) ,
485
- TokenKind :: Word ( _) ,
486
- TokenKind :: Punctuation ( Punctuation :: Quote { .. } ) ,
487
- TokenKind :: Word ( _) ,
488
- TokenKind :: Number ( OrderedFloat ( 2019.0 ) , None ) ,
492
+ TokenKind :: Word ( _) , // identifier
493
+ TokenKind :: Word ( _) , // key 1
494
+ TokenKind :: Word ( _) , // value 1
495
+ TokenKind :: Word ( _) , // key 2
496
+ TokenKind :: Number ( OrderedFloat ( 2019.0 ) , None ) , // value 2
497
+ ]
498
+ ) )
499
+ }
500
+
501
+ #[ test]
502
+ fn str_parsing ( ) {
503
+ let source_with_quotes = r#"#let ident = "This is a string""# ;
504
+ let source_no_quotes = r#"#let ident = This is a string"# ;
505
+
506
+ let with_quotes_token_kinds = Typst
507
+ . parse_str ( source_with_quotes)
508
+ . iter ( )
509
+ . map ( |t| t. kind )
510
+ . collect_vec ( ) ;
511
+ let no_quotes_token_kinds = Typst
512
+ . parse_str ( source_no_quotes)
513
+ . iter ( )
514
+ . map ( |t| t. kind )
515
+ . collect_vec ( ) ;
516
+
517
+ assert_eq ! ( with_quotes_token_kinds, no_quotes_token_kinds) ;
518
+ assert ! ( matches!(
519
+ & with_quotes_token_kinds. as_slice( ) ,
520
+ & [
521
+ TokenKind :: Word ( _) , // identifier
522
+ TokenKind :: Word ( _) , // This
523
+ TokenKind :: Space ( 1 ) ,
524
+ TokenKind :: Word ( _) , // is
525
+ TokenKind :: Space ( 1 ) ,
526
+ TokenKind :: Word ( _) , // a
527
+ TokenKind :: Space ( 1 ) ,
528
+ TokenKind :: Word ( _) , // string
489
529
]
490
530
) )
491
531
}
@@ -495,7 +535,7 @@ mod tests {
495
535
let source = "This is a sentence, it does not have any particularly interesting elements of the typst syntax." ;
496
536
497
537
let tokens = Typst . parse_str ( source) ;
498
- let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect :: < Vec < _ > > ( ) ;
538
+ let token_kinds = tokens. iter ( ) . map ( |t| t. kind ) . collect_vec ( ) ;
499
539
dbg ! ( & token_kinds) ;
500
540
501
541
assert ! ( matches!(
0 commit comments