1.1 --- a/ImprovedMoinSearch.py Mon Jul 05 00:46:43 2010 +0200
1.2 +++ b/ImprovedMoinSearch.py Sun Sep 05 01:49:50 2010 +0200
1.3 @@ -12,7 +12,15 @@
1.4 import re
1.5
1.6 heading_regexp = re.compile(r"^(?P<level>=+)(?P<heading>.*?)(?P=level)$", re.UNICODE | re.MULTILINE)
1.7 -heading_options_regexp = re.compile(r"heading\s*(?P<min>\d+)?(?:\s*-\s*(?P<max>\d+))?", re.UNICODE)
1.8 +paragraph_regexp = re.compile(r"(?P<paragraph>(?:^[^#=\s].*$\n)+)", re.UNICODE | re.MULTILINE)
1.9 +
1.10 +def range_groups(min_name, max_name):
1.11 + return r"(?P<%s>\d+)?(?:\s*-\s*(?P<%s>\d+))?" % (min_name, max_name)
1.12 +
1.13 +format_options_regexp = re.compile(r"("
1.14 + "(?P<heading>(heading|title|h)\s*" + range_groups("min_heading", "max_heading") + ")"
1.15 + "|(?P<paragraph>(paragraph|para|p)\s*(?P<paragraph_number>\d+)?)"
1.16 + ")", re.UNICODE)
1.17
1.18 def getSearchResultPages(request, query, **kw):
1.19
1.20 @@ -24,12 +32,12 @@
1.21 results = searchPages(request, query, **kw)
1.22 return results.hits
1.23
1.24 -def getFirstPageHeading(request, page, min_level=1, max_level=1):
1.25 +def getFirstPageHeading(request, page, min_level=None, max_level=None):
1.26
1.27 """
1.28 Using the given 'request', return the first heading in the given 'page'
1.29 - having a heading level of at least 'min_level' (which is 1 if not specified)
1.30 - and at most 'max_level' (which is 1 if not specified).
1.31 + having a heading level of at least 'min_level' (which is undefined if not
1.32 + specified) and at most 'max_level' (which is undefined if not specified).
1.33 """
1.34
1.35 full_page = Page(request, page.page_name)
1.36 @@ -45,6 +53,20 @@
1.37
1.38 return None
1.39
1.40 +def getParagraph(request, page, number=None):
1.41 +
1.42 + full_page = Page(request, page.page_name)
1.43 + body = full_page.get_raw_body()
1.44 +
1.45 + for i, match in enumerate(paragraph_regexp.finditer(body)):
1.46 + if number is None or i == number:
1.47 + return match.group("paragraph")
1.48 +
1.49 + return None
1.50 +
1.51 +def getPageName(request, page):
1.52 + return page.page_name
1.53 +
1.54 def formatResultPages(request, formatter, pages, paging, format, page_from=0):
1.55
1.56 """
1.57 @@ -57,17 +79,16 @@
1.58 collection) will be shown.
1.59 """
1.60
1.61 - if format:
1.62 - m = heading_options_regexp.search(format)
1.63 - else:
1.64 - m = None
1.65 + actions = []
1.66
1.67 - if m:
1.68 - format = "heading"
1.69 - min_level = int_or_none(m.group("min"))
1.70 - max_level = int_or_none(m.group("max"))
1.71 + if format:
1.72 + for match in format_options_regexp.finditer(format):
1.73 + if match.group("heading"):
1.74 + actions.append((getFirstPageHeading, map(int_or_none, (match.group("min_heading"), match.group("max_heading")))))
1.75 + elif match.group("paragraph"):
1.76 + actions.append((getParagraph, map(int_or_none, (match.group("paragraph_number"),))))
1.77 else:
1.78 - format = "name"
1.79 + actions.append((getPageName, ()))
1.80
1.81 # Use paging only when there are enough results.
1.82
1.83 @@ -87,14 +108,20 @@
1.84 for page in pages_to_show:
1.85 output.append(formatter.listitem(on=1))
1.86
1.87 - if format == "heading":
1.88 - text = getFirstPageHeading(request, page, min_level, max_level) or page.page_name
1.89 - else:
1.90 - text = page.page_name
1.91 + first = 1
1.92 + for action, args in actions:
1.93 + if first:
1.94 + output.append(formatter.pagelink(on=1, pagename=page.page_name))
1.95 + else:
1.96 + output.append(" ")
1.97
1.98 - output.append(formatter.pagelink(on=1, pagename=page.page_name))
1.99 - output.append(formatter.text(text))
1.100 - output.append(formatter.pagelink(on=0))
1.101 + text = action(request, page, *args)
1.102 + output.append(formatter.text(text))
1.103 +
1.104 + if first:
1.105 + output.append(formatter.pagelink(on=0))
1.106 + first = 0
1.107 +
1.108 output.append(formatter.listitem(on=0))
1.109
1.110 output.append(formatter.number_list(on=0))