diff --git a/Cargo.lock b/Cargo.lock index f5b18a3..734c92f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,6 +26,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.3.2" @@ -201,6 +216,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" + [[package]] name = "bytemuck" version = "1.14.3" @@ -234,6 +255,20 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.3", +] + [[package]] name = "clap" version = "4.3.22" @@ -306,6 +341,12 @@ dependencies = [ "walkdir", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + [[package]] name = "cpufeatures" version = "0.2.9" @@ -693,6 +734,29 @@ dependencies = [ "tokio", ] +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "idna" version = "0.5.0" @@ -757,6 +821,15 @@ dependencies = [ "rayon", ] +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "lebe" version = "0.5.2" @@ -1496,6 +1569,7 @@ dependencies = [ "anyhow", "axum", "base64", + "chrono", "clap", "codespan-reporting", "copy_dir", @@ -1620,6 +1694,60 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + [[package]] name = "weezl" version = "0.1.8" @@ -1657,6 +1785,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.3", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/crates/treehouse/Cargo.toml b/crates/treehouse/Cargo.toml index 218c818..b2facbf 100644 --- a/crates/treehouse/Cargo.toml +++ b/crates/treehouse/Cargo.toml @@ -28,3 +28,4 @@ walkdir = "2.3.3" ulid = "1.0.0" url = "2.5.0" base64 = "0.21.7" +chrono = "0.4.35" diff --git a/crates/treehouse/src/cli/generate.rs b/crates/treehouse/src/cli/generate.rs index 583c9d1..7370c20 100644 --- a/crates/treehouse/src/cli/generate.rs +++ b/crates/treehouse/src/cli/generate.rs @@ -19,6 +19,7 @@ use walkdir::WalkDir; use crate::{ cli::parse::parse_tree_with_diagnostics, config::{Config, ConfigDerivedData}, + fun::seasons::Season, html::{ breadcrumbs::breadcrumbs_to_html, navmap::{build_navigation_map, NavigationMap}, @@ -68,13 +69,15 @@ pub struct Thumbnail { #[derive(Serialize)] struct StaticTemplateData<'a> { config: &'a Config, + season: Option, } #[derive(Serialize)] struct PageTemplateData<'a> { - pub config: &'a Config, - pub page: Page, - pub feeds: &'a HashMap, + config: &'a Config, + page: Page, + feeds: &'a HashMap, + season: Option, } impl Generator { @@ -231,7 +234,13 @@ impl Generator { for (name, &file_id) in &template_file_ids { let filename = name.rsplit_once('/').unwrap_or(("", name)).1; if !filename.starts_with('_') { - let templated_html = match handlebars.render(name, &StaticTemplateData { config }) { + let templated_html = match handlebars.render( + name, + &StaticTemplateData { + config, + season: Season::current(), + }, + ) { Ok(html) => html, Err(error) => { Self::wrangle_handlebars_error_into_diagnostic( @@ -307,6 +316,7 @@ impl Generator { tree, }, feeds: &feeds, + season: Season::current(), }; let template_name = roots .attributes diff --git a/crates/treehouse/src/fun.rs b/crates/treehouse/src/fun.rs new file mode 100644 index 0000000..70853bc --- /dev/null +++ b/crates/treehouse/src/fun.rs @@ -0,0 +1 @@ +pub mod seasons; diff --git a/crates/treehouse/src/fun/seasons.rs b/crates/treehouse/src/fun/seasons.rs new file mode 100644 index 0000000..269c2fc --- /dev/null +++ b/crates/treehouse/src/fun/seasons.rs @@ -0,0 +1,78 @@ +use chrono::{Datelike, Utc}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)] +#[serde(rename_all = "snake_case")] +pub enum Season { + Spring, + Summer, + Autumn, + Winter, +} + +impl Season { + pub fn on(month: u32, day: u32) -> Option { + let md = (month, day); + Some(match () { + _ if ((1, 1)..=(3, 20)).contains(&md) => Season::Winter, + _ if ((3, 21)..=(6, 21)).contains(&md) => Season::Spring, + _ if ((6, 22)..=(9, 22)).contains(&md) => Season::Summer, + _ if ((9, 23)..=(12, 21)).contains(&md) => Season::Autumn, + _ if ((12, 22)..=(12, 31)).contains(&md) => Season::Winter, + // Just in case something really darn weird happens to the calendar. + _ => return None, + }) + } + + pub fn current() -> Option { + let now = Utc::now(); + Self::on(now.month(), now.day()) + } +} + +#[cfg(test)] +mod tests { + use crate::fun::seasons::Season; + + #[test] + fn all_the_seasons() { + assert_eq!(Season::on(0, 0), None); + assert_eq!(Season::on(1, 1), Some(Season::Winter)); + assert_eq!(Season::on(1, 15), Some(Season::Winter)); + assert_eq!(Season::on(1, 31), Some(Season::Winter)); + assert_eq!(Season::on(2, 1), Some(Season::Winter)); + assert_eq!(Season::on(2, 28), Some(Season::Winter)); + assert_eq!(Season::on(2, 29), Some(Season::Winter)); + assert_eq!(Season::on(3, 1), Some(Season::Winter)); + assert_eq!(Season::on(3, 20), Some(Season::Winter)); + assert_eq!(Season::on(3, 21), Some(Season::Spring)); + assert_eq!(Season::on(3, 22), Some(Season::Spring)); + assert_eq!(Season::on(4, 1), Some(Season::Spring)); + assert_eq!(Season::on(4, 30), Some(Season::Spring)); + assert_eq!(Season::on(5, 1), Some(Season::Spring)); + assert_eq!(Season::on(5, 31), Some(Season::Spring)); + assert_eq!(Season::on(6, 1), Some(Season::Spring)); + assert_eq!(Season::on(6, 21), Some(Season::Spring)); + assert_eq!(Season::on(6, 22), Some(Season::Summer)); + assert_eq!(Season::on(6, 30), Some(Season::Summer)); + assert_eq!(Season::on(7, 1), Some(Season::Summer)); + assert_eq!(Season::on(7, 31), Some(Season::Summer)); + assert_eq!(Season::on(8, 1), Some(Season::Summer)); + assert_eq!(Season::on(8, 31), Some(Season::Summer)); + assert_eq!(Season::on(9, 1), Some(Season::Summer)); + assert_eq!(Season::on(9, 22), Some(Season::Summer)); + assert_eq!(Season::on(9, 23), Some(Season::Autumn)); + assert_eq!(Season::on(9, 30), Some(Season::Autumn)); + assert_eq!(Season::on(10, 1), Some(Season::Autumn)); + assert_eq!(Season::on(10, 31), Some(Season::Autumn)); + assert_eq!(Season::on(11, 1), Some(Season::Autumn)); + assert_eq!(Season::on(11, 30), Some(Season::Autumn)); + assert_eq!(Season::on(12, 1), Some(Season::Autumn)); + assert_eq!(Season::on(12, 21), Some(Season::Autumn)); + assert_eq!(Season::on(12, 22), Some(Season::Winter)); + assert_eq!(Season::on(12, 22), Some(Season::Winter)); + assert_eq!(Season::on(12, 31), Some(Season::Winter)); + assert_eq!(Season::on(12, 32), None); + assert_eq!(Season::on(21, 37), None); + } +} diff --git a/crates/treehouse/src/main.rs b/crates/treehouse/src/main.rs index 7d92ace..7cd81b8 100644 --- a/crates/treehouse/src/main.rs +++ b/crates/treehouse/src/main.rs @@ -11,6 +11,7 @@ use log::{error, info, warn}; mod cli; mod config; +mod fun; mod html; mod paths; mod state; diff --git a/static/favicon/@16x.png b/static/favicon/@16x.png new file mode 100644 index 0000000..7e37b4a Binary files /dev/null and b/static/favicon/@16x.png differ diff --git a/static/favicon/@1x.png b/static/favicon/@1x.png new file mode 100644 index 0000000..d5b390f Binary files /dev/null and b/static/favicon/@1x.png differ diff --git a/static/favicon/@2x.png b/static/favicon/@2x.png new file mode 100644 index 0000000..05a3948 Binary files /dev/null and b/static/favicon/@2x.png differ diff --git a/static/favicon/@32x.png b/static/favicon/@32x.png new file mode 100644 index 0000000..8bc21fd Binary files /dev/null and b/static/favicon/@32x.png differ diff --git a/static/favicon/@4x.png b/static/favicon/@4x.png new file mode 100644 index 0000000..e72b58c Binary files /dev/null and b/static/favicon/@4x.png differ diff --git a/static/favicon/@8x.png b/static/favicon/@8x.png new file mode 100644 index 0000000..1c9d9e0 Binary files /dev/null and b/static/favicon/@8x.png differ diff --git a/static/favicon/autumn@16x.png b/static/favicon/autumn@16x.png new file mode 100644 index 0000000..451e0db Binary files /dev/null and b/static/favicon/autumn@16x.png differ diff --git a/static/favicon/autumn@1x.png b/static/favicon/autumn@1x.png new file mode 100644 index 0000000..c682eba Binary files /dev/null and b/static/favicon/autumn@1x.png differ diff --git a/static/favicon/autumn@2x.png b/static/favicon/autumn@2x.png new file mode 100644 index 0000000..866b5f6 Binary files /dev/null and b/static/favicon/autumn@2x.png differ diff --git a/static/favicon/autumn@32x.png b/static/favicon/autumn@32x.png new file mode 100644 index 0000000..da42199 Binary files /dev/null and b/static/favicon/autumn@32x.png differ diff --git a/static/favicon/autumn@4x.png b/static/favicon/autumn@4x.png new file mode 100644 index 0000000..cf0454d Binary files /dev/null and b/static/favicon/autumn@4x.png differ diff --git a/static/favicon/autumn@8x.png b/static/favicon/autumn@8x.png new file mode 100644 index 0000000..91bd553 Binary files /dev/null and b/static/favicon/autumn@8x.png differ diff --git a/static/favicon/spring@16x.png b/static/favicon/spring@16x.png new file mode 100644 index 0000000..a2c52e4 Binary files /dev/null and b/static/favicon/spring@16x.png differ diff --git a/static/favicon/spring@1x.png b/static/favicon/spring@1x.png new file mode 100644 index 0000000..3caeb2e Binary files /dev/null and b/static/favicon/spring@1x.png differ diff --git a/static/favicon/spring@2x.png b/static/favicon/spring@2x.png new file mode 100644 index 0000000..120c2e1 Binary files /dev/null and b/static/favicon/spring@2x.png differ diff --git a/static/favicon/spring@32x.png b/static/favicon/spring@32x.png new file mode 100644 index 0000000..396952c Binary files /dev/null and b/static/favicon/spring@32x.png differ diff --git a/static/favicon/spring@4x.png b/static/favicon/spring@4x.png new file mode 100644 index 0000000..97c9fdc Binary files /dev/null and b/static/favicon/spring@4x.png differ diff --git a/static/favicon/spring@8x.png b/static/favicon/spring@8x.png new file mode 100644 index 0000000..4653b58 Binary files /dev/null and b/static/favicon/spring@8x.png differ diff --git a/static/favicon/summer@16x.png b/static/favicon/summer@16x.png new file mode 100644 index 0000000..a2ff7e0 Binary files /dev/null and b/static/favicon/summer@16x.png differ diff --git a/static/favicon/summer@1x.png b/static/favicon/summer@1x.png new file mode 100644 index 0000000..8212f02 Binary files /dev/null and b/static/favicon/summer@1x.png differ diff --git a/static/favicon/summer@2x.png b/static/favicon/summer@2x.png new file mode 100644 index 0000000..4d429a5 Binary files /dev/null and b/static/favicon/summer@2x.png differ diff --git a/static/favicon/summer@32x.png b/static/favicon/summer@32x.png new file mode 100644 index 0000000..d5ddf9f Binary files /dev/null and b/static/favicon/summer@32x.png differ diff --git a/static/favicon/summer@4x.png b/static/favicon/summer@4x.png new file mode 100644 index 0000000..a944ee5 Binary files /dev/null and b/static/favicon/summer@4x.png differ diff --git a/static/favicon/summer@8x.png b/static/favicon/summer@8x.png new file mode 100644 index 0000000..a529a15 Binary files /dev/null and b/static/favicon/summer@8x.png differ diff --git a/static/favicon/winter@16x.png b/static/favicon/winter@16x.png new file mode 100644 index 0000000..f2d25d7 Binary files /dev/null and b/static/favicon/winter@16x.png differ diff --git a/static/favicon/winter@1x.png b/static/favicon/winter@1x.png new file mode 100644 index 0000000..839479f Binary files /dev/null and b/static/favicon/winter@1x.png differ diff --git a/static/favicon/winter@2x.png b/static/favicon/winter@2x.png new file mode 100644 index 0000000..f4c28ea Binary files /dev/null and b/static/favicon/winter@2x.png differ diff --git a/static/favicon/winter@32x.png b/static/favicon/winter@32x.png new file mode 100644 index 0000000..3516580 Binary files /dev/null and b/static/favicon/winter@32x.png differ diff --git a/static/favicon/winter@4x.png b/static/favicon/winter@4x.png new file mode 100644 index 0000000..09b2ff8 Binary files /dev/null and b/static/favicon/winter@4x.png differ diff --git a/static/favicon/winter@8x.png b/static/favicon/winter@8x.png new file mode 100644 index 0000000..2924180 Binary files /dev/null and b/static/favicon/winter@8x.png differ diff --git a/template/components/_head.hbs b/template/components/_head.hbs index eb257f3..2b4dfdd 100644 --- a/template/components/_head.hbs +++ b/template/components/_head.hbs @@ -41,3 +41,16 @@ It just needs to be a string replacement. {{/if}} + + + + + + + + + + + + +