diff --git a/lib/rexml/formatters/pretty.rb b/lib/rexml/formatters/pretty.rb index a838d835..ff0e1022 100644 --- a/lib/rexml/formatters/pretty.rb +++ b/lib/rexml/formatters/pretty.rb @@ -86,9 +86,8 @@ def write_element(node, output) end def write_text( node, output ) - s = node.to_s() - s.gsub!(/\s/,' ') - s.squeeze!(" ") + # Not gsub!/squeeze!: Text#to_s returns the node's own string. + s = node.to_s().gsub(/\s/, ' ').squeeze(" ") s = wrap(s, @width - @level) s = indent_text(s, @level, " ", true) output << (' '*@level + s) diff --git a/test/formatter/test_pretty.rb b/test/formatter/test_pretty.rb new file mode 100644 index 00000000..a3e97d54 --- /dev/null +++ b/test/formatter/test_pretty.rb @@ -0,0 +1,34 @@ +module REXMLTests + class PrettyFormatterTest < Test::Unit::TestCase + def format(node, indentation=2) + formatter = REXML::Formatters::Pretty.new(indentation) + output = +"" + formatter.write(node, output) + output + end + + class TextTest < self + def test_source_document_is_not_modified + document = REXML::Document.new("hello world") + format(document) + assert_equal("hello world", document.to_s) + end + + def test_raw_text_value_is_not_modified + text = REXML::Text.new("hello world", true, nil, true) + format(text) + assert_equal("hello world", text.value) + end + + def test_whitespace_is_replaced_with_space + document = REXML::Document.new("x\ty") + assert_equal("\n \n x y\n \n", format(document)) + end + + def test_consecutive_spaces_are_squeezed + document = REXML::Document.new("x y") + assert_equal("\n \n x y\n \n", format(document)) + end + end + end +end