diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | lib/rexml/document.rb | 8 | ||||
-rw-r--r-- | lib/rexml/xmldecl.rb | 6 | ||||
-rw-r--r-- | test/rexml/test_document.rb | 26 |
4 files changed, 35 insertions, 15 deletions
@@ -1,3 +1,13 @@ +Sat Nov 3 12:49:45 2012 Kouhei Sutou <kou@cozmixng.org> + + * 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 <kou@cozmixng.org> * 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) -<?xml version='1.0' encoding='SHIFT_JIS'?> -<message>Hello world!</message> + assert_equal(<<-EOX.encode(encoding), output) +<?xml version='1.0' encoding='#{xml_declaration_encoding}'?> +<message>#{japanese_text}</message> EOX end end @@ -215,10 +220,15 @@ EOX def test_encoding output = "" - @document.write(:output => output, :encoding => "Shift_JIS") - assert_equal(<<-EOX, output) -<?xml version='1.0' encoding='SHIFT_JIS'?> -<message>Hello world!</message> + 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) +<?xml version='1.0' encoding='#{xml_declaration_encoding}'?> +<message>#{japanese_text}</message> EOX end end |