From 091d56d4411ce2f21c7808b6756cae9b18786b5b Mon Sep 17 00:00:00 2001 From: tempest Date: Tue, 17 Jun 2025 00:13:55 -0600 Subject: Properly handle void tags --- src/render.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/render.rs b/src/render.rs index 73e1a5e..691f778 100644 --- a/src/render.rs +++ b/src/render.rs @@ -33,6 +33,11 @@ pub enum RenderNode { Null, } +const VOID_TAGS: [&str; 14] = [ + "area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", + "track", "wbr", +]; + impl RenderNode { pub(crate) fn render_to_string(self) -> Pin>> { match self { @@ -76,8 +81,18 @@ impl RenderNode { .map(|child| child.render_to_string()) .collect::>()).await.join(""); - format!("<{name}{text_attributes}>{rendered_children}") + let is_void = VOID_TAGS.iter().any(|&s| s == name); + let has_children = rendered_children.trim() != ""; + + if has_children && is_void { + eprintln!("WARN: <{name}/> is a void tag, and should not have children"); + } + if !has_children && is_void { + format!("<{name}{text_attributes}/>") + } else { + format!("<{name}{text_attributes}>{rendered_children}") + } }) }, RenderNode::Fragment { children } => { -- cgit 1.4.1