]> oss.titaniummirror.com Git - webber.git/blobdiff - plugins/hierarchy.py
Merge branch 'upstream'
[webber.git] / plugins / hierarchy.py
index 8c65003610e7341c3037df97b72bb3dfa4bbfd6c..91575561525c25d9f1b35b3ef1a353b078455096 100644 (file)
@@ -5,33 +5,36 @@ import re
 
 reSPLIT = re.compile(r',\s*')
 
+# This hashes store webber.File instances
 _childs = {}
 _parent = {}
 
-def memorize_links(title, links):
+def memorize_links(thisfile, links):
        global _childs
        if not links:
                return
        order = 100
        for link in reSPLIT.split(links):
-               #print title, link
-               if not _childs.has_key(title):
-                       _childs[title] = []
-               _childs[title].append( (order,link))
+               linked = get_file_for(link)
+               if not _childs.has_key(thisfile):
+                       _childs[thisfile] = []
+               _childs[thisfile].append( (order, linked))
                order += 100
-               _parent[link] = title
+               #print "memorize_links:", thisfile, "->", linked
+               _parent[linked] = thisfile
 
 
-def memorize_parent(title, parent, order=100):
-       #print "memorize_parent:", title, parent
-       #print "  parent:", _parent
-       #print "  childs:", _childs
-       #print "order:", title, order
+def memorize_parent(thisfile, parent, order=100):
+       # Convert titles or linktitle to entries of webber.File
+       if not isinstance(parent, webber.File):
+               parent = get_file_for(parent)
+
        if not _childs.has_key(parent):
                _childs[parent] = []
-       _childs[parent].append( (order, title) )
-       _parent[title] = parent
-       
+       _childs[parent].append( (order, thisfile) )
+       #print "memorize_parent:", thisfile, "->", parent
+       _parent[thisfile] = parent
+
 
 #
 # The "scan" plugins should scan for meta-data, mostly for links.
@@ -43,14 +46,19 @@ def memorize_parent(title, parent, order=100):
 @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)
+               memorize_links(file, file.links)
        if file.has_key("parent"):
                if file.has_key("order"):
                        order = int(file.order)
                else:
                        order = 100
-               memorize_parent(file.linktitle, file.parent, order)
+               memorize_parent(file, file.parent, order)
 
 
 @set_hook("scan_done")
@@ -59,14 +67,30 @@ def scan_done(params):
        in ascending order."""
 
        for c in _childs:
-               _childs[c].sort()
-       return
+               # Sort by linktitle
+               _childs[c].sort(key = lambda x: x[1].linktitle)
+               # And now sort by priority. Since Python 2.2 and upwards has stable-sort,
+               # this effectively makes a two-dimensional sort.
+               _childs[c].sort(key = lambda x: x[0])
+
+       visited = {}
+       visited[get_file_for("Home")] = True
+       for f in _parent:
+               visited[f] = True
+       for f in files:
+               file = files[f]
+               if not file.has_key("linktitle"):
+                       continue
+               if not visited.has_key(file ):
+                       warning("orphan file '%s'" % f)
 
+       return
        print "_parent:"
        for c in _parent:
                print " ", c, _parent[c]
        print "_childs:"
-       for c in _childs: print " ", c,_childs[c]
+       for c in _childs:
+               print " ", c,_childs[c]
 
 
 @set_function("get_breadcrumbs")
@@ -75,33 +99,30 @@ def get_breadcrumbs(orig_page=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.linktitle):
-               page = get_file_for(_parent[page.linktitle])
+       while _parent.has_key(page):
+               page = _parent[page]
                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(root="Home", level=1):
+       """Returns (level, part_of_path, is_current, page, link) tuples, where
+    page is a class File object and link is a relative link from the current
+    page to page."""
        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
-
        res = [(0, 1, int(root==page), root, get_link_from(page, root))]
 
+       bread = get_breadcrumbs()
+
        def do_menu(pg, level):
-               #print "pg, has_key:", pg, _childs.has_key(pg)
-               if _childs.has_key(pg.linktitle):
-                       for p in _childs[pg.linktitle]:
-                               subpage = get_file_for(p[1])
+               if _childs.has_key(pg):
+                       for p in _childs[pg]:
+                               subpage = p[1]
                                in_bread = False
                                for b in bread:
                                        if b[0] == subpage:
@@ -109,7 +130,6 @@ def get_sidemenu(root="Home", level=1):
                                                break
 
                                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, in_bread, int(subpage==page), subpage, link))
                                if go_deeper:
@@ -118,50 +138,60 @@ def get_sidemenu(root="Home", 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(root, level)
+
+       # print "-" * 77
+       # import pprint
+       # pprint.pprint(res)
+       # print "-" * 77
        return res
 
 
 
-@set_function("get_sitemap")
-def get_sitemap(root="Home", show_orphans=False, level=1):
+@set_function("get_hierarchical_sitemap")
+def get_hierarchical_sitemap(root="Home"):
+       page = get_current_file()
+       if not isinstance(root, webber.File):
+               root = get_file_for(root)
+
+       def do_menu(pg):
+               res = []
+               if _childs.has_key(pg):
+                       for p in _childs[pg]:
+                               subpage = p[1]
+                               res.append( do_menu(subpage) )
+               return (pg, get_link_from(root, pg), res)
+
+       res = do_menu(root)
+
+       #import pprint
+       #pprint.pprint(res, indent=4)
+       return res
+
+
+@set_function("get_linear_sitemap")
+def get_linear_sitemap(root="Home", level=1):
        page = get_current_file()
        if not isinstance(root, webber.File):
                root = get_file_for(root)
 
        res = [(0, root, get_link_from(page, root))]
 
-       visited = {root: None}
        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])
+               #, _childs.has_key(pg.title)
+               if _childs.has_key(pg):
+                       for p in _childs[pg]:
+                               subpage = 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)))
-       #for t in res: print t
+       #import pprint
+       #pprint.pprint(res)
        return res
 
 
@@ -176,11 +206,11 @@ def get_recently(page=None, max_items=10):
        orig_page = page
 
        def addPage(res, page):
+               #print "page:", page
                res.append( (page, get_link_from(orig_page, page)) )
-               if _childs.has_key(page.linktitle):
-                       for c in _childs[page.linktitle]:
-                               if len(res) < max_items:
-                                       addPage(res, get_file_for(c[1]))
+               if _childs.has_key(page):
+                       for c in _childs[page]:
+                               addPage(res, c[1])
        addPage(res, orig_page)
        res.sort(cmp = lambda x,y: cmp(y[0].mtime, x[0].mtime))
-       return res
+       return res[:max_items]