Module: PSD::Node::Search

Included in:
Base, Root
Defined in:
lib/psd/nodes/search.rb

Instance Method Summary collapse

Instance Method Details

#children_at_path(path, opts = {}) ⇒ Object Also known as: children_with_path

Searches the tree structure for a node at the given path. The path is defined by the layer/folder names. Because the PSD format does not require unique layer/folder names, we always return an array of all found nodes.



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/psd/nodes/search.rb', line 8

def children_at_path(path, opts={})
  path = path.split('/').delete_if { |p| p == "" } unless path.is_a?(Array)

  path = path.dup
  query = path.shift
  matches = children.select do |c|
    if opts[:case_sensitive]
      c.name == query
    else
      c.name.downcase == query.downcase
    end
  end

  if path.length == 0
    return matches
  else
    return matches.map { |m| m.children_at_path(path.dup, opts) }.flatten
  end
end

#filter_by_comp(id) ⇒ Object

Given a layer comp ID, name, or :last for last document state, create a new tree with layer/group visibility altered based on the layer comp.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/psd/nodes/search.rb', line 31

def filter_by_comp(id)
  if id.is_a?(String)
    comp = psd.layer_comps.select { |c| c[:name] == id }.first
    raise "Layer comp not found" if comp.nil?

    id = comp[:id]
  else
    comp = psd.layer_comps.select { |c| c[:id] == id }.first
    raise "Layer comp not found" if comp.nil?
  end

  root = PSD::Node::Root.new(psd)
  
  # Force layers to be visible if they are enabled for the comp
  root.descendants.each do |c|
    set_visibility(comp, c) if Resource::Section::LayerComps.visibility_captured?(comp)
    set_position(comp, c) if Resource::Section::LayerComps.position_captured?(comp)

    PSD.logger.debug "#{c.path}: visible = #{c.visible?}, position = #{c.left}, #{c.top}"
  end

  return root
end