1
Fork 0
mirror of https://github.com/RGBCube/Site synced 2025-07-31 13:07:46 +00:00

Add RSS feed, use UTC everywhere

This commit is contained in:
RGBCube 2024-01-18 14:53:54 +03:00
parent 6eda24d407
commit b12a8f377e
No known key found for this signature in database
6 changed files with 223 additions and 16 deletions

165
Cargo.lock generated
View file

@ -124,7 +124,20 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
]
[[package]]
name = "atom_syndication"
version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "571832dcff775e26562e8e6930cd483de5587301d40d3a3b85d532b6383e15a7"
dependencies = [
"chrono",
"derive_builder",
"diligent-date-parser",
"never",
"quick-xml",
]
[[package]]
@ -198,7 +211,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
]
[[package]]
@ -330,7 +343,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
]
[[package]]
@ -351,6 +364,81 @@ version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
[[package]]
name = "darling"
version = "0.14.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"
dependencies = [
"darling_core",
"darling_macro",
]
[[package]]
name = "darling_core"
version = "0.14.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim",
"syn 1.0.109",
]
[[package]]
name = "darling_macro"
version = "0.14.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
dependencies = [
"darling_core",
"quote",
"syn 1.0.109",
]
[[package]]
name = "derive_builder"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8"
dependencies = [
"derive_builder_macro",
]
[[package]]
name = "derive_builder_core"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f"
dependencies = [
"darling",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "derive_builder_macro"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e"
dependencies = [
"derive_builder_core",
"syn 1.0.109",
]
[[package]]
name = "diligent-date-parser"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6cf7fe294274a222363f84bcb63cdea762979a0443b4cf1f4f8fd17c86b1182"
dependencies = [
"chrono",
]
[[package]]
name = "either"
version = "1.9.0"
@ -372,7 +460,16 @@ source = "git+https://github.com/RGBCube/embed-rs#7c2eb614db7947d5f12c02685c9740
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
]
[[package]]
name = "encoding_rs"
version = "0.8.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
dependencies = [
"cfg-if",
]
[[package]]
@ -632,6 +729,12 @@ dependencies = [
"cc",
]
[[package]]
name = "ident_case"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "indexmap"
version = "2.1.0"
@ -739,7 +842,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
]
[[package]]
@ -795,6 +898,12 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "never"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91"
[[package]]
name = "num-traits"
version = "0.2.17"
@ -888,7 +997,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
]
[[package]]
@ -946,6 +1055,16 @@ dependencies = [
"unicase",
]
[[package]]
name = "quick-xml"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956"
dependencies = [
"encoding_rs",
"memchr",
]
[[package]]
name = "quote"
version = "1.0.35"
@ -993,6 +1112,18 @@ version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]]
name = "rss"
version = "2.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7b2c77eb4450d7d5f98df52c381cd6c4e19b75dad9209a9530b85a44510219a"
dependencies = [
"atom_syndication",
"derive_builder",
"never",
"quick-xml",
]
[[package]]
name = "rustc-demangle"
version = "0.1.23"
@ -1047,7 +1178,7 @@ checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
]
[[package]]
@ -1134,6 +1265,7 @@ dependencies = [
"mime_guess",
"minify-js",
"pulldown-cmark",
"rss",
"serde",
"serde_yaml",
"tokio",
@ -1172,6 +1304,17 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "syn"
version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "syn"
version = "2.0.48"
@ -1225,7 +1368,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
]
[[package]]
@ -1408,7 +1551,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
"wasm-bindgen-shared",
]
@ -1430,7 +1573,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@ -1639,5 +1782,5 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.48",
]

View file

@ -25,6 +25,7 @@ maud = { git = "https://github.com/lambda-fairy/maud", features = [ "a
mime_guess = "2.0.4"
minify-js = "0.6.0"
pulldown-cmark = "0.9.3"
rss = "2.0.7"
serde = { version = "1.0.195", features = [ "derive" ] }
serde_yaml = "0.9.30"
tokio = { version = "1.35.1", features = [ "full" ] }

View file

@ -1,6 +1,6 @@
use chrono::{
Datelike,
Local,
Utc,
};
use maud::{
html,
@ -39,7 +39,7 @@ pub fn create(title: Option<&str>, page: Page, body: &Markup) -> Markup {
footer {
"Copyright © "
(Local::now().year())
(Utc::now().year())
" RGBCube"
}
}

View file

@ -3,15 +3,28 @@ use std::sync::LazyLock;
use axum::{
body::Body,
extract::Path,
http::Response,
http::{
header::CONTENT_TYPE,
Response,
},
response::IntoResponse,
};
use bytes::Bytes;
use chrono::{
Datelike,
Utc,
};
use indexmap::IndexMap;
use itertools::Itertools;
use maud::{
html,
Markup,
};
use rss::{
CategoryBuilder,
ChannelBuilder,
ItemBuilder,
};
use super::markdown::{
Metadata,
@ -22,6 +35,7 @@ use crate::{
page::{
text,
Page,
MANIFEST,
},
};
@ -82,3 +96,47 @@ pub async fn entry_handler(Path(entry): Path<String>) -> Response<Body> {
not_found::handler().await.into_response()
}
}
static FEED: LazyLock<Bytes> = LazyLock::new(|| {
let url = MANIFEST.package.as_ref().unwrap().homepage().unwrap();
let items = ENTRIES.iter().map(|(path, (metadata, body))| {
ItemBuilder::default()
.link(Some(format!("{url}{path}")))
.title(Some(metadata.title.clone()))
.description(metadata.description.clone())
.author(Some("contact@rgbcu.be".to_string()))
.categories(
metadata
.tags
.as_ref()
.unwrap()
.iter()
.map(|tag| CategoryBuilder::default().name(tag.clone()).build())
.collect_vec(),
)
.pub_date(metadata.date.map(|date| date.to_rfc2822()))
.content(Some(body.clone().into_string()))
.build()
});
let channel = ChannelBuilder::default()
.title("RGBCube's Blog".to_string())
.link(format!("{url}blog"))
.description(
"The webpage where RGBCube puts his schizophrenic rambling about software and all the \
likes"
.to_string(),
)
.copyright(Some(format!("Copyright © {} RGBCube", Utc::now().year())))
.language(Some("en-us".to_string()))
.webmaster(Some("contact@rgbcu.be".to_string()))
.items(items.collect_vec())
.build();
Bytes::from(channel.to_string().into_bytes())
});
pub async fn feed_handler() -> impl IntoResponse {
([(CONTENT_TYPE, "application/xml")], Bytes::clone(&*FEED))
}

View file

@ -3,7 +3,10 @@ use std::{
sync::LazyLock,
};
use chrono::NaiveDate;
use chrono::{
DateTime,
Utc,
};
use maud::Markup;
use serde::Deserialize;
@ -12,7 +15,8 @@ use crate::markdown;
#[derive(Deserialize, Debug)]
pub struct Metadata {
pub title: String,
pub date: Option<NaiveDate>,
pub description: Option<String>,
pub date: Option<DateTime<Utc>>,
pub tags: Option<Vec<String>>,
}

View file

@ -13,5 +13,6 @@ pub fn router() -> Router {
.route("/", get(index::handler))
.route("/blog", get(blog::index_handler))
.route("/blog/:entry", get(blog::entry_handler))
.route("/feed", get(blog::feed_handler))
.route("/*path", get(assets::handler))
}