1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/macros/CategoryMenu.py Sun Oct 19 00:37:24 2008 +0200
1.3 @@ -0,0 +1,151 @@
1.4 +# -*- coding: iso-8859-1 -*-
1.5 +"""
1.6 + MoinMoin - CategoryMenu Macro
1.7 +
1.8 + @copyright: 2008 by Paul Boddie <paul@boddie.org.uk>
1.9 + @copyright: 2000-2004 Juergen Hermann <jh@web.de>,
1.10 + 2005-2008 MoinMoin:ThomasWaldmann.
1.11 + @license: GNU GPL (v2 or later), see COPYING.txt for details.
1.12 +"""
1.13 +
1.14 +from MoinMoin.Page import Page
1.15 +from MoinMoin import wikiutil, search, version
1.16 +import re
1.17 +
1.18 +category_regexp = None
1.19 +
1.20 +Dependencies = ['pages']
1.21 +
1.22 +def isMoin15():
1.23 + return version.release.startswith("1.5.")
1.24 +
1.25 +def getCategoryPattern(request):
1.26 + global category_regexp
1.27 +
1.28 + try:
1.29 + return request.cfg.cache.page_category_regexact
1.30 + except AttributeError:
1.31 +
1.32 + # Use regular expression from MoinMoin 1.7.1 otherwise.
1.33 +
1.34 + if category_regexp is None:
1.35 + category_regexp = re.compile(u'^%s$' % ur'(?P<all>Category(?P<key>(?!Template)\S+))', re.UNICODE)
1.36 + return category_regexp
1.37 +
1.38 +def getCategories(request):
1.39 +
1.40 + """
1.41 + From the AdvancedSearch macro, return a list of category page names using
1.42 + the given 'request'.
1.43 + """
1.44 +
1.45 + # This will return all pages with "Category" in the title.
1.46 +
1.47 + cat_filter = getCategoryPattern(request).search
1.48 + pagenames = request.rootpage.getPageList(filter=cat_filter)
1.49 + pagenames.sort()
1.50 + return pagenames
1.51 +
1.52 +def getCategoryMapping(category_pagenames, request):
1.53 +
1.54 + """
1.55 + For the given 'category_pagenames' return a list of tuples of the form
1.56 + (category name, category page name) using the given 'request'.
1.57 + """
1.58 +
1.59 + cat_pattern = getCategoryPattern(request)
1.60 + mapping = []
1.61 + for pagename in category_pagenames:
1.62 + name = cat_pattern.match(pagename).group("key")
1.63 + if name != "Category":
1.64 + mapping.append((name, pagename))
1.65 + mapping.sort()
1.66 + return mapping
1.67 +
1.68 +def getPages(pagename, request):
1.69 +
1.70 + "Return the links minus category links for 'pagename' using the 'request'."
1.71 +
1.72 + query = search.QueryParser().parse_query('"%s"' % pagename)
1.73 + if isMoin15():
1.74 + results = search.searchPages(request, query)
1.75 + results.sortByPagename()
1.76 + else:
1.77 + results = search.searchPages(request, query, "page_name")
1.78 +
1.79 + cat_pattern = getCategoryPattern(request)
1.80 + pages = []
1.81 + for page in results.hits:
1.82 + if not cat_pattern.match(page.page_name):
1.83 + pages.append(page)
1.84 + return pages
1.85 +
1.86 +def execute(macro, args):
1.87 + request = macro.request
1.88 + fmt = macro.formatter
1.89 + page = fmt.page
1.90 +
1.91 + # Interpret the arguments.
1.92 +
1.93 + try:
1.94 + selected_category_names = wikiutil.parse_quoted_separated(args, name_value=False)
1.95 + except AttributeError:
1.96 + selected_category_names = args.split(",")
1.97 +
1.98 + selected_category_names = [arg for arg in selected_category_names if arg]
1.99 +
1.100 + # Get the categories.
1.101 +
1.102 + categories = getCategoryMapping(getCategories(request), request)
1.103 +
1.104 + # Generate a menu with the categories, together with expanded submenus for
1.105 + # the categories employed by the current page or as requested in the macro
1.106 + # arguments.
1.107 +
1.108 + output = []
1.109 + output.append(fmt.bullet_list(on=1, attr={"class" : "category-menu"}))
1.110 +
1.111 + for category in categories:
1.112 + category_name, category_pagename = category
1.113 +
1.114 + pages_in_category = getPages(category_pagename, request)
1.115 + pagenames_in_category = [p.page_name for p in pages_in_category]
1.116 +
1.117 + # Generate the submenu where appropriate.
1.118 +
1.119 + if selected_category_names and category_name in selected_category_names or \
1.120 + not selected_category_names and page.page_name in pagenames_in_category:
1.121 +
1.122 + output.append(fmt.listitem(on=1, attr={"class" : "category-menu-item-selected"}))
1.123 + output.append(fmt.text(category_name))
1.124 +
1.125 + output.append(fmt.bullet_list(on=1, attr={"class" : "category-submenu"}))
1.126 +
1.127 + # Visit each page in the category.
1.128 +
1.129 + for page_in_category in pages_in_category:
1.130 + pagename = page_in_category.page_name
1.131 +
1.132 + output.append(fmt.listitem(on=1))
1.133 + output.append(fmt.pagelink(on=1, pagename=pagename))
1.134 + output.append(fmt.text(pagename))
1.135 + output.append(fmt.pagelink(on=0, pagename=pagename))
1.136 + output.append(fmt.listitem(on=0))
1.137 +
1.138 + output.append(fmt.bullet_list(on=0))
1.139 + output.append(fmt.listitem(on=0))
1.140 +
1.141 + # Otherwise generate a simple link.
1.142 +
1.143 + else:
1.144 + output.append(fmt.listitem(on=1, attr={"class" : "category-menu-item"}))
1.145 + output.append(fmt.pagelink(on=1, pagename=category_pagename))
1.146 + output.append(fmt.text(category_name))
1.147 + output.append(fmt.pagelink(on=0, pagename=category_pagename))
1.148 + output.append(fmt.listitem(on=0))
1.149 +
1.150 + output.append(fmt.bullet_list(on=0))
1.151 +
1.152 + return ''.join(output)
1.153 +
1.154 +# vim: tabstop=4 expandtab shiftwidth=4