ruby--ruby/lib/rss/converter.rb

183 lines
3.5 KiB
Ruby
Raw Normal View History

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