#![cfg_attr(rustfmt, rustfmt::skip)]
#![allow(clippy::needless_borrow)]
pub fn render_card(out: &mut impl std::fmt::Write, title: &str, content: &str, content_html: &str) -> std::fmt::Result {
writeln!(out)?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "card")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "card-header")?; write!(out, "\"")?;
write!(out, " data-info")?; write!(out, "='")?; write!(out, "{{\"id\": \"card-header\", \"class\": \"card-header\"}}")?; write!(out, "'")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h3")?; write!(out, ">")?;
forme::html_escape(out, &(title))?;
write!(out, "</h3>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "card-body")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
if !content.is_empty() {
write!(out, "<p")?; write!(out, ">")?;
forme::html_escape(out, &(content))?;
write!(out, "</p>")?;
}
write!(out, "\n ")?;
if !content_html.is_empty() {
write!(out, "{}", &(content_html))?;
}
write!(out, "\n ")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "card-footer")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<small")?; write!(out, ">")?;
write!(out, "Component rendered")?;
write!(out, "</small>")?;
write!(out, " via tpl-template")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
writeln!(out)?;
write!(out, "</div>")?;
writeln!(out)?;
Ok(())
}
pub fn render_header(out: &mut impl std::fmt::Write, top_items: Vec<String>, menu_items: Vec<String>) -> std::fmt::Result {
writeln!(out)?;
write!(out, "<ul")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "top-items")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
for item in &top_items {
write!(out, "<li")?; write!(out, ">")?;
write!(out, "{}", &(item))?;
write!(out, "</li>")?;
}
writeln!(out)?;
write!(out, "</ul>")?;
writeln!(out, "\n")?;
write!(out, "<ul")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "menu")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
for item in &menu_items {
write!(out, "<li")?; write!(out, ">")?;
write!(out, "{}", &(item))?;
write!(out, "</li>")?;
}
writeln!(out)?;
write!(out, "</ul>")?;
writeln!(out)?;
Ok(())
}
pub fn render_list(out: &mut impl std::fmt::Write, children: Vec<String>) -> std::fmt::Result {
writeln!(out, "\n")?;
write!(out, "<h2")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "list-title")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "ListTitle")?;
write!(out, "</h2>")?;
writeln!(out)?;
write!(out, "<ul")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "list-component")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
for child in children {
write!(out, "<li")?; write!(out, ">")?;
write!(out, "{}", &(child))?;
write!(out, "</li>")?;
}
writeln!(out)?;
write!(out, "</ul>")?;
writeln!(out)?;
Ok(())
}
pub fn render_page(out: &mut impl std::fmt::Write) -> std::fmt::Result {
render_header(out, {
let mut out_v = Vec::new();
{
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<a")?;
write!(out, " href")?; write!(out, "=\"")?; write!(out, "/index.html")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "Home")?;
write!(out, "</a>")?;
write!(out, "\n ")?;
out_v.push(out_s);
}
{
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<a")?;
write!(out, " href")?; write!(out, "=\"")?; write!(out, "/account.html")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "Account")?;
write!(out, "</a>")?;
write!(out, "\n ")?;
out_v.push(out_s);
}
for section in &["about", "openings"] {
if section.contains("about") {
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<a")?;
write!(out, " href")?; write!(out, "=\"")?; forme::html_escape(out, &(format!("/{section}.html")))?; write!(out, "\"")?; write!(out, ">")?;
forme::html_escape(out, &(format!("{}", section.to_uppercase())))?;
write!(out, "</a>")?;
write!(out, "\n ")?;
if !out_s.is_empty() { out_v.push(out_s); }
}
}
if true {
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<a")?;
write!(out, " href")?; write!(out, "=\"")?; forme::html_escape(out, &(format!("/true_section.html")))?; write!(out, "\"")?; write!(out, ">")?;
forme::html_escape(out, &(format!("True Section")))?;
write!(out, "</a>")?;
write!(out, "\n ")?;
if !out_s.is_empty() { out_v.push(out_s); }
}
if false {
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<a")?;
write!(out, " href")?; write!(out, "=\"")?; forme::html_escape(out, &(format!("/false_section.html")))?; write!(out, "\"")?; write!(out, ">")?;
forme::html_escape(out, &(format!("False Section")))?;
write!(out, "</a>")?;
write!(out, "\n ")?;
if !out_s.is_empty() { out_v.push(out_s); }
}
out_v
}
,
{
let mut out_v = Vec::new();
{
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<a")?;
write!(out, " href")?; write!(out, "=\"")?; write!(out, "/index.html")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "Home")?;
write!(out, "</a>")?;
write!(out, "\n ")?;
out_v.push(out_s);
}
{
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<a")?;
write!(out, " href")?; write!(out, "=\"")?; write!(out, "/account.html")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "Account")?;
write!(out, "</a>")?;
write!(out, "\n ")?;
out_v.push(out_s);
}
out_v
}
)?;
writeln!(out)?;
Ok(())
}
#[allow(clippy::too_many_arguments)]
pub fn render_showcase(out: &mut impl std::fmt::Write, title: &str, show_header: bool, items: &[super::types::Item], user: Option<&super::types::User>, status: &str, id: u32, is_enabled: bool, is_readonly: bool, input_value: &str, is_active: bool) -> std::fmt::Result {
write!(out, "<!DOCTYPE html>")?;
writeln!(out)?;
write!(out, "<html")?;
write!(out, " lang")?; write!(out, "=\"")?; write!(out, "en")?; write!(out, "\"")?; write!(out, ">")?;
writeln!(out)?;
write!(out, "<head")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<meta")?;
write!(out, " charset")?; write!(out, "=\"")?; write!(out, "UTF-8")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<meta")?;
write!(out, " content")?; write!(out, "=\"")?; write!(out, "width=device-width, initial-scale=1.0")?; write!(out, "\"")?;
write!(out, " name")?; write!(out, "=\"")?; write!(out, "viewport")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<title")?; write!(out, ">")?;
forme::html_escape(out, &(title))?;
write!(out, "</title>")?;
write!(out, "\n ")?;
write!(out, "<link")?;
write!(out, " href")?; write!(out, "=\"")?; write!(out, "showcase.css")?; write!(out, "\"")?;
write!(out, " rel")?; write!(out, "=\"")?; write!(out, "stylesheet")?; write!(out, "\"")?; write!(out, ">")?;
writeln!(out)?;
write!(out, "</head>")?;
writeln!(out)?;
write!(out, "<body")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "container")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n\n ")?;
if show_header {
write!(out, "<header")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h1")?; write!(out, ">")?;
forme::html_escape(out, &(title))?;
write!(out, "</h1>")?;
write!(out, "\n ")?;
write!(out, "<nav")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<ul")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<li")?; write!(out, ">")?;
write!(out, "<a")?;
write!(out, " href")?; write!(out, "=\"")?; write!(out, "/")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "Home")?;
write!(out, "</a>")?;
write!(out, "</li>")?;
write!(out, "\n ")?;
write!(out, "<li")?; write!(out, ">")?;
write!(out, "<a")?;
write!(out, " href")?; write!(out, "=\"")?; write!(out, "/about")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "About")?;
write!(out, "</a>")?;
write!(out, "</li>")?;
write!(out, "\n ")?;
write!(out, "<li")?; write!(out, ">")?;
write!(out, "<a")?;
write!(out, " href")?; write!(out, "=\"")?; write!(out, "/contact")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "Contact")?;
write!(out, "</a>")?;
write!(out, "</li>")?;
write!(out, "\n ")?;
write!(out, "</ul>")?;
write!(out, "\n ")?;
write!(out, "</nav>")?;
write!(out, "\n ")?;
write!(out, "</header>")?;
}
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "welcome")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Welcome Message")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
forme::html_escape(out, &(format!("Welcome to {}! This page demonstrates all template features.", title)))?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "dynamic-attributes")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Dynamic Attributes")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; forme::html_escape(out, &(format!("card status-{}", status)))?; write!(out, "\"")?;
write!(out, " id")?; write!(out, "=\"")?; forme::html_escape(out, &(format!("card-{}", id)))?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
write!(out, "This div has dynamically generated class and id attributes")?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
forme::html_escape(out, &(format!("ID: {}, Status: {}", id, status)))?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "optional-attributes")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Optional Attributes")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
write!(out, "<button")?;
if !is_enabled {
write!(out, " disabled")?;
}
write!(out, ">")?;
write!(out, "\n Click me (disabled based on condition)\n ")?;
write!(out, "</button>")?;
write!(out, "\n ")?;
write!(out, "<button")?;
if is_enabled {
write!(out, " disabled")?;
}
write!(out, ">")?;
write!(out, "\n Click me (disaabled based on reversed condition)\n ")?;
write!(out, "</button>")?;
write!(out, "\n ")?;
write!(out, "<input")?;
if is_readonly {
write!(out, " readonly")?;
}
write!(out, " type")?; write!(out, "=\"")?; write!(out, "text")?; write!(out, "\"")?;
write!(out, " value")?; write!(out, "=\"")?; forme::html_escape(out, &(input_value))?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "items-list")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Items List (tpl-repeat directive)")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
if items.len() > 0 {
write!(out, "<div")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<ul")?; write!(out, ">")?;
write!(out, "\n ")?;
for (idx, item) in items.iter().enumerate() {
write!(out, "<li")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<span")?; write!(out, ">")?;
forme::html_escape(out, &(format!("{}. {}", idx + 1, item.name)))?;
write!(out, "</span>")?;
write!(out, "\n ")?;
if item.in_stock {
write!(out, "<span")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "badge in-stock")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "✓ In Stock")?;
write!(out, "</span>")?;
}
write!(out, "\n ")?;
if !item.in_stock {
write!(out, "<span")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "badge out-of-stock")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "✗ Out of Stock")?;
write!(out, "</span>")?;
}
write!(out, "\n ")?;
write!(out, "<span")?; write!(out, ">")?;
forme::html_escape(out, &(format!(" - ${:.2}", item.price)))?;
write!(out, "</span>")?;
write!(out, "\n ")?;
write!(out, "</li>")?;
}
write!(out, "\n ")?;
write!(out, "</ul>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
}
write!(out, "\n ")?;
if items.len() == 0 {
write!(out, "<p")?; write!(out, ">")?;
write!(out, "No items available")?;
write!(out, "</p>")?;
}
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "user-section")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "User Information")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
if user.is_some() {
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "user")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
for u in user.iter() {
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "user_card")?; write!(out, "\"")?; write!(out, ">")?;
render_card(out, &u.name,
"",
&({
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
write!(out, "<strong")?; write!(out, ">")?;
write!(out, "Username:")?;
write!(out, "</strong>")?;
write!(out, " ")?;
write!(out, "<span")?; write!(out, ">")?;
forme::html_escape(out, &(u.name))?;
write!(out, "</span>")?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
write!(out, "<strong")?; write!(out, ">")?;
write!(out, "User ID:")?;
write!(out, "</strong>")?;
write!(out, " ")?;
write!(out, "<span")?; write!(out, ">")?;
forme::html_escape(out, &(u.id.to_string()))?;
write!(out, "</span>")?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
write!(out, "<strong")?; write!(out, ">")?;
write!(out, "Email:")?;
write!(out, "</strong>")?;
write!(out, " ")?;
write!(out, "<span")?; write!(out, ">")?;
forme::html_escape(out, &(u.email))?;
write!(out, "</span>")?;
write!(out, "</p>")?;
write!(out, "\n ")?;
if u.is_admin {
write!(out, "<div")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<span")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "badge admin-badge")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "Administrator")?;
write!(out, "</span>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
}
write!(out, "\n ")?;
if !u.is_admin {
write!(out, "<div")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<span")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "badge user-badge")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "Regular User")?;
write!(out, "</span>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
}
write!(out, "\n ")?;
out_s
})
)?;
write!(out, "</div>")?;
}
write!(out, "\n ")?;
write!(out, "</div>")?;
}
write!(out, "\n ")?;
if user.is_none() {
write!(out, "<div")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<p")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "warning")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "Please log in to see user information")?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
}
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "nested-template")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Nested Template Component")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
write!(out, "<div")?; write!(out, ">")?;
render_card(out, "Card Title",
"This is content from the card component",
"" )?;
write!(out, "</div>")?;
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "multiple-components")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Multiple Component Instances")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "cards-grid")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
for item in items.iter().take(3) {
write!(out, "<div")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<div")?; write!(out, ">")?;
render_card(out, &item.name,
&format!("Price: ${:.2}", item.price),
"" )?;
write!(out, "</div>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
}
write!(out, "\n ")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "complex-expressions")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Complex Expressions")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; forme::html_escape(out, &(format!("status-{}", if is_active { "active" } else { "inactive" })))?; write!(out, "\"")?;
write!(out, " data-count")?; write!(out, "=\"")?; forme::html_escape(out, &(items.len().to_string()))?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
forme::html_escape(out, &(format!("Total items: {}", items.len())))?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
forme::html_escape(out, &(format!("Status: {}", if show_header { "Full Mode" } else { "Compact Mode" })))?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "void-elements")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Self-closing Elements")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
write!(out, "<img")?;
write!(out, " alt")?; write!(out, "=\"")?; forme::html_escape(out, &(user.as_ref().map(|u| u.name.as_str()).unwrap_or("Guest")))?; write!(out, "\"")?;
write!(out, " height")?; write!(out, "=\"")?; write!(out, "100")?; write!(out, "\"")?;
write!(out, " src")?; write!(out, "=\"")?; forme::html_escape(out, &(format!("/images/user-{}.jpg", user.as_ref().map(|u| u.id).unwrap_or(0))))?; write!(out, "\"")?;
write!(out, " width")?; write!(out, "=\"")?; write!(out, "100")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<br")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<input")?;
if user.as_ref().map(|u| u.is_admin).unwrap_or(false) {
write!(out, " checked")?;
}
write!(out, " id")?; write!(out, "=\"")?; write!(out, "admin-check")?; write!(out, "\"")?;
write!(out, " type")?; write!(out, "=\"")?; write!(out, "checkbox")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<label")?;
write!(out, " for")?; write!(out, "=\"")?; write!(out, "admin-check")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "Is Admin")?;
write!(out, "</label>")?;
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "combined-features")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Combined Features Demo")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
if show_header {
write!(out, "<div")?; write!(out, ">")?;
write!(out, "\n ")?;
for item in items.iter().filter(|i| i.in_stock) {
write!(out, "<div")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; forme::html_escape(out, &(format!("product-card product-{}", item.id)))?; write!(out, "\"")?;
if item.is_featured {
write!(out, " data-featured")?;
}
write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h3")?; write!(out, ">")?;
forme::html_escape(out, &(item.name))?;
write!(out, "</h3>")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
forme::html_escape(out, &(format!("${:.2}", item.price)))?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "<button")?;
if !item.in_stock {
write!(out, " disabled")?;
}
write!(out, ">")?;
write!(out, "Add to Cart")?;
write!(out, "</button>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
}
write!(out, "\n ")?;
write!(out, "</div>")?;
}
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "childrens-as-args")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Combined Features Demo")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
if show_header {
write!(out, "<div")?; write!(out, ">")?;
write!(out, "\n ")?;
render_list(out, {
let mut out_v = Vec::new();
{
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
render_list(out, {
let mut out_v = Vec::new();
{
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<div")?; write!(out, ">")?;
write!(out, "nested 1")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
out_v.push(out_s);
}
{
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<div")?; write!(out, ">")?;
write!(out, "nested 2")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
out_v.push(out_s);
}
out_v
}
)?;
write!(out, "\n ")?;
out_v.push(out_s);
}
{
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<div")?; write!(out, ">")?;
write!(out, "a")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
out_v.push(out_s);
}
{
use std::fmt::Write;
let mut out_s = String::new();
let out = &mut out_s;
write!(out, "\n ")?;
write!(out, "<div")?; write!(out, ">")?;
write!(out, "b")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
out_v.push(out_s);
}
out_v
}
)?;
write!(out, "\n ")?;
write!(out, "</div>")?;
}
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<footer")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
write!(out, "Template System Showcase - All features demonstrated")?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
forme::html_escape(out, &(format!("Rendered with {} items", items.len())))?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "</footer>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
writeln!(out)?;
write!(out, "</body>")?;
writeln!(out)?;
write!(out, "</html>")?;
writeln!(out)?;
Ok(())
}
pub fn render_simple(out: &mut impl std::fmt::Write) -> std::fmt::Result {
write!(out, "<!DOCTYPE html>")?;
writeln!(out)?;
write!(out, "<html")?;
write!(out, " lang")?; write!(out, "=\"")?; write!(out, "en")?; write!(out, "\"")?; write!(out, ">")?;
writeln!(out)?;
write!(out, "<head")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<meta")?;
write!(out, " charset")?; write!(out, "=\"")?; write!(out, "UTF-8")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<meta")?;
write!(out, " content")?; write!(out, "=\"")?; write!(out, "width=device-width, initial-scale=1.0")?; write!(out, "\"")?;
write!(out, " name")?; write!(out, "=\"")?; write!(out, "viewport")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<title")?; write!(out, ">")?;
write!(out, "Simple Template Example")?;
write!(out, "</title>")?;
write!(out, "\n ")?;
write!(out, "<link")?;
write!(out, " href")?; write!(out, "=\"")?; write!(out, "simple.css")?; write!(out, "\"")?;
write!(out, " rel")?; write!(out, "=\"")?; write!(out, "stylesheet")?; write!(out, "\"")?; write!(out, ">")?;
writeln!(out)?;
write!(out, "</head>")?;
writeln!(out)?;
write!(out, "<body")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "container")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h1")?; write!(out, ">")?;
write!(out, "Template System Example")?;
write!(out, "</h1>")?;
write!(out, "\n \n ")?;
write!(out, "<section")?; write!(out, ">")?;
write!(out, "</section>")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Welcome Message")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
write!(out, "This is a simple HTML template that demonstrates the basic structure.")?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "<section")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Features")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
write!(out, "<ul")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<li")?; write!(out, ">")?;
write!(out, "Static HTML generation")?;
write!(out, "</li>")?;
write!(out, "\n ")?;
write!(out, "<li")?; write!(out, ">")?;
write!(out, "Template-based rendering")?;
write!(out, "</li>")?;
write!(out, "\n ")?;
write!(out, "<li")?; write!(out, ">")?;
write!(out, "Rust code generation")?;
write!(out, "</li>")?;
write!(out, "\n ")?;
write!(out, "</ul>")?;
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n\n ")?;
write!(out, "<section")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h2")?; write!(out, ">")?;
write!(out, "Sample Content")?;
write!(out, "</h2>")?;
write!(out, "\n ")?;
write!(out, "<div")?;
write!(out, " class")?; write!(out, "=\"")?; write!(out, "card")?; write!(out, "\"")?; write!(out, ">")?;
write!(out, "\n ")?;
write!(out, "<h3")?; write!(out, ">")?;
write!(out, "Card Title")?;
write!(out, "</h3>")?;
write!(out, "\n ")?;
write!(out, "<p")?; write!(out, ">")?;
write!(out, "This is a sample card with some content.")?;
write!(out, "</p>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
write!(out, "\n ")?;
write!(out, "</section>")?;
write!(out, "\n ")?;
write!(out, "</div>")?;
writeln!(out)?;
write!(out, "</body>")?;
writeln!(out)?;
write!(out, "</html>")?;
Ok(())
}