# class RSS::Converter

### Public Class Methods

new(to_enc, from_enc=nil) click to toggle source

    # 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

### Public Instance Methods

convert(value) click to toggle source

    # 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) click to toggle source

    # 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) click to toggle source

    # 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) click to toggle source

    # 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_enc() click to toggle source

    # 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_jp() click to toggle source

    # 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_jis() click to toggle source

    # 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_8() click to toggle source

    # 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_jp() click to toggle source

    # 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_8() click to toggle source

    # 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_jp() click to toggle source

    # 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_8() click to toggle source

    # 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_jp() click to toggle source

    # 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_1() click to toggle source

    # 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_jis() click to toggle source

    # 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) click to toggle source

    # 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