Class: Shaven::Transformer::List

Inherits:
Base
  • Object
show all
Defined in:
lib/shaven/transformers/list.rb

Overview

This transformer can be applied when value can be iterated (responds to #each). It treats given node as template so generates sequence of clones for each list value, and finally removes original node.

Example

<ul id="users">
  <li rb="users">John Doe</li>
</ul>

applied with given value:

["Emmet Brown", "Marty Macfly", "Biff Tannen"]

… generates:

<ul id="users">
  <li>Emmet Brown</li>
  <li>Marty Macfly</li>
  <li>Biff Tannen</li>
</ul>

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.can_be_transformed?(value) ⇒ Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/shaven/transformers/list.rb', line 26

def self.can_be_transformed?(value)
  value.is_a?(Array)
end

Instance Method Details

#transform!Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/shaven/transformers/list.rb', line 30

def transform!
  array_scope = {}
  parent = node.parent
  id = 0

  value.each { |item|
    new_node = node.dup
    array_scope["__shaven_list_item_#{id}"] = item
    new_node['rb'] = "__shaven_list_item_#{id}"
    parent.add_child(new_node)
    id += 1
  }

  node.remove
  array_scope = scope.dup.unshift(array_scope)
  self.class.apply!(array_scope.with(parent))
  
  nil
end