X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=plugins%2Fhierarchy.py;h=91575561525c25d9f1b35b3ef1a353b078455096;hb=712216965d66183bf3b78d342c0bd4f2627bb431;hp=09fbeaea98132d0832ec0a5d8d2eb97351a1dec3;hpb=8c48cb9d69740d71b718ebdbf909499ff33a5a0e;p=oss-web.git diff --git a/plugins/hierarchy.py b/plugins/hierarchy.py index 09fbeae..9157556 100644 --- a/plugins/hierarchy.py +++ b/plugins/hierarchy.py @@ -1,36 +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 + #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. @@ -42,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") @@ -58,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 - 1 1 0 Beruf - 2 0 0 Kenntnisse - 2 1 0 Werdegang - 3 0 1 Alte - 1 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] @@ -120,103 +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(root, 1) + do_menu(root, level) + + # print "-" * 77 + # import pprint + # pprint.pprint(res) + # print "-" * 77 return res -@set_function("get_sitemap") -def get_sitemap(page): - # Determine root page: - root = "Home" #TODO - - res = [(0, get_file_for(root).title, get_link_from(page, root))] +@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, has_key:", pg, _childs.has_key(pg) + #print "pg:", pg + #, _childs.has_key(pg.title) if _childs.has_key(pg): for p in _childs[pg]: subpage = p[1] - #print "subpage:", subpage, "in bread:", in_bread, "go deeper:", go_deeper + #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, 1) - #print visited - for f in files: - #print f - file = files[f] - try: - if file.linktitle in visited: - #print "found", file.linktitle - continue - except KeyError: - continue - #print "not found:", file.linktitle - res.append( (0, file.title, get_link_from(page, file.linktitle))) - #for t in res: print t + 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 - for t in get_sitemap("Home"): 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): + 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[:max_items]