Class: RSS::Converter

Inherits:
Object
  • Object
show all
Includes:
Utils
Defined in:
lib/rss/converter.rb

Instance Method Summary collapse

Methods included from Utils

element_initialize_arguments?, get_file_and_line_from_caller, new_with_value_if_need, to_class_name

Constructor Details

#initialize(to_enc, from_enc = nil) ⇒ Converter

Returns a new instance of Converter.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/rss/converter.rb', line 10

def initialize(to_enc, from_enc=nil)
  if "".respond_to?(:encode)
    @to_encoding = to_enc
    return
  end
  normalized_to_enc = to_enc.downcase.gsub(/-/, '_')
  from_enc ||= 'utf-8'
  normalized_from_enc = from_enc.downcase.gsub(/-/, '_')
  if normalized_to_enc == normalized_from_enc
    def_same_enc()
  else
    def_diff_enc = "def_to_#{normalized_to_enc}_from_#{normalized_from_enc}"
    if respond_to?(def_diff_enc)
      __send__(def_diff_enc)
    else
      def_else_enc(to_enc, from_enc)
    end
  end
end

Instance Method Details

#convert(value) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/rss/converter.rb', line 30

def convert(value)
  if value.is_a?(String) and value.respond_to?(:encode)
    value.encode(@to_encoding)
  else
    value
  end
end

#def_convert(depth = 0) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/rss/converter.rb', line 38

def def_convert(depth=0)
  instance_eval(<<-EOC, *get_file_and_line_from_caller(depth))
  def convert(value)
    if value.kind_of?(String)
      #{yield('value')}
    else
      value
    end
  end
  EOC
end

#def_else_enc(to_enc, from_enc) ⇒ Object



68
69
70
# File 'lib/rss/converter.rb', line 68

def def_else_enc(to_enc, from_enc)
  def_iconv_convert(to_enc, from_enc, 0)
end

#def_iconv_convert(to_enc, from_enc, depth = 0) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/rss/converter.rb', line 50

def def_iconv_convert(to_enc, from_enc, depth=0)
  begin
    require "iconv"
    @iconv = Iconv.new(to_enc, from_enc)
    def_convert(depth+1) do |value|
      <<-EOC
      begin
        @iconv.iconv(#{value})
      rescue Iconv::Failure
        raise ConversionError.new(#{value}, "#{to_enc}", "#{from_enc}")
      end
      EOC
    end
  rescue LoadError, ArgumentError, SystemCallError
    raise UnknownConversionMethodError.new(to_enc, from_enc)
  end
end

#def_same_encObject



72
73
74
75
76
# File 'lib/rss/converter.rb', line 72

def def_same_enc()
  def_convert do |value|
    value
  end
end

#def_to_euc_jp_from_iso_2022_jpObject



132
133
134
135
136
137
# File 'lib/rss/converter.rb', line 132

def def_to_euc_jp_from_iso_2022_jp
  require "nkf"
  def_convert do |value|
    "NKF.nkf('-Je', #{value})"
  end
end

#def_to_euc_jp_from_shift_jisObject



118
119
120
121
122
123
# File 'lib/rss/converter.rb', line 118

def def_to_euc_jp_from_shift_jis
  require "nkf"
  def_convert do |value|
    "NKF.nkf('-Se', #{value})"
  end
end

#def_to_euc_jp_from_utf_8Object



102
103
104
# File 'lib/rss/converter.rb', line 102

def def_to_euc_jp_from_utf_8
  def_uconv_convert_if_can('u8toeuc', 'EUC-JP', 'UTF-8', '-We')
end

#def_to_iso_2022_jp_from_euc_jpObject



139
140
141
142
143
144
# File 'lib/rss/converter.rb', line 139

def def_to_iso_2022_jp_from_euc_jp
  require "nkf"
  def_convert do |value|
    "NKF.nkf('-Ej', #{value})"
  end
end

#def_to_iso_8859_1_from_utf_8Object



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/rss/converter.rb', line 152

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

#def_to_shift_jis_from_euc_jpObject



125
126
127
128
129
130
# File 'lib/rss/converter.rb', line 125

def def_to_shift_jis_from_euc_jp
  require "nkf"
  def_convert do |value|
    "NKF.nkf('-Es', #{value})"
  end
end

#def_to_shift_jis_from_utf_8Object



110
111
112
# File 'lib/rss/converter.rb', line 110

def def_to_shift_jis_from_utf_8
  def_uconv_convert_if_can('u8tosjis', 'Shift_JIS', 'UTF-8', '-Ws')
end

#def_to_utf_8_from_euc_jpObject



106
107
108
# File 'lib/rss/converter.rb', line 106

def def_to_utf_8_from_euc_jp
  def_uconv_convert_if_can('euctou8', 'UTF-8', 'EUC-JP', '-Ew')
end

#def_to_utf_8_from_iso_8859_1Object



146
147
148
149
150
# File 'lib/rss/converter.rb', line 146

def def_to_utf_8_from_iso_8859_1
  def_convert do |value|
    "#{value}.unpack('C*').pack('U*')"
  end
end

#def_to_utf_8_from_shift_jisObject



114
115
116
# File 'lib/rss/converter.rb', line 114

def def_to_utf_8_from_shift_jis
  def_uconv_convert_if_can('sjistou8', 'UTF-8', 'Shift_JIS', '-Sw')
end

#def_uconv_convert_if_can(meth, to_enc, from_enc, nkf_arg) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/rss/converter.rb', line 78

def def_uconv_convert_if_can(meth, to_enc, from_enc, nkf_arg)
  begin
    require "uconv"
    def_convert(1) do |value|
      <<-EOC
      begin
        Uconv.#{meth}(#{value})
      rescue Uconv::Error
        raise ConversionError.new(#{value}, "#{to_enc}", "#{from_enc}")
      end
      EOC
    end
  rescue LoadError
    require 'nkf'
    if NKF.const_defined?(:UTF8)
      def_convert(1) do |value|
        "NKF.nkf(#{nkf_arg.dump}, #{value})"
      end
    else
      def_iconv_convert(to_enc, from_enc, 1)
    end
  end
end