""" $Id$ $HeadURL$ Copyright (c) 2006 Peter Kropf. All rights reserved. Module documentation goes here. """ __revision__ = '$LastChangedRevision$' __id__ = '$Id$' __headurl__ = '$HeadURL$' __docformat__ = 'restructuredtext' __version__ = '0.1.0' import fnmatch from trac.core import * from trac.web.main import IRequestHandler from trac.web.chrome import ITemplateProvider from trac.util import escape, Markup from trac.wiki import IWikiSyntaxProvider class PageListModule(Component): implements(IRequestHandler, ITemplateProvider, IWikiSyntaxProvider) # IRequestHandler methods def match_request(self, req): return req.path_info.startswith('/pagelist') def process_request(self, req): db = self.env.get_db_cnx() cursor = db.cursor() pieces = [item for item in req.path_info.split('/pagelist') if len(item)] if len(pieces): pieces = [item for item in pieces[0].split('/') if len(item)] prefix = '*' suffix = '*' if len(pieces) > 1: if 'prefix' in pieces: suffix = '*' prefix = '' pieces.remove('prefix') if 'suffix' in pieces: suffix = '' prefix = '*' pieces.remove('suffix') if len(pieces): text = pieces[0] else: text = '' req.hdf['pagelist.pages'] = self._get_pagelist(cursor, '%s%s%s' % (prefix, text, suffix)) return 'pagelist.cs', None # ITemplateProvider methods def get_templates_dirs(self): """ Return the absolute path of the directory containing the provided ClearSilver templates. """ from pkg_resources import resource_filename return [resource_filename(__name__, 'templates')] # IWikiSyntaxProvider def get_link_resolvers(self): yield ('pagelist', self._pagelist_link) def get_wiki_syntax(self): return [] # workers def _pagelist_link(self, formatter, ns, params, label): db = self.env.get_db_cnx() cursor = db.cursor() prefix = '*' suffix = '*' pieces = params.split(':') if len(pieces) > 1: if 'prefix' in pieces: suffix = '*' prefix = '' pieces.remove('prefix') if 'suffix' in pieces: suffix = '' prefix = '*' pieces.remove('suffix') text = pieces[0] pagelist = [n['link'] for n in self._get_pagelist(cursor, '%s%s%s' % (prefix, text, suffix))] links = '
'.join(pagelist) return links def _get_pagelist(self, cursor, pattern): cursor.execute('SELECT DISTINCT name FROM wiki ORDER BY name') link = '%s' wiki = self.env.href.wiki() pagelist = [{'name': row[0], 'link': link % (wiki, row[0], row[0]), 'prefix': wiki, } for row in self._match_pages(pattern, cursor)] return pagelist def _match_pages(self, pattern, cursor): for row in cursor.fetchall(): if fnmatch.fnmatch(row[0], pattern): yield row else: pass