88 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| module Oga
 | |
|   module XML
 | |
|     ##
 | |
|     # Class used for storing information about an entire XML document. This
 | |
|     # includes the doctype, XML declaration, child nodes and more.
 | |
|     #
 | |
|     # @!attribute [rw] children
 | |
|     #  The child nodes of the document.
 | |
|     #  @return [Array]
 | |
|     #
 | |
|     # @!attribute [rw] doctype
 | |
|     #  The doctype of the document.
 | |
|     #  @return [Oga::XML::Doctype]
 | |
|     #
 | |
|     # @!attribute [rw] xml_declaration
 | |
|     #  The XML declaration of the document.
 | |
|     #  @return [Oga::XML::XmlDeclaration]
 | |
|     #
 | |
|     class Document
 | |
|       attr_accessor :children, :doctype, :xml_declaration
 | |
| 
 | |
|       ##
 | |
|       # @param [Hash] options
 | |
|       #
 | |
|       # @option options [Array] :children
 | |
|       # @option options [Oga::XML::Doctype] :doctype
 | |
|       # @option options [Oga::XML::XmlDeclaration] :xml_declaration
 | |
|       #
 | |
|       def initialize(options = {})
 | |
|         @children        = options[:children] || []
 | |
|         @doctype         = options[:doctype]
 | |
|         @xml_declaration = options[:xml_declaration]
 | |
|       end
 | |
| 
 | |
|       ##
 | |
|       # Converts the document and its child nodes to XML.
 | |
|       #
 | |
|       # @return [String]
 | |
|       #
 | |
|       def to_xml
 | |
|         xml = children.map(&:to_xml).join('')
 | |
| 
 | |
|         if doctype
 | |
|           xml = doctype.to_xml + "\n" + xml.strip
 | |
|         end
 | |
| 
 | |
|         if xml_declaration
 | |
|           xml = xml_declaration.to_xml + "\n" + xml.strip
 | |
|         end
 | |
| 
 | |
|         return xml
 | |
|       end
 | |
| 
 | |
|       ##
 | |
|       # Inspects the document and its child nodes. Child nodes are indented for
 | |
|       # each nesting level.
 | |
|       #
 | |
|       # @return [String]
 | |
|       #
 | |
|       def inspect
 | |
|         class_name  = self.class.to_s.split('::').last
 | |
|         child_lines = children.map { |child| child.inspect(4) }.join("\n")
 | |
| 
 | |
|         if doctype
 | |
|           dtd = doctype.inspect(2)
 | |
|         else
 | |
|           dtd = doctype.inspect
 | |
|         end
 | |
| 
 | |
|         if xml_declaration
 | |
|           decl = xml_declaration.inspect(2)
 | |
|         else
 | |
|           decl = xml_declaration.inspect
 | |
|         end
 | |
| 
 | |
|         return <<-EOF.strip
 | |
| #{class_name}(
 | |
|   doctype: #{dtd}
 | |
|   xml_declaration: #{decl}
 | |
|   children: [
 | |
| #{child_lines}
 | |
| ])
 | |
|         EOF
 | |
|       end
 | |
|     end # Document
 | |
|   end # XML
 | |
| end # Oga
 |