]> oss.titaniummirror.com Git - webber.git/blobdiff - plugins/hierarchy.py
hierarchy.py: fix get_linear_sitemap()
[webber.git] / plugins / hierarchy.py
index 6aa2f3e4d99f36772dcbc4644793ce621e6de267..82cbd6a14a5e975d2c7e407b2227484533be9404 100644 (file)
@@ -1,4 +1,5 @@
 # -*- coding: iso-8859-1 -*-
+import webber
 from webber import *
 import re
 
@@ -21,26 +22,16 @@ def memorize_links(title, links):
                _parent[link] = title
 
 
-def memorize_parent(title, parent, order):
+def memorize_parent(title, parent, order=100):
        #print "memorize_parent:", title, parent
        #print "  parent:", _parent
        #print "  childs:", _childs
-       if order==-1:
-               order = 0
-               if _childs.has_key(parent):
-                       for c in _childs:
-                               for o,n in _childs[c]:
-                                       if o > order:
-                                               order = o
-               else:
-                       _childs[parent] = []
-               order += 100
        #print "order:", title, order
        if not _childs.has_key(parent):
                _childs[parent] = []
        _childs[parent].append( (order, title) )
        _parent[title] = parent
-       
+
 
 #
 # The "scan" plugins should scan for meta-data, mostly for links.
@@ -52,13 +43,18 @@ def memorize_parent(title, parent, order):
 @set_hook("scan")
 def scan(params):
        file = params["file"]
+
+       # Ignore hidden pages
+       if file.has_key("hide") and file.hide:
+               return
+
        if file.has_key("links"):
                memorize_links(file.linktitle, file.links)
        if file.has_key("parent"):
                if file.has_key("order"):
                        order = int(file.order)
                else:
-                       order = -1
+                       order = 100
                memorize_parent(file.linktitle, file.parent, order)
 
 
@@ -79,50 +75,38 @@ def scan_done(params):
 
 
 @set_function("get_breadcrumbs")
-def get_breadcrumbs(orig_page):
-       """Returns something like ['Home', 'Beruf', 'Werdegang']. This can
-       be easyly used to generate breadcrumbs HTML code."""
+def get_breadcrumbs(orig_page=None):
+       if orig_page is None:
+               orig_page = get_current_file()
        res = [(orig_page, get_link_from(orig_page, orig_page))]
        page = orig_page
        #print "orig_page:", orig_page
-       while _parent.has_key(page):
-               page = _parent[page]
+       while _parent.has_key(page.linktitle):
+               page = get_file_for(_parent[page.linktitle])
                link = get_link_from(orig_page, page)
                #print "  page, link:", page, link
                res.insert(0, (page, link))
+       #print res
        return res
 
 
-
 @set_function("get_sidemenu")
-def get_sidemenu(page):
-       """Returns an array with a side-menu. Everything from the current
-       page upwards is shown, as well as one level below the current
-       position. The array has the following items:
-
-       level  part-of-path  current-page  title
-
-       Example:
-               0 1 0 Home
-               0 1 0 Beruf
-               1 0 0 Kenntnisse
-               1 1 0 Werdegang
-               2 0 1 Alte
-               0 0 0 Haus
-       """
-       # Determine root page:
-       bread = get_breadcrumbs(page)
+def get_sidemenu(root="Home", level=1):
+       page = get_current_file()
+       if not isinstance(root, webber.File):
+               root = get_file_for(root)
+
+       bread = get_breadcrumbs()
        #print "Menu for:", page
        #print "Bread:", bread
 
-       root = "Home" #TODO
        res = [(0, 1, int(root==page), root, get_link_from(page, root))]
 
        def do_menu(pg, level):
                #print "pg, has_key:", pg, _childs.has_key(pg)
-               if _childs.has_key(pg):
-                       for p in _childs[pg]:
-                               subpage = p[1]
+               if _childs.has_key(pg.linktitle):
+                       for p in _childs[pg.linktitle]:
+                               subpage = get_file_for(p[1])
                                in_bread = False
                                for b in bread:
                                        if b[0] == subpage:
@@ -132,64 +116,115 @@ def get_sidemenu(page):
                                go_deeper = in_bread or (subpage==page)
                                #print "subpage:", subpage, "in bread:", in_bread, "go deeper:", go_deeper
                                link = get_link_from(page, subpage)
-                               res.append((level, int(subpage in bread), int(subpage==page), subpage, link))
+                               res.append((level, in_bread, int(subpage==page), subpage, link))
                                if go_deeper:
                                        do_menu(subpage, level+1)
 
        # TODO: make this configurable, e.g. cfg.rootpage, otherwise a page
        # that is outside of the menu won't show a menu
-       do_menu("Home", 0)
+       do_menu(root, level)
        return res
 
 
 
