mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
994f066f76
* lib/rexml/encodings/: remove. * lib/rexml/document.rb, lib/rexml/formatters/default.rb, lib/rexml/output.rb, lib/rexml/parseexception.rb, lib/rexml/parsers/baseparser.rb, lib/rexml/source.rb, lib/rexml/xmldecl.rb: use Ruby's native Encoding object. * test/rexml/, test/rss/: follow the above encoding chagnes. * NEWS: add REXML's incompatible change about encoding. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29646 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
130 lines
3 KiB
Ruby
130 lines
3 KiB
Ruby
require 'rexml/encoding'
|
|
require 'rexml/source'
|
|
|
|
module REXML
|
|
# NEEDS DOCUMENTATION
|
|
class XMLDecl < Child
|
|
include Encoding
|
|
|
|
DEFAULT_VERSION = "1.0";
|
|
DEFAULT_ENCODING = "UTF-8";
|
|
DEFAULT_STANDALONE = "no";
|
|
START = '<\?xml';
|
|
STOP = '\?>';
|
|
|
|
attr_accessor :version, :standalone
|
|
attr_reader :writeencoding, :writethis
|
|
|
|
def initialize(version=DEFAULT_VERSION, encoding=nil, standalone=nil)
|
|
@writethis = true
|
|
@writeencoding = !encoding.nil?
|
|
if version.kind_of? XMLDecl
|
|
super()
|
|
@version = version.version
|
|
self.encoding = version.encoding
|
|
@writeencoding = version.writeencoding
|
|
@standalone = version.standalone
|
|
else
|
|
super()
|
|
@version = version
|
|
self.encoding = encoding
|
|
@standalone = standalone
|
|
end
|
|
@version = DEFAULT_VERSION if @version.nil?
|
|
end
|
|
|
|
def clone
|
|
XMLDecl.new(self)
|
|
end
|
|
|
|
# indent::
|
|
# Ignored. There must be no whitespace before an XML declaration
|
|
# transitive::
|
|
# Ignored
|
|
# ie_hack::
|
|
# Ignored
|
|
def write(writer, indent=-1, transitive=false, ie_hack=false)
|
|
return nil unless @writethis or writer.kind_of? Output
|
|
writer << START.sub(/\\/u, '')
|
|
if writer.kind_of? Output
|
|
writer << " #{content writer.encoding}"
|
|
else
|
|
writer << " #{content encoding}"
|
|
end
|
|
writer << STOP.sub(/\\/u, '')
|
|
end
|
|
|
|
def ==( other )
|
|
other.kind_of?(XMLDecl) and
|
|
other.version == @version and
|
|
other.encoding == self.encoding and
|
|
other.standalone == @standalone
|
|
end
|
|
|
|
def xmldecl version, encoding, standalone
|
|
@version = version
|
|
self.encoding = encoding
|
|
@standalone = standalone
|
|
end
|
|
|
|
def node_type
|
|
:xmldecl
|
|
end
|
|
|
|
alias :stand_alone? :standalone
|
|
alias :old_enc= :encoding=
|
|
|
|
def encoding=( enc )
|
|
if enc.nil?
|
|
self.old_enc = "UTF-8"
|
|
@writeencoding = false
|
|
else
|
|
self.old_enc = enc
|
|
@writeencoding = true
|
|
end
|
|
self.dowrite
|
|
end
|
|
|
|
# Only use this if you do not want the XML declaration to be written;
|
|
# this object is ignored by the XML writer. Otherwise, instantiate your
|
|
# own XMLDecl and add it to the document.
|
|
#
|
|
# Note that XML 1.1 documents *must* include an XML declaration
|
|
def XMLDecl.default
|
|
rv = XMLDecl.new( "1.0" )
|
|
rv.nowrite
|
|
rv
|
|
end
|
|
|
|
def nowrite
|
|
@writethis = false
|
|
end
|
|
|
|
def dowrite
|
|
@writethis = true
|
|
end
|
|
|
|
def inspect
|
|
START.sub(/\\/u, '') + " ... " + STOP.sub(/\\/u, '')
|
|
end
|
|
|
|
private
|
|
def normalized_encoding_name(_encoding)
|
|
if _encoding == ::Encoding::UTF_16BE
|
|
"UTF-16"
|
|
else
|
|
return _encoding.name
|
|
end
|
|
end
|
|
|
|
def content(enc)
|
|
rv = "version='#@version'"
|
|
if @writeencoding || enc.to_s !~ /\Autf-8\z/i
|
|
encoding_name = normalized_encoding_name(enc)
|
|
rv << " encoding='#{encoding_name}'"
|
|
end
|
|
rv << " standalone='#@standalone'" if @standalone
|
|
rv
|
|
end
|
|
end
|
|
end
|