aboutsummaryrefslogtreecommitdiff
path: root/code/src/markdown
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-09-25 16:03:27 +0200
committermetamuffin <metamuffin@disroot.org>2022-09-25 16:03:27 +0200
commit136acb9049ff56b130a6071e403ffbc8b39f19b6 (patch)
treeffe5a98948779dcaba4f40dae312027e69c9f6af /code/src/markdown
parent2403a9a3599c4b77d33fb6de5f438e53e19412ff (diff)
downloadmetamuffin-blog-136acb9049ff56b130a6071e403ffbc8b39f19b6.tar
metamuffin-blog-136acb9049ff56b130a6071e403ffbc8b39f19b6.tar.bz2
metamuffin-blog-136acb9049ff56b130a6071e403ffbc8b39f19b6.tar.zst
move files
Diffstat (limited to 'code/src/markdown')
-rw-r--r--code/src/markdown/mod.rs2
-rw-r--r--code/src/markdown/parser.rs0
-rw-r--r--code/src/markdown/render.rs81
3 files changed, 83 insertions, 0 deletions
diff --git a/code/src/markdown/mod.rs b/code/src/markdown/mod.rs
new file mode 100644
index 0000000..7bdf323
--- /dev/null
+++ b/code/src/markdown/mod.rs
@@ -0,0 +1,2 @@
+pub mod parser;
+pub mod render;
diff --git a/code/src/markdown/parser.rs b/code/src/markdown/parser.rs
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/code/src/markdown/parser.rs
diff --git a/code/src/markdown/render.rs b/code/src/markdown/render.rs
new file mode 100644
index 0000000..22934c5
--- /dev/null
+++ b/code/src/markdown/render.rs
@@ -0,0 +1,81 @@
+use markdown::{Block, ListItem, Span};
+
+use crate::syntax_highlight::syntax_highlight;
+
+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) => {
+ if let Some(s) = &syntax {
+ format!("<pre>{}</pre>", syntax_highlight(s, &content))
+ } else {
+ format!("<pre>{}</pre>", escape(&content))
+ }
+ }
+ 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;")
+}