diff --git a/src/xml/attributes.cr b/src/xml/attributes.cr index 1df5aea55483..7a91c619eeb2 100644 --- a/src/xml/attributes.cr +++ b/src/xml/attributes.cr @@ -69,6 +69,10 @@ class XML::Attributes to_s(io) end + def pretty_print(pp : PrettyPrint) : Nil + pp.list("[", self, "]") + end + protected def props @node.to_unsafe.value.properties end diff --git a/src/xml/namespace.cr b/src/xml/namespace.cr index e59f1c756af7..78553011a725 100644 --- a/src/xml/namespace.cr +++ b/src/xml/namespace.cr @@ -39,4 +39,30 @@ class XML::Namespace def inspect(io : IO) : Nil to_s io end + + def pretty_print(pp : PrettyPrint) : Nil + pp.surround("#", left_break: nil, right_break: nil) do + if prefix = self.prefix + pp.breakable + pp.group do + pp.text "prefix=" + pp.nest do + pp.breakable "" + prefix.pretty_print(pp) + end + end + end + + if href = self.href + pp.breakable + pp.group do + pp.text "href=" + pp.nest do + pp.breakable "" + href.pretty_print(pp) + end + end + end + end + end end diff --git a/src/xml/node.cr b/src/xml/node.cr index 45878e762b0f..781e567168d4 100644 --- a/src/xml/node.cr +++ b/src/xml/node.cr @@ -165,33 +165,7 @@ class XML::Node # Returns detailed information for this node including node type, name, attributes and children. def inspect(io : IO) : Nil - io << "#' end + def pretty_print(pp : PrettyPrint) : Nil + pp.surround("#", left_break: nil, right_break: nil) do + if text? + pp.breakable + content.pretty_print(pp) + else + unless document? + pp.breakable + pp.group do + pp.text "name=" + pp.nest do + pp.breakable "" + name.pretty_print(pp) + end + end + end + + if attribute? + pp.breakable + pp.group do + pp.text "content=" + pp.nest do + pp.breakable "" + content.pretty_print(pp) + end + end + else + attributes = self.attributes + unless attributes.empty? + pp.breakable + pp.group do + pp.text "attributes=" + pp.nest do + pp.breakable "" + attributes.pretty_print(pp) + end + end + end + + children = self.children + unless children.empty? + pp.breakable + pp.group do + pp.text "children=" + pp.nest do + pp.breakable "" + children.pretty_print(pp) + end + end + end + end + end + end + end + + private def type_name + case type + when XML::Node::Type::NONE then "None" + when XML::Node::Type::ELEMENT_NODE then "Element" + when XML::Node::Type::ATTRIBUTE_NODE then "Attribute" + when XML::Node::Type::TEXT_NODE then "Text" + when XML::Node::Type::CDATA_SECTION_NODE then "CData" + when XML::Node::Type::ENTITY_REF_NODE then "EntityRef" + when XML::Node::Type::ENTITY_NODE then "Entity" + when XML::Node::Type::PI_NODE then "ProcessingInstruction" + when XML::Node::Type::COMMENT_NODE then "Comment" + when XML::Node::Type::DOCUMENT_NODE then "Document" + when XML::Node::Type::DOCUMENT_TYPE_NODE then "DocumentType" + when XML::Node::Type::DOCUMENT_FRAG_NODE then "DocumentFragment" + when XML::Node::Type::NOTATION_NODE then "Notation" + when XML::Node::Type::HTML_DOCUMENT_NODE then "HTMLDocument" + when XML::Node::Type::DTD_NODE then "DTD" + when XML::Node::Type::ELEMENT_DECL then "Element" + when XML::Node::Type::ATTRIBUTE_DECL then "AttributeDecl" + when XML::Node::Type::ENTITY_DECL then "EntityDecl" + when XML::Node::Type::NAMESPACE_DECL then "NamespaceDecl" + when XML::Node::Type::XINCLUDE_START then "XIncludeStart" + when XML::Node::Type::XINCLUDE_END then "XIncludeEnd" + when XML::Node::Type::DOCB_DOCUMENT_NODE then "DOCBDocument" + end + end + # Returns the next sibling node or `nil` if not found. def next : XML::Node? next_node = @node.value.next diff --git a/src/xml/node_set.cr b/src/xml/node_set.cr index 0263facbfd55..8f6a8a3474e4 100644 --- a/src/xml/node_set.cr +++ b/src/xml/node_set.cr @@ -37,6 +37,10 @@ class XML::NodeSet io << ']' end + def pretty_print(pp : PrettyPrint) : Nil + pp.list("[", self, "]") + end + def size : Int32 @set.value.node_nr end