X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=plugins%2Fhierarchy.py;fp=plugins%2Fhierarchy.py;h=91575561525c25d9f1b35b3ef1a353b078455096;hb=b5bc4ffdfbaa76db7cd4cdeb078097ec17024f6b;hp=8c65003610e7341c3037df97b72bb3dfa4bbfd6c;hpb=c6d30c7f18e835e0b99032d01b1f8acd7f077ec6;p=webber.git diff --git a/plugins/hierarchy.py b/plugins/hierarchy.py index 8c65003..9157556 100644 --- a/plugins/hierarchy.py +++ b/plugins/hierarchy.py @@ -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]