From bd4fb25a6a64a6b4688f538282fa67e9b49de53e Mon Sep 17 00:00:00 2001 From: Wynd Date: Sun, 29 Jun 2025 15:18:43 +0300 Subject: [PATCH] Better file hashing and scripts organization --- public/scripts/{bbs.js => bbs/melding.js} | 2 +- public/scripts/{modules => }/common/helper.js | 0 .../{modules => }/common/mat-kind-filter.js | 0 public/scripts/{kh2.js => kh1/drops.js} | 2 +- public/scripts/{kh1.js => kh1/synth.js} | 8 --- public/scripts/kh2/drops.js | 7 +++ public/scripts/{kh3.js => kh3/food-sim.js} | 0 rustfmt.toml | 1 - src/bbs.rs | 10 +--- src/bbs/melding.rs | 2 +- src/common/synthesis.rs | 3 +- src/ddd.rs | 9 +-- src/kh1.rs | 10 +--- src/kh2.rs | 10 +--- src/kh3.rs | 10 +--- src/main.rs | 55 +++++++++++++++---- templates/pages/bbs/melding.html | 5 +- templates/pages/kh1/drops.html | 5 +- templates/pages/kh1/synth.html | 2 +- templates/pages/kh2/drops.html | 5 +- templates/pages/kh3/food-sim.html | 5 +- 21 files changed, 77 insertions(+), 74 deletions(-) rename public/scripts/{bbs.js => bbs/melding.js} (98%) rename public/scripts/{modules => }/common/helper.js (100%) rename public/scripts/{modules => }/common/mat-kind-filter.js (100%) rename public/scripts/{kh2.js => kh1/drops.js} (64%) rename public/scripts/{kh1.js => kh1/synth.js} (93%) create mode 100644 public/scripts/kh2/drops.js rename public/scripts/{kh3.js => kh3/food-sim.js} (100%) diff --git a/public/scripts/bbs.js b/public/scripts/bbs/melding.js similarity index 98% rename from public/scripts/bbs.js rename to public/scripts/bbs/melding.js index 53f3306..9bef01c 100644 --- a/public/scripts/bbs.js +++ b/public/scripts/bbs/melding.js @@ -1,4 +1,4 @@ -import { debounce } from "./modules/common/helper.js"; +import { debounce } from "../common/helper.js"; let charFilter = ""; let typeFilter = ""; diff --git a/public/scripts/modules/common/helper.js b/public/scripts/common/helper.js similarity index 100% rename from public/scripts/modules/common/helper.js rename to public/scripts/common/helper.js diff --git a/public/scripts/modules/common/mat-kind-filter.js b/public/scripts/common/mat-kind-filter.js similarity index 100% rename from public/scripts/modules/common/mat-kind-filter.js rename to public/scripts/common/mat-kind-filter.js diff --git a/public/scripts/kh2.js b/public/scripts/kh1/drops.js similarity index 64% rename from public/scripts/kh2.js rename to public/scripts/kh1/drops.js index df5e1f4..aa16e94 100644 --- a/public/scripts/kh2.js +++ b/public/scripts/kh1/drops.js @@ -2,6 +2,6 @@ import { kindFilter, showOnlyTracked, track, -} from "./modules/common/mat-kind-filter.js"; +} from "../common/mat-kind-filter.js"; Object.assign(window, { track }); diff --git a/public/scripts/kh1.js b/public/scripts/kh1/synth.js similarity index 93% rename from public/scripts/kh1.js rename to public/scripts/kh1/synth.js index 1b19ad9..c58723a 100644 --- a/public/scripts/kh1.js +++ b/public/scripts/kh1/synth.js @@ -1,9 +1,3 @@ -import { - kindFilter, - showOnlyTracked, - track, -} from "./modules/common/mat-kind-filter.js"; - document.addEventListener("DOMContentLoaded", (event) => { const recipes = document.querySelectorAll(".recipe"); @@ -68,5 +62,3 @@ function calc_total_ingredients() { } matsList.appendChild(uiList); } - -Object.assign(window, { track }); diff --git a/public/scripts/kh2/drops.js b/public/scripts/kh2/drops.js new file mode 100644 index 0000000..aa16e94 --- /dev/null +++ b/public/scripts/kh2/drops.js @@ -0,0 +1,7 @@ +import { + kindFilter, + showOnlyTracked, + track, +} from "../common/mat-kind-filter.js"; + +Object.assign(window, { track }); diff --git a/public/scripts/kh3.js b/public/scripts/kh3/food-sim.js similarity index 100% rename from public/scripts/kh3.js rename to public/scripts/kh3/food-sim.js diff --git a/rustfmt.toml b/rustfmt.toml index 9a311d1..a4ba3b2 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,4 +1,3 @@ -unstable_features = true reorder_imports = true hard_tabs = true control_brace_style = "ClosingNextLine" diff --git a/src/bbs.rs b/src/bbs.rs index 3a85a58..0cb4aa6 100644 --- a/src/bbs.rs +++ b/src/bbs.rs @@ -1,14 +1,13 @@ -use std::{collections::HashMap, sync::OnceLock}; +use std::collections::HashMap; use ability::Ability; use askama::Template; -use blake3::Hash; use command::Command; use finisher::Finisher; use itertools::Itertools; use serde::Deserialize; -use crate::{RuntimeModule, create_file, create_hashes}; +use crate::{RuntimeModule, create_file}; mod ability; mod command; @@ -18,7 +17,6 @@ mod melding; const ABILITIES_PATH: &str = "./input/bbs/abilities.json"; const FINISHERS_PATH: &str = "./input/bbs/finish-commands.json"; const COMMANDS_PATH: &str = "./input/bbs/commands.json"; -static JS_HASH: OnceLock = OnceLock::new(); #[derive(Debug, Deserialize, PartialEq, Eq)] enum Character { @@ -73,8 +71,4 @@ impl RuntimeModule for Module { create_file("./out/bbs", "melding", melding_template).unwrap(); } - - fn get_js_hash() -> String { - JS_HASH.get_or_init(|| create_hashes("bbs")).to_string() - } } diff --git a/src/bbs/melding.rs b/src/bbs/melding.rs index d466e23..a995888 100644 --- a/src/bbs/melding.rs +++ b/src/bbs/melding.rs @@ -1,6 +1,6 @@ use serde::Deserialize; -use super::{ability::Ability, Character}; +use super::{Character, ability::Ability}; #[derive(Debug, Deserialize)] pub struct CommandRecipe { diff --git a/src/common/synthesis.rs b/src/common/synthesis.rs index a139dee..ede1903 100644 --- a/src/common/synthesis.rs +++ b/src/common/synthesis.rs @@ -1,6 +1,5 @@ -use std::collections::{BTreeMap, HashMap}; +use std::collections::HashMap; -use itertools::Itertools; use serde::Deserialize; #[derive(Debug, Default, Clone, Deserialize, PartialEq, Eq)] diff --git a/src/ddd.rs b/src/ddd.rs index 6cc8eae..7085f1d 100644 --- a/src/ddd.rs +++ b/src/ddd.rs @@ -1,10 +1,8 @@ use std::path::PathBuf; -use std::sync::OnceLock; use crate::ddd::ability::AbilityType; -use crate::{RuntimeModule, create_file, create_hashes}; +use crate::{RuntimeModule, create_file}; use askama::Template; -use blake3::Hash; use board::Board; mod ability; @@ -13,7 +11,6 @@ mod board_position; mod route; const ABILITIES_PATH: &str = "./input/ddd/abilities"; -static JS_HASH: OnceLock = OnceLock::new(); #[derive(Template)] #[template(path = "pages/ddd/boards.html")] @@ -57,8 +54,4 @@ impl RuntimeModule for Module { create_file("./out/ddd", "boards", boards_template).unwrap(); } - - fn get_js_hash() -> String { - JS_HASH.get_or_init(|| create_hashes("ddd")).to_string() - } } diff --git a/src/kh1.rs b/src/kh1.rs index 85f418d..20d2fc9 100644 --- a/src/kh1.rs +++ b/src/kh1.rs @@ -1,18 +1,14 @@ -use std::sync::OnceLock; - use askama::Template; -use blake3::Hash; use itertools::Itertools; use crate::{ RuntimeModule, common::{Game, enemy::Enemy, materials::MaterialDrops, synthesis::SynthesisData}, - create_file, create_hashes, + create_file, }; const ENEMIES_PATH: &str = "./input/kh1/enemies"; const SYNTHESIS_PATH: &str = "./input/kh1/synthesis.toml"; -static JS_HASH: OnceLock = OnceLock::new(); #[derive(Template)] #[template(path = "pages/kh1/drops.html")] @@ -59,8 +55,4 @@ impl RuntimeModule for Module { create_file("./out/kh1", "synth", synth_template).unwrap(); } - - fn get_js_hash() -> String { - JS_HASH.get_or_init(|| create_hashes("kh1")).to_string() - } } diff --git a/src/kh2.rs b/src/kh2.rs index b62bacd..97bf219 100644 --- a/src/kh2.rs +++ b/src/kh2.rs @@ -1,17 +1,13 @@ -use std::sync::OnceLock; - use askama::Template; -use blake3::Hash; use itertools::Itertools; use crate::{ RuntimeModule, common::{Game, enemy::Enemy, materials::MaterialDrops}, - create_file, create_hashes, + create_file, }; const ENEMIES_PATH: &str = "./input/kh2/enemies"; -static JS_HASH: OnceLock = OnceLock::new(); #[derive(Template)] #[template(path = "pages/kh2/drops.html")] @@ -44,8 +40,4 @@ impl RuntimeModule for Module { create_file("./out/kh2", "drops", drops_template).unwrap(); } - - fn get_js_hash() -> String { - JS_HASH.get_or_init(|| create_hashes("kh2")).to_string() - } } diff --git a/src/kh3.rs b/src/kh3.rs index e4c5de1..3360188 100644 --- a/src/kh3.rs +++ b/src/kh3.rs @@ -1,15 +1,11 @@ -use std::sync::OnceLock; - use askama::Template; -use blake3::Hash; use food::Recipes; -use crate::{RuntimeModule, create_file, create_hashes}; +use crate::{RuntimeModule, create_file}; mod food; const RECIPES_PATH: &str = "./input/kh3/recipes.toml"; -static JS_HASH: OnceLock = OnceLock::new(); #[derive(Template)] #[template(path = "pages/kh3/food-sim.html")] @@ -30,8 +26,4 @@ impl RuntimeModule for Module { create_file("./out/kh3", "food-sim", food_template).unwrap(); } - - fn get_js_hash() -> String { - JS_HASH.get_or_init(|| create_hashes("kh3")).to_string() - } } diff --git a/src/main.rs b/src/main.rs index 605d0c6..b4c2de9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ #![allow(dead_code)] -use std::{fs, path::PathBuf}; +use std::{collections::HashMap, fs, path::PathBuf, sync::LazyLock}; use askama::Template; use blake3::{Hash, Hasher}; @@ -25,11 +25,43 @@ mod kh3; pub const VERSION: &str = env!("CARGO_PKG_VERSION"); pub const ASSETS_FOLDER_PATH: &str = "./public/assets"; +pub const SCRIPTS_FOLDER_PATH: &str = "./public/scripts"; +static FILE_HASHES: LazyLock> = LazyLock::new(|| { + let mut map = HashMap::new(); + + fn parse_path(path: PathBuf, map: &mut HashMap) { + if let Ok(paths) = fs::read_dir(path) { + for path in paths.flatten() { + let path = path.path(); + + if path.metadata().is_ok_and(|p| p.is_dir()) { + parse_path(path, map); + continue; + } + + let dir = path.parent().unwrap().to_str().unwrap(); + let path = path.to_str().unwrap(); + let is_module = path.contains("/common"); + + let mut hasher = Hasher::new(); + hash_file(path.to_string().into(), &mut hasher); + if !is_module { + hash_files_in_dir(format!("{dir}/common").into(), &mut hasher); + } + + let hash = hasher.finalize(); + map.insert(path.to_string(), hash); + } + } + } + + parse_path(SCRIPTS_FOLDER_PATH.into(), &mut map); + + map +}); pub trait RuntimeModule { fn start_module(); - - fn get_js_hash() -> String; } #[derive(Template)] @@ -72,15 +104,14 @@ fn start_module() { M::start_module(); } -fn create_hashes(module: &str) -> Hash { - let mut hasher = Hasher::new(); - hash_file(format!("./public/scripts/{module}.js").into(), &mut hasher); - hash_files_in_dir("./public/scripts/modules/common".into(), &mut hasher); - hash_files_in_dir( - format!("./public/scripts/modules/{module}").into(), - &mut hasher, - ); - hasher.finalize() +fn find_hash(file: &str) -> String { + let map = &*FILE_HASHES; + let hash = map.get(&format!(".{file}")); + if let Some(hash) = hash { + return format!("{file}?hash={hash}"); + } + + file.to_string() } fn hash_files_in_dir(path: PathBuf, hasher: &mut Hasher) { diff --git a/templates/pages/bbs/melding.html b/templates/pages/bbs/melding.html index b80be26..11e30c7 100644 --- a/templates/pages/bbs/melding.html +++ b/templates/pages/bbs/melding.html @@ -4,7 +4,10 @@ {% block head %} - + {% endblock %} {% block content %} diff --git a/templates/pages/kh1/drops.html b/templates/pages/kh1/drops.html index 4e12e7b..49da11b 100644 --- a/templates/pages/kh1/drops.html +++ b/templates/pages/kh1/drops.html @@ -5,7 +5,10 @@ {% block head %} - + {% endblock %} {% block content %} diff --git a/templates/pages/kh1/synth.html b/templates/pages/kh1/synth.html index 18e11c8..593c5cb 100644 --- a/templates/pages/kh1/synth.html +++ b/templates/pages/kh1/synth.html @@ -7,7 +7,7 @@ {% endblock %} diff --git a/templates/pages/kh2/drops.html b/templates/pages/kh2/drops.html index a3ea88c..d11ce7c 100644 --- a/templates/pages/kh2/drops.html +++ b/templates/pages/kh2/drops.html @@ -5,7 +5,10 @@ {% block head %} - + {% endblock %} {% block content %} diff --git a/templates/pages/kh3/food-sim.html b/templates/pages/kh3/food-sim.html index c8a86d6..a0d5bea 100644 --- a/templates/pages/kh3/food-sim.html +++ b/templates/pages/kh3/food-sim.html @@ -4,7 +4,10 @@ {% block head %} - + {% endblock %} {% block content %}