use super::{ pagination::{PaginatableTemplate, PaginationInfo}, posts::{parse::Tag, HtmlContent, Post}, util::templates::filters, util::templates::TemplateCommon, }; use crate::generator::pagination::render_paginated; use askama::Template; use std::collections::HashMap; pub fn generate(posts: &[Post]) -> HashMap<&Tag, Vec<&Post>> { let mut tags: HashMap<&Tag, Vec<&Post>> = HashMap::new(); for p in posts.iter() { if let Some(ref ts) = p.metadata.tags { for t in ts.iter() { if tags.contains_key(t) { let res = tags.get_mut(t).unwrap(); res.push(&p); } else { tags.insert(t, vec![&p]); } } } } // for (k, v) in tags.iter() { // print!("{}: [", k.slug); // let mut first = true; // for p in v.iter() { // if !first { // print!(", "); // } else { // first = false; // } // print!("'{}'", p.metadata.title); // } // println!("]"); // } for (&tag, posts) in &tags { render_paginated( &TagTemplate { tag, posts: &[], pagination_info: Default::default(), }, posts, &tag.slug, ) .unwrap(); } return tags; } #[derive(Template)] #[template(path = "tag.html")] struct TagTemplate<'a> { tag: &'a Tag, posts: &'a [&'a Post], pagination_info: PaginationInfo, } impl<'a> TemplateCommon for TagTemplate<'a> {} impl<'a> TagTemplate<'a> { fn permalink(&self) -> String { format!("/{}/", self.tag.slug) } } impl<'a> PaginatableTemplate<'a> for TagTemplate<'a> { fn with_posts( &'a self, posts: &'a [&'a Post], pagination_info: PaginationInfo, ) -> Self { Self { posts, pagination_info, ..*self } } }