# HG changeset patch # User Paul Boddie # Date 1283644190 -7200 # Node ID 5798830a2bc3f0a3c290653a63da41753efca9ef # Parent 0f8223a1cf514aaab9dcdfa998ede8938467eee7 Made the formatting options more general, adding support for different actions including the new paragraph retrieval action. Added copyright statements for the few lines left over from the PageList macro. diff -r 0f8223a1cf51 -r 5798830a2bc3 ImprovedMoinSearch.py --- a/ImprovedMoinSearch.py Mon Jul 05 00:46:43 2010 +0200 +++ b/ImprovedMoinSearch.py Sun Sep 05 01:49:50 2010 +0200 @@ -12,7 +12,15 @@ import re heading_regexp = re.compile(r"^(?P=+)(?P.*?)(?P=level)$", re.UNICODE | re.MULTILINE) -heading_options_regexp = re.compile(r"heading\s*(?P\d+)?(?:\s*-\s*(?P\d+))?", re.UNICODE) +paragraph_regexp = re.compile(r"(?P(?:^[^#=\s].*$\n)+)", re.UNICODE | re.MULTILINE) + +def range_groups(min_name, max_name): + return r"(?P<%s>\d+)?(?:\s*-\s*(?P<%s>\d+))?" % (min_name, max_name) + +format_options_regexp = re.compile(r"(" + "(?P(heading|title|h)\s*" + range_groups("min_heading", "max_heading") + ")" + "|(?P(paragraph|para|p)\s*(?P\d+)?)" + ")", re.UNICODE) def getSearchResultPages(request, query, **kw): @@ -24,12 +32,12 @@ results = searchPages(request, query, **kw) return results.hits -def getFirstPageHeading(request, page, min_level=1, max_level=1): +def getFirstPageHeading(request, page, min_level=None, max_level=None): """ Using the given 'request', return the first heading in the given 'page' - having a heading level of at least 'min_level' (which is 1 if not specified) - and at most 'max_level' (which is 1 if not specified). + having a heading level of at least 'min_level' (which is undefined if not + specified) and at most 'max_level' (which is undefined if not specified). """ full_page = Page(request, page.page_name) @@ -45,6 +53,20 @@ return None +def getParagraph(request, page, number=None): + + full_page = Page(request, page.page_name) + body = full_page.get_raw_body() + + for i, match in enumerate(paragraph_regexp.finditer(body)): + if number is None or i == number: + return match.group("paragraph") + + return None + +def getPageName(request, page): + return page.page_name + def formatResultPages(request, formatter, pages, paging, format, page_from=0): """ @@ -57,17 +79,16 @@ collection) will be shown. """ - if format: - m = heading_options_regexp.search(format) - else: - m = None + actions = [] - if m: - format = "heading" - min_level = int_or_none(m.group("min")) - max_level = int_or_none(m.group("max")) + if format: + for match in format_options_regexp.finditer(format): + if match.group("heading"): + actions.append((getFirstPageHeading, map(int_or_none, (match.group("min_heading"), match.group("max_heading"))))) + elif match.group("paragraph"): + actions.append((getParagraph, map(int_or_none, (match.group("paragraph_number"),)))) else: - format = "name" + actions.append((getPageName, ())) # Use paging only when there are enough results. @@ -87,14 +108,20 @@ for page in pages_to_show: output.append(formatter.listitem(on=1)) - if format == "heading": - text = getFirstPageHeading(request, page, min_level, max_level) or page.page_name - else: - text = page.page_name + first = 1 + for action, args in actions: + if first: + output.append(formatter.pagelink(on=1, pagename=page.page_name)) + else: + output.append(" ") - output.append(formatter.pagelink(on=1, pagename=page.page_name)) - output.append(formatter.text(text)) - output.append(formatter.pagelink(on=0)) + text = action(request, page, *args) + output.append(formatter.text(text)) + + if first: + output.append(formatter.pagelink(on=0)) + first = 0 + output.append(formatter.listitem(on=0)) output.append(formatter.number_list(on=0)) diff -r 0f8223a1cf51 -r 5798830a2bc3 macros/PageListPlus.py --- a/macros/PageListPlus.py Mon Jul 05 00:46:43 2010 +0200 +++ b/macros/PageListPlus.py Sun Sep 05 01:49:50 2010 +0200 @@ -5,6 +5,9 @@ print a list of pages whose title matches the search term @copyright: 2010 Paul Boddie + 2001-2003 Juergen Hermann + 2003-2008 MoinMoin:ThomasWaldmann + 2008 MoinMoin:ReimarBauer @license: GNU GPL, see COPYING for details. """