aboutsummaryrefslogtreecommitdiff
path: root/code/src/markdown/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'code/src/markdown/mod.rs')
-rw-r--r--code/src/markdown/mod.rs41
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()),
+ }
+}