Dump.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include <LibHTML/CSS/StyleSheet.h>
  2. #include <LibHTML/DOM/Document.h>
  3. #include <LibHTML/DOM/Element.h>
  4. #include <LibHTML/DOM/Text.h>
  5. #include <LibHTML/Dump.h>
  6. #include <LibHTML/Layout/LayoutNode.h>
  7. #include <LibHTML/Layout/LayoutText.h>
  8. #include <stdio.h>
  9. void dump_tree(const Node& node)
  10. {
  11. static int indent = 0;
  12. for (int i = 0; i < indent; ++i)
  13. printf(" ");
  14. if (node.is_document()) {
  15. printf("*Document*\n");
  16. } else if (node.is_element()) {
  17. printf("<%s", static_cast<const Element&>(node).tag_name().characters());
  18. static_cast<const Element&>(node).for_each_attribute([](auto& name, auto& value) {
  19. printf(" %s=%s", name.characters(), value.characters());
  20. });
  21. printf(">\n");
  22. } else if (node.is_text()) {
  23. printf("\"%s\"\n", static_cast<const Text&>(node).data().characters());
  24. }
  25. ++indent;
  26. if (node.is_parent_node()) {
  27. static_cast<const ParentNode&>(node).for_each_child([](auto& child) {
  28. dump_tree(child);
  29. });
  30. }
  31. --indent;
  32. }
  33. void dump_tree(const LayoutNode& layout_node)
  34. {
  35. static int indent = 0;
  36. for (int i = 0; i < indent; ++i)
  37. printf(" ");
  38. String tag_name;
  39. if (layout_node.is_anonymous())
  40. tag_name = "(anonymous)";
  41. else if (layout_node.node()->is_text())
  42. tag_name = "#text";
  43. else if (layout_node.node()->is_document())
  44. tag_name = "#document";
  45. else if (layout_node.node()->is_element())
  46. tag_name = static_cast<const Element&>(*layout_node.node()).tag_name();
  47. else
  48. tag_name = "???";
  49. printf("%s {%s} at (%d,%d) size %dx%d",
  50. layout_node.class_name(),
  51. tag_name.characters(),
  52. layout_node.rect().x(),
  53. layout_node.rect().y(),
  54. layout_node.rect().width(),
  55. layout_node.rect().height());
  56. if (layout_node.is_text())
  57. printf(" \"%s\"", static_cast<const LayoutText&>(layout_node).text().characters());
  58. printf("\n");
  59. ++indent;
  60. layout_node.for_each_child([](auto& child) {
  61. dump_tree(child);
  62. });
  63. --indent;
  64. }
  65. void dump_sheet(const StyleSheet& sheet)
  66. {
  67. printf("StyleSheet{%p}: %d rule(s)\n", &sheet, sheet.rules().size());
  68. }