12d49485034c3be4905e052fc92a9d6c5b4c6a79
[leap_website.git] / lib / static_page.rb
1 require 'lib/property_set'
2 require 'i18n'
3 require 'pathname'
4
5 class StaticPage
6
7   class PageArray < Array
8     def limit(num)
9       PageArray.new(self[0..(num-1)])
10     end
11     def order_by(attr, locale=I18n.locale)
12       array = sort do |a,b|
13         a_prop = a.props.locale(locale).send(attr)
14         b_prop = b.props.locale(locale).send(attr)
15         if a_prop.nil? && b_prop.nil?
16           0
17         elsif a_prop.nil?
18           1
19         elsif b_prop.nil?
20           -1
21         else
22           a_prop <=> b_prop
23         end
24       end
25       array.delete_if do |page|
26         page.props.locale(locale).send(attr).nil?
27       end
28     end
29   end
30
31   attr_accessor :path, :children, :name, :props, :parent
32
33   def self.find(filter)
34     if filter =~ /\//
35       path = filter.split('/').map{|segment| segment.gsub(/[^0-9a-z_-]/, '')}
36       page = @@pages[path.join('/')]
37       if page
38         return page
39       else
40         return @@pages[path.last]
41       end
42     else
43       @@pages[filter]
44     end
45   end
46
47   def self.all
48     @@pages_array
49   end
50
51   def self.load(directory)
52     @@pages = {}
53     @@page_array = PageArray.new
54     @@root_directory = directory
55     @@relative_root_directory = relative_to_rails_view_root(directory)
56     scan_directory(directory) do |page|
57       @@pages[page.name] ||= page
58       @@pages[page.path.join('/')] = page
59       @@page_array << page
60     end
61   end
62
63   def initialize(parent, name)
64     @children = []
65     @name = name
66     if parent
67       @parent = parent
68       @parent.add_child(self)
69       @path = [@parent.path, @name].flatten.compact
70       @props = load_properties(file_path)
71     else
72       @path = []
73     end
74   end
75
76   def add_child(page)
77     @children << page
78   end
79
80   def all_children
81     PageArray.new(child_tree.flatten.compact)
82   end
83
84   #
85   # e.g. /home/user/dev/leap-public-site/app/views/pages/about-us/contact
86   #
87   def file_path
88     "#{@@root_directory}/#{@path.join('/')}"
89   end
90
91   #
92   # e.g. pages/about-us/contact/en
93   #
94   def template_path(locale=I18n.locale)
95     "#{@@relative_root_directory}/#{@path.join('/')}/#{locale}"
96   end
97
98   def inspect
99     "<'#{@path.join('/')}' #{children.inspect}>"
100   end
101
102   def title
103     begin
104       I18n.t!('pages.' + @name, :raise => true)
105     rescue I18n::MissingTranslationData
106       props.title
107     end
108   end
109
110   protected
111
112   def child_tree
113     [self, children.collect{|child| child.child_tree}]
114   end
115
116   private
117
118   def self.scan_directory(directory, parent=nil, &block)
119     parent ||= StaticPage.new(nil, 'root')
120     Dir.chdir directory do
121       Dir.glob("*").each do |child_dir|
122         next unless File.directory?(child_dir)
123         page = StaticPage.new(parent, child_dir)
124         yield page
125         scan_directory(child_dir, page, &block)
126       end
127     end
128   end
129
130   def self.relative_to_rails_view_root(absolute_path)
131     if Rails.root
132       absolute = Pathname.new(absolute_path)
133       rails_view_root = Pathname.new(Rails.root + 'app/views')
134       absolute.relative_path_from(rails_view_root).to_s
135     end
136   end
137
138   def load_properties(file_path)
139     props = PropertySet.new(self)
140     Dir.glob(file_path + '/*.haml') do |content_file_path|
141       locale = File.basename(content_file_path).sub(File.extname(content_file_path),'')
142       #variable_header = ""
143       #p content_file_path
144       #File.open(content_file_path) do |f|
145       #  while (line = f.gets) =~ /^- @/
146       #    variable_header << line
147       #  end
148       #end
149       props.eval(locale, File.read(content_file_path))
150     end
151     return props
152   end
153
154 end
155
156