#![allow(clippy::print_stdout)]
#[macro_use]
extern crate html5ever;
use brik::parse_html;
use brik::traits::*;
fn main() {
let html = r#"<!DOCTYPE html>
<html>
<head>
<title>Template Processing Example</title>
</head>
<body>
<h1>Product List</h1>
<div id="products">
<!-- In a real template system, these might be processed server-side -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="20" height="20">
<circle r="10" cx="10" cy="10"/>
</svg>
<p>Regular HTML content</p>
<svg xmlns="http://www.w3.org/2000/svg" class="icon" width="20" height="20">
<rect width="20" height="20"/>
</svg>
</div>
</body>
</html>"#;
let doc = parse_html().one(html);
println!("=== Template Processing Workflow ===\n");
println!("Step 1: Analyzing document structure");
let all_elements: Vec<_> = doc.descendants().elements().collect();
println!(" Total elements: {}", all_elements.len());
let svg_elements: Vec<_> = doc
.descendants()
.elements()
.elements_in_ns(ns!(svg))
.collect();
println!(
" SVG elements (template artifacts): {}\n",
svg_elements.len()
);
println!("Step 2: Processing template directives");
println!(" (In a real system, this would expand loops, conditionals, etc.)\n");
println!("Step 3: Removing template elements");
let svg_to_remove: Vec<_> = doc
.descendants()
.elements()
.elements_in_ns(ns!(svg))
.collect();
svg_to_remove
.into_iter()
.map(|elem| elem.as_node().clone())
.detach_all();
println!(" Removed SVG elements\n");
println!("Step 4: Cleaning up namespace declarations");
if let Ok(html_elem) = doc.select_first("html") {
html_elem
.attributes
.borrow_mut()
.remove_xmlns_for("http://www.w3.org/2000/svg");
println!(" Cleaned up xmlns declarations\n");
}
println!("Step 5: Verifying cleanup");
let remaining_svg: Vec<_> = doc
.descendants()
.elements()
.elements_in_ns(ns!(svg))
.collect();
println!(" Remaining SVG elements: {}", remaining_svg.len());
let remaining_elements: Vec<_> = doc.descendants().elements().collect();
println!(" Total remaining elements: {}\n", remaining_elements.len());
println!("Step 6: Generating clean HTML output");
let mut output = Vec::new();
doc.serialize(&mut output).unwrap();
let html_output = String::from_utf8(output).unwrap();
println!("---");
println!("{html_output}");
println!("---\n");
println!("✓ Template processing complete!");
println!(" Original: {} elements", all_elements.len());
println!(" Final: {} elements", remaining_elements.len());
println!(
" Removed: {} elements",
all_elements.len() - remaining_elements.len()
);
}