vdomdisplay.rs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. use crate::innerlude::*;
  2. pub(crate) struct ScopeRenderer<'a> {
  3. pub skip_components: bool,
  4. pub show_fragments: bool,
  5. pub _scope: &'a Scope,
  6. pub _pre_render: bool,
  7. pub _newline: bool,
  8. pub _indent: bool,
  9. pub _max_depth: usize,
  10. }
  11. // this is more or less a debug tool, but it'll render the entire tree to the terminal
  12. impl<'a> ScopeRenderer<'a> {
  13. pub fn render(
  14. &self,
  15. vdom: &VirtualDom,
  16. node: &VNode,
  17. f: &mut std::fmt::Formatter,
  18. il: u16,
  19. ) -> std::fmt::Result {
  20. const INDENT: &str = " ";
  21. let write_indent = |_f: &mut std::fmt::Formatter, le| {
  22. for _ in 0..le {
  23. write!(_f, "{}", INDENT).unwrap();
  24. }
  25. };
  26. match &node {
  27. VNode::Text(text) => {
  28. write_indent(f, il);
  29. write!(f, "\"{}\"\n", text.text)?
  30. }
  31. VNode::Anchor(anchor) => {
  32. write_indent(f, il);
  33. write!(f, "Anchor {{}}\n")?;
  34. }
  35. VNode::Element(el) => {
  36. write_indent(f, il);
  37. write!(f, "{} {{\n", el.tag_name)?;
  38. // write!(f, "element: {}", el.tag_name)?;
  39. let mut attr_iter = el.attributes.iter().peekable();
  40. while let Some(attr) = attr_iter.next() {
  41. match attr.namespace {
  42. None => {
  43. //
  44. write_indent(f, il + 1);
  45. write!(f, "{}: \"{}\"\n", attr.name, attr.value)?
  46. }
  47. Some(ns) => {
  48. // write the opening tag
  49. write_indent(f, il + 1);
  50. write!(f, " {}:\"", ns)?;
  51. let mut cur_ns_el = attr;
  52. 'ns_parse: loop {
  53. write!(f, "{}:{};", cur_ns_el.name, cur_ns_el.value)?;
  54. match attr_iter.peek() {
  55. Some(next_attr) if next_attr.namespace == Some(ns) => {
  56. cur_ns_el = attr_iter.next().unwrap();
  57. }
  58. _ => break 'ns_parse,
  59. }
  60. }
  61. // write the closing tag
  62. write!(f, "\"")?;
  63. }
  64. }
  65. }
  66. for child in el.children {
  67. self.render(vdom, child, f, il + 1)?;
  68. }
  69. write_indent(f, il);
  70. write!(f, "}}\n")?;
  71. }
  72. VNode::Fragment(frag) => {
  73. if self.show_fragments {
  74. write_indent(f, il);
  75. write!(f, "Fragment {{\n")?;
  76. for child in frag.children {
  77. self.render(vdom, child, f, il + 1)?;
  78. }
  79. write_indent(f, il);
  80. write!(f, "}}\n")?;
  81. } else {
  82. for child in frag.children {
  83. self.render(vdom, child, f, il)?;
  84. }
  85. }
  86. }
  87. VNode::Component(vcomp) => {
  88. let idx = vcomp.associated_scope.get().unwrap();
  89. if !self.skip_components {
  90. let new_node = vdom.get_scope(idx).unwrap().root_node();
  91. self.render(vdom, new_node, f, il)?;
  92. }
  93. }
  94. VNode::Suspended { .. } => {
  95. // we can't do anything with suspended nodes
  96. }
  97. }
  98. Ok(())
  99. }
  100. }