From f5fb445b6d83d74f7809062d7965ce75b6efda97 Mon Sep 17 00:00:00 2001 From: ser Date: Fri, 2 Apr 2004 03:26:19 +0000 Subject: REXML changes backported from the 1.9 branch: * Minor source documentation changes * Changes to the pretty-printing code, including the addition of the word- wrap submission. * Bug fix for missing quotations in NOTATION DTD items * Bug fixes and improvements to whitespace handling in text nodes * Refactoring and bug fixes in encoding support * Minor speed optimizations in the core parser * Bug fixes in the SAX2 parserthe core parser * Copyright fixes * Version bump to REXML 3.0.0 * A change that caused speed degredation has been reversed * Addition of a value=() method in Text, for replacing the contents of a text node * Fixed the document order of the descendant-or-self axis in XPath git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@6071 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/rexml/text.rb | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) (limited to 'lib/rexml/text.rb') diff --git a/lib/rexml/text.rb b/lib/rexml/text.rb index 2494ad9e8..2e54f9fa1 100644 --- a/lib/rexml/text.rb +++ b/lib/rexml/text.rb @@ -164,9 +164,54 @@ 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 + # Sets the contents of this text node. This expects the text to be + # unnormalized. It returns self. + # + # e = Element.new( "a" ) + # e.add_text( "foo" ) # foo + # e[0].value = "bar" # bar + # e[0].value = "" # <a> + def value=( val ) + @string = val.gsub( /\r\n?/, "\n" ) + @unnormalized = nil + @normalized = nil + @raw = false + 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? and indent > 0 and s.count("\n") > 0 + s = indent(s, indent, @parent.context[:indentstyle], false) + end + s.squeeze!(" \n\t") if @parent and !@parent.whitespace + end + writer << s end # Writes out text, substituting special characters beforehand. -- cgit