Here is the Navitree macro code:

# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - Navitree Macro

    Originally authored by Jennifer Vanderputten (Jen@RabidWeasel.com)
    Based off of Navigation.py
"""

import re
from MoinMoin import config
from MoinMoin.Page import Page

Dependencies = ["namespace"]

def _getParent(pagename):
    """ Return parent of pagename.
    """
    pos = pagename.rfind('/')
    if pos >= 0:
        return pagename[:pos]
    return None


def _getPages(request, filter_regex=None):
    """ Return a (filtered) list of pages names.
    """
    filter = None
    if filter_regex:
        filter = re.compile(filter_regex).match
    pages = request.rootpage.getPageList(filter=filter)
    pages.sort()
    return pages


def _getLinks(request, pagename, filter_regex=None):
    """ Return pagename for up, first, prev, next, last; each can be None.
    """
    pos, size, first, prev, next, last = 0, 0, None, None, None, None

    all_pages = _getPages(request, filter_regex)
    size = len(all_pages)

    if all_pages:
        try:
            pos = all_pages.index(pagename)
        except ValueError:
            # this should never happen in theory, but let's be sure
            pass
        else:
            if pos > 0:
                first = all_pages[0]
                prev = all_pages[pos-1]
            if pos+1 < len(all_pages):
                next = all_pages[pos+1]
                last = all_pages[-1]

    return pos, size, (first, prev, next, last)

class Navitree:
    """ Dispatcher class implementing the navitree schemes.
    """

    # querystring for slideshow links
    PROJECTION = 'action=print&media=projection'

    def __init__(self, macro, args):
        """ Prepare common values used during processing.
        """
        self.macro = macro
        self.args = args.split(',')
        self._ = self.macro.request.getText

        self.pagename = self.macro.formatter.page.page_name
        self.print_mode = self.macro.request.form.has_key('action') \
            and self.macro.request.form['action'][0] == 'print'
        self.media = self.macro.request.form.get('media', [None])[0]
        self.querystr = self.print_mode and self.PROJECTION or ''


    def dispatch(self):
        """ Return None if in plain print mode (no navigational
            elements in printouts), else the proper HTML code.
        """
        if self.print_mode and self.media != 'projection':
            return None

        scheme = self.args[0] or '<default>'
        return getattr(self, 'do_'+scheme, self.badscheme)()


    def badscheme(self):
        """ Bad scheme argument.
        """
        _ = self._
        scheme = self.args[0]
        return (self.macro.formatter.sysmsg(1) +
                self.macro.formatter.text(
            _("Unsupported navitree scheme '%(scheme)s'!") %
            {'scheme': scheme}) +
                self.macro.formatter.sysmsg(0))


    def do_childtree(self):
        return self.do_tree(root=self.pagename, currentdepth=0, parents={})

    def do_tree(self, root=None, currentdepth=0, parents={}):
        """ Navigate to subpages from a parent page.
        """
        _ = self._
        try:
            depth = int(self.args[1])
        except (IndexError, TypeError, ValueError):
            depth = 0

        # get parent page name if no root was specified
        parent = root or _getParent(self.pagename)
        if not parent:
            return (self.macro.formatter.sysmsg(1) +
                    self.macro.formatter.text(_('No parent page found!'))+
                    self.macro.formatter.sysmsg(0))
        else:
            parents[parent] = 1

        # limit depth if a depth was specified
        if depth and currentdepth >= depth:
            return ''

        # iterate over children, adding links to all of them
        result = []
        result.append('<ul>')
        children = _getPages(self.macro.request, '^%s/' % parent)
        for child in children:
            # display short page name, leaving out the parent path
            # (and make sure the name doesn't get wrapped)
            shortname = child[len(parent)+1:]

            if shortname.count('/') > 0:
                shortname = re.sub('/.*$', '', shortname)
                child = parent + '/' + shortname

            if parents.has_key(child):
                continue

            result.append('<li>')

            if child == self.pagename:
                # do not link to focus
                result.append(self.macro.formatter.text(shortname))
            else:
                # link to child
                result.append(Page(self.macro.request, child).link_to(self.macro.request, text=shortname, querystr=self.querystr))

            result.append('</li>')
            result.append(self.do_tree(root=child, currentdepth=currentdepth+1, parents=parents))

        result.append('</ul>')
        return ''.join(result)


def execute(macro, args):
    # get HTML code with the links
    navi = Navitree(macro, args or '').dispatch()

    if navi:
        return '%s' % navi

    # navigation disabled in plain print mode
    return ''

MoinMoin: JenniferVanderputten/Navitree (last edited 2009-10-13 05:50:48 by 114)