summaryrefslogtreecommitdiff
path: root/app/helpers/content_helper.rb
blob: 1e56488f221a08da4e184b434c1d3d71f2a871ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
module ContentHelper
  
  def main_menu
    menu_items = MenuItem.all(:order => "position ASC")
    render(
      :partial => 'content/main_navigation', 
      :locals => {:menu_items => menu_items}
    )
  end
  
  def calendar
    occurrences = Occurrence.find_in_range(Time.now, (Time.now+14.days))
    
    if occurrences.empty?
      occurrences = Occurrence.find_next
    end
    
    render(
      :partial  => 'content/front_page_calendar', 
      :locals   => {:occurrences => occurrences}
    )
  end
  
  def tags
    render :partial => 'content/tags'
  end
  
  def featured_articles
    @featured_articles = FeaturedArticle.all
    render :partial => 'content/featured_articles'
  end
  
  def headline_image
    @images = @page.assets.images
    
    unless @images.empty?
      render :partial => 'content/headline_image'
    end
  end
  
  # Returns the published_at attribute of a page if it is not nil, otherwise
  # it returns the auto-filled value of the created_at attribute
  def date_for_page page
    page.published_at.to_s(:db) rescue page.created_at.to_s(:db)
  end
  
  def author_for_page page
    page.user ? page.user.login : "Unknown author"
  end
  
  def page_title
    if @page.title && @page.title != ""
      "CCC | #{@page.title}"
    else
      "CCC | Chaos Computer Club"
    end
  end
  
  # This method is an output filter for templates. It accepts any kind of text
  # and checks for an <aggregate /> tag within it. If such a tag is found, its 
  # attributes are parsed and converted into parameters for the 
  # render_collection method. The <aggregate /> tag will then be replaced 
  # entirely with the output of the render_collection method.
  #
  # Syntax of the <aggregate /> tag:
  #
  # <aggregate 
  #   flags="update, pressemitteilung"
  #   limit="20"
  #   order_by="published_at"
  #   order_direction="DESC"
  # />
  def aggregate? content
    options = {}
    
    begin
      if content =~ /<aggregate([^<>]*)>/
        tag = $~.to_s
        matched_data = $1.scan(/\w+\=\"[a-zA-Z\s\/_\d,]*\"/)
        
        matched_data.each do |data|
          splitted_data = data.split("=")
          options[splitted_data[0].to_sym] = splitted_data[1].gsub(/\"/, "")
        end
        
        options[:partial] = select_partial( options[:partial] )

        sanitize( content.sub(tag, render_collection(options)) )
      else
        sanitize( content )
      end
      
    rescue
      sanitize( content )
    end
  end
  
  # Takes the parameters from the aggregate? method and renders the collection
  # from Page.aggregate(options) with a given partial
  def render_collection options
    @content_collection = Page.aggregate(options, params[:page])

    render(
      :partial => options[:partial], 
      :collection => @content_collection,
      :as => :page
    )
  end
  
  private
  
  # Either return a custom partial path if it exsits or default to the standard
  # partial
  def select_partial partial
    if partial && partial_exists?( partial )
      return "custom/partials/#{partial}"
    else
      return 'custom/partials/article'
    end
  end

  # Check if a custom partial exists in the proper location
  def partial_exists? partial
    File.exist?(
      File.join( 
        RAILS_ROOT, 'app', 'views', 'custom', 'partials', "_#{partial}.html.erb"
      )
    )
  end
  
end