Current section

Files

Jump to
rbt_weave crates weave-content src html mod.rs
Raw

crates/weave-content/src/html/mod.rs

//! Static HTML generator for case and entity pages.
//!
//! Produces semantic HTML fragments (no `<html>`/`<head>`/`<body>` wrapper)
//! suitable for embedding in a Phoenix layout. Each fragment includes
//! `data-og-*` attributes on the root element for meta tag extraction,
//! Schema.org microdata, and a `<script type="application/ld+json">` block.
//!
//! # Module structure
//!
//! - [`case`] — case page renderer
//! - [`entity`] — person and organization page renderers
//! - [`pages`] — tag, country, and sitemap page renderers
//! - [`components`] — reusable section renderers (sources, timeline, etc.)
//! - [`countries`] — ISO 3166-1 country name resolution
//! - [`escape`] — HTML escaping and inline markdown
//! - [`thumbnail`] — thumbnail URL rewriting
//! - [`dl`] — definition list field helpers
//! - [`jsonld`] — JSON-LD structured data builders
#![allow(clippy::format_push_string)]
mod case;
mod components;
pub(crate) mod countries;
mod dl;
mod entity;
pub(crate) mod escape;
mod jsonld;
mod pages;
mod thumbnail;
// Re-export the public API (preserving backward compatibility)
pub use case::render_case;
pub use entity::{render_organization, render_person};
pub use pages::{
CountryIndexEntry, TagCaseEntry, TagIndexEntry, render_countries_index, render_country_page,
render_sitemap, render_tag_page, render_tag_page_scoped, render_tags_index,
};
/// Configuration for HTML generation.
#[derive(Debug, Default, Clone)]
pub struct HtmlConfig {
/// Base URL for rewriting thumbnail image sources.
///
/// When set, original thumbnail URLs are rewritten to
/// `{base_url}/thumbnails/{sha256_hex[0..32]}.webp` using the same
/// deterministic key as `weave-image::thumbnail_key`.
///
/// Example: `http://files.web.garage.localhost:3902`
pub thumbnail_base_url: Option<String>,
}
/// Maximum size for a single HTML fragment file (2 MB).
const MAX_FRAGMENT_BYTES: usize = 2_097_152;
fn check_size(html: &str) -> Result<String, String> {
if html.len() > MAX_FRAGMENT_BYTES {
Err(format!(
"HTML fragment exceeds {MAX_FRAGMENT_BYTES} bytes ({} bytes)",
html.len()
))
} else {
Ok(html.to_string())
}
}
#[cfg(test)]
mod tests;