summaryrefslogtreecommitdiff
path: root/app/helpers/content_helper.rb
blob: 53bf5b2201df659047e600f4ce0a08a8ef8a03bc (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
132
133
module ContentHelper

  def main_menu
    menu_items = MenuItem.order("position ASC").all
    render(
      :partial => 'content/main_navigation',
      :locals => {:menu_items => menu_items}
    )
  end

  def calendar
    occurrences = Occurrence.find_in_range(Time.now, (Time.now+6.weeks))

    if occurrences.empty?
      occurrences = Occurrence.find_next
    end

    occurrences = occurrences.reject { |o| o.node.nil? || o.node.head.nil? }

    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
    I18n.l(page.published_at, :format => :ccc) rescue I18n.l(page.created_at, :format => :ccc)
  end

  def author_for_page page
    page.user ? page.user.login : "Unknown author"
  end

  def page_title
    if @page && @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 short code within it. If such a code is found,
  # its # attributes are parsed and converted into parameters for the
  # render_collection method. The [aggregate ] short code will then be replaced
  # entirely with the output of the render_collection method.
  #
  # Syntax of the [aggregate ] short code:
  #
  # [aggregate
  #   flags="update, pressemitteilung"
  #   limit="20"
  #   order_by="published_at"
  #   order_direction="DESC"
  # ]
  def aggregate? content
    options = {}

    cccms_attributes = ActionView::Base.sanitized_allowed_attributes + ['lang']

    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("=", 2)
          options[splitted_data[0].to_sym] = splitted_data[1].gsub(/"/, "")
        end

        options[:partial] = select_partial(options[:partial])

        sanitize(content.sub(tag, render_collection(options)), :attributes => cccms_attributes)
      else
        sanitize(content, :attributes => cccms_attributes)
      end

    rescue
      sanitize(content, :attributes => cccms_attributes)
    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?(
      Rails.root.join('app', 'views', 'custom', 'partials', "_#{partial}.html.erb")
    )
  end

end