diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-01-28 03:46:13 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-01-28 03:46:13 +0000 |
commit | 2cfa999f7baa1b994c9a0e3fef6b05f30d2ec7d9 (patch) | |
tree | 6262080bde1c6376c96bdc05d2a6692bd9de6818 /lib/rss/converter.rb | |
parent | 28651fcd3db70dc779fd2d8d119229d3721de34b (diff) | |
download | ruby-2cfa999f7baa1b994c9a0e3fef6b05f30d2ec7d9.tar.gz ruby-2cfa999f7baa1b994c9a0e3fef6b05f30d2ec7d9.tar.xz ruby-2cfa999f7baa1b994c9a0e3fef6b05f30d2ec7d9.zip |
* lib/rss: rss library imported. [ruby-dev:22726]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@5566 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rss/converter.rb')
-rw-r--r-- | lib/rss/converter.rb | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/lib/rss/converter.rb b/lib/rss/converter.rb new file mode 100644 index 000000000..144daab56 --- /dev/null +++ b/lib/rss/converter.rb @@ -0,0 +1,182 @@ +require "rss/utils" + +module RSS + + class Converter + + include Utils + + def initialize(to_enc, from_enc=nil) + to_enc = to_enc.downcase.gsub(/-/, '_') + from_enc ||= 'utf-8' + from_enc = from_enc.downcase.gsub(/-/, '_') + if to_enc == from_enc + def_same_enc() + else + if respond_to?("def_to_#{to_enc}_from_#{from_enc}") + send("def_to_#{to_enc}_from_#{from_enc}") + else + def_else_enc(to_enc, from_enc) + end + end + end + + def convert(value) + value + end + + def def_convert() + instance_eval(<<-EOC, *get_file_and_line_from_caller(0)) + def convert(value) + if value.kind_of?(String) + #{yield('value')} + else + value + end + end + EOC + end + + def def_iconv_convert(to_enc, from_enc) + begin + require "iconv" + def_convert do |value| + <<-EOC + @iconv ||= Iconv.new("#{to_enc}", "#{from_enc}") + begin + @iconv.iconv(#{value}) + rescue Iconv::Failure + raise ConversionError.new(#{value}, "#{to_enc}", "#{from_enc}") + #{value} + end +EOC + end + rescue LoadError, ArgumentError, SystemCallError + raise UnknownConversionMethodError.new(to_enc, from_enc) + end + end + + def def_else_enc(to_enc, from_enc) + raise UnknownConversionMethodError.new(to_enc, from_enc) + end + + def def_same_enc() + def_convert do |value| + value + end + end + + def def_to_euc_jp_from_utf_8 + begin + require "uconv" + def_convert do |value| + "Uconv.u8toeuc(#{value})" + end + rescue LoadError + def_iconv_convert('EUC-JP', 'UTF-8') + end + end + + def def_to_utf_8_from_euc_jp + begin + require "uconv" + def_convert do |value| + "Uconv.euctou8(#{value})" + end + rescue LoadError + def_iconv_convert('UTF-8', 'EUC-JP') + end + end + + def def_to_shift_jis_from_utf_8 + begin + require "uconv" + def_convert do |value| + "Uconv.u8tosjis(#{value})" + end + rescue LoadError + def_iconv_convert('Shift_JIS', 'UTF-8') + end + end + + def def_to_utf_8_from_shift_jis + begin + require "uconv" + def_convert do |value| + "Uconv.sjistou8(#{value})" + end + rescue LoadError + def_iconv_convert('UTF-8', 'Shift_JIS') + end + end + + def def_to_euc_jp_from_shift_jis + begin + require "nkf" + rescue LoadError + raise UnknownConversionMethodError.new('EUC-JP', 'Shift_JIS') + end + def_convert do |value| + "NKF.nkf('-Se', #{value})" + end + end + + def def_to_shift_jis_from_euc_jp + begin + require "nkf" + rescue LoadError + raise UnknownConversionMethodError.new('Shift_JIS', 'EUC-JP') + end + def_convert do |value| + "NKF.nkf('-Es', #{value})" + end + end + + def def_to_euc_jp_from_iso_2022_jp + begin + require "nkf" + rescue LoadError + raise UnknownConversionMethodError.new('EUC-JP', 'ISO-2022-JP') + end + def_convert do |value| + "NKF.nkf('-Je', #{value})" + end + end + + def def_to_iso_2022_jp_from_euc_jp + begin + require "nkf" + rescue LoadError + raise UnknownConversionMethodError.new('ISO-2022-JP', 'EUC-JP') + end + def_convert do |value| + "NKF.nkf('-Ej', #{value})" + end + end + + def def_to_utf_8_from_iso_8859_1 + def_convert do |value| + "#{value}.unpack('C*').pack('U*')" + end + end + + def def_to_iso_8859_1_from_utf_8 + def_convert do |value| + <<-EOC + array_utf8 = #{value}.unpack('U*') + array_enc = [] + array_utf8.each do |num| + if num <= 0xFF + array_enc << num + else + array_enc.concat "&\#\#{num};".unpack('C*') + end + end + array_enc.pack('C*') +EOC + end + end + + end + +end |