Current section

Files

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

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

//! Person and organization entity page HTML fragment renderers.
use crate::output::NodeOutput;
use super::HtmlConfig;
use super::components::{render_cases_list, render_entity_detail};
use super::escape::{escape_attr, truncate};
use super::jsonld::{
build_org_og_description, build_person_og_description, render_org_json_ld,
render_person_json_ld,
};
use super::thumbnail::og_image_attr;
/// Generate a person page HTML fragment.
///
/// # Errors
///
/// Returns an error if the rendered HTML exceeds the size limit.
pub fn render_person(
node: &NodeOutput,
cases: &[(String, String)],
config: &HtmlConfig,
) -> Result<String, String> {
let mut html = String::with_capacity(4096);
let og_title = truncate(&node.name, 120);
let og_description = build_person_og_description(node);
html.push_str(&format!(
"<article class=\"loom-person\" itemscope itemtype=\"https://schema.org/Person\" \
data-og-title=\"{}\" \
data-og-description=\"{}\" \
data-og-type=\"profile\" \
data-og-url=\"/{}\"{}>\n",
escape_attr(&og_title),
escape_attr(&og_description),
escape_attr(node.slug.as_deref().unwrap_or(&node.id)),
og_image_attr(node.thumbnail.as_deref(), config),
));
render_entity_detail(&mut html, node, config);
render_cases_list(&mut html, cases);
render_person_json_ld(&mut html, node);
html.push_str("</article>\n");
super::check_size(&html)
}
/// Generate an organization page HTML fragment.
///
/// # Errors
///
/// Returns an error if the rendered HTML exceeds the size limit.
pub fn render_organization(
node: &NodeOutput,
cases: &[(String, String)],
config: &HtmlConfig,
) -> Result<String, String> {
let mut html = String::with_capacity(4096);
let og_title = truncate(&node.name, 120);
let og_description = build_org_og_description(node);
html.push_str(&format!(
"<article class=\"loom-organization\" itemscope itemtype=\"https://schema.org/Organization\" \
data-og-title=\"{}\" \
data-og-description=\"{}\" \
data-og-type=\"profile\" \
data-og-url=\"/{}\"{}>\n",
escape_attr(&og_title),
escape_attr(&og_description),
escape_attr(node.slug.as_deref().unwrap_or(&node.id)),
og_image_attr(node.thumbnail.as_deref(), config),
));
render_entity_detail(&mut html, node, config);
render_cases_list(&mut html, cases);
render_org_json_ld(&mut html, node);
html.push_str("</article>\n");
super::check_size(&html)
}