From 5316b954323a4d7bee492a3997bae35dd107e44a Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 26 Sep 2022 17:08:20 +0200 Subject: hyperlinks --- code/src/markdown/mod.rs | 50 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) (limited to 'code/src/markdown/mod.rs') diff --git a/code/src/markdown/mod.rs b/code/src/markdown/mod.rs index dee923c..7ee18a2 100644 --- a/code/src/markdown/mod.rs +++ b/code/src/markdown/mod.rs @@ -7,7 +7,7 @@ use pest_derive::Parser; use crate::{html::escape, syntax_highlight::syntax_highlight}; #[derive(Parser)] -#[grammar = "grammar/markdown.pest"] +#[grammar = "src/markdown/parser.pest"] struct Grammar; pub fn render(s: &str) -> String { @@ -27,16 +27,28 @@ pub fn render_pairs(p: Pairs) -> String { 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::header => { + let mut level = 0; + while p.as_str()[level..].starts_with("#") { + level += 1 + } + format!("{}", render_pairs(p.into_inner())) + } Rule::paragraph => format!("

{}

", render_pairs(p.into_inner())), + Rule::style_italic => format!("{}", render_pairs(p.into_inner())), + Rule::style_bold => format!("{}", render_pairs(p.into_inner())), + Rule::style_code => format!("{}", p.into_inner().next().unwrap().as_str()), Rule::unordered_list => format!("
    {}
", render_pairs(p.into_inner())), Rule::ordered_list => format!("
    {}
", render_pairs(p.into_inner())), Rule::unordered_list_item | Rule::ordered_list_item => { format!("
  • {}
  • ", render_pairs(p.into_inner())) } - Rule::style_italic => format!("{}", render_pairs(p.into_inner())), - Rule::style_bold => format!("{}", render_pairs(p.into_inner())), - Rule::style_code => format!("{}", p.into_inner().next().unwrap().as_str()), + Rule::hyperlink => { + let k = p.into_inner().collect::>(); + let label = k[0].as_str(); + let target = k[1].as_str(); + format!("{}", escape(target), escape(label)) + } Rule::span => render_pairs(p.into_inner()), Rule::EOI => "".to_string(), Rule::code_block => { @@ -48,11 +60,35 @@ pub fn render_ast(p: Pair) -> String { syntax_highlight(lang, &inner).unwrap_or_else(|| escape(&inner)) ) } - Rule::inline_latex => format!("TODO: Inline latex"), - Rule::latex_block => format!("

    TODO: Latex block

    "), + Rule::inline_latex => fix_katex( + &katex::render_with_opts( + &p.into_inner().as_str(), + &katex::OptsBuilder::default().build().unwrap(), + ) + .unwrap(), + ), + Rule::latex_block => fix_katex( + &katex::render_with_opts( + &p.into_inner().as_str(), + &katex::OptsBuilder::default() + .display_mode(true) + .build() + .unwrap(), + ) + .unwrap(), + ), Rule::text => escape(p.as_str()), _ => todo!("{:?}", p.as_rule()), } } + +// TODO this is *really* bad fix +fn fix_katex<'a>(s: &str) -> String { + let e = s.find("", + "", + ) +} -- cgit v1.2.3-70-g09d2