Packages
rbt_weave
0.2.64
0.2.67
0.2.66
0.2.65
0.2.64
0.2.63
0.2.62
0.2.61
0.2.60
0.2.59
0.2.58
0.2.57
0.2.56
0.2.55
0.2.54
0.2.53
0.2.52
0.2.51
0.2.50
0.2.49
0.2.48
0.2.47
0.2.46
0.2.45
0.2.44
0.2.43
0.2.42
0.2.41
0.2.40
0.2.39
0.2.38
0.2.37
0.2.36
0.2.35
0.2.34
0.2.33
0.2.32
0.2.31
0.2.30
0.2.29
0.2.28
0.2.27
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
Graph conflict detection and image processing NIFs for OSINT knowledge graphs, powered by Rust.
Current section
Files
Jump to
Current section
Files
crates/weave-content/src/html/thumbnail.rs
//! Thumbnail URL rewriting and OG image helpers.
use std::fmt::Write as _;
use sha2::{Digest, Sha256};
use super::HtmlConfig;
use super::escape::escape_attr;
/// Length of the hex-encoded SHA-256 prefix used for thumbnail keys.
pub(crate) const THUMB_KEY_HEX_LEN: usize = 32;
/// Rewrite a thumbnail source URL to a hosted URL.
///
/// When `config.thumbnail_base_url` is set, computes the deterministic
/// key `thumbnails/{sha256_hex[0..32]}.webp` (matching `weave-image`)
/// and returns `{base_url}/thumbnails/{hash}.webp`.
///
/// When not set, returns the original URL unchanged.
pub(crate) fn rewrite_thumbnail_url(source_url: &str, config: &HtmlConfig) -> String {
match &config.thumbnail_base_url {
Some(base) => {
// If already rewritten (e.g. by loom-seed thumbnail processor), return as-is
if source_url.starts_with(base.as_str()) {
return source_url.to_string();
}
let key = thumbnail_key(source_url);
format!("{base}/{key}")
}
None => source_url.to_string(),
}
}
/// Compute the thumbnail object key from a source URL.
///
/// Returns `thumbnails/{sha256_hex[0..32]}.webp`, matching the algorithm
/// in `weave-image::thumbnail_key`.
pub(crate) fn thumbnail_key(source_url: &str) -> String {
let mut hasher = Sha256::new();
hasher.update(source_url.as_bytes());
let hash = hasher.finalize();
let hex = hex_encode(&hash);
format!("thumbnails/{}.webp", &hex[..THUMB_KEY_HEX_LEN])
}
/// Encode bytes as lowercase hex string.
fn hex_encode(bytes: &[u8]) -> String {
let mut s = String::with_capacity(bytes.len() * 2);
for b in bytes {
let _ = write!(s, "{b:02x}");
}
s
}
/// Build `data-og-image` attribute string if a URL is available.
pub(crate) fn og_image_attr(url: Option<&str>, config: &HtmlConfig) -> String {
match url {
Some(u) if !u.is_empty() => {
let rewritten = rewrite_thumbnail_url(u, config);
format!(" data-og-image=\"{}\"", escape_attr(&rewritten))
}
_ => String::new(),
}
}