Scaffold a second content parser pass
This commit is contained in:
parent
3b515324a2
commit
d51b9a135e
19 changed files with 282 additions and 90 deletions
|
|
@ -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),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue