order by date
Some checks are pending
ci/woodpecker/push/publish Pipeline is pending

This commit is contained in:
Mylloon 2023-04-20 15:08:09 +02:00
parent 0fd74dd449
commit d9c9ff0828
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 25 additions and 19 deletions

View file

@ -1,5 +1,6 @@
use actix_web::{get, web, HttpResponse, Responder}; use actix_web::{get, web, HttpResponse, Responder};
use cached::proc_macro::once; use cached::proc_macro::once;
use chrono::{DateTime, Datelike, Utc};
use ramhorns::Content; use ramhorns::Content;
use crate::{ use crate::{
@ -28,22 +29,13 @@ struct Post {
pub fn get_index(config: Config) -> String { pub fn get_index(config: Config) -> String {
let location = "data/blog"; let location = "data/blog";
let mut entries = std::fs::read_dir(location) let entries = std::fs::read_dir(location)
.unwrap() .unwrap()
.flatten() .flatten()
.filter(|f| f.path().extension().unwrap() == "md") .filter(|f| f.path().extension().unwrap() == "md")
.collect::<Vec<std::fs::DirEntry>>(); .collect::<Vec<std::fs::DirEntry>>();
// Sort by latest modification/ date of creation let mut posts = entries
entries.sort_by_cached_key(|f| {
f.metadata()
.unwrap()
.modified()
.unwrap_or(f.metadata().unwrap().created().unwrap())
});
entries.reverse();
let paths = entries
.iter() .iter()
.map(|f| { .map(|f| {
let _filename = f.file_name(); let _filename = f.file_name();
@ -73,17 +65,31 @@ pub fn get_index(config: Config) -> String {
Post { Post {
url: file_without_ext.to_string(), url: file_without_ext.to_string(),
title: file_metadata.title.unwrap(), title: file_metadata.title.unwrap(),
date: file_metadata.date.unwrap_or_default(), date: file_metadata.date.unwrap_or({
let m = f.metadata().unwrap();
let date = std::convert::Into::<DateTime<Utc>>::into(
m.modified().unwrap_or(m.created().unwrap()),
)
.date_naive();
Date {
day: date.day(),
month: date.month(),
year: date.year(),
}
}),
} }
}) })
.collect::<Vec<Post>>(); .collect::<Vec<Post>>();
// TODO sort vec by post date metadata, removing the sort above // Sort from newest to oldest
posts.sort_by_cached_key(|p| p.date.clone());
posts.reverse();
config.tmpl.render( config.tmpl.render(
"blog/index.html", "blog/index.html",
BlogIndexTemplate { BlogIndexTemplate {
posts: if paths.is_empty() { None } else { Some(paths) }, posts: if posts.is_empty() { None } else { Some(posts) },
}, },
Infos { Infos {
page_title: Some("Blog".to_string()), page_title: Some("Blog".to_string()),

View file

@ -59,11 +59,11 @@ impl FrontMatter<'_> {
} }
} }
} }
#[derive(Content, Default, Debug)] #[derive(Content, Default, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Date { pub struct Date {
day: u32, pub day: u32,
month: u32, pub month: u32,
year: i32, pub year: i32,
} }
impl<'de> Deserialize<'de> for Date { impl<'de> Deserialize<'de> for Date {
@ -85,7 +85,7 @@ impl<'de> Deserialize<'de> for Date {
} }
} }
#[derive(Default, Deserialize, Content, Debug)] #[derive(Default, Deserialize, Content)]
pub struct FileMetadata { pub struct FileMetadata {
pub title: Option<String>, pub title: Option<String>,
pub link: Option<String>, pub link: Option<String>,