b5bb657213d666b809e85b305adf31a5bb403ef1
[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 = StaticPage.find(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       @page.props.title || @page.title
73     else
74       ""
75     end
76   end
77
78   #
79   # renders the content of a static page
80   # this is an ugly duplicate of the application controller render_page, because
81   # they call two different 'render' methods (controller and view renders behave differently).
82   # TODO: figure out how to combine into one helper_method.
83   #
84   def render_page(page)
85     begin
86       render :template => page.template_path
87     rescue ActionView::MissingTemplate => exc
88       begin
89         render :template => page.template_path(DEFAULT_LOCALE)
90       rescue
91         raise exc
92       end
93     end
94   end
95
96 end