@@ -41,6 +41,7 @@ from searx.engines import (
4141from searx.utils import UnicodeWriter, highlight_content, html_to_text
4242from searx.languages import language_codes
4343from searx.search import Search
44+from searx.autocomplete import backends as autocomplete_backends
4445
4546
4647app = Flask(
@@ -91,16 +92,25 @@ def get_base_url():
9192
9293def render(template_name, **kwargs):
9394 blocked_engines = request.cookies.get('blocked_engines', '').split(',')
95+
96+ autocomplete = request.cookies.get('autocomplete')
97+
98+ if autocomplete not in autocomplete_backends:
99+ autocomplete = None
100+
94101 nonblocked_categories = (engines[e].categories
95102 for e in engines
96103 if e not in blocked_engines)
104+
97105 nonblocked_categories = set(chain.from_iterable(nonblocked_categories))
106+
98107 if not 'categories' in kwargs:
99108 kwargs['categories'] = ['general']
100109 kwargs['categories'].extend(x for x in
101110 sorted(categories.keys())
102111 if x != 'general'
103112 and x in nonblocked_categories)
113+
104114 if not 'selected_categories' in kwargs:
105115 kwargs['selected_categories'] = []
106116 cookie_categories = request.cookies.get('categories', '').split(',')
@@ -109,6 +119,10 @@ def render(template_name, **kwargs):
109119 kwargs['selected_categories'].append(ccateg)
110120 if not kwargs['selected_categories']:
111121 kwargs['selected_categories'] = ['general']
122+
123+ if not 'autocomplete' in kwargs:
124+ kwargs['autocomplete'] = autocomplete
125+
112126 return render_template(template_name, **kwargs)
113127
114128
@@ -122,7 +136,6 @@ def index():
122136 if not request.args and not request.form:
123137 return render(
124138 'index.html',
125− client=settings.get('client', None)
126139 )
127140
128141 try:
@@ -130,7 +143,6 @@ def index():
130143 except:
131144 return render(
132145 'index.html',
133− client=settings.get('client', None)
134146 )
135147
136148 # TODO moar refactor - do_search integration into Search class
@@ -212,7 +224,6 @@ def index():
212224 return render(
213225 'results.html',
214226 results=search.results,
215− client=settings.get('client', None),
216227 q=search.request_data['q'],
217228 selected_categories=search.categories,
218229 paging=search.paging,
@@ -227,7 +238,6 @@ def about():
227238 """Render about page"""
228239 return render(
229240 'about.html',
230− client=settings.get('client', None)
231241 )
232242
233243
@@ -235,27 +245,35 @@ def about():
235245def autocompleter():
236246 """Return autocompleter results"""
237247 request_data = {}
238−
248+
239249 if request.method == 'POST':
240250 request_data = request.form
241251 else:
242252 request_data = request.args
243−
253+
244254 # TODO fix XSS-vulnerability
245− autocompleter.querry = request_data.get('q')
246− autocompleter.results = []
247−
248− if settings['client']['autocompleter']:
249− #TODO remove test code and add real autocompletion
250− if autocompleter.querry:
251− autocompleter.results = [autocompleter.querry + " result-1",autocompleter.querry + " result-2",autocompleter.querry + " result-3",autocompleter.querry + " result-4"]
252−
255+ query = request_data.get('q')
256+
257+ if not query:
258+ return
259+
260+ completer = autocomplete_backends.get(request.cookies.get('autocomplete'))
261+
262+ if not completer:
263+ return
264+
265+ try:
266+ results = completer(query)
267+ except Exception, e:
268+ print e
269+ results = []
270+
253271 if request_data.get('format') == 'x-suggestions':
254− return Response(json.dumps([autocompleter.querry,autocompleter.results]),
255− mimetype='application/json')
272+ return Response(json.dumps([query, results]),
273+ mimetype='application/json')
256274 else:
257− return Response(json.dumps(autocompleter.results),
258− mimetype='application/json')
275+ return Response(json.dumps(results),
276+ mimetype='application/json')
259277
260278
261279@app.route('/preferences', methods=['GET', 'POST'])
@@ -276,6 +294,7 @@ def preferences():
276294 else:
277295 selected_categories = []
278296 locale = None
297+ autocomplete = ''
279298 for pd_name, pd in request.form.items():
280299 if pd_name.startswith('category_'):
281300 category = pd_name[9:]
@@ -284,6 +303,8 @@ def preferences():
284303 selected_categories.append(category)
285304 elif pd_name == 'locale' and pd in settings['locales']:
286305 locale = pd
306+ elif pd_name == 'autocomplete':
307+ autocomplete = pd
287308 elif pd_name == 'language' and (pd == 'all' or
288309 pd in (x[0] for
289310 x in language_codes)):
@@ -319,8 +340,14 @@ def preferences():
319340 # cookie max age: 4 weeks
320341 resp.set_cookie(
321342 'categories', ','.join(selected_categories),
322− max_age=60 * 60 * 24 * 7 * 4
343+ max_age=cookie_max_age
323344 )
345+
346+ resp.set_cookie(
347+ 'autocomplete', autocomplete,
348+ max_age=cookie_max_age
349+ )
350+
324351 return resp
325352 return render('preferences.html',
326353 client=settings.get('client', None),
@@ -330,6 +357,7 @@ def preferences():
330357 language_codes=language_codes,
331358 categs=categories.items(),
332359 blocked_engines=blocked_engines,
360+ autocomplete_backends=autocomplete_backends,
333361 shortcuts={y: x for x, y in engine_shortcuts.items()})
334362
335363
@@ -361,7 +389,12 @@ def opensearch():
361389 # chrome/chromium only supports HTTP GET....
362390 if request.headers.get('User-Agent', '').lower().find('webkit') >= 0:
363391 method = 'get'
364− ret = render('opensearch.xml', method=method, host=get_base_url(),client=settings['client'])
392+
393+ ret = render('opensearch.xml',
394+ method=method,
395+ host=get_base_url(),
396+ client=settings['client'])
397+
365398 resp = Response(response=ret,
366399 status=200,
367400 mimetype="application/xml")