summaryrefslogtreecommitdiff
path: root/lib/rexml/encoding.rb
diff options
context:
space:
mode:
authorser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-06-10 01:31:01 +0000
committerser <ser@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-06-10 01:31:01 +0000
commitea7a527a2ae7024a5cf2885dee8f7a5c21fedd5d (patch)
treed3e1f95a5acf262a9dd46e9663b7034bb285b406 /lib/rexml/encoding.rb
parentca02190d8887ecd852e4e3f18f3a3ea91e9c6f7a (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.rb62
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