diff options
Diffstat (limited to 'code/src/markdown/mod.rs')
-rw-r--r-- | code/src/markdown/mod.rs | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/code/src/markdown/mod.rs b/code/src/markdown/mod.rs index 7bdf323..b6dfb55 100644 --- a/code/src/markdown/mod.rs +++ b/code/src/markdown/mod.rs @@ -1,2 +1,39 @@ -pub mod parser; -pub mod render; +use pest::{ + iterators::{Pair, Pairs}, + Parser, +}; +use pest_derive::Parser; + +use crate::html::escape; + +#[derive(Parser)] +#[grammar = "grammar/markdown.pest"] +struct Grammar; + +pub fn render(s: &str) -> String { + match Grammar::parse(Rule::file, s) { + Ok(pairs) => { + eprintln!("{pairs:#?}"); + render_pairs(pairs) + } + Err(e) => panic!("{e}"), + } +} + +pub fn render_pairs(p: Pairs<Rule>) -> String { + p.map(|p| render_ast(p)).collect::<Vec<_>>().join("") +} + +pub fn render_ast(p: Pair<Rule>) -> String { + match p.as_rule() { + Rule::block => render_pairs(p.into_inner()), + Rule::header => format!("<h1>{}</h1>", render_pairs(p.into_inner())), + Rule::paragraph => format!("<p>{}</p>", render_pairs(p.into_inner())), + Rule::list => format!("<ul>{}</ul>", render_pairs(p.into_inner())), + Rule::list_item => format!("<li>{}</li>", render_pairs(p.into_inner())), + Rule::span => render_pairs(p.into_inner()), + Rule::text => escape(p.as_str()), + Rule::EOI => "".to_string(), + _ => todo!("{:?}", p.as_rule()), + } +} |