1# coding: US-ASCII
2module REXML
3  module Encoding
4    # ID ---> Encoding name
5    attr_reader :encoding
6    def encoding=(encoding)
7      encoding = encoding.name if encoding.is_a?(Encoding)
8      if encoding.is_a?(String)
9        original_encoding = encoding
10        encoding = find_encoding(encoding)
11        unless encoding
12          raise ArgumentError, "Bad encoding name #{original_encoding}"
13        end
14      end
15      return false if defined?(@encoding) and encoding == @encoding
16      if encoding
17        @encoding = encoding.upcase
18      else
19        @encoding = 'UTF-8'
20      end
21      true
22    end
23
24    def encode(string)
25      string.encode(@encoding)
26    end
27
28    def decode(string)
29      string.encode(::Encoding::UTF_8, @encoding)
30    end
31
32    private
33    def find_encoding(name)
34      case name
35      when /\Ashift-jis\z/i
36        return "SHIFT_JIS"
37      when /\ACP-(\d+)\z/
38        name = "CP#{$1}"
39      when /\AUTF-8\z/i
40        return name
41      end
42      begin
43        ::Encoding::Converter.search_convpath(name, 'UTF-8')
44      rescue ::Encoding::ConverterNotFoundError
45        return nil
46      end
47      name
48    end
49  end
50end
51