diff options
author | ser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-10 01:31:01 +0000 |
---|---|---|
committer | ser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-10 01:31:01 +0000 |
commit | ea7a527a2ae7024a5cf2885dee8f7a5c21fedd5d (patch) | |
tree | d3e1f95a5acf262a9dd46e9663b7034bb285b406 /lib/rexml/encoding.rb | |
parent | ca02190d8887ecd852e4e3f18f3a3ea91e9c6f7a (diff) |
Initial revision
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3925 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rexml/encoding.rb')
-rw-r--r-- | lib/rexml/encoding.rb | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/rexml/encoding.rb b/lib/rexml/encoding.rb new file mode 100644 index 0000000000..3d7dcd6260 --- /dev/null +++ b/lib/rexml/encoding.rb @@ -0,0 +1,62 @@ +module REXML + module Encoding + @@uconv_available = false + + ENCODING_CLAIMS = { } + + def Encoding.claim( encoding_str, match=nil ) + if match + ENCODING_CLAIMS[ match ] = encoding_str + else + ENCODING_CLAIMS[ /^\s*<?xml\s*version=(['"]).*?\1\s*encoding=(["'])#{encoding_str}\2/ ] = encoding_str + end + end + + # Native, default format is UTF-8, so it is declared here rather than in + # an encodings/ definition. + UTF_8 = 'UTF-8' + claim( UTF_8 ) + + # ID ---> Encoding name + attr_reader :encoding + def encoding=( enc ) + enc = UTF_8 unless enc + @encoding = enc.upcase + require "rexml/encodings/#@encoding" unless @encoding == UTF_8 + end + + def check_encoding str + rv = ENCODING_CLAIMS.find{|k,v| str =~ k } + # Raise an exception if there is a declared encoding and we don't + # recognize it + unless rv + if str =~ /^\s*<?xml\s*version=(['"]).*?\1\s*encoding=(["'])(.*?)\2/ + raise "A matching encoding handler was not found for encoding '#{$3}', or the encoding handler failed to load due to a missing support library (such as uconv)." + else + return UTF_8 + end + end + return rv[1] + end + + def to_utf_8(str) + return str + end + + def from_utf_8 content + return content + end + end + + module Encodingses + encodings = [] + $:.each do |incl_dir| + if Dir[ File.join(incl_dir, 'rexml', 'encodings') ].size > 0 + encodings |= Dir[ File.join(incl_dir, 'rexml', 'encodings', '*_decl.rb') ] + end + encodings.collect!{ |f| File.basename(f) } + encodings.uniq! + end + encodings.each { |enc| require "rexml/encodings/#{enc}" } + end +end |