From 5d2c5197cd61d5f31bad139d63db58366c20fd96 Mon Sep 17 00:00:00 2001 From: RGBCube Date: Mon, 8 Jan 2024 15:12:25 +0300 Subject: [PATCH] Sort blog entries --- .gitignore | 1 + Cargo.lock | 17 +++++++++ Cargo.toml | 2 + src/routes/blog.rs | 73 +++++++++++++++++++++++------------- src/routes/blog/test.md | 6 +++ src/routes/blog/test123.md | 6 +++ src/routes/blog/test123a.md | 6 +++ src/routes/blog/test12d3a.md | 6 +++ src/routes/markdown.rs | 15 +++----- 9 files changed, 96 insertions(+), 36 deletions(-) create mode 100644 src/routes/blog/test.md create mode 100644 src/routes/blog/test123.md create mode 100644 src/routes/blog/test123a.md create mode 100644 src/routes/blog/test12d3a.md diff --git a/.gitignore b/.gitignore index 8a62fd3..f6ae63a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ !src/page/cube/ !src/page/text/ !src/routes/ +!src/routes/blog/ !src/routes/index/ !.gitignore diff --git a/Cargo.lock b/Cargo.lock index b6cd07a..16bfebd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -367,6 +367,12 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + [[package]] name = "embed" version = "0.1.0" @@ -674,6 +680,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "itertools" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.10" @@ -1201,6 +1216,8 @@ dependencies = [ "clap", "embed", "env_logger", + "indexmap", + "itertools", "log", "maud", "mime_guess", diff --git a/Cargo.toml b/Cargo.toml index 135c7e8..34185ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,8 @@ chrono = { version = "0.4.31", features = [ "serde" ] } clap = { version = "4.4.12", features = [ "derive" ] } embed = { git = "https://github.com/RGBCube/embed-rs" } env_logger = "0.10.1" +indexmap = "2.1.0" +itertools = "0.12.0" log = { version = "0.4.20", features = [ "serde" ] } maud = { git = "https://github.com/lambda-fairy/maud", features = [ "axum" ] } mime_guess = "2.0.4" diff --git a/src/routes/blog.rs b/src/routes/blog.rs index 26cbb26..002457f 100644 --- a/src/routes/blog.rs +++ b/src/routes/blog.rs @@ -1,10 +1,17 @@ +use std::sync::LazyLock; + use axum::extract::Path; +use indexmap::IndexMap; +use itertools::Itertools; use maud::{ html, Markup, }; -use super::markdown::PAGES; +use super::markdown::{ + Metadata, + PAGES, +}; use crate::{ errors::not_found, page::{ @@ -13,24 +20,49 @@ use crate::{ }, }; +static ENTRIES: LazyLock> = + LazyLock::new(|| { + IndexMap::from_iter( + PAGES + .iter() + .sorted_by_key(|(_, value)| value.0.date) + .rev() + .filter_map(|(path, (metadata, body))| { + if let Some(name) = path.strip_prefix("blog/") { + let body = html! { + (body) + + @if let Some(tags) = &metadata.tags { + p { + "Tags: " + (tags.join(", ")) + } + } + }; + + Some((name, (metadata, body))) + } else { + None + } + }), + ) + }); + pub async fn index_handler() -> Markup { text::create( - Some("blog"), + Some("Blog"), Page::Blog, &html! { h1 { "Blog Articles" } p { "RSS feed coming soon, probably :)" } ul { - @let pages = &*PAGES; - @for (path, (metadata, ..)) in pages.iter() { - @if path.starts_with("blog") { - li { - (metadata.date.unwrap().format("%d/%m/%Y")) - " - " - a href=(format!("/{path}")) { - (metadata.title) - } + @for (path, (metadata, ..)) in ENTRIES.iter() { + li { + (metadata.date.unwrap().format("%d/%m/%Y")) + " - " + a href=(format!("/blog/{path}")) { + (metadata.title) } } } @@ -39,22 +71,9 @@ pub async fn index_handler() -> Markup { ) } -pub async fn entry_handler(Path(path): Path) -> Markup { - if let Some((metadata, body)) = PAGES.get(&path) { - text::create( - Some(&metadata.title), - Page::Other, - &html! { - (body) - - @if let Some(tags) = &metadata.tags { - p { - "Tags: " - (tags.join(", ")) - } - } - }, - ) +pub async fn entry_handler(Path(entry): Path) -> Markup { + if let Some((metadata, body)) = ENTRIES.get(entry.as_str()) { + text::create(Some(&metadata.title), Page::Other, &body) } else { not_found::handler().await } diff --git a/src/routes/blog/test.md b/src/routes/blog/test.md new file mode 100644 index 0000000..aade55f --- /dev/null +++ b/src/routes/blog/test.md @@ -0,0 +1,6 @@ +title: Oldest entry +date: 2022-01-01 +tags: + - foo + - bar +--- diff --git a/src/routes/blog/test123.md b/src/routes/blog/test123.md new file mode 100644 index 0000000..fc791bb --- /dev/null +++ b/src/routes/blog/test123.md @@ -0,0 +1,6 @@ +title: Second oldest +date: 2022-01-05 +tags: + - foo + - bar +--- diff --git a/src/routes/blog/test123a.md b/src/routes/blog/test123a.md new file mode 100644 index 0000000..a998541 --- /dev/null +++ b/src/routes/blog/test123a.md @@ -0,0 +1,6 @@ +title: Newest +date: 2024-01-08 +tags: + - foo + - bar +--- diff --git a/src/routes/blog/test12d3a.md b/src/routes/blog/test12d3a.md new file mode 100644 index 0000000..c253f7a --- /dev/null +++ b/src/routes/blog/test12d3a.md @@ -0,0 +1,6 @@ +title: 3rd oldest +date: 2023-01-08 +tags: + - foo + - bar +--- diff --git a/src/routes/markdown.rs b/src/routes/markdown.rs index 3e9dd4a..f15e5a4 100644 --- a/src/routes/markdown.rs +++ b/src/routes/markdown.rs @@ -32,9 +32,7 @@ pub static PAGES: LazyLock> = LazyLock::new( .canonicalize() .unwrap(); - let mut pages = HashMap::new(); - - for file in embed::dir!(".").flatten() { + HashMap::from_iter(embed::dir!(".").flatten().iter().filter_map(|file| { let path = path::Path::new(file.path().as_ref()) .strip_prefix(&routes_path) .unwrap() @@ -42,7 +40,7 @@ pub static PAGES: LazyLock> = LazyLock::new( .unwrap(); if !path.ends_with(".md") { - continue; + return None; } let content = String::from_utf8(file.content().to_vec()).unwrap(); @@ -52,13 +50,12 @@ pub static PAGES: LazyLock> = LazyLock::new( let metadata: Metadata = serde_yaml::from_str(metadata).unwrap(); log::info!("Adding page {path}"); - pages.insert( + + Some(( path.to_string().strip_suffix(".md").unwrap().to_string(), (metadata, markdown::parse(content)), - ); - } - - pages + )) + })) }); pub async fn handler(Path(path): Path) -> Markup {