Class: REXMLUtilityNode
- Inherits:
-
Object
- Object
- REXMLUtilityNode
- Defined in:
- lib/crack/xml.rb
Overview
This is a slighly modified version of the XMLUtilityNode from merb.devjavu.com/projects/merb/ticket/95 ([email protected]) It’s mainly just adding vowels, as I ht cd wth n vwls :) This represents the hard part of the work, all I did was change the underlying parser.
Instance Attribute Summary collapse
-
#attributes ⇒ Object
:nodoc:.
-
#children ⇒ Object
:nodoc:.
-
#name ⇒ Object
:nodoc:.
-
#type ⇒ Object
:nodoc:.
Class Method Summary collapse
- .available_typecasts ⇒ Object
- .available_typecasts=(obj) ⇒ Object
- .typecasts ⇒ Object
- .typecasts=(obj) ⇒ Object
Instance Method Summary collapse
- #add_node(node) ⇒ Object
-
#initialize(name, normalized_attributes = {}) ⇒ REXMLUtilityNode
constructor
A new instance of REXMLUtilityNode.
-
#inner_html ⇒ Object
Get the inner_html of the REXML node.
- #to_hash ⇒ Object
-
#to_html ⇒ String
Converts the node into a readable HTML node.
- #to_s ⇒ Object
-
#typecast_value(value) ⇒ Integer, ...
Typecasts a value based upon its type.
-
#undasherize_keys(params) ⇒ Object
Take keys of the form foo-bar and convert them to foo_bar.
Constructor Details
#initialize(name, normalized_attributes = {}) ⇒ REXMLUtilityNode
Returns a new instance of REXMLUtilityNode.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/crack/xml.rb', line 56 def initialize(name, normalized_attributes = {}) # unnormalize attribute values attributes = Hash[* normalized_attributes.map { |key, value| [ key, unnormalize_xml_entities(value) ] }.flatten] @name = name.tr("-", "_") # leave the type alone if we don't know what it is @type = self.class.available_typecasts.include?(attributes["type"]) ? attributes.delete("type") : attributes["type"] @nil_element = attributes.delete("nil") == "true" @attributes = undasherize_keys(attributes) @children = [] @text = false end |
Instance Attribute Details
#attributes ⇒ Object
:nodoc:
24 25 26 |
# File 'lib/crack/xml.rb', line 24 def attributes @attributes end |
#children ⇒ Object
:nodoc:
24 25 26 |
# File 'lib/crack/xml.rb', line 24 def children @children end |
#name ⇒ Object
:nodoc:
24 25 26 |
# File 'lib/crack/xml.rb', line 24 def name @name end |
#type ⇒ Object
:nodoc:
24 25 26 |
# File 'lib/crack/xml.rb', line 24 def type @type end |
Class Method Details
.available_typecasts ⇒ Object
34 35 36 |
# File 'lib/crack/xml.rb', line 34 def self.available_typecasts @@available_typecasts end |
.available_typecasts=(obj) ⇒ Object
38 39 40 |
# File 'lib/crack/xml.rb', line 38 def self.available_typecasts=(obj) @@available_typecasts = obj end |
.typecasts ⇒ Object
26 27 28 |
# File 'lib/crack/xml.rb', line 26 def self.typecasts @@typecasts end |
.typecasts=(obj) ⇒ Object
30 31 32 |
# File 'lib/crack/xml.rb', line 30 def self.typecasts=(obj) @@typecasts = obj end |
Instance Method Details
#add_node(node) ⇒ Object
73 74 75 76 |
# File 'lib/crack/xml.rb', line 73 def add_node(node) @text = true if node.is_a? String @children << node end |
#inner_html ⇒ Object
Get the inner_html of the REXML node.
172 173 174 |
# File 'lib/crack/xml.rb', line 172 def inner_html @children.join end |
#to_hash ⇒ Object
78 79 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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/crack/xml.rb', line 78 def to_hash # ACG: Added a check here to prevent an exception a type == "file" tag has nodes within it if @type == "file" and (@children.first.nil? or @children.first.is_a?(String)) f = StringIO.new((@children.first || '').unpack('m').first) class << f attr_accessor :original_filename, :content_type end f.original_filename = attributes['name'] || 'untitled' f.content_type = attributes['content_type'] || 'application/octet-stream' return {name => f} end if @text t = typecast_value( unnormalize_xml_entities( inner_html ) ) if t.is_a?(String) t = REXMLUtiliyNodeString.new(t) t.attributes = attributes end return { name => t } else #change repeating groups into an array groups = @children.inject({}) { |s,e| (s[e.name] ||= []) << e; s } out = nil if @type == "array" out = [] groups.each do |k, v| if v.size == 1 out << v.first.to_hash.entries.first.last else out << v.map{|e| e.to_hash[k]} end end out = out.flatten else # If Hash out = {} groups.each do |k,v| if v.size == 1 out.merge!(v.first) else out.merge!( k => v.map{|e| e.to_hash[k]}) end end out.merge! attributes unless attributes.empty? out = out.empty? ? nil : out end if @type && out.nil? { name => typecast_value(out) } else { name => out } end end end |
#to_html ⇒ String
Converts the node into a readable HTML node.
179 180 181 182 |
# File 'lib/crack/xml.rb', line 179 def to_html attributes.merge!(:type => @type ) if @type "<#{name}#{Crack::Util.to_xml_attributes(attributes)}>#{@nil_element ? '' : inner_html}</#{name}>" end |
#to_s ⇒ Object
185 186 187 |
# File 'lib/crack/xml.rb', line 185 def to_s to_html end |
#typecast_value(value) ⇒ Integer, ...
If self
does not have a “type” key, or if it’s not one of the options specified above, the raw value
will be returned.
Typecasts a value based upon its type. For instance, if node
has #type == “integer”, #=> 12]}
157 158 159 160 161 |
# File 'lib/crack/xml.rb', line 157 def typecast_value(value) return value unless @type proc = self.class.typecasts[@type] proc.nil? ? value : proc.call(value) end |
#undasherize_keys(params) ⇒ Object
Take keys of the form foo-bar and convert them to foo_bar
164 165 166 167 168 169 |
# File 'lib/crack/xml.rb', line 164 def undasherize_keys(params) params.keys.each do |key, value| params[key.tr("-", "_")] = params.delete(key) end params end |