lib/psd/nodes/ancestry.rb in psd-3.2.4 vs lib/psd/nodes/ancestry.rb in psd-3.3.1

- old
+ new

@@ -1,103 +1,99 @@ class PSD module Node # Collection of methods to help in traversing the PSD tree structure. module Ancestry - extend ActiveSupport::Concern + # Returns the root node + def root + return self if is_root? + return parent.root + end - included do - # Returns the root node - def root - return self if is_root? - return parent.root - end + # Is this node the root node? + def root? + self.is_a?(PSD::Node::Root) + end + alias :is_root? :root? - # Is this node the root node? - def root? - self.is_a?(PSD::Node::Root) - end - alias :is_root? :root? + # Returns all ancestors in the path of this node. This + # does NOT return the root node. + def ancestors + return [] if parent.nil? || parent.is_root? + return parent.ancestors + [parent] + end - # Returns all ancestors in the path of this node. This - # does NOT return the root node. - def ancestors - return [] if parent.nil? || parent.is_root? - return parent.ancestors + [parent] - end + # Does this node have any children nodes? + def has_children? + children.length > 0 + end - # Does this node have any children nodes? - def has_children? - children.length > 0 - end + # Inverse of has_children? + def childless? + !has_children? + end - # Inverse of has_children? - def childless? - !has_children? - end + # Returns all sibling nodes including the current node. Can also + # be thought of as all children of the parent of this node. + def siblings + return [] if parent.nil? + parent.children + end - # Returns all sibling nodes including the current node. Can also - # be thought of as all children of the parent of this node. - def siblings - return [] if parent.nil? - parent.children - end + def next_sibling + return nil if parent.nil? + index = siblings.index(self) + siblings[index + 1] + end - def next_sibling - return nil if parent.nil? - index = siblings.index(self) - siblings[index + 1] - end + def prev_sibling + return nil if parent.nil? + index = siblings.index(self) + siblings[index - 1] + end - def prev_sibling - return nil if parent.nil? - index = siblings.index(self) - siblings[index - 1] - end + # Does this node have any siblings? + def has_siblings? + siblings.length > 1 + end - # Does this node have any siblings? - def has_siblings? - siblings.length > 1 - end + # Is this node the only descendant of its parent? + def only_child? + siblings.length == 1 + end - # Is this node the only descendant of its parent? - def only_child? - siblings.length == 1 - end + # Recursively get all descendant nodes, not including this node. + def descendants + children.map(&:subtree).flatten + end - # Recursively get all descendant nodes, not including this node. - def descendants - children.map(&:subtree).flatten - end + # Same as descendants, except it includes this node. + def subtree + [self] + descendants + end - # Same as descendants, except it includes this node. - def subtree - [self] + descendants - end + # Depth from the root node. Root depth is 0. + def depth + return ancestors.length + 1 + end - # Depth from the root node. Root depth is 0. - def depth - return ancestors.length + 1 - end + def path(as_array = false) + path = (ancestors.map(&:name) + [name]) + as_array ? path : path.join('/') + end - def path(as_array = false) - path = (ancestors.map(&:name) + [name]) - as_array ? path : path.join('/') + def method_missing(method, *args, &block) + test = /^(.+)_(layers|groups)$/.match(method) + if test + m = self.respond_to?(test[1]) ? test[1] : "#{test[1]}s" + self.send(m).select &method("#{test[2]}_only") + else + super end + end - def method_missing(method, *args, &block) - test = /^(.+)_(layers|groups)$/.match(method) - if test - m = self.respond_to?(test[1]) ? test[1] : "#{test[1]}s" - self.send(m).select &method("#{test[2]}_only") - else - super - end - end + private - private - - def layers_only(d); d.layer?; end - def groups_only(d); d.group?(false); end - end + def layers_only(d); d.layer?; end + def groups_only(d); d.group?(false); end end end -end \ No newline at end of file +end