diff --git a/Gemfile b/Gemfile
index 5690efad..56e67122 100644
--- a/Gemfile
+++ b/Gemfile
@@ -8,4 +8,5 @@ gem 'adsf'
gem 'sass'
gem 'rdiscount'
gem 't'
+gem 'nokogiri'
diff --git a/Gemfile.lock b/Gemfile.lock
index 8958abe3..3a2b0ec2 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -50,12 +50,15 @@ GEM
rb-kqueue (>= 0.2)
lumberjack (1.0.4)
method_source (0.8.2)
+ mini_portile (0.5.1)
multi_json (1.6.1)
multipart-post (1.1.5)
nanoc (3.6.4)
cri (~> 2.3)
nanoc3 (3.3.0)
nanoc (>= 3.3.0)
+ nokogiri (1.6.0)
+ mini_portile (~> 0.5.0)
oauth (0.4.7)
oj (2.0.7)
pry (0.9.12.2)
@@ -105,6 +108,7 @@ DEPENDENCIES
adsf
guard-nanoc
nanoc3
+ nokogiri
rdiscount
sass
systemu
diff --git a/content/projects/index.html b/content/projects/index.html
new file mode 100644
index 00000000..f00deee9
--- /dev/null
+++ b/content/projects/index.html
@@ -0,0 +1,25 @@
+-----
+title: Projekte
+kind: page
+-----
+<%
+ prj = projects_by_state
+%>
+<% if prj.has_key?('active') %>
+
Aktive Projekte
+
+ <%= render 'project_list', :projects => prj['active'], :extended => true %>
+
+<% end %>
+<% if prj.has_key?('completed') %>
+Abgeschlossene Projekte
+
+ <%= render 'project_list', :projects => prj['completed'], :extended => true %>
+
+<% end %>
+<% if prj.has_key?('stalled') %>
+Ruhende Projekte
+
+ <%= render 'project_list', :projects => prj['stalled'], :extended => true %>
+
+<% end %>
diff --git a/layouts/default.html b/layouts/default.html
index 2deb3971..31496a33 100644
--- a/layouts/default.html
+++ b/layouts/default.html
@@ -24,7 +24,7 @@
Wir über uns
Veranstaltungen
Aktivitäten
- Projekte
+ Projekte
Members
Planet CCCS
Archiv
diff --git a/layouts/project_intro.erb b/layouts/project_intro.erb
new file mode 100644
index 00000000..12cb0de0
--- /dev/null
+++ b/layouts/project_intro.erb
@@ -0,0 +1,21 @@
+-----
+filter: erb
+-----
+<%
+ prjname = @project.identifier.split('/')[2]
+%>
+
+
+
+ <% if @project.attributes.has_key?(:subtitle) then %>
+ <%= @project[:subtitle] %>
+ <% end %>
+
+
+
+ <% if @extended then %>
+ <%= article_summary(@project) %>
+ <% end %>
+
+
+
diff --git a/layouts/project_list.erb b/layouts/project_list.erb
new file mode 100644
index 00000000..1922ff04
--- /dev/null
+++ b/layouts/project_list.erb
@@ -0,0 +1,3 @@
+<% @projects.each do |prj| %>
+ <%= render 'project_intro', :project => prj, :classes => "hyphenate", :extended => @extended %>
+<% end %>
diff --git a/lib/articlesummary.rb b/lib/articlesummary.rb
new file mode 100644
index 00000000..0fd993b2
--- /dev/null
+++ b/lib/articlesummary.rb
@@ -0,0 +1,16 @@
+require 'nokogiri'
+
+def article_summary(item, separator=//)
+ # Has intro attribute? Use this
+ if (item[:intro] && item[:intro].length>0)
+ return parse_markdown(item[:intro])
+ end
+ # Try to extract marked teaser from article
+ summary,body = item.compiled_content.split(separator)
+ if (body)
+ return summary
+ end
+ # Else: Extract first top level html element
+ doc = Nokogiri::Slop(item.compiled_content)
+ return doc.children[0].to_html
+end
diff --git a/lib/projectpages.rb b/lib/projectpages.rb
new file mode 100644
index 00000000..5e237adc
--- /dev/null
+++ b/lib/projectpages.rb
@@ -0,0 +1,9 @@
+def projects_by_state()
+ @cache_projects ||= items.select { |i| i[:kind] == 'project' }.sort_by { |i| i[:title] }
+ @cache_projects_by_state ||= @cache_projects.group_by { |item| item[:status] }
+ @cache_projects_by_state
+end
+
+def project_id(project)
+ project.identifier.split('/')[2]
+end