This action follows the links from the current page and produces a tree-like view of nearby pages. You can try it out by clicking on LocalSiteMap at the bottom of the page.
-- SteveHowell
code
"""
MoinMoin - LocalSiteMap action
Copyright (c) 2001 by Steve Howell <showell@zipcon.com>
Copyright (c) 2001 by Jürgen Hermann <jh@web.de>
All rights reserved, see COPYING for details.
The LocalSiteMap action gives you a page that shows
nearby links. This is an example of what appears on the
page (names are linkable on the real page):
MoinMoin
GarthKidd
OrphanedPages
WantedPages
JørnHansen
CategoryHomepage
CategoryCategory
WikiHomePage
JørnsTodo
WikiWiki
OriginalWiki
TODO:
- add missing docs (docstrings, inline comments)
"""
# Imports
import string
#import os, urlparse
from MoinMoin import config, wikiutil, webapi, user
from MoinMoin.Page import Page
def execute(pagename, form):
webapi.http_headers()
wikiutil.send_title(user.current.text('Local Site Map for "%s"') % (pagename),
pagename=pagename)
"""
caller = os.environ.get('HTTP_REFERER')
if caller:
parts = urlparse.urlparse(caller)
print "Back to", Page(string.split(parts[2], "/")[-1]).link_to()
print "<br><br>"
"""
print LocalSiteMap(pagename).output()
wikiutil.send_footer(pagename)
class LocalSiteMap:
def __init__(self, name):
self.name = name
self.result = []
def output(self):
tree = PageTreeBuilder().build_tree(self.name)
#self.append("<small>")
tree.depth_first_visit(self)
#self.append("</small>")
return string.join(self.result, '')
def visit(self, name, depth):
""" Visit a page, i.e. create a link.
"""
if not name: return
self.append(' ' * (5*depth))
self.append(' ' + wikiutil.link_tag('%s?action=%s' %
(wikiutil.quoteWikiname(name), string.split(__name__, '.')[-1]), name))
self.append(" <small>[")
self.append(Page(name).link_to('view'))
self.append("</small>]<br>")
def append(self, text):
self.result.append(text)
class PageTreeBuilder:
def __init__(self):
self.children = {}
self.numnodes = 0
self.maxnodes = 35
def mark_child(self, name):
self.children[name] = 1
def child_marked(self, name):
return self.children.has_key(name)
def is_ok(self, child):
if not self.child_marked(child):
if Page(child).exists():
self.mark_child(child)
return 1
return 0
def new_kids(self, name):
# does not recurse
kids = []
for child in Page(name).getPageLinks():
if self.is_ok(child):
kids.append(child)
return kids
def new_node(self):
self.numnodes = self.numnodes + 1
if self.numnodes == self.maxnodes:
raise "max nodes reached"
def build_tree(self, name):
self.mark_child(name)
tree = Tree(name)
try:
self.recurse_build([tree], 1)
except:
pass
return tree
def recurse_build(self, trees, depth):
all_kids = []
for tree in trees:
kids = self.new_kids(tree.node)
for kid in kids:
newTree = Tree(kid)
tree.append(newTree)
self.new_node()
all_kids.append(newTree)
if len(kids):
self.recurse_build(all_kids, depth+1)
class Tree:
def __init__(self, node):
self.node = node
self.children = []
def append(self, node):
self.children.append(node)
def depth_first_visit(self, visitor, depth=0):
visitor.visit(self.node, depth)
for c in self.children:
c.depth_first_visit(visitor, depth+1)