From 3f817764e24eb05aceef884e213d4a7043c292fa Mon Sep 17 00:00:00 2001 From: kou Date: Sat, 3 Nov 2012 03:53:09 +0000 Subject: * 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37440 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++++ lib/rexml/document.rb | 8 ++++++-- lib/rexml/xmldecl.rb | 6 +----- test/rexml/test_document.rb | 26 ++++++++++++++++++-------- 4 files changed, 35 insertions(+), 15 deletions(-) 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 -- cgit v1.2.3