From bc3e25f8c1edbd233ed0c266c574892e88644d9c Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Wed, 15 Jan 2025 15:54:27 +1300 Subject: Implement image galleries Each gallery image must be kept in the three directories images/large, images/small, and images/thumb. A gallery is a fragment with the language 'gallery' containing a list of image filenames, one per line. --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- src/collect_files.rs | 14 ++++++++++++++ src/generate_html.rs | 11 +++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 78b7b91..d17b517 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,8 +24,8 @@ dependencies = [ [[package]] name = "vagabond" -version = "1.0.2" -source = "git+git://benbridle.com/vagabond?tag=v1.0.2#740df75e2bf62d067ca76bd661f9c46b4a228678" +version = "1.0.3" +source = "git+git://benbridle.com/vagabond?tag=v1.0.3#fb80ee168e1977230680115304103b80ccf7f1ac" [[package]] name = "xflags" diff --git a/Cargo.toml b/Cargo.toml index 205393c..9032713 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ version = "1.5.0" edition = "2021" [dependencies] -vagabond = { git = "git://benbridle.com/vagabond", tag = "v1.0.2" } +vagabond = { git = "git://benbridle.com/vagabond", tag = "v1.0.3" } markdown = { git = "git://benbridle.com/markdown", tag = "v2.1.1" } recipe = { git = "git://benbridle.com/recipe", tag = "v1.4.0" } xflags = "0.4.0-pre.1" diff --git a/src/collect_files.rs b/src/collect_files.rs index b0e24ed..cf39ebe 100644 --- a/src/collect_files.rs +++ b/src/collect_files.rs @@ -121,6 +121,15 @@ impl Website { // Process each entry. if entry.is_directory() { if let Some(stripped) = entry.name.strip_prefix("!") { + // Track all files inside the static directory. + for child in traverse_directory(&entry).unwrap() { + let source_path = child.original_path; + let relative_path = source_path.strip_prefix(&entry.original_path).unwrap_or_else( + |_| error!("Path doesn't start with {prefix:?}: {source_path:?}")) + .as_os_str().to_string_lossy().to_string(); + let full_url = format!("{stripped}/{relative_path}"); + self.static_files.push(StaticItem { full_url, source_path }) + } let full_url = make_url_safe(stripped); self.static_dirs.push(StaticItem { full_url, source_path }); } else { @@ -299,6 +308,11 @@ impl Website { return None; } + pub fn has_image(&self, file_name: &str) -> bool { + let image_path = format!("images/thumb/{file_name}"); + self.static_files.iter().any(|s| s.full_url == image_path) + } + pub fn get_config(&self, key: &str) -> String { self.config.get(key).map(String::to_owned).unwrap_or_else(String::new) } diff --git a/src/generate_html.rs b/src/generate_html.rs index 3486352..0210986 100644 --- a/src/generate_html.rs +++ b/src/generate_html.rs @@ -188,6 +188,17 @@ pub fn document_to_html(document: &MarkdownDocument, page: &Page, website: &Webs for paragraph in recipe.process { html!("

{paragraph}

") } html!(""); }, + "gallery" => wrap!("div", "class='gallery'", for line in content.lines() { + let file = line.trim(); + if !website.has_image(file) { + warn!("Gallery on page {:?} references nonexistent image {file:?}", page.name); + continue; + } + let large = format!("{root}images/large/{file}"); + // let small = format!("{root}images/small/{file}"); + let thumb = format!("{root}images/thumb/{file}"); + html!(""); + }), _ => { html!("
", language);
                         html!("{}", sanitize_text(content));
-- 
cgit v1.2.3-70-g09d2