diff --git a/Cargo.lock b/Cargo.lock index d7f5373..bd539a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2355,6 +2355,7 @@ dependencies = [ "config 0.1.0", "csv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", + "image 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)", "imageproc 0.1.0", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "library 0.1.0", diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index a8ffcc9..6be1fcd 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -395,6 +395,10 @@ impl Site { "resize_image", global_fns::ResizeImage::new(self.imageproc.clone()), ); + self.tera.register_function( + "get_image_metadata", + global_fns::GetImageMeta::new(self.content_path.clone()), + ); self.tera.register_function("load_data", global_fns::LoadData::new(self.base_path.clone())); self.tera.register_function("trans", global_fns::Trans::new(self.config.clone())); self.tera.register_function( diff --git a/components/templates/Cargo.toml b/components/templates/Cargo.toml index 4976895..9713d0d 100644 --- a/components/templates/Cargo.toml +++ b/components/templates/Cargo.toml @@ -10,6 +10,7 @@ lazy_static = "1" pulldown-cmark = "0.5" toml = "0.4" csv = "1" +image = "0.21" serde_json = "1.0" reqwest = "0.9" url = "1.5" diff --git a/components/templates/src/global_fns/mod.rs b/components/templates/src/global_fns/mod.rs index 16a8a1e..f979a2e 100644 --- a/components/templates/src/global_fns/mod.rs +++ b/components/templates/src/global_fns/mod.rs @@ -2,11 +2,13 @@ use std::collections::HashMap; use std::path::PathBuf; use std::sync::{Arc, Mutex, RwLock}; -use tera::{from_value, to_value, Function as TeraFn, Result, Value}; +use tera::{from_value, to_value, Error, Function as TeraFn, Result, Value}; use config::Config; use library::{Library, Taxonomy}; use utils::site::resolve_internal_link; +use image; +use image::GenericImageView; use imageproc; @@ -140,6 +142,39 @@ impl TeraFn for ResizeImage { } } +#[derive(Debug)] +pub struct GetImageMeta { + content_path: PathBuf +} + +impl GetImageMeta { + pub fn new(content_path: PathBuf) -> Self { + Self { content_path } + } +} + +impl TeraFn for GetImageMeta { + fn call(&self, args: &HashMap) -> Result { + let path = required_arg!( + String, + args.get("path"), + "`get_image_meta` requires a `path` argument with a string value" + ); + let src_path = self.content_path.join(&path); + if !src_path.exists(){ + return Err(format!("`get_image_meta`: Cannot find path: {}", path).into()); + } + let img = image::open(&src_path) + .map_err(|e| Error::chain(format!("Failed to process image: {}", path), e))?; + let mut map = tera::Map::new(); + map.insert(String::from("height"), Value::Number(tera::Number::from(img.height()))); + map.insert(String::from("width"), Value::Number(tera::Number::from(img.width()))); + Ok(Value::Object(map)) + } +} + + + #[derive(Debug)] pub struct GetTaxonomyUrl { taxonomies: HashMap>, diff --git a/components/templates/src/lib.rs b/components/templates/src/lib.rs index a1b6113..c51b452 100644 --- a/components/templates/src/lib.rs +++ b/components/templates/src/lib.rs @@ -7,7 +7,7 @@ extern crate csv; extern crate pulldown_cmark; extern crate reqwest; extern crate url; - +extern crate image; #[cfg(test)] #[macro_use] extern crate serde_json; diff --git a/docs/content/documentation/content/image-processing/index.md b/docs/content/documentation/content/image-processing/index.md index 697cbe0..32c95d6 100644 --- a/docs/content/documentation/content/image-processing/index.md +++ b/docs/content/documentation/content/image-processing/index.md @@ -145,3 +145,9 @@ Here is the result: Image attribution: Public domain, except: _06-example.jpg_: Willi Heidelbach, _07-example.jpg_: Daniel Ullrich. + + +## Get image size + +Sometimes when building a gallery it is useful to know the dimensions of each asset. You can get this information with +[get_image_metadata](./documentation/templates/overview.md#get-image-metadata) \ No newline at end of file diff --git a/docs/content/documentation/templates/overview.md b/docs/content/documentation/templates/overview.md index bd0df02..de2a3e9 100644 --- a/docs/content/documentation/templates/overview.md +++ b/docs/content/documentation/templates/overview.md @@ -130,6 +130,14 @@ In the case of non-internal links, you can also add a cachebust of the format `? by passing `cachebust=true` to the `get_url` function. +### `get_image_metadata` +Gets metadata for an image. Today the only supported keys are `width` and `height`. + +```jinja2 + {% set meta = get_image_metadata(path="...") %} + Our image is {{ meta.width }}x{{ meta.height }} +``` + ### `get_taxonomy_url` Gets the permalink for the taxonomy item found. diff --git a/docs/content/documentation/templates/pagination.md b/docs/content/documentation/templates/pagination.md index c6fda40..f3828ad 100644 --- a/docs/content/documentation/templates/pagination.md +++ b/docs/content/documentation/templates/pagination.md @@ -3,9 +3,12 @@ title = "Pagination" weight = 30 +++ -Two things can get paginated: a section or a taxonomy term. +Two things can get paginated: a section and a taxonomy term. -Every paginated template gets a `paginator` variable of the `Pager` type: +A paginated section gets the same `section` variable as a normal +[section page](./documentation/templates/pages-sections.md#section-variables) minus its pages +while both a paginated taxonomy page and a paginated section page gets a +`paginator` variable of the `Pager` type: ```ts // How many items per page @@ -32,11 +35,12 @@ current_index: Number; ## Section A paginated section gets the same `section` variable as a normal -[section page](@/documentation/templates/pages-sections.md#section-variables) minus its pages. +[section page](./documentation/templates/pages-sections.md#section-variables) +minus its pages. The pages are instead in `paginator.pages`. ## Taxonomy term -A paginated taxonomy gets two variables: +A paginated taxonomy gets two variables aside from the `paginator` variable: - a `taxonomy` variable of type `TaxonomyConfig` - a `term` variable of type `TaxonomyTerm`.