Class REXML::DocType
In: rexml/doctype.rb
Parent: Parent

Represents an XML DOCTYPE declaration; that is, the contents of <!DOCTYPE … >. DOCTYPES can be used to declare the DTD of a document, as well as being used to declare entities used in the document.

Methods

add   attribute_of   attributes_of   clone   context   entity   new   node_type   write  

Included Modules

XMLTokens

Constants

START = "<!DOCTYPE"
STOP = ">"
SYSTEM = "SYSTEM"
PUBLIC = "PUBLIC"
DEFAULT_ENTITIES = { 'gt'=>EntityConst::GT, 'lt'=>EntityConst::LT, 'quot'=>EntityConst::QUOT, "apos"=>EntityConst::APOS

Attributes

entities  [R]  name is the name of the doctype external_id is the referenced DTD, if given
external_id  [R]  name is the name of the doctype external_id is the referenced DTD, if given
name  [R]  name is the name of the doctype external_id is the referenced DTD, if given
namespaces  [R]  name is the name of the doctype external_id is the referenced DTD, if given

Public Class methods

Constructor

     dt = DocType.new( 'foo', '-//I/Hate/External/IDs' )
     # <!DOCTYPE foo '-//I/Hate/External/IDs'>
     dt = DocType.new( doctype_to_clone )
     # Incomplete.  Shallow clone of doctype

Note that the constructor:

 Doctype.new( Source.new( "<!DOCTYPE foo 'bar'>" ) )

is deprecated. Do not use it. It will probably disappear.

[Source]

# File rexml/doctype.rb, line 41
                def initialize( first, parent=nil )
                        @entities = DEFAULT_ENTITIES
                        @long_name = @uri = nil
                        if first.kind_of? String
                                super()
                                @name = first
                                @external_id = parent
                        elsif first.kind_of? DocType
                                super( parent )
                                @name = first.name
                                @external_id = first.external_id
                        elsif first.kind_of? Array
                                super( parent )
                                @name = first[0]
                                @external_id = first[1]
                                @long_name = first[2]
                                @uri = first[3]
      elsif first.kind_of? Source
        super( parent )
        parser = Parsers::BaseParser.new( first )
        event = parser.pull
        if event[0] == :start_doctype
          @name, @external_id, @long_name, @uri, = event[1..-1]
        end
      else
        super()
                        end
                end

Public Instance methods

[Source]

# File rexml/doctype.rb, line 147
                def add child
                        super(child)
                        @entities = DEFAULT_ENTITIES.clone if @entities == DEFAULT_ENTITIES
                        @entities[ child.name ] = child if child.kind_of? Entity
                end

[Source]

# File rexml/doctype.rb, line 84
                def attribute_of element, attribute
                        att_decl = find do |child|
                                child.kind_of? AttlistDecl and
                                child.element_name == element and
                                child.include? attribute
                        end
                        return nil unless att_decl
                        att_decl[attribute]
                end

[Source]

# File rexml/doctype.rb, line 74
                def attributes_of element
                        rv = []
                        each do |child|
                                child.each do |key,val|
                                        rv << Attribute.new(key,val)
                                end if child.kind_of? AttlistDecl and child.element_name == element
                        end
                        rv
                end

[Source]

# File rexml/doctype.rb, line 94
                def clone
                        DocType.new self
                end

[Source]

# File rexml/doctype.rb, line 139
    def context
      @parent.context
    end

[Source]

# File rexml/doctype.rb, line 143
                def entity( name )
                        @entities[name].unnormalized if @entities[name]
                end

[Source]

# File rexml/doctype.rb, line 70
                def node_type
                        :doctype
                end
output:Where to write the string
indent:An integer. If -1, no indenting will be used; otherwise, the indentation will be this number of spaces, and children will be indented an additional amount.
transitive:If transitive is true and indent is >= 0, then the output will be pretty-printed in such a way that the added whitespace does not affect the absolute value of the document — that is, it leaves the value and number of Text nodes in the document unchanged.
ie_hack:Internet Explorer is the worst piece of crap to have ever been written, with the possible exception of Windows itself. Since IE is unable to parse proper XML, we have to provide a hack to generate XML that IE’s limited abilities can handle. This hack inserts a space before the /> on empty tags.

[Source]

# File rexml/doctype.rb, line 116
                def write( output, indent=0, transitive=false, ie_hack=false )
                        indent( output, indent )
                        output << START
                        output << ' '
                        output << @name
                        output << " #@external_id" if @external_id
                        output << " #@long_name" if @long_name
                        output << " #@uri" if @uri
                        unless @children.empty?
                                next_indent = indent + 1
                                output << ' ['
                                child = nil         # speed
                                @children.each { |child|
                                        output << "\n"
                                        child.write( output, next_indent )
                                }
                                output << "\n"
                                #output << '   '*next_indent
                                output << "]"
                        end
                        output << STOP
                end

[Validate]