summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfrozolotl <44589151+frozolotl@users.noreply.github.com>2023-03-30 21:26:43 +0200
committerGitHub <noreply@github.com>2023-03-30 21:26:43 +0200
commited36ef3312c09c2f0f1d4a6f620772fccd064e50 (patch)
treeedbb3bbf50bbd809e337fa3988ebaac2df91d0d7 /src
parent5aa2ba14906a83706849e06581e511d49f66ac49 (diff)
Add support for more characters in links (#379)
Diffstat (limited to 'src')
-rw-r--r--src/syntax/lexer.rs37
1 files changed, 28 insertions, 9 deletions
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();
}