diff options
author | metamuffin <metamuffin@disroot.org> | 2022-08-29 22:53:37 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-08-29 22:53:37 +0200 |
commit | 3eb1adfeb8dd477479404a1269c8682e3b4edf12 (patch) | |
tree | 1a4788149dc4b958dee129c28b95553cc3927f16 /code/src/markdown.rs | |
parent | a4dd9c4944340505962f07853d53ab02f3a02336 (diff) | |
download | metamuffin-blog-3eb1adfeb8dd477479404a1269c8682e3b4edf12.tar metamuffin-blog-3eb1adfeb8dd477479404a1269c8682e3b4edf12.tar.bz2 metamuffin-blog-3eb1adfeb8dd477479404a1269c8682e3b4edf12.tar.zst |
split files
Diffstat (limited to 'code/src/markdown.rs')
-rw-r--r-- | code/src/markdown.rs | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/code/src/markdown.rs b/code/src/markdown.rs new file mode 100644 index 0000000..c194a07 --- /dev/null +++ b/code/src/markdown.rs @@ -0,0 +1,77 @@ +use markdown::{Block, ListItem, Span}; + + +pub fn span_to_html(ss: Vec<Span>) -> String { + let mut out = String::new(); + for s in ss { + out += match s { + Span::Break => format!("<br/>"), + Span::Text(t) => escape(&t), + Span::Code(c) => format!("<code>{}</code>", escape(&c)), + Span::Link(text, url, _) => { + format!("<a href=\"{}\">{}</a>", escape(&url), escape(&text)) + } + Span::Image(_, _, _) => todo!(), + Span::Emphasis(c) => format!("<i>{}</i>", span_to_html(c)), + Span::Strong(c) => format!("<b>{}</b>", span_to_html(c)), + } + .as_str() + } + out +} +pub fn blocks_to_html(blocks: Vec<Block>) -> String { + let mut out = String::new(); + for e in blocks { + out += match e { + Block::Header(text, level) => { + format!("<h{level}>{}</h{level}>", span_to_html(text)) + } + Block::Paragraph(p) => format!("<p>{}</p>", span_to_html(p)), + Block::Blockquote(q) => format!("<quote>{}</quote>", blocks_to_html(q)), + Block::CodeBlock(_syntax, content) => { + format!("<code><pre>{}</pre></code>", escape(&content)) // TODO syntax highlighting + } + Block::OrderedList(els, _) => format!( + "<ol>{}</ol>", + els.into_iter() + .map(|e| format!( + "<li>{}</li>", + match e { + ListItem::Simple(s) => span_to_html(s), + ListItem::Paragraph(b) => blocks_to_html(b), + } + )) + .collect::<Vec<_>>() + .join("") + ), + Block::UnorderedList(els) => { + format!( + "<ul>{}</ul>", + els.into_iter() + .map(|e| format!( + "<li>{}</li>", + match e { + ListItem::Simple(s) => span_to_html(s), + ListItem::Paragraph(b) => blocks_to_html(b), + } + )) + .collect::<Vec<_>>() + .join("") + ) + } + Block::Raw(r) => r, + Block::Hr => format!("<hr/>"), + } + .as_str(); + } + out +} + +pub fn escape(text: &str) -> String { + text.replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("'", "’") + .replace("\"", """) +} + |