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 74
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 174
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 119
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 109
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 129
def clone
  DocType.new self
end
context() click to toggle source
# File lib/rexml/doctype.rb, line 166
def context
  @parent.context
end
entity( name ) click to toggle source
# File lib/rexml/doctype.rb, line 170
def entity( name )
  @entities[name].unnormalized if @entities[name]
end
node_type() click to toggle source
# File lib/rexml/doctype.rb, line 105
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 218
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 210
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 184
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 196
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 143
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)
    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 227
def strip_quotes(quoted_string)
  quoted_string =~ /^[\'\"].*[\'\"]$/ ?
    quoted_string[1, quoted_string.length-2] :
    quoted_string
end