diff options
Diffstat (limited to 'code/src')
-rw-r--r-- | code/src/markdown/mod.rs | 27 |
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()), } } |