diff options
author | metamuffin <metamuffin@disroot.org> | 2022-09-26 15:16:05 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-09-26 15:16:05 +0200 |
commit | a5ee9b1edd25f698813ebdc52404ec19fa479718 (patch) | |
tree | 7d428ca9b2b0059e39f78bc096bf57b94f1d8a3d /code/src/markdown/mod.rs | |
parent | 15d78464ba9a717a71e1dc47a4101c8b13ec6581 (diff) | |
download | metamuffin-blog-a5ee9b1edd25f698813ebdc52404ec19fa479718.tar metamuffin-blog-a5ee9b1edd25f698813ebdc52404ec19fa479718.tar.bz2 metamuffin-blog-a5ee9b1edd25f698813ebdc52404ec19fa479718.tar.zst |
new renderer
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()), + } +} |