Class: REXML::DocType
- 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
-
#entities ⇒ Object
readonly
name is the name of the doctype external_id is the referenced DTD, if given.
-
#external_id ⇒ Object
readonly
name is the name of the doctype external_id is the referenced DTD, if given.
-
#name ⇒ Object
readonly
name is the name of the doctype external_id is the referenced DTD, if given.
-
#namespaces ⇒ Object
readonly
name is the name of the doctype external_id is the referenced DTD, if given.
Attributes inherited from Child
Instance Method Summary collapse
- #add(child) ⇒ Object
- #attribute_of(element, attribute) ⇒ Object
- #attributes_of(element) ⇒ Object
- #clone ⇒ Object
- #context ⇒ Object
- #entity(name) ⇒ Object
-
#initialize(first, parent = nil) ⇒ DocType
constructor
Constructor.
- #node_type ⇒ Object
-
#notation(name) ⇒ Object
Retrieves a named notation.
-
#notations ⇒ Object
This method returns a list of notations that have been declared in the internal DTD subset.
-
#public ⇒ Object
This method retrieves the public identifier identifying the document’s DTD.
-
#system ⇒ Object
This method retrieves the system identifier identifying the document’s DTD.
-
#write(output, indent = 0, transitive = false, ie_hack = false) ⇒ Object
- output
- Where to write the string indent
-
An integer.
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
#entities ⇒ Object (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_id ⇒ Object (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 |
#name ⇒ Object (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 |
#namespaces ⇒ Object (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 |
#context ⇒ Object
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_type ⇒ Object
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 |
#notations ⇒ Object
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 |
#public ⇒ Object
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 |
#system ⇒ Object
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 |