summaryrefslogtreecommitdiff
path: root/lib/rexml/text.rb
diff options
context:
space:
mode:
authorser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-02-13 22:40:14 +0000
committerser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-02-13 22:40:14 +0000
commit95be40a06d1227a0cd0a1cec4424ab33748d1450 (patch)
treee8e2e4db64964fb5bf1fa9f5cfd882fb20cd20d0 /lib/rexml/text.rb
parentbe3b9b1c5c61b73884bbbf4a22fff16f9b197eb9 (diff)
@@ Fix for the XPath descendant* result set ordering bug @@
@@ SAX2 listener bug fixes @@ @@ Undid a code change that caused a 10x speed regression @@ @@ Indentation fixes, and a new word wrapping feature for text nodes was contributed by Devin Bayer (documentation forthcoming; see the change logs for now) @@ The XPath bug fix is really ugly and inefficient, but I spent two days hacking at it and this was the best I could come up with. The SAX2 listener fixes had to do with crashes in certain conditions, like when there was a carriage return at the end of a document Several people submitted patches for the speed regression; it is embarrassing how long it took me to get around to looking at this. To this day, I don't know where the offending code came from. Encoding fixes Added a contributed word wrapping option for text formatting. Devin Bayer contributed this. Here's his comment: "Setting :wordwrapping to :all, wordwraps all text nodes longer than 60 characters. Setting :indentstyle to aString, make aString used as indentation, instead of the default ' '. And as long as :respect_whitespace isn't set for the element, multiline text nodes will be indented." git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5696 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rexml/text.rb')
-rw-r--r--lib/rexml/text.rb39
1 files changed, 37 insertions, 2 deletions
diff --git a/lib/rexml/text.rb b/lib/rexml/text.rb
index 2494ad9e8a..6f94ca4ba1 100644
--- a/lib/rexml/text.rb
+++ b/lib/rexml/text.rb
@@ -164,9 +164,44 @@ module REXML
end
@unnormalized = Text::unnormalize( @string, doctype )
end
-
+
+ def wrap(string, width, addnewline=false)
+ # Recursivly wrap string at width.
+ return string if string.length <= width
+ place = string.rindex(' ', width) # Position in string with last ' ' before cutoff
+ if addnewline then
+ return "\n" + string[0,place] + "\n" + wrap(string[place+1..-1], width)
+ else
+ return string[0,place] + "\n" + wrap(string[place+1..-1], width)
+ end
+ end
+
+ def indent(string, level=1, style="\t", indentfirstline=true)
+ return string if level < 0
+ new_string = ''
+ string.each { |line|
+ indent_string = style * level
+ new_line = (indent_string + line).sub(/[\s]+$/,'')
+ new_string << new_line
+ }
+ new_string.strip! unless indentfirstline
+ return new_string
+ end
+
def write( writer, indent=-1, transitive=false, ie_hack=false )
- writer << to_s()
+ s = to_s()
+ if not (@parent and @parent.whitespace) then
+ s = wrap(s, 60, false) if @parent and @parent.context[:wordwrap] == :all
+ if @parent and not @parent.context[:indentstyle].nil? then
+ indentstyle = @parent.context[:indentstyle]
+ else
+ indentstyle = ' '
+ end
+ if s.count("\n") > 0 and indent > 0 then
+ s = indent(s, indent, indentstyle, false)
+ end
+ end
+ writer << s
end
# Writes out text, substituting special characters beforehand.