///|
pub(all) enum ContentDensity {
Sparse
Balanced
Dense
} derive(Debug, Eq)
///|
pub(all) struct ContentProfile {
characters : Int
non_empty_fields : Int
density : ContentDensity
has_image : Bool
} derive(Debug, Eq)
///|
fn field_lengths(content : TemplateContent) -> Array[Int] {
[
content.eyebrow.char_length(),
content.title.char_length(),
content.subtitle.char_length(),
content.body.char_length(),
content.cta.char_length(),
content.footer.char_length(),
content.image_label.char_length(),
content.image_asset_id.char_length(),
]
}
///|
pub fn profile_content(content : TemplateContent) -> ContentProfile {
let lengths = field_lengths(content)
let characters = lengths.fold(init=0, (sum, value) => sum + value)
let non_empty_fields = lengths.filter(value => value > 0).length()
let density = if characters < 120 {
Sparse
} else if characters < 360 {
Balanced
} else {
Dense
}
{
characters,
non_empty_fields,
density,
has_image: content.image_asset_id.trim().length() > 0,
}
}
///|
pub fn density_text(density : ContentDensity) -> String {
match density {
Sparse => "sparse"
Balanced => "balanced"
Dense => "dense"
}
}
///|
pub fn content_summary(content : TemplateContent) -> String {
let profile = profile_content(content)
let image = if profile.has_image { "yes" } else { "no" }
"characters=" +
profile.characters.to_string() +
",fields=" +
profile.non_empty_fields.to_string() +
",density=" +
density_text(profile.density) +
",image=" +
image
}
///|
pub fn render_compact(
template~ : String,
preset~ : @preset.PosterPreset,
theme~ : @theme.Theme,
content~ : TemplateContent,
) -> @scene.PosterDocument {
let profile = profile_content(content)
match profile.density {
Sparse => render_template(template~, preset~, theme~, content~)
Balanced => render_template(template~, preset~, theme~, content~)
Dense => render_template(template="digest", preset~, theme~, content~)
}
}
///|
pub fn render_story_variant(
theme~ : @theme.Theme,
content~ : TemplateContent,
) -> @scene.PosterDocument {
render_template(
template="editorial",
preset=@preset.PosterPreset::social_story(),
theme~,
content~,
)
}
///|
pub fn render_wide_variant(
theme~ : @theme.Theme,
content~ : TemplateContent,
) -> @scene.PosterDocument {
render_template(
template="digest",
preset=@preset.PosterPreset::youtube_thumbnail(),
theme~,
content~,
)
}