diff options
Diffstat (limited to 'crates/typst-syntax/src/parser.rs')
| -rw-r--r-- | crates/typst-syntax/src/parser.rs | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/crates/typst-syntax/src/parser.rs b/crates/typst-syntax/src/parser.rs index f4bb19e1..4785b8a1 100644 --- a/crates/typst-syntax/src/parser.rs +++ b/crates/typst-syntax/src/parser.rs @@ -116,13 +116,13 @@ fn markup_expr(p: &mut Parser, at_start: &mut bool) { | SyntaxKind::Escape | SyntaxKind::Shorthand | SyntaxKind::SmartQuote - | SyntaxKind::Raw | SyntaxKind::Link | SyntaxKind::Label => p.eat(), SyntaxKind::Hash => embedded_code_expr(p), SyntaxKind::Star => strong(p), SyntaxKind::Underscore => emph(p), + SyntaxKind::RawDelim => raw(p), SyntaxKind::HeadingMarker if *at_start => heading(p), SyntaxKind::ListMarker if *at_start => list_item(p), SyntaxKind::EnumMarker if *at_start => enum_item(p), @@ -172,6 +172,22 @@ fn emph(p: &mut Parser) { p.wrap(m, SyntaxKind::Emph); } +/// Parses raw text with optional syntax highlighting: `` `...` ``. +fn raw(p: &mut Parser) { + let m = p.marker(); + p.enter(LexMode::Raw); + p.assert(SyntaxKind::RawDelim); + + // Eats until the closing delimiter. + while !p.eof() && !p.at(SyntaxKind::RawDelim) { + p.eat(); + } + + p.expect(SyntaxKind::RawDelim); + p.exit(); + p.wrap(m, SyntaxKind::Raw); +} + /// Parses a section heading: `= Introduction`. fn heading(p: &mut Parser) { const END: SyntaxSet = SyntaxSet::new() @@ -747,6 +763,7 @@ fn code_primary(p: &mut Parser, atomic: bool) { SyntaxKind::LeftBrace => code_block(p), SyntaxKind::LeftBracket => content_block(p), SyntaxKind::LeftParen => expr_with_paren(p, atomic), + SyntaxKind::RawDelim => raw(p), SyntaxKind::Dollar => equation(p), SyntaxKind::Let => let_binding(p), SyntaxKind::Set => set_rule(p), @@ -768,8 +785,7 @@ fn code_primary(p: &mut Parser, atomic: bool) { | SyntaxKind::Bool | SyntaxKind::Numeric | SyntaxKind::Str - | SyntaxKind::Label - | SyntaxKind::Raw => p.eat(), + | SyntaxKind::Label => p.eat(), _ => p.expected("expression"), } |
