1
0

render_template.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. use dioxus_core::{Template, TemplateAttribute, TemplateNode};
  2. use std::fmt::Write;
  3. /// Render a template to an HTML string
  4. ///
  5. /// Useful for sending over the wire. Can be used to with innerHtml to create templates with little work
  6. pub fn render_template_to_html(template: &Template) -> String {
  7. let mut out = String::new();
  8. for root in template.roots {
  9. render_template_node(root, &mut out).unwrap();
  10. }
  11. out
  12. }
  13. fn render_template_node(node: &TemplateNode, out: &mut String) -> std::fmt::Result {
  14. match node {
  15. TemplateNode::Element {
  16. tag,
  17. attrs,
  18. children,
  19. ..
  20. } => {
  21. write!(out, "<{tag}")?;
  22. for attr in *attrs {
  23. if let TemplateAttribute::Static { name, value, .. } = attr {
  24. write!(out, "{name}=\"{value}\"")?;
  25. }
  26. }
  27. for child in *children {
  28. render_template_node(child, out)?;
  29. }
  30. write!(out, "</{tag}>")?;
  31. }
  32. TemplateNode::Text { text: t } => write!(out, "{t}")?,
  33. TemplateNode::Dynamic { id: _ } => write!(out, "<pre hidden />")?,
  34. TemplateNode::DynamicText { id: t } => write!(out, "<!-- --> {t} <!-- -->")?,
  35. };
  36. Ok(())
  37. }