aboutsummaryrefslogtreecommitdiff
path: root/code/src/markdown.rs
diff options
context:
space:
mode:
Diffstat (limited to 'code/src/markdown.rs')
-rw-r--r--code/src/markdown.rs77
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("&", "&amp;")
+ .replace("<", "&lt;")
+ .replace(">", "&gt;")
+ .replace("'", "&#8217;")
+ .replace("\"", "&quot;")
+}
+