Module: Goat::DOMTools

Included in:
DOMDiff, DOMDiff, Traverser
Defined in:
lib/goat/dom.rb

Defined Under Namespace

Modules: DiffTools Classes: DOMAttrs, DOMDiff, HTMLBuilder, InvalidBodyError, PartialUpdateFailed, Traverser

Class Method Summary collapse

Class Method Details

.attrs(node) ⇒ Object



7
# File 'lib/goat/dom.rb', line 7

def attrs(node); node[1] if is_attrs?(node[1]); end

.body(node) ⇒ Object



8
# File 'lib/goat/dom.rb', line 8

def body(node); is_attrs?(node[1]) ? node[2..-1] : node[1..-1]; end

.car_tag(tree) ⇒ Object



13
14
15
16
17
18
# File 'lib/goat/dom.rb', line 13

def car_tag(tree)
  if (b = tree).is_a?(Array)
    b = b.first while b.is_a?(Array)
    b
  end
end

.dom_components(tree) ⇒ Object



188
189
190
191
192
193
194
195
196
197
198
# File 'lib/goat/dom.rb', line 188

def self.dom_components(tree)
  c = []
  DOMTools.traverse(tree) do |elt|
    # dom_\w{10} is the form of a component ID; anything more liberal might catch things like
    # dom_xxxxxxxxxx_table_border
    if dom_node?(elt) && (attrs = attrs(elt)) && attrs.include?(:id) && attrs[:id] =~ /^dom_\w{10}$/
      c << attrs[:id]
    end
  end
  c
end

.dom_node?(node) ⇒ Boolean

Returns:

  • (Boolean)


10
# File 'lib/goat/dom.rb', line 10

def dom_node?(node); node.is_a?(Array) && node.first.is_a?(Symbol); end

.domid(node) ⇒ Object



9
# File 'lib/goat/dom.rb', line 9

def domid(node); attrs(node) ? attrs(node)[:id] : nil; end

.expanded_dom(dom) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/goat/dom.rb', line 143

def self.expanded_dom(dom)
  DOMTools.transpose(dom) do |elt, update|
    if elt.kind_of?(Component)
      raise "Component #{elt} has no ID: was super's initialize called?" unless elt.id
      Dynamic[:expander].component_used(elt)
      update.call(elt.component(elt.expanded_dom))
    elsif dom_node?(elt)
      tag = tag(elt)

      if tag == :tbody
        b = body(elt)
        b = b.first while b.is_a?(Array)
        if b == :tbody
          update.call(expanded_dom(body(elt)))
        end
      elsif tag == :table
        a = attrs(elt)
        tbody_id = (a && a[:id]) ? "#{a[:id]}_tbody" : 'tbody_' + String.random
        update.call([:table, a ? a : {}, [:tbody, {:id => tbody_id}, expanded_dom(body(elt))]])
      end
    end
    true
  end
end

.find_component(tree, id) ⇒ Object



200
201
202
203
204
205
206
207
208
209
# File 'lib/goat/dom.rb', line 200

def self.find_component(tree, id)
  catch(:find_component) do
    DOMTools.traverse(tree) do |elt|
      if dom_node?(elt) & (attrs = attrs(elt)) && attrs[:id] == id
        throw :find_component, elt
      end
      nil
    end
  end
end

.inject_prefixes(id, dom) ⇒ Object



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/goat/dom.rb', line 168

def self.inject_prefixes(id, dom)
  DOMTools.traverse(dom) do |elt|
    if elt.kind_of?(Array) && elt.first.is_a?(Symbol) && elt[1].kind_of?(Hash)
      attrs = elt[1]
      elt[1] = attrs.map_to_hash do |k, v|
        if v.kind_of?(String)
          [k, v.prefix_ns(id)]
        elsif v.kind_of?(Array) && HTMLBuilder::ARRAY_ATTRS.include?(k)
          [k, v]
        elsif v.kind_of?(Integer) && HTMLBuilder::INTEGER_ATTRS.include?(k)
          [k, v]
        else
          raise "Invalid object #{v.inspect} to get a prefix in dom:\n#{dom.inspect}"
        end
      end
    end
  end
  dom
end

.is_attrs?(x) ⇒ Boolean

Returns:

  • (Boolean)


6
# File 'lib/goat/dom.rb', line 6

def is_attrs?(x); x.kind_of?(Hash) || x.kind_of?(DOMAttrs); end

.nested_body?(node) ⇒ Boolean

Returns:

  • (Boolean)


11
# File 'lib/goat/dom.rb', line 11

def nested_body?(node); node.is_a?(Array) && !node.first.is_a?(Symbol); end

.normalized_tags(body) ⇒ Object



12
# File 'lib/goat/dom.rb', line 12

def normalized_tags(body); nested_body?(body) ? body.map{|b| normalized_tags(b)}.flatten(1) : [body]; end

.tag(node) ⇒ Object



5
# File 'lib/goat/dom.rb', line 5

def tag(node); node[0]; end

.transpose(tree, dlg = nil, &blk) ⇒ Object



141
# File 'lib/goat/dom.rb', line 141

def self.transpose(tree, dlg=nil, &blk); Traverser.transpose(tree, dlg, &blk); end

.traverse(tree, dlg = nil, &blk) ⇒ Object



140
# File 'lib/goat/dom.rb', line 140

def self.traverse(tree, dlg=nil, &blk); Traverser.traverse(tree, dlg, &blk); end