Skip to content

Commit 7cd135f

Browse files
committed
feat(#230): remove quotes from Str parsing
1 parent 550cf20 commit 7cd135f

File tree

2 files changed

+58
-18
lines changed

2 files changed

+58
-18
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

harper-core/src/parsers/typst.rs

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,18 @@ fn map_token(
211211
}
212212
Expr::Numeric(a) => constant_token!(doc, a, TokenKind::Unlintable),
213213
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+
)
217226
}
218227
Expr::Code(a) => constant_token!(doc, a, TokenKind::Unlintable),
219228
Expr::Content(content_block) => {
@@ -378,7 +387,7 @@ mod tests {
378387
let source = "doesn't";
379388

380389
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();
382391
dbg!(&token_kinds);
383392

384393
assert_eq!(token_kinds.len(), 1);
@@ -390,7 +399,7 @@ mod tests {
390399
let source = "person's";
391400

392401
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();
394403
dbg!(&token_kinds);
395404

396405
assert_eq!(token_kinds.len(), 1);
@@ -413,7 +422,7 @@ mod tests {
413422
let source = "12 is larger than 11, but much less than 11!";
414423

415424
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();
417426
dbg!(&token_kinds);
418427

419428
assert!(matches!(
@@ -449,7 +458,7 @@ mod tests {
449458
let source = "$12 > 11$, $12 << 11!$";
450459

451460
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();
453462
dbg!(&token_kinds);
454463

455464
assert!(matches!(
@@ -471,21 +480,52 @@ mod tests {
471480
)"#;
472481

473482
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();
475484
dbg!(&token_kinds);
476485

477486
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+
479489
assert!(matches!(
480490
token_kinds.as_slice(),
481491
&[
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
489529
]
490530
))
491531
}
@@ -495,7 +535,7 @@ mod tests {
495535
let source = "This is a sentence, it does not have any particularly interesting elements of the typst syntax.";
496536

497537
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();
499539
dbg!(&token_kinds);
500540

501541
assert!(matches!(

0 commit comments

Comments
 (0)