Class: REXMLUtilityNode

Inherits:
Object show all
Defined in:
lib/gems/extlib-0.9.9/lib/extlib/hash.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

Instance Method Summary collapse

Constructor Details

#initialize(name, attributes = {}) ⇒ REXMLUtilityNode

Returns a new instance of REXMLUtilityNode.



281
282
283
284
285
286
287
288
289
290
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 281

def initialize(name, attributes = {})
  @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

#attributesObject

Returns the value of attribute attributes.



262
263
264
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 262

def attributes
  @attributes
end

#childrenObject

Returns the value of attribute children.



262
263
264
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 262

def children
  @children
end

#nameObject

Returns the value of attribute name.



262
263
264
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 262

def name
  @name
end

#typeObject

Returns the value of attribute type.



262
263
264
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 262

def type
  @type
end

Instance Method Details

#add_node(node) ⇒ Object



292
293
294
295
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 292

def add_node(node)
  @text = true if node.is_a? String
  @children << node
end

#inner_htmlObject

Get the inner_html of the REXML node.



398
399
400
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 398

def inner_html
  @children.join
end

#to_hashObject



297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 297

def to_hash
  if @type == "file"
    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
    return { name => typecast_value( translate_xml_entities( inner_html ) ) }
  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_htmlString

Converts the node into a readable HTML node.

Returns:

  • (String)

    The HTML node in text form.



405
406
407
408
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 405

def to_html
  attributes.merge!(:type => @type ) if @type
  "<#{name}#{attributes.to_xml_attributes}>#{@nil_element ? '' : inner_html}</#{name}>"
end

#to_sObject



411
412
413
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 411

def to_s
  to_html
end

#translate_xml_entities(value) ⇒ #gsub

Convert basic XML entities into their literal values.

Parameters:

  • value (#gsub)

    An XML fragment.

Returns:

  • (#gsub)

    The XML fragment after converting entities.



381
382
383
384
385
386
387
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 381

def translate_xml_entities(value)
  value.gsub(/&lt;/,   "<").
        gsub(/&gt;/,   ">").
        gsub(/&quot;/, '"').
        gsub(/&apos;/, "'").
        gsub(/&amp;/,  "&")
end

#typecast_value(value) ⇒ Integer, ...

Note:

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]}

Parameters:

  • value (String)

    The value that is being typecast.

Returns:



370
371
372
373
374
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 370

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



390
391
392
393
394
395
# File 'lib/gems/extlib-0.9.9/lib/extlib/hash.rb', line 390

def undasherize_keys(params)
  params.keys.each do |key, value|
    params[key.tr("-", "_")] = params.delete(key)
  end
  params
end