use markdown::{Block, ListItem, Span}; use crate::syntax_highlight::syntax_highlight; pub fn span_to_html(ss: Vec) -> String { let mut out = String::new(); for s in ss { out += match s { Span::Break => format!("
"), Span::Text(t) => escape(&t), Span::Code(c) => format!("{}", escape(&c)), Span::Link(text, url, _) => { format!("{}", escape(&url), escape(&text)) } Span::Image(_, _, _) => todo!(), Span::Emphasis(c) => format!("{}", span_to_html(c)), Span::Strong(c) => format!("{}", span_to_html(c)), } .as_str() } out } pub fn blocks_to_html(blocks: Vec) -> String { let mut out = String::new(); for e in blocks { out += match e { Block::Header(text, level) => { format!("{}", span_to_html(text)) } Block::Paragraph(p) => format!("

{}

", span_to_html(p)), Block::Blockquote(q) => format!("{}", blocks_to_html(q)), Block::CodeBlock(syntax, content) => { if let Some(s) = &syntax { format!("
{}
", syntax_highlight(s, &content)) } else { format!("
{}
", escape(&content)) } } Block::OrderedList(els, _) => format!( "
    {}
", els.into_iter() .map(|e| format!( "
  • {}
  • ", match e { ListItem::Simple(s) => span_to_html(s), ListItem::Paragraph(b) => blocks_to_html(b), } )) .collect::>() .join("") ), Block::UnorderedList(els) => { format!( "
      {}
    ", els.into_iter() .map(|e| format!( "
  • {}
  • ", match e { ListItem::Simple(s) => span_to_html(s), ListItem::Paragraph(b) => blocks_to_html(b), } )) .collect::>() .join("") ) } Block::Raw(r) => r, Block::Hr => format!("
    "), } .as_str(); } out } pub fn escape(text: &str) -> String { text.replace("&", "&") .replace("<", "<") .replace(">", ">") .replace("'", "’") .replace("\"", """) }