use crate::html::{escape_html, SafeHtml};
use crate::tag::Tag;
use maud::{Markup, PreEscaped, Render};
impl Render for SafeHtml {
fn render_to(&self, buffer: &mut String) {
buffer.push_str(self.as_str());
}
}
impl Render for Tag<'_> {
fn render_to(&self, buffer: &mut String) {
buffer.push_str(self.to_html().as_str());
}
}
pub fn element(name: &str, attrs: &SafeHtml, content: impl Render) -> Markup {
let valid = !name.is_empty()
&& name.starts_with(|c: char| c.is_ascii_alphabetic())
&& name.chars().all(|c| c.is_ascii_alphanumeric() || c == '-');
let content = content.render().into_string();
if !valid {
return PreEscaped(content);
}
let name = escape_html(name);
let space = if attrs.is_empty() { "" } else { " " };
PreEscaped(format!("<{name}{space}{attrs}>{content}</{name}>"))
}