From a49f7dc2dc42b9d390322364b03fa9603d465345 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Sun, 16 Jun 2024 15:58:21 +0200 Subject: [PATCH] Respect toc attribute in metadata --- src/misc/markdown.rs | 25 ++++++++++----------- src/misc/utils.rs | 1 + src/routes/blog.rs | 47 ++++++++++++---------------------------- templates/blog/post.html | 4 +++- 4 files changed, 30 insertions(+), 47 deletions(-) diff --git a/src/misc/markdown.rs b/src/misc/markdown.rs index 599ee58..5799c3b 100644 --- a/src/misc/markdown.rs +++ b/src/misc/markdown.rs @@ -21,7 +21,7 @@ pub struct FileMetadataBlog { pub description: Option, pub publish: Option, pub tags: Option>, - pub toc: Option, + pub toc: Option, } /// A tag, related to post blog @@ -119,6 +119,7 @@ impl Metadata { pub struct File { pub metadata: Metadata, pub content: String, + pub toc_data: String, } /// Options used for parser and compiler MD --> HTML @@ -309,6 +310,8 @@ pub fn read_md( html_content = custom_img_size(&html_content); (html_content, mail_obfsucated) = mail_obfuscation(&html_content); + let toc = toc_to_html(&generate_toc(root)); + let mut final_metadata = Metadata { info: metadata, mermaid: check_mermaid(root, mermaid_name), @@ -321,6 +324,7 @@ pub fn read_md( File { metadata: final_metadata, content: html_content, + toc_data: toc, } } @@ -335,15 +339,10 @@ pub fn get_metadata<'a>(root: &'a AstNode<'a>, mtype: &TypeFileMetadata) -> File .find_map(|node| match &node.data.borrow().value { // Extract metadata from frontmatter NodeValue::FrontMatter(text) => Some(match mtype { - TypeFileMetadata::Blog => { - let mut metadata: FileMetadataBlog = deserialize_metadata(text); - metadata.toc = toc_to_html(&generate_toc(root)); - - FileMetadata { - blog: Some(metadata), - ..FileMetadata::default() - } - } + TypeFileMetadata::Blog => FileMetadata { + blog: Some(deserialize_metadata(text)), + ..FileMetadata::default() + }, TypeFileMetadata::Contact => { let mut metadata: FileMetadataContact = deserialize_metadata(text); @@ -570,9 +569,9 @@ fn generate_toc<'a>(root: &'a AstNode<'a>) -> Vec { toc } -fn toc_to_html(toc: &[TOCEntry]) -> Option { +fn toc_to_html(toc: &[TOCEntry]) -> String { if toc.is_empty() { - return None; + return String::new(); } let mut html = Vec::with_capacity(20 + 20 * toc.len()); @@ -592,5 +591,5 @@ fn toc_to_html(toc: &[TOCEntry]) -> Option { html.extend_from_slice(b""); - Some(String::from_utf8(html).unwrap()) + String::from_utf8(html).unwrap() } diff --git a/src/misc/utils.rs b/src/misc/utils.rs index 96699d3..0607fda 100644 --- a/src/misc/utils.rs +++ b/src/misc/utils.rs @@ -81,5 +81,6 @@ fn read_pdf(data: Vec) -> File { style="width: 100%; height: 79vh"; >"# ), + toc_data: String::new(), } } diff --git a/src/routes/blog.rs b/src/routes/blog.rs index a97a2c7..9523f70 100644 --- a/src/routes/blog.rs +++ b/src/routes/blog.rs @@ -186,7 +186,6 @@ fn get_posts(location: &str) -> Vec { struct BlogPostTemplate { navbar: NavBar, post: Option, - toc: String, } #[get("/blog/p/{id}")] @@ -199,7 +198,7 @@ pub async fn page(path: web::Path<(String,)>, config: web::Data) -> impl fn build_post(file: &str, config: Config) -> String { let mut post = None; - let (infos, toc) = get_post( + let infos = get_post( &mut post, file, &config.fc.name.unwrap_or_default(), @@ -214,18 +213,12 @@ fn build_post(file: &str, config: Config) -> String { ..NavBar::default() }, post, - toc, }, infos, ) } -fn get_post( - post: &mut Option, - filename: &str, - name: &str, - data_dir: &str, -) -> (InfosPage, String) { +fn get_post(post: &mut Option, filename: &str, name: &str, data_dir: &str) -> InfosPage { let blog_dir = format!("{data_dir}/{BLOG_DIR}/{POST_DIR}"); let ext = ".md"; @@ -234,13 +227,8 @@ fn get_post( &TypeFileMetadata::Blog, ); - let default = ( - filename, - &format!("Blog d'{name}"), - Vec::new(), - String::new(), - ); - let (title, desc, tags, toc) = match post { + let default = (filename, &format!("Blog d'{name}"), Vec::new()); + let (title, desc, tags) = match post { Some(data) => ( match &data.metadata.info.blog.as_ref().unwrap().title { Some(text) => text, @@ -254,27 +242,20 @@ fn get_post( Some(tags) => tags.clone(), None => default.2, }, - match &data.metadata.info.blog.as_ref().unwrap().toc { - Some(toc) => toc.into(), - _ => default.3, - }, ), None => default, }; - ( - InfosPage { - title: Some(format!("Post: {title}")), - desc: Some(desc.clone()), - kw: Some(make_kw( - &["blog", "blogging", "write", "writing"] - .into_iter() - .chain(tags.iter().map(|t| t.name.as_str())) - .collect::>(), - )), - }, - toc, - ) + InfosPage { + title: Some(format!("Post: {title}")), + desc: Some(desc.clone()), + kw: Some(make_kw( + &["blog", "blogging", "write", "writing"] + .into_iter() + .chain(tags.iter().map(|t| t.name.as_str())) + .collect::>(), + )), + } } #[routes] diff --git a/templates/blog/post.html b/templates/blog/post.html index bf48205..9264c8b 100644 --- a/templates/blog/post.html +++ b/templates/blog/post.html @@ -28,7 +28,9 @@
{{^post}}

This post doesn't exist... sorry

- {{/post}} {{#post}} {{&toc}} + {{/post}} {{#post}} {{#metadata}} {{#info}} {{#blog}} {{#toc}} + + {{/toc}} {{/blog}} {{/info}} {{/metadata}}
{{&content}}
{{/post}}