From 67feca4fc2ee5a4a173de7862c905580428ecb60 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Tue, 2 May 2023 16:02:50 +0200 Subject: [PATCH] tags in post --- src/misc/markdown.rs | 24 ++++++++++++++++++++++-- src/routes/blog.rs | 37 +++++++++++++++++++++---------------- static/css/blog/post.css | 2 +- templates/blog/post.html | 10 +++++++--- 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/misc/markdown.rs b/src/misc/markdown.rs index 5ca6d3d..bbcbcb6 100644 --- a/src/misc/markdown.rs +++ b/src/misc/markdown.rs @@ -5,7 +5,7 @@ use comrak::{ ComrakRenderOptions, ListStyleType, }; use ramhorns::Content; -use serde::Deserialize; +use serde::{Deserialize, Deserializer}; use std::fs; #[derive(Default, Deserialize, Content, Debug)] @@ -15,7 +15,27 @@ pub struct FileMetadata { pub date: Option, pub description: Option, pub publish: Option, - pub tags: Option>, + pub tags: Option>, +} + +#[derive(Content, Debug, Clone)] +pub struct Tag { + pub name: String, +} + +impl<'de> Deserialize<'de> for Tag { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + match <&str>::deserialize(deserializer) { + Ok(s) => match serde_yaml::from_str(s) { + Ok(tags) => Ok(Self { name: tags }), + Err(e) => Err(serde::de::Error::custom(e)), + }, + Err(e) => Err(e), + } + } } #[derive(Content, Debug)] diff --git a/src/routes/blog.rs b/src/routes/blog.rs index f3ca070..1d0cad0 100644 --- a/src/routes/blog.rs +++ b/src/routes/blog.rs @@ -66,6 +66,11 @@ pub fn build_index(config: Config, url: String) -> String { ) } +#[derive(Content, Debug)] +pub struct Tag { + pub name: String, +} + #[derive(Content, Debug)] struct Post { title: String, @@ -73,7 +78,7 @@ struct Post { url: String, desc: Option, content: Option, - tags: Option>, + tags: Vec, } impl Post { @@ -129,9 +134,6 @@ fn get_posts(location: &str) -> Vec { None => Some(file_without_ext.into()), }; - // No tags if the vec is empty - metadata.tags = metadata.tags.filter(|tags| !tags.is_empty()); - metadata } Err(_) => FileMetadata { @@ -159,7 +161,12 @@ fn get_posts(location: &str) -> Vec { }), desc: file_metadata.description, content: None, - tags: file_metadata.tags, + tags: file_metadata + .tags + .unwrap_or_default() + .iter() + .map(|t| t.name.to_owned()) + .collect(), }) } else { None @@ -223,7 +230,7 @@ fn get_post(post: &mut Option, filename: String, name: String, url: String vec!["blog", "blogging", "write", "writing"] .iter() .map(|&tag| tag.to_owned()) - .chain(tags.into_iter()) + .chain(tags.into_iter().map(|t| t.name)) .collect::>() .join(", "), ), @@ -297,16 +304,14 @@ fn build_rss(config: Config, info: ConnectionInfo) -> String { title: Some(p.title.to_owned()), link: Some(format!("{}/blog/p/{}", link_to_site, p.url)), description: p.content.to_owned(), - categories: match &p.tags { - Some(tags) => tags - .iter() - .map(|c| Category { - name: c.into(), - ..Category::default() - }) - .collect(), - None => vec![], - }, + categories: p + .tags + .iter() + .map(|c| Category { + name: c.to_owned(), + ..Category::default() + }) + .collect(), guid: Some(Guid { value: format!("urn:hash:{}", { let mut hasher = DefaultHasher::new(); diff --git a/static/css/blog/post.css b/static/css/blog/post.css index d64a8c1..9b687de 100644 --- a/static/css/blog/post.css +++ b/static/css/blog/post.css @@ -63,7 +63,7 @@ header > h1 { } /* Date's title */ -header > p { +header > span { font-style: italic; } diff --git a/templates/blog/post.html b/templates/blog/post.html index fcde92b..ba653ee 100644 --- a/templates/blog/post.html +++ b/templates/blog/post.html @@ -11,9 +11,13 @@
{{#info}}

{{title}}

- {{#date}} -

{{>blog/date.html}}

- {{/date}} {{/info}} {{/metadata}} {{/post}} + {{#date}} {{>blog/date.html}} {{/date}} +
    + {{#tags}} +
  • {{name}}
  • + {{/tags}} +
+ {{/info}} {{/metadata}} {{/post}}
{{^post}}