Fix up Rubinius specific library specs.
[rbx.git] / lib / rexml / formatters / transitive.rb
blob17eae11f301df623e9a45b39eb705f19bc87db1c
1 require 'rexml/formatters/pretty'
2 require 'rexml/formatters/transitive'
4 module REXML
5   module Formatters
6     # The Transitive formatter writes an XML document that parses to an
7     # identical document as the source document.  This means that no extra
8     # whitespace nodes are inserted, and whitespace within text nodes is
9     # preserved.  Within these constraints, the document is pretty-printed,
10     # with whitespace inserted into the metadata to introduce formatting.
11     #
12     # Note that this is only useful if the original XML is not already
13     # formatted.  Since this formatter does not alter whitespace nodes, the
14     # results of formatting already formatted XML will be odd.
15     class Transitive < Default
16       def initialize( indentation=2 )
17         @indentation = indentation
18         @level = 0
19       end
21       protected
22       def write_element( node, output )
23         output << "<#{node.expanded_name}"
25         node.attributes.each_attribute do |attr|
26           output << " "
27           attr.write( output )
28         end unless node.attributes.empty?
30         output << "\n"
31         output << ' '*@level
32         if node.children.empty?
33           output << "/" 
34         else
35           output << ">"
36           # If compact and all children are text, and if the formatted output
37           # is less than the specified width, then try to print everything on
38           # one line
39           skip = false
40           @level += @indentation
41           node.children.each { |child|
42             write( child, output )
43           }
44           @level -= @indentation
45           output << "</#{node.expanded_name}"
46           output << "\n"
47           output << ' '*@level
48         end
49         output << ">"
50       end
52       def write_text( node, output )
53         output << node.to_s()
54       end
55     end
56   end
57 end