diff --git a/test_input/templates/base.html b/test_input/templates/base.html
index 4c90851..c6fde94 100644
--- a/test_input/templates/base.html
+++ b/test_input/templates/base.html
@@ -3,6 +3,8 @@
{{page_title}}
+ {{menu}}
+
{{content}}
Created: {{content_creation_time.strftime('%d.%m.%Y %H:%M:%S')}}
diff --git a/test_input/testblog.py b/test_input/testblog.py
index acffdf1..3316839 100644
--- a/test_input/testblog.py
+++ b/test_input/testblog.py
@@ -8,13 +8,22 @@ from verdandi.modules.page import Page
class TestPage1(Page):
title = "A cool new Page"
+ menu_title = "New Page"
+ menu_label = "new_cool_page"
+
class TestPage2(Page):
title = "An other cool Page"
url = "page2.html"
+ menu_title = "Other new Page"
+ menu_label = "cool_page1"
+
class TestPage3(Page):
title = "Yet an other cool Page"
+ menu_title = "Other new Page2"
+ menu_label = "cool_page2"
+ menu_parent = "cool_page1"
url = "subdir/page3.html"
diff --git a/verdandi/mixins/menuitemmixin.py b/verdandi/mixins/menuitemmixin.py
index 8cba70f..50893f9 100644
--- a/verdandi/mixins/menuitemmixin.py
+++ b/verdandi/mixins/menuitemmixin.py
@@ -6,6 +6,8 @@ class MenuItemMixin(object):
menu_label = None
menu_parent = None
url = "index.html"
+
+ menu_items = None
def process_message(self, message):
if message == None:
@@ -14,5 +16,72 @@ class MenuItemMixin(object):
'parent' : self.menu_parent,
'label' : self.menu_label,
'url' : self.url}]
+ elif message['type'] == 'menu_add_item':
+
+ if self.menu_items == None:
+ self.menu_items = {}
+
+ label = message['label']
+ if label in self.menu_items.keys():
+ print '[Warn] Depulicate menu item label: %s in %s' % (label, self.menu_label)
+ return []
+
+ self.menu_items[label] = {}
+
+ for key in ['title', 'parent', 'label', 'url']:
+ self.menu_items[label][key] = message[key]
return []
+
+
+ def get_menu_path(self):
+ path = [self.menu_label]
+ while self.menu_items[path[0]]['parent'] != None:
+ path = [self.menu_items[path[0]]['parent']] + path
+
+ return path
+
+
+ def get_menu_level(self, parent):
+ return filter(lambda x: x['parent'] == parent, self.menu_items.values())
+
+
+ def generate_levels(self, path):
+ level = path[0]
+ next_level = None
+ if len(path) > 1:
+ next_level = path[1]
+
+ res = ''
+
+ sorted_level = sorted(self.get_menu_level(level), key=lambda x: x['label'])
+ for item in sorted_level:
+ if item['label'] == self.menu_label:
+ res += '- %s
' % item['title']
+ res += self.generate_levels(path[1:])
+ res += ' '
+ elif item['label'] == next_level:
+ res += '- %s
' % (item['url'], item['title'])
+ res += self.generate_levels(path[1:])
+ res += ' '
+ else:
+ res += '- %s
' % (item['url'], item['title'])
+
+ res += '
'
+
+ return res
+
+ def generate_menu(self):
+
+ path = self.get_menu_path()
+
+ return self.generate_levels([None] + path)
+
+
+ def get_context(self):
+ context = super(MenuItemMixin, self).get_context()
+
+ context['menu'] = self.generate_menu()
+
+ return context
+
diff --git a/verdandi/modules/page.py b/verdandi/modules/page.py
index afd8775..df67ea8 100644
--- a/verdandi/modules/page.py
+++ b/verdandi/modules/page.py
@@ -8,7 +8,7 @@ from verdandi.mixins.templatemixin import TemplateMixin
from verdandi.mixins.menuitemmixin import MenuItemMixin
from verdandi.constants import CONTENT_DIRECTORY
-class Page(TemplateMixin, MenuItemMixin):
+class Page(MenuItemMixin, TemplateMixin):
title = "Page Title"
content_file = "content.md"