[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]