]> oss.titaniummirror.com Git - webber.git/blobdiff - plugins/hierarchy.py
plugins/hierarchy: warn about orphan files
[webber.git] / plugins / hierarchy.py
index 6aa2f3e4d99f36772dcbc4644793ce621e6de267..01994ac5a82187caa663052db10c3fd04369d3ba 100644 (file)
@@ -1,46 +1,40 @@
 # -*- coding: iso-8859-1 -*-
+import webber
 from webber import *
 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
-
-
-def memorize_parent(title, parent, order):
-       #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
+               #print "memorize_links:", thisfile, "->", linked
+               _parent[linked] = thisfile
+
+
+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.
@@ -52,14 +46,19 @@ 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)
+               memorize_links(file, file.links)
        if file.has_key("parent"):
                if file.has_key("order"):
                        order = int(file.order)
                else:
-                       order = -1
-               memorize_parent(file.linktitle, file.parent, order)
+                       order = 100
+               memorize_parent(file, file.parent, order)
 
 
 @set_hook("scan_done")
@@ -68,58 +67,59 @@ 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")
-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]
                link = get_link_from(orig_page, page)
-               #print "  page, link:", page, link
                res.insert(0, (page, link))
        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)
-       #print "Menu for:", page
-       #print "Bread:", bread
-
-       root = "Home" #TODO
+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)
+
        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):
                        for p in _childs[pg]:
                                subpage = p[1]
@@ -130,66 +130,87 @@ def get_sidemenu(page):
                                                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, 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)
+
+       # print "-" * 77
+       # import pprint
+       # pprint.pprint(res)
+       # print "-" * 77
        return res
 
 
 
+@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))]
+
+       def do_menu(pg, level):
+               #print "pg:", pg
+               #, _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))
+                               do_menu(subpage, level+1)
+
+       do_menu(root, level)
+
+       #import pprint
+       #pprint.pprint(res)
+       return res
+
 
 @set_function("get_recently")
-def get_recently(file):
-       #file = get_current_file()
-       #print "XXXXXX:", file.linktitle
-       pg = []
-
-       max_n = 10      # TODO: configurable?
-       orig_page = file.linktitle
-
-       def addPage(pg, title):
-               #print "addPage", title
-               for f in files:
-                       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
+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):
+               #print "page:", page
+               res.append( (page, get_link_from(orig_page, page)) )
+               if _childs.has_key(page.title):
+                       for c in _childs[page.title]:
+                               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]