diff --git a/ChangeLog b/ChangeLog index 455dfa0345..2d09ca1e21 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sun Oct 28 14:59:14 2012 Kouhei Sutou + + * lib/rexml/document.rb (REXML::Document#write): Accept options + Hash as argument. + * test/rexml/test_document.rb: Add tests for the above change. + Sun Oct 28 14:09:44 2012 Kouhei Sutou * lib/rexml/document.rb (REXML::Document#write): Fix wrong usage diff --git a/lib/rexml/document.rb b/lib/rexml/document.rb index bbcc72fcca..6be13be4c5 100644 --- a/lib/rexml/document.rb +++ b/lib/rexml/document.rb @@ -144,6 +144,10 @@ module REXML xml_decl().stand_alone? end + # :call-seq: + # doc.write(output=$stdout, indent=-1, transtive=false, ie_hack=false) + # doc.write(options={:output => $stdout, :indent => -1, :transtive => false, :ie_hack => false}) + # # Write the XML tree out, optionally with indent. This writes out the # entire XML document, including XML declarations, doctype declarations, # and processing instructions (if any are given). @@ -154,15 +158,27 @@ module REXML # specified, because it adds unnecessary bandwidth to applications such # as XML-RPC. # - # See also the classes in the rexml/formatters package for the proper way - # to change the default formatting of XML output + # Accept Nth argument style and options Hash style as argument. + # The recommended style is options Hash style for one or more + # arguments case. # # _Examples_ # Document.new("").write # - # output_string = "" + # output = "" + # Document.new("").write(output) + # + # output = "" + # Document.new("").write(:output => output, :indent => 2) + # + # See also the classes in the rexml/formatters package for the proper way + # to change the default formatting of XML output. + # + # _Examples_ + # + # output = "" # tr = Transitive.new - # tr.write(Document.new(""), output_string) + # tr.write(Document.new(""), output) # # output:: # output an object which supports '<< string'; this is where the @@ -183,7 +199,23 @@ module REXML # unable to parse proper XML, we have to provide a hack to generate XML # that IE's limited abilities can handle. This hack inserts a space # before the /> on empty tags. Defaults to false - def write( output=$stdout, indent=-1, transitive=false, ie_hack=false ) + def write(*arguments) + if arguments.size == 1 and arguments[0].class == Hash + options = arguments[0] + + output = options[:output] + indent = options[:indent] + transitive = options[:transitive] + ie_hack = options[:ie_hack] + else + output, indent, transitive, ie_hack, = *arguments + end + + output ||= $stdout + indent ||= -1 + transitive = false if transitive.nil? + ie_hack = false if ie_hack.nil? + if xml_decl.encoding != 'UTF-8' && !output.kind_of?(Output) output = Output.new( output, xml_decl.encoding ) end diff --git a/test/rexml/test_document.rb b/test/rexml/test_document.rb index ab0b1e4e96..e8ca2e1c24 100644 --- a/test/rexml/test_document.rb +++ b/test/rexml/test_document.rb @@ -106,4 +106,99 @@ EOX doc = REXML::Document.new('') assert_equal('no', doc.stand_alone?, bug2539) end + + class WriteTest < Test::Unit::TestCase + def setup + @document = REXML::Document.new(<<-EOX) + +Hello world! +EOX + end + + class ArgumentsTest < self + def test_output + output = "" + @document.write(output) + assert_equal(<<-EOX, output) + +Hello world! +EOX + end + + def test_indent + output = "" + indent = 2 + @document.write(output, indent) + assert_equal(<<-EOX.chomp, output) + + + Hello world! + +EOX + end + + def test_transitive + output = "" + indent = 2 + transitive = true + @document.write(output, indent, transitive) + assert_equal(<<-EOX, output) + +Hello world! +EOX + end + + def test_ie_hack + output = "" + indent = -1 + transitive = false + ie_hack = true + document = REXML::Document.new("") + document.write(output, indent, transitive, ie_hack) + assert_equal("", output) + end + end + + class OptionsTest < self + def test_output + output = "" + @document.write(:output => output) + assert_equal(<<-EOX, output) + +Hello world! +EOX + end + + def test_indent + output = "" + @document.write(:output => output, :indent => 2) + assert_equal(<<-EOX.chomp, output) + + + Hello world! + +EOX + end + + def test_transitive + output = "" + @document.write(:output => output, :indent => 2, :transitive => true) + assert_equal(<<-EOX, output) + +Hello world! +EOX + end + + def test_ie_hack + output = "" + document = REXML::Document.new("") + document.write(:output => output, :ie_hack => true) + assert_equal("", output) + end + end + end end