From ed36ef3312c09c2f0f1d4a6f620772fccd064e50 Mon Sep 17 00:00:00 2001 From: frozolotl <44589151+frozolotl@users.noreply.github.com> Date: Thu, 30 Mar 2023 21:26:43 +0200 Subject: Add support for more characters in links (#379) --- src/syntax/lexer.rs | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/syntax/lexer.rs b/src/syntax/lexer.rs index a5e4a9e0..748cb076 100644 --- a/src/syntax/lexer.rs +++ b/src/syntax/lexer.rs @@ -264,16 +264,35 @@ impl Lexer<'_> { } fn link(&mut self) -> SyntaxKind { + let mut bracket_stack = Vec::new(); #[rustfmt::skip] - self.s.eat_while(|c: char| matches!(c, - | '0' ..= '9' - | 'a' ..= 'z' - | 'A' ..= 'Z' - | '~' | '/' | '%' | '?' | '#' | '&' | '+' | '=' - | '\'' | '.' | ',' | ';' - )); - - if self.s.scout(-1) == Some('.') { + self.s.eat_while(|c: char| { + match c { + | '0' ..= '9' + | 'a' ..= 'z' + | 'A' ..= 'Z' + | '!' | '#' | '$' | '%' | '&' | '*' | '+' + | ',' | '-' | '.' | '/' | ':' | ';' | '=' + | '?' | '@' | '_' | '~' | '\'' => true, + '[' => { + bracket_stack.push(SyntaxKind::LeftBracket); + true + } + '(' => { + bracket_stack.push(SyntaxKind::LeftParen); + true + } + ']' => bracket_stack.pop() == Some(SyntaxKind::LeftBracket), + ')' => bracket_stack.pop() == Some(SyntaxKind::LeftParen), + _ => false, + } + }); + if !bracket_stack.is_empty() { + return self.error_at_end("expected closing bracket in link"); + } + + // Don't include the trailing characters likely to be part of another expression. + if matches!(self.s.scout(-1), Some('!' | ',' | '.' | ':' | ';' | '?' | '\'')) { self.s.uneat(); } -- cgit v1.2.3