annotate examples/trac/trac/Search.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children 6d1f79b2f7ef
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2003-2004 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2003-2004 Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # individuals. For exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 # Author: Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 import re
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18 import time
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 from trac.config import IntOption
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 from trac.core import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 from trac.perm import IPermissionRequestor
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 from trac.util.datefmt import format_datetime
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 from trac.util.markup import escape, html, Element
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 from trac.web import IRequestHandler
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 from trac.web.chrome import add_link, add_stylesheet, INavigationContributor
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27 from trac.wiki import IWikiSyntaxProvider, wiki_to_link
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 class ISearchSource(Interface):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 Extension point interface for adding search sources to the Trac
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 Search system.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 def get_search_filters(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 Return a list of filters that this search source supports. Each
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 filter must be a (name, label[, default]) tuple, where `name` is the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 internal name, `label` is a human-readable name for display and
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 `default` is an optional boolean for determining whether this filter
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 is searchable by default.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 def get_search_results(self, req, terms, filters):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 Return a list of search results matching each search term in `terms`.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 The `filters` parameters is a list of the enabled
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 filters, each item being the name of the tuples returned by
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 `get_search_events`.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 The events returned by this function must be tuples of the form
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 (href, title, date, author, excerpt).
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 def search_terms(q):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 Break apart a search query into its various search terms. Terms are
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 grouped implicitly by word boundary, or explicitly by (single or double)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 quotes.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 results = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 for term in re.split('(".*?")|(\'.*?\')|(\s+)', q):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 if term != None and term.strip() != '':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 if term[0] == term[-1] == "'" or term[0] == term[-1] == '"':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 term = term[1:-1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 results.append(term)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 return results
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 def search_to_sql(db, columns, terms):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 Convert a search query into a SQL condition string and corresponding
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 parameters. The result is returned as a (string, params) tuple.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 if len(columns) < 1 or len(terms) < 1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 raise TracError('Empty search attempt, this should really not happen.')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 likes = ['%s %s' % (i, db.like()) for i in columns]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 c = ' OR '.join(likes)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 sql = '(' + ') AND ('.join([c] * len(terms)) + ')'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 args = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 for t in terms:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 args.extend(['%'+db.like_escape(t)+'%'] * len(columns))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 return sql, tuple(args)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 def shorten_result(text='', keywords=[], maxlen=240, fuzz=60):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 if not text: text = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 text_low = text.lower()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 beg = -1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 for k in keywords:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 i = text_low.find(k.lower())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 if (i > -1 and i < beg) or beg == -1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 beg = i
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95 excerpt_beg = 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 if beg > fuzz:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 for sep in ('.', ':', ';', '='):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 eb = text.find(sep, beg - fuzz, beg - 1)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 if eb > -1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 eb += 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 break
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 eb = beg - fuzz
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 excerpt_beg = eb
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 if excerpt_beg < 0: excerpt_beg = 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 msg = text[excerpt_beg:beg+maxlen]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 if beg > fuzz:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 msg = '... ' + msg
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 if beg < len(text)-maxlen:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 msg = msg + ' ...'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 return msg
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 class SearchModule(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 implements(INavigationContributor, IPermissionRequestor, IRequestHandler,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 IWikiSyntaxProvider)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 search_sources = ExtensionPoint(ISearchSource)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 RESULTS_PER_PAGE = 10
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 min_query_length = IntOption('search', 'min_query_length', 3,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 """Minimum length of query string allowed when performing a search.""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 # INavigationContributor methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 def get_active_navigation_item(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 return 'search'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 def get_navigation_items(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 if not req.perm.has_permission('SEARCH_VIEW'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134 yield ('mainnav', 'search',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 html.A('Search', href=req.href.search(), accesskey=4))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 # IPermissionRequestor methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139 def get_permission_actions(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 return ['SEARCH_VIEW']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 # IRequestHandler methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 def match_request(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 return re.match(r'/search/?', req.path_info) is not None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 def process_request(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 req.perm.assert_permission('SEARCH_VIEW')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 available_filters = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 for source in self.search_sources:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 available_filters += source.get_search_filters(req)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 filters = [f[0] for f in available_filters if req.args.has_key(f[0])]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 if not filters:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 filters = [f[0] for f in available_filters
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 if len(f) < 3 or len(f) > 2 and f[2]]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 req.hdf['search.filters'] = [
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 { 'name': filter[0],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 'label': filter[1],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 'active': filter[0] in filters
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 } for filter in available_filters]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 req.hdf['title'] = 'Search'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 query = req.args.get('q')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 if query:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 page = int(req.args.get('page', '1'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170 noquickjump = int(req.args.get('noquickjump', '0'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 link_elt = self.quickjump(req, query)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 if link_elt is not None:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 quickjump_href = link_elt.attr['href']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 if noquickjump:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175 req.hdf['search.quickjump'] = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 'href': quickjump_href,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 'name': html.EM(link_elt.children),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 'description': link_elt.attr.get('title', '')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 req.redirect(quickjump_href)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182 elif query.startswith('!'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 query = query[1:]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184 terms = search_terms(query)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 # Refuse queries that obviously would result in a huge result set
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 if len(terms) == 1 and len(terms[0]) < self.min_query_length:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187 raise TracError('Search query too short. '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188 'Query must be at least %d characters long.' % \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 self.min_query_length, 'Search Error')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 results = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191 for source in self.search_sources:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 results += list(source.get_search_results(req, terms, filters))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 results.sort(lambda x,y: cmp(y[2], x[2]))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194 page_size = self.RESULTS_PER_PAGE
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 n = len(results)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 n_pages = (n-1) / page_size + 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 results = results[(page-1) * page_size: page * page_size]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 req.hdf['title'] = 'Search Results'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200 req.hdf['search.q'] = req.args.get('q')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201 req.hdf['search.page'] = page
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 req.hdf['search.n_hits'] = n
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203 req.hdf['search.n_pages'] = n_pages
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 req.hdf['search.page_size'] = page_size
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 if page < n_pages:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 next_href = req.href.search(zip(filters, ['on'] * len(filters)),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 q=req.args.get('q'), page=page + 1)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 add_link(req, 'next', next_href, 'Next Page')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209 if page > 1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 prev_href = req.href.search(zip(filters, ['on'] * len(filters)),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 q=req.args.get('q'), page=page - 1)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 add_link(req, 'prev', prev_href, 'Previous Page')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213 req.hdf['search.page_href'] = req.href.search(zip(filters, ['on'] * len(filters)),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 q=req.args.get('q'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 req.hdf['search.result'] = [
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216 { 'href': result[0],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217 'title': result[1],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218 'date': format_datetime(result[2]),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219 'author': result[3],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220 'excerpt': result[4]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221 } for result in results]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223 add_stylesheet(req, 'common/css/search.css')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224 return 'search.cs', None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226 def quickjump(self, req, kwd):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227 # Source quickjump
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228 if kwd[0] == '/':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229 return req.href.browser(kwd)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 link = wiki_to_link(kwd, self.env, req)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231 if isinstance(link, Element):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 return link
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234 # IWikiSyntaxProvider methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 def get_wiki_syntax(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237 return []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239 def get_link_resolvers(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240 yield ('search', self._format_link)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242 def _format_link(self, formatter, ns, target, label):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
243 path, query, fragment = formatter.split_link(target)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
244 if query:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
245 href = formatter.href.search() + query.replace(' ', '+')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
246 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
247 href = formatter.href.search(q=path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
248 return html.A(label, class_='search', href=href)
Copyright (C) 2012-2017 Edgewall Software