added capacity for pulling static pages from multiple directory source trees.
[leap_website.git] / lib / site.rb
1
2 class Site
3   extend Forwardable
4
5   attr_accessor :pages
6   attr_accessor :page_list
7   attr_accessor :root
8   attr_accessor :menu
9
10   def_delegators :@config, :title, :pagination_size
11
12   def initialize
13     @config = SiteConfiguration.load("#{Rails.root}/site.rb")
14   end
15
16   def load_pages
17     @root      = nil
18     @pages     = {}
19     @page_list = StaticPageArray.new
20     @menu      = Menu.new('root')
21     @config.mount_points.each do |mp|
22       add_mount_point(mp)
23       mp.reset_timestamp
24     end
25   end
26
27   def reload_pages_if_needed
28     if @pages.nil? || @config.pages_changed?
29       puts "Reloading pages ................."
30       load_pages
31     end
32   end
33
34   #def menu
35   #  @menu ||= Menu.new
36   #end
37
38   def find_pages(filter)
39     StaticPage.find(self, filter)
40   end
41
42   def find_page(filter)
43     find_pages(filter)
44   end
45
46   def all_pages
47     @page_list
48   end
49
50   private
51
52   def add_mount_point(mp)
53     # create base_page
54     base_page = begin
55       if mp.path == '/'
56         @root = StaticPage.new(nil, 'root', mp.directory)
57       else
58         name = File.basename(mp.path)
59         page = StaticPage.new(find_parent(mp.path), name, File.join(mp.directory, name))
60         add_page(page)
61         page
62       end
63     end
64     base_page.mount_point = mp
65
66     # load menu and locals
67     menu.load(mp.menu_file) if mp.menu_file
68     I18n.load_path += Dir[File.join(mp.locales_dir, '/*.{rb,yml,yaml}')] if mp.locales_dir
69
70     # add the full directory tree
71     base_page.scan do |page|
72       add_page(page)
73     end
74   end
75
76   def add_page(page)
77     @pages[page.name] = page
78     @pages[page.path.join('/')] = page
79     @page_list << page
80   end
81
82   def find_parent(path)
83     so_far = []
84     path.split('/').compact.each do |path_segment|
85       so_far << path_segment
86       if page = @pages[so_far.join('/')]
87         return page
88       end
89     end
90     return @root
91   end
92
93 end