@@ -18,7 +18,8 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
20from searx import settings
20from searx import settings
21−from flask import Flask, request, render_template, url_for, Response, make_response, redirect
21+from flask import Flask, request, render_template
22+from flask import url_for, Response, make_response, redirect
22from searx.engines import search, categories, engines, get_engines_stats
23from searx.engines import search, categories, engines, get_engines_stats
23import json
24import json
24import cStringIO
25import cStringIO
@@ -70,7 +71,8 @@ def get_base_url():
70def render(template_name, **kwargs):
71def render(template_name, **kwargs):
71 global categories
72 global categories
72 kwargs['categories'] = ['general']
73 kwargs['categories'] = ['general']
74+ kwargs['categories'].extend(x for x in
73− kwargs['categories'].extend(x for x in sorted(categories.keys()) if x != 'general')
75+ sorted(categories.keys()) if x != 'general')
74 if not 'selected_categories' in kwargs:
76 if not 'selected_categories' in kwargs:
75 kwargs['selected_categories'] = []
77 kwargs['selected_categories'] = []
76 cookie_categories = request.cookies.get('categories', '').split(',')
78 cookie_categories = request.cookies.get('categories', '').split(',')
@@ -114,7 +116,8 @@ def index():
115 selected_categories.append(category)
117 selected_categories.append(category)
116 if not len(selected_categories):
118 if not len(selected_categories):
117− cookie_categories = request.cookies.get('categories', '').split(',')
119+ cookie_categories = request.cookies.get('categories', '')
120+ cookie_categories = cookie_categories.split(',')
118 for ccateg in cookie_categories:
121 for ccateg in cookie_categories:
119 if ccateg in categories:
122 if ccateg in categories:
120 selected_categories.append(ccateg)
123 selected_categories.append(ccateg)
@@ -122,7 +125,9 @@ def index():
122 selected_categories = ['general']
125 selected_categories = ['general']
124 for categ in selected_categories:
127 for categ in selected_categories:
125− selected_engines.extend({'category': categ, 'name': x.name} for x in categories[categ])
128+ selected_engines.extend({'category': categ,
130+ for x in categories[categ])
127 results, suggestions = search(query, request, selected_engines)
132 results, suggestions = search(query, request, selected_engines)
@@ -137,7 +142,8 @@ def index():
137 result['content'] = html_to_text(result['content']).strip()
142 result['content'] = html_to_text(result['content']).strip()
138 result['title'] = html_to_text(result['title']).strip()
143 result['title'] = html_to_text(result['title']).strip()
139 if len(result['url']) > 74:
144 if len(result['url']) > 74:
145+ url_parts = result['url'][:35], result['url'][-35:]
140− result['pretty_url'] = result['url'][:35] + '[..]' + result['url'][-35:]
146+ result['pretty_url'] = '{0}[...]{1}'.format(*url_parts)
142 result['pretty_url'] = result['url']
148 result['pretty_url'] = result['url']
@@ -146,7 +152,8 @@ def index():
146 result['favicon'] = engine
152 result['favicon'] = engine
148 if request_data.get('format') == 'json':
154 if request_data.get('format') == 'json':
149− return Response(json.dumps({'query': query, 'results': results}), mimetype='application/json')
155+ return Response(json.dumps({'query': query, 'results': results}),
156+ mimetype='application/json')
150 elif request_data.get('format') == 'csv':
157 elif request_data.get('format') == 'csv':
151 csv = UnicodeWriter(cStringIO.StringIO())
158 csv = UnicodeWriter(cStringIO.StringIO())
152 keys = ('title', 'url', 'content', 'host', 'engine', 'score')
159 keys = ('title', 'url', 'content', 'host', 'engine', 'score')
@@ -157,7 +164,8 @@ def index():
157 csv.writerow([row.get(key, '') for key in keys])
164 csv.writerow([row.get(key, '') for key in keys])
158 csv.stream.seek(0)
165 csv.stream.seek(0)
159 response = Response(csv.stream.read(), mimetype='application/csv')
166 response = Response(csv.stream.read(), mimetype='application/csv')
160− response.headers.add('Content-Disposition', 'attachment;Filename=searx_-_{0}.csv'.format('_'.join(query.split())))
167+ content_disp = 'attachment;Filename=searx_-_{0}.csv'.format(query)
168+ response.headers.add('Content-Disposition', content_disp)
161 return response
169 return response
162 elif request_data.get('format') == 'rss':
170 elif request_data.get('format') == 'rss':
163 response_rss = render(
171 response_rss = render(
@@ -240,15 +248,16 @@ def opensearch():
240 base_url = get_base_url()
248 base_url = get_base_url()
241 ret = opensearch_xml.format(method=method, host=base_url)
249 ret = opensearch_xml.format(method=method, host=base_url)
242 resp = Response(response=ret,
250 resp = Response(response=ret,
243− status=200,
251+ status=200,
244− mimetype="application/xml")
252+ mimetype="application/xml")
245 return resp
253 return resp
248@app.route('/favicon.ico')
256@app.route('/favicon.ico')
249def favicon():
257def favicon():
250 return send_from_directory(os.path.join(app.root_path, 'static/img'),
258 return send_from_directory(os.path.join(app.root_path, 'static/img'),
251− 'favicon.png', mimetype='image/vnd.microsoft.icon')
260+ mimetype='image/vnd.microsoft.icon')
254def run():
263def run():