From f1340b265e0a60786c03cbebc3fa0bcb22295c3b Mon Sep 17 00:00:00 2001 From: takurinton Date: Sun, 23 Jun 2024 21:13:43 +0900 Subject: [PATCH] add --- markdown/src/lexer.rs | 123 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/markdown/src/lexer.rs b/markdown/src/lexer.rs index a15da1d..b36e2d0 100644 --- a/markdown/src/lexer.rs +++ b/markdown/src/lexer.rs @@ -53,6 +53,15 @@ impl<'a> Lexer<'a> { } Some('[') => Some(self.read_link()), Some('-') if self.peek_char() == Some(' ') => Some(self.read_list()), + Some('`') => Some(self.read_code_block_or_inline_code()), + Some('>') => Some(self.read_quote()), + Some('!') => { + if self.peek_char() == Some('[') { + Some(self.read_image()) + } else { + Some(self.read_text()) + } + } Some(_) => Some(self.read_text()), None => None, } @@ -164,6 +173,120 @@ impl<'a> Lexer<'a> { } } + fn read_code_block_or_inline_code(&mut self) -> Token { + if self.peek_char() == Some('`') { + self.read_code_block() + } else { + self.read_inline_code() + } + } + + fn read_code_block(&mut self) -> Token { + // ``` + self.read_char(); + self.read_char(); + self.read_char(); + + let start = self.position; + while let Some(ch) = self.ch { + if ch == '\n' { + break; + } + self.read_char(); + } + + let language = self.input[start..self.position].to_string(); + + // \n + self.read_char(); + + let start = self.position; + while let Some(ch) = self.ch { + if ch == '`' && self.peek_char() == Some('`') && self.peek_char() == Some('`') { + break; + } + self.read_char(); + } + + let content = self.input[start..self.position].to_string(); + + self.read_char(); + self.read_char(); + self.read_char(); + + Token::CodeBlock { + language: language, + content: content, + } + } + + fn read_inline_code(&mut self) -> Token { + // ` + self.read_char(); + + let start = self.position; + while let Some(ch) = self.ch { + if ch == '`' { + break; + } + self.read_char(); + } + + let content = self.input[start..self.position].to_string(); + + // ` + self.read_char(); + + Token::InlineCode(content) + } + + fn read_quote(&mut self) -> Token { + self.read_char(); + self.read_char(); + let start = self.position; + while let Some(ch) = self.ch { + if ch == '\n' { + break; + } + self.read_char(); + } + Token::BlockQuote(self.input[start..self.position].to_string()) + } + + fn read_image(&mut self) -> Token { + self.read_char(); + self.read_char(); + + let start = self.position; + while let Some(ch) = self.ch { + if ch == ']' { + break; + } + self.read_char(); + } + + let alt = self.input[start..self.position].to_string(); + + // Skip the closing ']' and opening '(' + self.read_char(); + self.read_char(); + + let link_start = self.position; + while let Some(ch) = self.ch { + if ch == ')' { + break; + } + self.read_char(); + } + + let src = self.input[link_start..self.position].to_string(); + + // Skip the closing ')' + self.read_char(); + + Token::Image { src, alt } + } + fn read_text(&mut self) -> Token { let start = self.position; while let Some(ch) = self.ch {