diff options
author | ser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-18 14:04:03 +0000 |
---|---|---|
committer | ser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-18 14:04:03 +0000 |
commit | 94e117da620b122dd28f6c1e52ac452459a50cc5 (patch) | |
tree | f257516d0c600ed2e63b70f087cb2f66730904ad /lib/rexml/source.rb | |
parent | b841a6fce553dd5440a86c7ad9dcabfe7c06f826 (diff) |
r1025 | ser | 2004-07-18 08:18:36 -0400 (Sun, 18 Jul 2004) | 2 lines
@@ Fixed a CDATA pretty-printing bug. (#39) @@
r1026 | ser | 2004-07-18 09:03:02 -0400 (Sun, 18 Jul 2004) | 4 lines
@@ Fixed a buffering bug in Source.rb that affected the SAX parser @@
This bug was related to how REXML determines the encoding of a file, and
evinced itself by hanging on input when using the SAX parser.
r1028 | ser | 2004-07-18 09:06:18 -0400 (Sun, 18 Jul 2004) | 3 lines
* Minor pretty printing fix WRT CDATA segments.
@@ Applied Curt Sampson's optimization improvements @@
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6673 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rexml/source.rb')
-rw-r--r-- | lib/rexml/source.rb | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/rexml/source.rb b/lib/rexml/source.rb index ce10d03a6c..7251666160 100644 --- a/lib/rexml/source.rb +++ b/lib/rexml/source.rb @@ -116,11 +116,21 @@ module REXML def initialize(arg, block_size=500) @er_source = @source = arg @to_utf = false - # FIXME - # This is broken. If the user puts in enough carriage returns, this can fail - # to calculate the correct encoding. - super @source.read( 100 ) - @line_break = encode( '>' ) + # Determining the encoding is a deceptively difficult issue to resolve. + # First, we check the first two bytes for UTF-16. Then we + # assume that the encoding is at least ASCII enough for the '>', and + # we read until we get one of those. This gives us the XML declaration, + # if there is one. If there isn't one, the file MUST be UTF-8, as per + # the XML spec. If there is one, we can determine the encoding from + # it. + str = @source.read( 2 ) + if (str[0] == 254 && str[1] == 255) || (str[0] == 255 && str[1] == 254) + @encoding = check_encoding( str ) + @line_break = encode( '>' ) + else + @line_break = '>' + end + super [email protected]( @line_break ) end def scan(pattern, cons=false) |