about summary refs log tree commit diff
path: root/corp/rih/static-markdown
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2023-05-26T14·27+0300
committertazjin <tazjin@tvl.su>2023-05-27T11·40+0000
commitd419b81ef7bd3bfc3a6911a13a303278eaa1be98 (patch)
treee10930f9e01bbff5e0bd8fa1c385644bccedbb4e /corp/rih/static-markdown
parent99c78966372017cb3b7bf021f08520a040004b0c (diff)
feat(corp/rih): add macro to render Markdown->yew::Html statically r/6209
This makes it possible to embed long texts from Markdown files instead
of dealing with writing the weird HTML-tags inside the yew macros,
which will be much easier for content editors to deal with.

Change-Id: Idc4e67404fcfe2b8d5083cf556df1c701ba17660
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8648
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Diffstat (limited to 'corp/rih/static-markdown')
-rw-r--r--corp/rih/static-markdown/Cargo.toml12
-rw-r--r--corp/rih/static-markdown/src/lib.rs27
2 files changed, 39 insertions, 0 deletions
diff --git a/corp/rih/static-markdown/Cargo.toml b/corp/rih/static-markdown/Cargo.toml
new file mode 100644
index 000000000000..c0e298d44cf2
--- /dev/null
+++ b/corp/rih/static-markdown/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+version = "1.0.0"
+name = "static_markdown"
+edition = "2018"
+
+[lib]
+proc-macro = true
+
+[dependencies]
+syn = "1.0"
+quote = "1.0"
+comrak = "0.18"
diff --git a/corp/rih/static-markdown/src/lib.rs b/corp/rih/static-markdown/src/lib.rs
new file mode 100644
index 000000000000..6a25c9292654
--- /dev/null
+++ b/corp/rih/static-markdown/src/lib.rs
@@ -0,0 +1,27 @@
+extern crate proc_macro;
+
+use comrak::{markdown_to_html, ComrakOptions};
+use proc_macro::TokenStream;
+use quote::quote;
+use syn::{parse_macro_input, LitStr};
+
+#[proc_macro]
+pub fn markdown(input: TokenStream) -> TokenStream {
+    let input = parse_macro_input!(input as LitStr);
+
+    let mut options = ComrakOptions::default();
+    options.extension.strikethrough = true;
+    options.extension.tagfilter = true;
+    options.extension.table = true;
+    options.extension.autolink = true;
+
+    let rendered_html = markdown_to_html(&input.value(), &options);
+
+    let tokens = quote! {
+        yew::virtual_dom::VNode::VRaw(yew::virtual_dom::VRaw {
+            html: #rendered_html.into(),
+        })
+    };
+
+    tokens.into()
+}