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,9 +1,10 @@
use elements::{header::Header};
use units::{Token, Lexeme};
use token::{Token};
use parsers::{line::Line, word::Word};
use lexeme::Lexeme;
mod units;
pub mod elements;
pub mod parser;
mod token;
pub mod lexeme;
pub mod parsers;
pub trait Parseable: Into<Token> {
fn probe(lexeme: &Lexeme) -> bool;
@ -13,14 +14,10 @@ pub trait Parseable: Into<Token> {
type Probe = fn(&Lexeme) -> bool;
type Lexer = fn(&Lexeme) -> Token;
type LexEntry = (Probe, Lexer);
type LexMap<'lm> = &'lm [LexEntry];
type LexMap<'lm> = &'lm [(Probe, Lexer)];
const LEXMAP: LexMap =
&[(Header::probe, |lexeme| Token::Header(Header::lex(lexeme)))];
fn make_lexmap<DefaultToken: Parseable>() -> Vec<LexEntry> {
let mut vector: Vec<(Probe, Lexer)> = LEXMAP.to_vec();
fn make_lexmap<DefaultToken: Parseable>(base: LexMap) -> Vec<(Probe, Lexer)> {
let mut vector: Vec<(Probe, Lexer)> = base.to_vec();
fn adapter<D: Parseable>(lex: &Lexeme) -> Token {
D::lex(lex).into()
@ -29,3 +26,12 @@ fn make_lexmap<DefaultToken: Parseable>() -> Vec<LexEntry> {
vector.push((DefaultToken::probe, adapter::<DefaultToken>));
vector
}
pub fn parse<DefaultLineToken: Parseable, DefaultWordToken: Parseable>(
text: &str,
) -> String {
let escaped_text = tera::escape_html(text);
parsers::line::parser::read::<DefaultLineToken>(
&parsers::word::parser::read::<DefaultWordToken>(&escaped_text),
)
}