Scaffold a second content parser pass

This commit is contained in:
Juno Takano 2025-12-17 00:16:44 -03:00
commit d51b9a135e
19 changed files with 282 additions and 90 deletions

View file

@ -1,31 +0,0 @@
use crate::syntax::content::{Parseable, Token, Lexeme, make_lexmap};
pub fn read<DefaultToken: Parseable>(text: &str) -> String {
let escaped_text = tera::escape_html(text);
parse(&lex(&escaped_text, &make_lexmap::<DefaultToken>()))
}
fn lex(text: &str, map: super::LexMap) -> Vec<Token> {
let mut tokens: Vec<Token> = Vec::new();
for line in text.lines().filter(|x| !x.trim().is_empty()) {
let lexeme = Lexeme::new(line);
for &(ref matcher, lexer) in map {
if matcher(&lexeme) {
tokens.push(lexer(&lexeme));
break;
}
}
}
tokens
}
fn parse(tokens: &[Token]) -> String {
tokens
.iter()
.map(Token::render)
.collect::<Vec<_>>()
.join("\n")
}