From a5ee9b1edd25f698813ebdc52404ec19fa479718 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 26 Sep 2022 15:16:05 +0200 Subject: new renderer --- code/src/markdown/mod.rs | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) (limited to 'code/src/markdown/mod.rs') 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) -> String { + p.map(|p| render_ast(p)).collect::>().join("") +} + +pub fn render_ast(p: Pair) -> String { + match p.as_rule() { + Rule::block => render_pairs(p.into_inner()), + Rule::header => format!("

{}

", render_pairs(p.into_inner())), + Rule::paragraph => format!("

{}

", render_pairs(p.into_inner())), + Rule::list => format!("
    {}
", render_pairs(p.into_inner())), + Rule::list_item => format!("
  • {}
  • ", 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()), + } +} -- cgit v1.2.3-70-g09d2