From 9270ec9e1c0f15f8a273872840202c55a1ea3c0a Mon Sep 17 00:00:00 2001 From: Bruno Rocha Date: Wed, 13 Nov 2024 19:27:01 +0000 Subject: [PATCH] authors page --- example/content/markdown-format.md | 2 +- example/templates/content_authors.html | 12 +++++++++++- src/content.rs | 7 ++++--- src/markdown.rs | 8 ++++++++ src/site.rs | 16 ++++++++++++++++ src/tera_functions.rs | 1 + 6 files changed, 41 insertions(+), 5 deletions(-) diff --git a/example/content/markdown-format.md b/example/content/markdown-format.md index 83e22e6..038f1d3 100644 --- a/example/content/markdown-format.md +++ b/example/content/markdown-format.md @@ -4,7 +4,7 @@ date: 2024-10-17 12:00:01 slug: markdown-format description: The content here accepts any valid CommonMark or Github Flavoured markdown and some GFM extensions. tags: docs, markdown, Common Mark, GFM -authors: rochacbruno,karlamagueta +authors: rochacbruno,karlamagueta,john extra: math: true mermaid: true diff --git a/example/templates/content_authors.html b/example/templates/content_authors.html index 803e014..5e1de92 100644 --- a/example/templates/content_authors.html +++ b/example/templates/content_authors.html @@ -2,6 +2,7 @@
-{% endif %} \ No newline at end of file +{% endif %} diff --git a/src/content.rs b/src/content.rs index a98b55f..01503c8 100644 --- a/src/content.rs +++ b/src/content.rs @@ -13,6 +13,7 @@ use unicode_normalization::UnicodeNormalization; pub enum Kind { Tag, Archive, + Author, } #[allow(clippy::module_name_repetitions)] @@ -45,11 +46,11 @@ impl GroupedContent { } vec.sort_by(|a, b| b.1.len().cmp(&a.1.len())); } - Kind::Archive => { - for (year, contents) in &self.map { + Kind::Archive | Kind::Author => { + for (text, contents) in &self.map { let mut contents = contents.clone(); contents.sort_by(|a, b| b.date.cmp(&a.date)); - vec.push((year, contents)); + vec.push((text, contents)); } vec.sort_by(|a, b| b.0.cmp(a.0)); } diff --git a/src/markdown.rs b/src/markdown.rs index 7bb4f28..52872ed 100644 --- a/src/markdown.rs +++ b/src/markdown.rs @@ -22,6 +22,14 @@ pub fn process_file(path: &Path, site_data: &mut Data) -> Result<(), String> { for tag in content.tags.clone() { site_data.tag.entry(tag).or_default().push(content.clone()); } + // authors + for username in content.authors.clone() { + site_data + .author + .entry(username) + .or_default() + .push(content.clone()); + } // archive by year let year = date.year().to_string(); site_data diff --git a/src/site.rs b/src/site.rs index 32397f3..2d13653 100644 --- a/src/site.rs +++ b/src/site.rs @@ -21,6 +21,7 @@ pub struct Data { pub pages: Vec, pub tag: GroupedContent, pub archive: GroupedContent, + pub author: GroupedContent, } impl Data { @@ -39,6 +40,7 @@ impl Data { pages: Vec::new(), tag: GroupedContent::new(Kind::Tag), archive: GroupedContent::new(Kind::Archive), + author: GroupedContent::new(Kind::Author), } } @@ -361,6 +363,20 @@ fn handle_author_pages( format!("author-{}", &author_slug).as_ref(), )?; } + + // Render authors.html group page + let mut authors_list_context = global_context.clone(); + authors_list_context.insert("title", &site_data.site.tags_title); + authors_list_context.insert("current_page", "authors.html"); + authors_list_context.insert("kind", "author"); + render_html( + "group.html", + "authors.html", + tera, + &authors_list_context, + output_dir, + )?; + Ok(()) } diff --git a/src/tera_functions.rs b/src/tera_functions.rs index f27ca72..dff35f4 100644 --- a/src/tera_functions.rs +++ b/src/tera_functions.rs @@ -85,6 +85,7 @@ impl Function for Group { let grouped_content = match kind { "tag" => &self.site_data.tag, "archive" => &self.site_data.archive, + "author" => &self.site_data.author, _ => return Err(tera::Error::msg("Invalid `kind` argument")), };