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 42
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) click to toggle source
Calls superclass method
# File lib/rexml/doctype.rb, line 137
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 85
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 75
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 95
def clone
  DocType.new self
end
context() click to toggle source
# File lib/rexml/doctype.rb, line 129
def context
  @parent.context
end
entity( name ) click to toggle source
# File lib/rexml/doctype.rb, line 133
def entity( name )
  @entities[name].unnormalized if @entities[name]
end
node_type() click to toggle source
# File lib/rexml/doctype.rb, line 71
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 181
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 173
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 147
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 159
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 109
def write( output, indent=0, transitive=false, ie_hack=false )
  f = REXML::Formatters::Default.new
  indent( output, indent )
  output << START
  output << ' '
  output << @name
  output << " #@external_id" if @external_id
  output << " #{@long_name.inspect}" if @long_name
  output << " #{@uri.inspect}" if @uri
  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 190
def strip_quotes(quoted_string)
  quoted_string =~ /^[\'\"].*[\'\"]$/ ?
    quoted_string[1, quoted_string.length-2] :
    quoted_string
end