diff --git a/ChangeLog b/ChangeLog index 80ae14e802..a1a5f4fde3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Sat Nov 3 12:49:45 2012 Kouhei Sutou + + * lib/rexml/document.rb (REXML::Document#write): Document encoding + option. Now different encoding between XML file's encoding and + XML declaration's encodiong is support. + [Feature #4872] (work in progress) + * lib/rexml/xmldecl.rb (REXML::XMLDecl#write): Always use XMLDecl's + encoding. + * test/rexml/test_document.rb: Update tests for the above change. + Sat Nov 3 12:36:35 2012 Kouhei Sutou * lib/rexml/xmldecl.rb (REXML::XMLDecl): Stop using REXML::Encoding diff --git a/lib/rexml/document.rb b/lib/rexml/document.rb index 5508a60be4..f9fdbdaab3 100644 --- a/lib/rexml/document.rb +++ b/lib/rexml/document.rb @@ -145,8 +145,8 @@ module REXML 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}) + # doc.write(output=$stdout, indent=-1, transtive=false, ie_hack=false, encoding=nil) + # doc.write(options={:output => $stdout, :indent => -1, :transtive => false, :ie_hack => false, :encoding => nil}) # # Write the XML tree out, optionally with indent. This writes out the # entire XML document, including XML declarations, doctype declarations, @@ -199,6 +199,10 @@ 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 + # encoding:: + # Encoding name as String. Change output encoding to specified encoding + # instead of encoding in XML declaration. + # Defaults to nil. It means encoding in XML declaration is used. def write(*arguments) if arguments.size == 1 and arguments[0].class == Hash options = arguments[0] diff --git a/lib/rexml/xmldecl.rb b/lib/rexml/xmldecl.rb index 6b48a6f8ea..783c9233dc 100644 --- a/lib/rexml/xmldecl.rb +++ b/lib/rexml/xmldecl.rb @@ -44,11 +44,7 @@ module REXML def write(writer, indent=-1, transitive=false, ie_hack=false) return nil unless @writethis or writer.kind_of? Output writer << START.sub(/\\/u, '') - if writer.kind_of? Output - writer << " #{content writer.encoding}" - else - writer << " #{content encoding}" - end + writer << " #{content encoding}" writer << STOP.sub(/\\/u, '') end diff --git a/test/rexml/test_document.rb b/test/rexml/test_document.rb index 2725235907..b78b310f00 100644 --- a/test/rexml/test_document.rb +++ b/test/rexml/test_document.rb @@ -165,11 +165,16 @@ EOX indent = -1 transitive = false ie_hack = false - encoding = "Shift_JIS" + encoding = "Windows-31J" + + xml_declaration_encoding = "Shift_JIS" + @document.xml_decl.encoding = xml_declaration_encoding + japanese_text = "こんにちは" + @document.root.text = japanese_text @document.write(output, indent, transitive, ie_hack, encoding) - assert_equal(<<-EOX, output) - -Hello world! + assert_equal(<<-EOX.encode(encoding), output) + +#{japanese_text} EOX end end @@ -215,10 +220,15 @@ EOX def test_encoding output = "" - @document.write(:output => output, :encoding => "Shift_JIS") - assert_equal(<<-EOX, output) - -Hello world! + encoding = "Windows-31J" + xml_declaration_encoding = "Shift_JIS" + @document.xml_decl.encoding = xml_declaration_encoding + japanese_text = "こんにちは" + @document.root.text = japanese_text + @document.write(:output => output, :encoding => encoding) + assert_equal(<<-EOX.encode(encoding), output) + +#{japanese_text} EOX end end