summaryrefslogtreecommitdiff
path: root/lib/rss/converter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rss/converter.rb')
-rw-r--r--lib/rss/converter.rb182
1 files changed, 182 insertions, 0 deletions
diff --git a/lib/rss/converter.rb b/lib/rss/converter.rb
new file mode 100644
index 0000000000..144daab564
--- /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