1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/lib/rexml/encoding.rb
ser 37886ed9a8 Fixes a bug in the pretty printer related to an incomplete refactoring.
Fixes another bug related to the formatting code refactoring in 3.1.7
  Fixes ticket:99, and adds Henrik's unit test (with minor modifications)
  Fixes ticket:102.
    Fix provided by kevinj -- thanks!  Great job.
  Implements namespace validation in the baseparser.  This means that, as per
    the XML namespace spec, unbound prefixes generate UndefinedNamespaceException.
    Also, as per the namespace spec, the 'xml' prefix must be bound to 
    http://www.w3.org/XML/1998/namespace, and the 'xmlns' prefix must not be declared. 
    in the XML.
  Fix for ticket:115
  Fixes a bug in the pretty printer related to an incomplete refactoring.
  Merge code cleanups
  Fixes another bug related to the formatting code refactoring in 3.1.7
  Indentation fix.
  lib/rexml/formatters/*.rb: set properties.
  lib/rexml/encodings/{ISO-8859-15,CP-1252}.rb: fixed invalid syntax.
  lib/rexml/rexml.rb: removed doubled constant.
  lib/rexml/rexml.rb: added encoding.
  Fixes ticket:110
  Missing include for UndefinedNamespaceException was causing errors in some
    cases.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@13815 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-11-04 04:50:15 +00:00

71 lines
2.1 KiB
Ruby

# -*- mode: ruby; ruby-indent-level: 2; indent-tabs-mode: t; tab-width: 2 -*- vim: sw=2 ts=2
module REXML
module Encoding
@encoding_methods = {}
def self.register(enc, &block)
@encoding_methods[enc] = block
end
def self.apply(obj, enc)
@encoding_methods[enc][obj]
end
def self.encoding_method(enc)
@encoding_methods[enc]
end
# Native, default format is UTF-8, so it is declared here rather than in
# an encodings/ definition.
UTF_8 = 'UTF-8'
UTF_16 = 'UTF-16'
UNILE = 'UNILE'
# ID ---> Encoding name
attr_reader :encoding
def encoding=( enc )
old_verbosity = $VERBOSE
begin
$VERBOSE = false
enc = enc.nil? ? nil : enc.upcase
return false if defined? @encoding and enc == @encoding
if enc and enc != UTF_8
@encoding = enc
raise ArgumentError, "Bad encoding name #@encoding" unless @encoding =~ /^[\w-]+$/
@encoding.untaint
begin
require 'rexml/encodings/ICONV.rb'
Encoding.apply(self, "ICONV")
rescue LoadError, Exception
begin
enc_file = File.join( "rexml", "encodings", "#@encoding.rb" )
require enc_file
Encoding.apply(self, @encoding)
rescue LoadError => err
puts err.message
raise ArgumentError, "No decoder found for encoding #@encoding. Please install iconv."
end
end
else
@encoding = UTF_8
require 'rexml/encodings/UTF-8.rb'
Encoding.apply(self, @encoding)
end
ensure
$VERBOSE = old_verbosity
end
true
end
def check_encoding str
# We have to recognize UTF-16, LSB UTF-16, and UTF-8
if str[0] == 0xfe && str[1] == 0xff
str[0,2] = ""
return UTF_16
elsif str[0] == 0xff && str[1] == 0xfe
str[0,2] = ""
return UNILE
end
str =~ /^\s*<\?xml\s+version\s*=\s*(['"]).*?\1\s+encoding\s*=\s*(["'])(.*?)\2/um
return $3.upcase if $3
return UTF_8
end
end
end