lib/spontaneous/plugins/page_tree.rb in spontaneous-0.1.0.alpha1 vs lib/spontaneous/plugins/page_tree.rb in spontaneous-0.2.0.alpha1

- old
+ new

@@ -1,25 +1,72 @@ # encoding: UTF-8 module Spontaneous::Plugins module PageTree + extend ActiveSupport::Concern - module InstanceMethods - def ancestors - ancestor_path.map { |id| Spontaneous::Content[id] } - end + # InstanceMethods - def ancestor(depth) - ancestors[depth] - end + def ancestors + @ancestors ||= ancestor_path.map { |id| Spontaneous::Content[id] } + end - def generation - parent ? parent.children : [root] + def ancestor(depth) + ancestors[depth] + end + + # Returns a list of all the pages at a certain depth in the page tree for any page + def at_depth(depth) + return root_at_depth(depth) if is_root? + parent_depth = [0, depth - 1].max + parent = ancestor(parent_depth) + unordered_pages = parent.children + # This is made more complex because the #children method is unordered + # whereas the actual page order must come from the boxes + return unordered_pages if parent.boxes.empty? + ordered_pages = [] + # Iterate through the list of boxes and pull out of the + # unordered page list each page that belongs to the current box + parent.boxes.each do |box| + box_id = box.schema_id.to_s + in_box, unordered_pages = unordered_pages.partition { |p| p.box_sid == box_id } + ordered_pages.concat in_box.sort { |a, b| a.position <=> b.position } end + ordered_pages + end - def siblings - generation.reject { |p| p === self } + def root_at_depth(depth) + case depth + when 0 + self + when 1 + self.children + else + raise ArgumentError.new("Cannot calculate descendents of root beyond a depth of 1") end end + + def ancestor?(page) + ancestor_path.include?(page.id) + end + + def active?(page) + page.id == self.id or ancestor?(page) + end + + def generation + parent ? parent.children : [root] + end + + def siblings + generation.reject { |p| p === self } + end + + def >(page) + page.ancestors.include?(self) + end + + def >=(page) + page == self or self.>(page) + end end end -