# HG changeset patch # User Paul Boddie # Date 1224369444 -7200 # Node ID e99d2cf1e6ba47e4f6eaa42c62bee1377b8ebb5f A category menu macro for MoinMoin 1.5 and above. diff -r 000000000000 -r e99d2cf1e6ba macros/CategoryMenu.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/macros/CategoryMenu.py Sun Oct 19 00:37:24 2008 +0200 @@ -0,0 +1,151 @@ +# -*- coding: iso-8859-1 -*- +""" + MoinMoin - CategoryMenu Macro + + @copyright: 2008 by Paul Boddie + @copyright: 2000-2004 Juergen Hermann , + 2005-2008 MoinMoin:ThomasWaldmann. + @license: GNU GPL (v2 or later), see COPYING.txt for details. +""" + +from MoinMoin.Page import Page +from MoinMoin import wikiutil, search, version +import re + +category_regexp = None + +Dependencies = ['pages'] + +def isMoin15(): + return version.release.startswith("1.5.") + +def getCategoryPattern(request): + global category_regexp + + try: + return request.cfg.cache.page_category_regexact + except AttributeError: + + # Use regular expression from MoinMoin 1.7.1 otherwise. + + if category_regexp is None: + category_regexp = re.compile(u'^%s$' % ur'(?PCategory(?P(?!Template)\S+))', re.UNICODE) + return category_regexp + +def getCategories(request): + + """ + From the AdvancedSearch macro, return a list of category page names using + the given 'request'. + """ + + # This will return all pages with "Category" in the title. + + cat_filter = getCategoryPattern(request).search + pagenames = request.rootpage.getPageList(filter=cat_filter) + pagenames.sort() + return pagenames + +def getCategoryMapping(category_pagenames, request): + + """ + For the given 'category_pagenames' return a list of tuples of the form + (category name, category page name) using the given 'request'. + """ + + cat_pattern = getCategoryPattern(request) + mapping = [] + for pagename in category_pagenames: + name = cat_pattern.match(pagename).group("key") + if name != "Category": + mapping.append((name, pagename)) + mapping.sort() + return mapping + +def getPages(pagename, request): + + "Return the links minus category links for 'pagename' using the 'request'." + + query = search.QueryParser().parse_query('"%s"' % pagename) + if isMoin15(): + results = search.searchPages(request, query) + results.sortByPagename() + else: + results = search.searchPages(request, query, "page_name") + + cat_pattern = getCategoryPattern(request) + pages = [] + for page in results.hits: + if not cat_pattern.match(page.page_name): + pages.append(page) + return pages + +def execute(macro, args): + request = macro.request + fmt = macro.formatter + page = fmt.page + + # Interpret the arguments. + + try: + selected_category_names = wikiutil.parse_quoted_separated(args, name_value=False) + except AttributeError: + selected_category_names = args.split(",") + + selected_category_names = [arg for arg in selected_category_names if arg] + + # Get the categories. + + categories = getCategoryMapping(getCategories(request), request) + + # Generate a menu with the categories, together with expanded submenus for + # the categories employed by the current page or as requested in the macro + # arguments. + + output = [] + output.append(fmt.bullet_list(on=1, attr={"class" : "category-menu"})) + + for category in categories: + category_name, category_pagename = category + + pages_in_category = getPages(category_pagename, request) + pagenames_in_category = [p.page_name for p in pages_in_category] + + # Generate the submenu where appropriate. + + if selected_category_names and category_name in selected_category_names or \ + not selected_category_names and page.page_name in pagenames_in_category: + + output.append(fmt.listitem(on=1, attr={"class" : "category-menu-item-selected"})) + output.append(fmt.text(category_name)) + + output.append(fmt.bullet_list(on=1, attr={"class" : "category-submenu"})) + + # Visit each page in the category. + + for page_in_category in pages_in_category: + pagename = page_in_category.page_name + + output.append(fmt.listitem(on=1)) + output.append(fmt.pagelink(on=1, pagename=pagename)) + output.append(fmt.text(pagename)) + output.append(fmt.pagelink(on=0, pagename=pagename)) + output.append(fmt.listitem(on=0)) + + output.append(fmt.bullet_list(on=0)) + output.append(fmt.listitem(on=0)) + + # Otherwise generate a simple link. + + else: + output.append(fmt.listitem(on=1, attr={"class" : "category-menu-item"})) + output.append(fmt.pagelink(on=1, pagename=category_pagename)) + output.append(fmt.text(category_name)) + output.append(fmt.pagelink(on=0, pagename=category_pagename)) + output.append(fmt.listitem(on=0)) + + output.append(fmt.bullet_list(on=0)) + + return ''.join(output) + +# vim: tabstop=4 expandtab shiftwidth=4