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