In Files

  • rexml/doctype.rb
  • rexml/text.rb

Class/Module Index [+]

Quicksearch

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.

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.

 
               # File 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
 
               # 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) click to toggle source
 
               # File 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 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 rexml/doctype.rb, line 95
def clone
  DocType.new self
end
            
context() click to toggle source
 
               # File rexml/doctype.rb, line 135
def context
  if @parent
    @parent.context
  else
    nil
  end
end
            
entity( name ) click to toggle source
 
               # File rexml/doctype.rb, line 143
def entity( name )
  @entities[name].unnormalized if @entities[name]
end
            
node_type() click to toggle source
 
               # File 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 rexml/doctype.rb, line 191
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 rexml/doctype.rb, line 183
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 rexml/doctype.rb, line 157
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 rexml/doctype.rb, line 169
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 rexml/doctype.rb, line 109
def write( output, indent=0, transitive=false, ie_hack=false )
  f = REXML::Formatters::Default.new
  c = context
  if c and c[:prologue_quote] == :apostrophe
    quote = "'"
  else
    quote = "\""
  end
  indent( output, indent )
  output << START
  output << ' '
  output << @name
  output << " #{@external_id}" if @external_id
  output << " #{quote}#{@long_name}#{quote}" if @long_name
  output << " #{quote}#{@uri}#{quote}" if @uri
  unless @children.empty?
    output << ' ['
    @children.each { |child|
      output << "\n"
      f.write( child, output )
    }
    output << "\n]"
  end
  output << STOP
end