# class REXML::DocType

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.

### Constants

DEFAULT_ENTITIES
PUBLIC
START
STOP
SYSTEM

### 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 ) click to toggle source

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.

Calls superclass method

    # File lib/rexml/doctype.rb, line 80
    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
        @long_name = first.instance_variable_get(:@long_name)
        @uri = first.instance_variable_get(:@uri)
      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) click to toggle source
Calls superclass method

    # File lib/rexml/doctype.rb, line 185
    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) click to toggle source

    # File lib/rexml/doctype.rb, line 125
    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) click to toggle source

    # File lib/rexml/doctype.rb, line 115
    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() click to toggle source

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

context() click to toggle source

    # File lib/rexml/doctype.rb, line 173
    def context
      if @parent
        @parent.context
      else
        nil
      end
    end

entity( name ) click to toggle source

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

node_type() click to toggle source

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

notation(name) click to toggle source

Retrieves a named notation. Only notations declared in the internal `DTD` subset can be retrieved.

`Method` contributed by Henrik Martensson

    # File lib/rexml/doctype.rb, line 229
    def notation(name)
      notations.find { |notation_decl|
        notation_decl.name == name
      }
    end

notations() click to toggle source

This method returns a list of notations that have been declared in the internal `DTD` subset. Notations in the external `DTD` subset are not listed.

`Method` contributed by Henrik Martensson

    # File lib/rexml/doctype.rb, line 221
    def notations
      children().select {|node| node.kind_of?(REXML::NotationDecl)}
    end

public() click to toggle source

This method retrieves the public identifier identifying the document's `DTD`.

`Method` contributed by Henrik Martensson

    # File lib/rexml/doctype.rb, line 195
    def public
      case @external_id
      when "SYSTEM"
        nil
      when "PUBLIC"
        strip_quotes(@long_name)
      end
    end

system() click to toggle source

This method retrieves the system identifier identifying the document's `DTD`

`Method` contributed by Henrik Martensson

    # File lib/rexml/doctype.rb, line 207
    def system
      case @external_id
      when "SYSTEM"
        strip_quotes(@long_name)
      when "PUBLIC"
        @uri.kind_of?(String) ? strip_quotes(@uri) : nil
      end
    end

write( output, indent=0, transitive=false, ie_hack=false ) click to toggle source

output

  Where to write the string

indent

  An integer. If -1, no indentation will be used; otherwise, the indentation will be this number of spaces, and children will be indented an additional amount.

transitive

  Ignored

ie_hack

  Ignored

    # File lib/rexml/doctype.rb, line 149
    def write( output, indent=0, transitive=false, ie_hack=false )
      f = REXML::Formatters::Default.new
      indent( output, indent )
      output << START
      output << ' '
      output << @name
      if @external_id
        reference_writer = ReferenceWriter.new(@external_id,
                                               @long_name,
                                               @uri,
                                               context)
        reference_writer.write(output)
      end
      unless @children.empty?
        output << ' ['
        @children.each { |child|
          output << "\n"
          f.write( child, output )
        }
        output << "\n]"
      end
      output << STOP
    end

### Private Instance Methods

strip_quotes(quoted_string) click to toggle source

`Method` contributed by Henrik Martensson

    # File lib/rexml/doctype.rb, line 238
    def strip_quotes(quoted_string)
      quoted_string =~ /^[\'\"].*[\'\"]$/ ?
        quoted_string[1, quoted_string.length-2] :
        quoted_string
    end