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
|