+@set_function("get_hierarchical_sitemap")
+def get_hierarchical_sitemap(root="Home", show_orphans=False):
+       page = get_current_file()
+       if not isinstance(root, webber.File):
+               root = get_file_for(root)
 
-@set_function("get_recently")
-def get_recently(file):
-       #file = get_current_file()
-       #print "XXXXXX:", file.linktitle
-       pg = []
+       visited = {root: True}
+       def do_menu(pg):
+               res = []
+               if _childs.has_key(pg.linktitle):
+                       for p in _childs[pg.linktitle]:
+                               subpage = get_file_for(p[1])
+                               visited[subpage] = True
+                               res.append( do_menu(subpage) )
+               return (pg, get_link_from(root, pg), res)
+               
+       res = do_menu(root)
 
-       max_n = 10      # TODO: configurable?
-       orig_page = file.linktitle
 
-       def addPage(pg, title):
-               #print "addPage", title
+       if show_orphans:
                for f in files:
+                       #print f
                        file = files[f]
-                       #print file
-                       if file.has_key("linktitle") and file.linktitle == title:
-                               pg.append( (file.mtime, file.ctime, file.title, get_link_from(orig_page, file.linktitle)) )
-                               if _childs.has_key(file.linktitle):
-                                       for c in _childs[file.linktitle]:
-                                               #print "c:", c
-                                               addPage(pg, c[1])
-                                               if len(pg) == max_n:
-                                                       return
-       addPage(pg, orig_page)
-       pg.sort(reverse=True)
-       #for p in pg: print p
-       return pg
-
-
-       
-       
-
-if __name__ == "__main__":
-       # You can call this test-code this way:
-       #
-       #       PYTHONPATH=`pwd` python plugins/hierarchy.py
-       #
-       memorize_parent("Impressum", "Home", 99999)
-       memorize_parent("Beruf", "Home", 100)
-       memorize_parent("Werdegang", "Beruf", 100)
-       memorize_parent("Kenntnisse", "Beruf", 200)
-       scan_done(None)
-       
-       #print get_breadcrumbs("Home")
-       #print get_breadcrumbs("Beruf")
-       #print get_breadcrumbs("Werdegang")
-       #print get_breadcrumbs("Kenntnisse")
-       #for t in get_sidemenu("Home"): print t
-       #for t in get_sidemenu("Beruf"): print t
-       for t in get_sidemenu("Kenntnisse"): print t
+                       if not file.has_key("linktitle"):
+                               continue
+                       try:
+                               if file in visited:
+                                       #print "found", file.linktitle
+                                       continue
+                       except KeyError:
+                               continue
+                       #print "not found:", file.linktitle
+                       res.append( (file, get_link_from(page, file.linktitle), []) )
+
+       #import pprint
+       #pprint.pprint(res, indent=4)
+       return res
+
+
+@set_function("get_linear_sitemap")
+def get_linear_sitemap(root="Home", show_orphans=False, level=1):
+       page = get_current_file()
+       if not isinstance(root, webber.File):
+               root = get_file_for(root)
+
+       visited = {root: None}
+       res = [(0, root, get_link_from(page, root))]
+
+       def do_menu(pg, level):
+               #print "pg:", pg
+               #, _childs.has_key(pg.linktitle)
+               if _childs.has_key(pg.linktitle):
+                       for p in _childs[pg.linktitle]:
+                               subpage = get_file_for(p[1])
+
+                               #print "subpage:", subpage
+                               link = get_link_from(page, subpage)
+                               res.append((level, subpage, link))
+                               visited[subpage] = None
+                               do_menu(subpage, level+1)
+
+       do_menu(root, level)
+
+       #print "visited:", visited
+       if show_orphans:
+               for f in files:
+                       #print f
+                       file = files[f]
+                       if not file.has_key("linktitle"):
+                               continue
+                       try:
+                               if file in visited:
+                                       #print "found", file.linktitle
+                                       continue
+                       except KeyError:
+                               continue
+                       #print "not found:", file.linktitle
+                       res.append( (0, file, get_link_from(page, file.linktitle)))
+       #import pprint
+       #pprint.pprint(res)
+       return res
+
+
+@set_function("get_recently")
+def get_recently(page=None, max_items=10):
+       if page is None:
+               page = get_current_file()
+       elif not isinstance(page, webber.File):
+               page = get_file_for(page)
+
+       res = []
+       orig_page = page
+
+       def addPage(res, page):
+               res.append( (page, get_link_from(orig_page, page)) )
+               if _childs.has_key(page.linktitle):
+                       for c in _childs[page.linktitle]:
+                               addPage(res, get_file_for(c[1]))
+       addPage(res, orig_page)
+       res.sort(cmp = lambda x,y: cmp(y[0].mtime, x[0].mtime))
+       return res[:max_items]