v6/src/generator/tags.rs

84 lines
2.1 KiB
Rust

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<HtmlContent>]) -> HashMap<&Tag, Vec<&Post<HtmlContent>>> {
let mut tags: HashMap<&Tag, Vec<&Post<HtmlContent>>> = 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<HtmlContent>],
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<HtmlContent>],
pagination_info: PaginationInfo,
) -> Self {
Self {
posts,
pagination_info,
..*self
}
}
}