added capacity for pulling static pages from multiple directory source trees.
[leap_website.git] / app / helpers / application_helper.rb
1 module ApplicationHelper
2
3   def main_column_class
4     if has_side_column?
5       'with_side_column'
6     else
7       'full'
8     end
9   end
10
11   #
12   # three forms:
13   #
14   #  (1) link('page-name')
15   #  (2) link('label' => 'page-name')
16   #  (3) link('label' => 'https://url')
17   #
18   # both accept optional options hash:
19   #
20   #  (1) link('page-name', :class => 'x')
21   #  (2) link('label' => 'page-name', :class => 'x')
22   #
23   def link(name, options=nil)
24     if name.is_a? Hash
25       klass = name.delete(:class)
26       label, name = name.to_a.first
27       if label.is_a? Symbol
28         label = I18n.t label
29       end
30     else
31       klass = options[:class] if options
32     end
33     if name.starts_with?('#') || name.starts_with?('http')
34       path = name
35     else
36       page = site.find_page(name)
37       if page
38         label ||= page.title
39         path = page_path(page)
40       else
41         label = '[dead link]'
42         path = '/'
43       end
44     end
45     link_to label, path, {:class => klass}
46   end
47
48   def page_path(page)
49     if page.props.path_prefix
50       "/#{I18n.locale.to_s}/#{page.props.path_prefix}/#{page.name}"
51     else
52       '/' + ([I18n.locale.to_s] + page.path).join('/')
53     end
54   end
55
56   #
57   # allows a template to render a partial giving a relative path (relative to the calling template)
58   #
59   def render_local_template(arg, locals={})
60     caller_path = Pathname.new(caller.first.gsub(/^([^:]*).*$/, '\1'))
61     doc_root = Pathname.new(Rails.root + 'app/views')
62     template_path = File.dirname(caller_path.relative_path_from(doc_root).to_s) + '/' + arg
63     begin
64       render :template => template_path, :locals => locals
65     rescue ActionView::MissingTemplate => exc
66       "<!-- template missing %s -->" % template_path
67     end
68   end
69
70   def page_title
71     if @page
72       if @page.props
73         @page.props.title || @page.title
74       else
75         @page.title
76       end
77     else
78       ""
79     end
80   end
81
82   #
83   # renders the content of a static page
84   # this is an ugly duplicate of the application controller render_page, because
85   # they call two different 'render' methods (controller and view renders behave differently).
86   # TODO: figure out how to combine into one helper_method.
87   #
88   def render_page(page)
89     begin
90       render :template => page.template_path
91     rescue ActionView::MissingTemplate => exc
92       begin
93         render :template => page.template_path(DEFAULT_LOCALE)
94       rescue
95         raise exc
96       end
97     end
98   end
99
100 end