123456789_123456789_123456789_123456789_123456789_

Class: REXML::DocType

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Parent, Child
Instance Chain:
self, XMLTokens, Parent, Enumerable, Child, Node
Inherits: REXML::Parent
Defined in: lib/rexml/doctype.rb

Overview

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.

Constant Summary

XMLTokens - Included

NAME, NAMECHAR, NAME_CHAR, NAME_START_CHAR, NAME_STR, NCNAME_STR, NMTOKEN, NMTOKENS, REFERENCE

Class Method Summary

Parent - Inherited

.new

Constructor.

Child - Inherited

.new

Constructor.

Instance Attribute Summary

  • #entities readonly

    name is the name of the doctype external_id is the referenced DTD, if given.

  • #external_id readonly

    name is the name of the doctype external_id is the referenced DTD, if given.

  • #name readonly

    name is the name of the doctype external_id is the referenced DTD, if given.

  • #namespaces readonly

    name is the name of the doctype external_id is the referenced DTD, if given.

Parent - Inherited

Child - Inherited

#next_sibling
#next_sibling=

Sets the next sibling of this child.

#parent

The Parent of this object.

#parent=

Sets the parent of this child to the supplied argument.

#previous_sibling
#previous_sibling=

Sets the previous sibling of this child.

Node - Included

Instance Method Summary

Parent - Inherited

#<<

Alias for Parent#push.

#[]

Fetches a child at a given index.

#[]=

Set an index entry.

#add,
#children

Alias for Parent#to_a.

#deep_clone

Deeply clones this object.

#delete, #delete_at, #delete_if, #each,
#each_child

Alias for Parent#each.

#each_index,
#index

Fetches the index of a given child of this parent.

#insert_after

Inserts an child after another child child2 will be inserted after child1 in the child list of the parent.

#insert_before

Inserts an child before another child child2 will be inserted before child1 in the child list of the parent.

#length

Alias for Parent#size.

#push

Alias for Parent#add.

#replace_child

Replaces one child with another, making sure the nodelist is correct Child).

#size, #to_a, #unshift

Child - Inherited

#bytes

This doesn't yet handle encodings.

#document
Returns

the document this child belongs to, or nil if this child belongs to no document.

#remove

Removes this child from the parent.

#replace_with

Replaces this object with another object.

Node - Included

#each_recursive

Visit all subnodes of self recursively.

#find_first_recursive

Find (and return) first subnode (recursively) for which the block evaluates to true.

#indent,
#index_in_parent

Returns the position that self holds in its parent's array, indexed from 1.

#next_sibling_node, #previous_sibling_node,
#to_s
indent

Constructor Details

.new(first, parent = nil) ⇒ DocType

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.

[ GitHub ]

  
# 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

Instance Attribute Details

#entities (readonly)

name is the name of the doctype external_id is the referenced DTD, if given

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 28

attr_reader :name, :external_id, :entities, :namespaces

#external_id (readonly)

name is the name of the doctype external_id is the referenced DTD, if given

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 28

attr_reader :name, :external_id, :entities, :namespaces

#name (readonly)

name is the name of the doctype external_id is the referenced DTD, if given

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 28

attr_reader :name, :external_id, :entities, :namespaces

#namespaces (readonly)

name is the name of the doctype external_id is the referenced DTD, if given

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 28

attr_reader :name, :external_id, :entities, :namespaces

Instance Method Details

#add(child)

[ GitHub ]

  
# 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)

[ GitHub ]

  
# 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)

[ GitHub ]

  
# 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

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 95

def clone
  DocType.new self
end

#context

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 129

def context
  @parent.context
end

#entity(name)

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 133

def entity( name )
  @entities[name].unnormalized if @entities[name]
end

#node_type

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 71

def node_type
  :doctype
end

#notation(name)

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

Method contributed by Henrik Martensson

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 181

def notation(name)
  notations.find { |notation_decl|
    notation_decl.name == name
  }
end

#notations

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

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 173

def notations
  children().select {|node| node.kind_of?(REXML::NotationDecl)}
end

#public

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

Method contributed by Henrik Martensson

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 147

def public
  case @external_id
  when "SYSTEM"
    nil
  when "PUBLIC"
    strip_quotes(@long_name)
  end
end

#strip_quotes(quoted_string) (private)

Method contributed by Henrik Martensson

[ GitHub ]

  
# File 'lib/rexml/doctype.rb', line 190

def strip_quotes(quoted_string)
  quoted_string =~ /^[\'\"].*[\'\"]$/ ?
    quoted_string[1, quoted_string.length-2] :
    quoted_string
end

#system

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

Method contributed by Henrik Martensson

[ GitHub ]

  
# 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)

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

[ GitHub ]

  
# 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