mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
71 lines
2.1 KiB
Ruby
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
|