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

new( first, parent=nil )

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

add(child)

[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

attribute_of(element, attribute)

[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

attributes_of(element)

[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

clone()

[Source]

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

context()

[Source]

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

entity( name )

[Source]

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

node_type()

[Source]

    # File rexml/doctype.rb, line 70
                    def node_type
                            :doctype
                    end

write( output, indent=0, transitive=false, ie_hack=false )

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]