Class: REXML::DocType

Inherits:
Parent show all
Includes:
XMLTokens
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 collapse

START =
"<!DOCTYPE"
STOP =
">"
SYSTEM =
"SYSTEM"
PUBLIC =
"PUBLIC"
DEFAULT_ENTITIES =
{
  'gt'=>EntityConst::GT,
  'lt'=>EntityConst::LT,
  'quot'=>EntityConst::QUOT,
  "apos"=>EntityConst::APOS
}

Constants included from XMLTokens

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

Instance Attribute Summary collapse

Attributes inherited from Child

#parent

Instance Method Summary collapse

Methods inherited from Parent

#[], #[]=, #deep_clone, #delete, #delete_at, #delete_if, #each, #each_index, #index, #insert_after, #insert_before, #parent?, #replace_child, #size, #to_a, #unshift

Methods inherited from Child

#bytes, #document, #next_sibling=, #previous_sibling=, #remove, #replace_with

Methods included from Node

#each_recursive, #find_first_recursive, #indent, #index_in_parent, #next_sibling_node, #parent?, #previous_sibling_node, #to_s

Constructor Details

#initialize(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.



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# 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

Instance Attribute Details

#entitiesObject (readonly)

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



66
67
68
# File 'lib/rexml/doctype.rb', line 66

def entities
  @entities
end

#external_idObject (readonly)

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



66
67
68
# File 'lib/rexml/doctype.rb', line 66

def external_id
  @external_id
end

#nameObject (readonly)

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



66
67
68
# File 'lib/rexml/doctype.rb', line 66

def name
  @name
end

#namespacesObject (readonly)

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



66
67
68
# File 'lib/rexml/doctype.rb', line 66

def namespaces
  @namespaces
end

Instance Method Details

#add(child) ⇒ Object



185
186
187
188
189
# 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) ⇒ Object



125
126
127
128
129
130
131
132
133
# 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) ⇒ Object



115
116
117
118
119
120
121
122
123
# 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

#cloneObject



135
136
137
# File 'lib/rexml/doctype.rb', line 135

def clone
  DocType.new self
end

#contextObject



173
174
175
176
177
178
179
# File 'lib/rexml/doctype.rb', line 173

def context
  if @parent
    @parent.context
  else
    nil
  end
end

#entity(name) ⇒ Object



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

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

#node_typeObject



111
112
113
# File 'lib/rexml/doctype.rb', line 111

def node_type
  :doctype
end

#notation(name) ⇒ Object

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

Method contributed by Henrik Martensson



229
230
231
232
233
# File 'lib/rexml/doctype.rb', line 229

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

#notationsObject

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



221
222
223
# File 'lib/rexml/doctype.rb', line 221

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

#publicObject

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

Method contributed by Henrik Martensson



195
196
197
198
199
200
201
202
# File 'lib/rexml/doctype.rb', line 195

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

#systemObject

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

Method contributed by Henrik Martensson



207
208
209
210
211
212
213
214
# File 'lib/rexml/doctype.rb', line 207

def system
  case @external_id
  when "SYSTEM"
    @long_name
  when "PUBLIC"
    @uri.kind_of?(String) ? @uri : nil
  end
end

#write(output, indent = 0, transitive = false, ie_hack = false) ⇒ Object

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



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# 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