From a293ef433289d77007c6018a06f618c94ad41e9c Mon Sep 17 00:00:00 2001 From: Mylloon Date: Wed, 19 Apr 2023 21:16:39 +0200 Subject: [PATCH] better metadata --- src/routes/blog.rs | 17 +++++++++++++--- src/template.rs | 49 ++++++++++++++++++++++++++++++---------------- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/routes/blog.rs b/src/routes/blog.rs index 525784d..23ca589 100644 --- a/src/routes/blog.rs +++ b/src/routes/blog.rs @@ -5,7 +5,7 @@ use ramhorns::Content; use crate::{ config::Config, - template::{read_md_file, File, Infos}, + template::{get_md_asm, get_md_metadata, read_md_file, File, Infos}, }; #[get("/blog")] @@ -26,7 +26,8 @@ struct Post { #[once(time = 60)] pub fn get_index(config: Config) -> String { - let paths = glob("data/blog/*.md") + let location = "data/blog"; + let paths = glob(&format!("{location}/*.md")) .unwrap() .map(|f| { let filename = f @@ -36,9 +37,19 @@ pub fn get_index(config: Config) -> String { .to_string_lossy() .to_string(); let file_without_ext = filename.split_at(filename.len() - 3).0; + + let file_metadata = match std::fs::read_to_string(format!("{location}/{filename}")) { + Ok(text) => { + let md_tree = get_md_asm(&text); + let md_nodes = md_tree.children().unwrap(); + get_md_metadata(md_nodes).title + } + _ => None, + }; + Post { - title: file_without_ext.to_string(), url: file_without_ext.to_string(), + title: file_metadata.unwrap_or(file_without_ext.to_string()), } }) .collect::>(); diff --git a/src/template.rs b/src/template.rs index 80daf7c..d0c8503 100644 --- a/src/template.rs +++ b/src/template.rs @@ -87,8 +87,21 @@ pub fn read_md_file(filename: &str) -> Option { } } -pub fn read_md(raw_text: &str) -> File { - let parse_option = markdown::ParseOptions { +pub fn get_md_metadata(vec: &[Node]) -> FileMetadata { + if vec.is_empty() { + FileMetadata::default() + } else { + match &vec[0] { + Node::Yaml(v) => FrontMatter::Yaml(&v.value).parse(), + Node::Toml(v) => FrontMatter::Toml(&v.value).parse(), + Node::MdxjsEsm(v) => FrontMatter::Json(&v.value).parse(), + _ => FileMetadata::default(), + } + } +} + +fn get_parse_option() -> markdown::ParseOptions { + markdown::ParseOptions { constructs: markdown::Constructs { frontmatter: true, math_text: true, @@ -96,32 +109,34 @@ pub fn read_md(raw_text: &str) -> File { ..markdown::Constructs::gfm() }, ..markdown::ParseOptions::gfm() - }; + } +} - let compile_option = markdown::CompileOptions { +fn get_compile_option() -> markdown::CompileOptions { + markdown::CompileOptions { allow_dangerous_html: true, ..markdown::CompileOptions::gfm() - }; + } +} - let md_tree = markdown::to_mdast(raw_text, &parse_option).unwrap(); +pub fn get_md_asm(raw_text: &str) -> Node { + let parse_option = get_parse_option(); + + markdown::to_mdast(raw_text, &parse_option).unwrap() +} + +pub fn read_md(raw_text: &str) -> File { + let md_tree = get_md_asm(raw_text); let md_nodes = md_tree.children().unwrap(); - let metadata; + let metadata = get_md_metadata(md_nodes); let presence_mermaid; let presence_math; let presence_code; if md_nodes.is_empty() { - metadata = FileMetadata::default(); presence_mermaid = false; presence_math = false; presence_code = false; } else { - metadata = match &md_nodes[0] { - Node::Yaml(v) => FrontMatter::Yaml(&v.value).parse(), - Node::Toml(v) => FrontMatter::Toml(&v.value).parse(), - Node::MdxjsEsm(v) => FrontMatter::Json(&v.value).parse(), - _ => FileMetadata::default(), - }; - // Find if document contains maths presence_math = check_math(md_nodes); @@ -137,8 +152,8 @@ pub fn read_md(raw_text: &str) -> File { let html = markdown::to_html_with_options( raw_text, &markdown::Options { - parse: parse_option, - compile: compile_option, + parse: get_parse_option(), + compile: get_compile_option(), }, ) .unwrap();