@@ -11,63 +11,70 @@ module Formatters
1111class XML
1212include Goliath ::Rack ::AsyncMiddleware
1313
14+ def initialize ( app , opts = { } )
15+ @app = app
16+ @opts = opts
17+ @opts [ :root ] ||= 'results'
18+ @opts [ :item ] ||= 'item'
19+ end
20+
1421def post_process ( env , status , headers , body )
15- body = [ to_xml ( body , false ) ] if xml_response? ( headers )
22+ if xml_response? ( headers )
23+ body = [ to_xml ( body ) ]
24+ end
1625[ status , headers , body ]
1726end
1827
1928def xml_response? ( headers )
2029headers [ 'Content-Type' ] =~ %r{^application/xml}
2130end
2231
23- def to_xml ( content , fragment = true , root = 'results' , item = 'item' )
32+ def to_xml ( content , fragment = false )
2433xml_string = ''
25- xml_string += xml_header ( root ) unless fragment
34+ xml_string << xml_header ( @opts [ : root] ) unless fragment
2635
27- xml_string += case ( content . class . to_s )
28- when "Hash" then hash_to_xml ( content , root , item )
29- when "Array" then array_to_xml ( content , root , item )
36+ xml_string << case ( content . class . to_s )
37+ when "Hash" then hash_to_xml ( content )
38+ when "Array" then array_to_xml ( content , @opts [ : item] )
3039when "String" then string_to_xml ( content )
3140else string_to_xml ( content )
3241end
3342
34- xml_string += xml_footer ( root ) unless fragment
43+ xml_string << xml_footer ( @opts [ : root] ) unless fragment
3544xml_string
3645end
3746
3847def string_to_xml ( content )
3948 ::Rack ::Utils . escape_html ( content . to_s )
4049end
4150
42- def hash_to_xml ( content , root = 'results' , item = 'item' )
51+ def hash_to_xml ( content )
4352xml_string = ''
4453if content . key? ( 'meta' )
45- xml_string += xml_item ( 'meta' , content [ 'meta' ] , root )
54+ xml_string += xml_item ( 'meta' , content [ 'meta' ] )
4655content . delete ( 'meta' )
4756end
4857
49- content . each_pair { |key , value | xml_string += xml_item ( key , value , root ) }
58+ content . each_pair { |key , value | xml_string << xml_item ( key , value ) }
5059xml_string
5160end
5261
53- def array_to_xml ( content , root = 'results' , item = 'item' )
62+ def array_to_xml ( content , item = 'item' )
5463xml_string = ''
55- content . each { |value | xml_string += xml_item ( item , value , root ) }
64+ content . each { |value | xml_string << xml_item ( item , value ) }
5665xml_string
5766end
5867
5968def xml_header ( root )
60- "<?xml version=\" 1.0\" encoding=\" UTF-8\" ?>\n " +
61- "<#{ root } xmlns:opensearch='http://a9.com/-/spec/opensearch/1.1/'\n " +
62- " xmlns:postrank='http://www.postrank.com/xsd/2007-11-30/postrank'>\n "
69+ "<?xml version=\" 1.0\" encoding=\" UTF-8\" ?>\n <#{ root } >"
6370end
6471
6572def xml_footer ( root )
6673"</#{ root } >"
6774end
6875
69- def xml_item ( key , value , root )
70- "<#{ key } >#{ to_xml ( value , true , root ) } </#{ key } >\n "
76+ def xml_item ( key , value )
77+ "<#{ key } >#{ to_xml ( value , true ) } </#{ key } >\n "
7178end
7279end
7380end
0 commit comments