ruby-changes:17816
From: kou <ko1@a...>
Date: Thu, 18 Nov 2010 23:25:10 +0900 (JST)
Subject: [ruby-changes:17816] Ruby:r29827 (trunk): * lib/rexml/formatters/pretty.rb (REXML::Formatters::Pretty#wrap):
kou 2010-11-18 23:25:03 +0900 (Thu, 18 Nov 2010) New Revision: 29827 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29827 Log: * lib/rexml/formatters/pretty.rb (REXML::Formatters::Pretty#wrap): REXML::Formatters::Pretty#wrap used a recursive method call to format text. This switches it to use an iterative approach. [ruby-core:33245] Patch by Jeremy Evans. Thanks!!! * test/rexml/test_core.rb: add a test for it. Modified files: trunk/ChangeLog trunk/lib/rexml/formatters/pretty.rb trunk/test/rexml/test_core.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 29826) +++ ChangeLog (revision 29827) @@ -1,3 +1,13 @@ +Thu Nov 18 23:21:23 2010 Kouhei Sutou <kou@c...> + + * lib/rexml/formatters/pretty.rb (REXML::Formatters::Pretty#wrap): + REXML::Formatters::Pretty#wrap used a recursive method call to + format text. This switches it to use an iterative approach. + [ruby-core:33245] + Patch by Jeremy Evans. Thanks!!! + + * test/rexml/test_core.rb: add a test for it. + Thu Nov 18 22:58:43 2010 Nobuyoshi Nakada <nobu@r...> * include/ruby/io.h (rb_io_buffer_t): extract from rb_io_t. Index: lib/rexml/formatters/pretty.rb =================================================================== --- lib/rexml/formatters/pretty.rb (revision 29826) +++ lib/rexml/formatters/pretty.rb (revision 29827) @@ -126,11 +126,13 @@ end def wrap(string, width) - # Recursively wrap string at width. - return string if string.length <= width - place = string.rindex(' ', width) # Position in string with last ' ' before cutoff - return string if place.nil? - return string[0,place] + "\n" + wrap(string[place+1..-1], width) + parts = [] + while string.length > width and place = string.rindex(' ', width) + parts << string[0...place] + string = string[place+1..-1] + end + parts << string + parts.join("\n") end end Index: test/rexml/test_core.rb =================================================================== --- test/rexml/test_core.rb (revision 29826) +++ test/rexml/test_core.rb (revision 29827) @@ -1151,6 +1151,22 @@ assert_not_equal( c, d ) end + def test_pretty_format_long_text_finite + n = 1_000_000 + long_text = 'aaaa ' * n + xml = "<doc>#{long_text}</doc>" + formatter = REXML::Formatters::Pretty.new + document = REXML::Document.new(xml) + output = "" + assert_nothing_raised do + formatter.write(document, output) + end + assert_equal("<doc>\n" + + ((" " + (" aaaa" * 15) + "\n") * (n / 15)) + + " " + ("aaaa " * (n % 15)) + "\n" + + "</doc>", + output) + end def test_ticket_58 doc = REXML::Document.new -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/