Skip to content

Commit

Permalink
add
Browse files Browse the repository at this point in the history
  • Loading branch information
takurinton committed Jun 23, 2024
1 parent d75c23e commit f1340b2
Showing 1 changed file with 123 additions and 0 deletions.
123 changes: 123 additions & 0 deletions markdown/src/lexer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit f1340b2

Please sign in to comment.