aboutsummaryrefslogtreecommitdiff
path: root/code/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-09-26 16:53:23 +0200
committermetamuffin <metamuffin@disroot.org>2022-09-26 16:53:23 +0200
commitb14edcc66993a3e84bbfa0606bff04d0fe271e48 (patch)
treeac3c5f9055b0beb0244cd59dc428c758036d1303 /code/src
parent6bccd84c8b846daa6fc3214cfcdb02474dd566e2 (diff)
downloadmetamuffin-blog-b14edcc66993a3e84bbfa0606bff04d0fe271e48.tar
metamuffin-blog-b14edcc66993a3e84bbfa0606bff04d0fe271e48.tar.bz2
metamuffin-blog-b14edcc66993a3e84bbfa0606bff04d0fe271e48.tar.zst
almost a good parser
Diffstat (limited to 'code/src')
-rw-r--r--code/src/markdown/mod.rs27
1 files changed, 23 insertions, 4 deletions
diff --git a/code/src/markdown/mod.rs b/code/src/markdown/mod.rs
index b6dfb55..dee923c 100644
--- a/code/src/markdown/mod.rs
+++ b/code/src/markdown/mod.rs
@@ -4,7 +4,7 @@ use pest::{
};
use pest_derive::Parser;
-use crate::html::escape;
+use crate::{html::escape, syntax_highlight::syntax_highlight};
#[derive(Parser)]
#[grammar = "grammar/markdown.pest"]
@@ -29,11 +29,30 @@ pub fn render_ast(p: Pair<Rule>) -> String {
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::unordered_list => format!("<ul>{}</ul>", render_pairs(p.into_inner())),
+ Rule::ordered_list => format!("<ol>{}</ol>", render_pairs(p.into_inner())),
+ Rule::unordered_list_item | Rule::ordered_list_item => {
+ format!("<li>{}</li>", render_pairs(p.into_inner()))
+ }
+ Rule::style_italic => format!("<i>{}</i>", render_pairs(p.into_inner())),
+ Rule::style_bold => format!("<b>{}</b>", render_pairs(p.into_inner())),
+ Rule::style_code => format!("<code>{}</code>", p.into_inner().next().unwrap().as_str()),
Rule::span => render_pairs(p.into_inner()),
- Rule::text => escape(p.as_str()),
Rule::EOI => "".to_string(),
+ Rule::code_block => {
+ let k = p.into_inner().collect::<Vec<_>>();
+ let lang = k[0].as_str();
+ let inner = k[1].as_str();
+ format!(
+ "<pre>{}</pre>",
+ syntax_highlight(lang, &inner).unwrap_or_else(|| escape(&inner))
+ )
+ }
+ Rule::inline_latex => format!("<span>TODO: Inline latex</span>"),
+ Rule::latex_block => format!("<p>TODO: Latex block</p>"),
+
+ Rule::text => escape(p.as_str()),
+
_ => todo!("{:?}", p.as_rule()),
}
}