on master help sign in
[enh] category support
f76d80dasciimoo
searx/engines/__init__.py+8
@@ -27,15 +27,23 @@ engine_dir = dirname(realpath(__file__))
27
27
28engines = {}
28engines = {}
29
29
30+categories = {'general': []}
31+
30for filename in listdir(engine_dir):
32for filename in listdir(engine_dir):
31 modname = splitext(filename)[0]
33 modname = splitext(filename)[0]
32 if filename.startswith('_') or not filename.endswith('.py'):
34 if filename.startswith('_') or not filename.endswith('.py'):
33 continue
35 continue
34 filepath = join(engine_dir, filename)
36 filepath = join(engine_dir, filename)
35 engine = load_source(modname, filepath)
37 engine = load_source(modname, filepath)
38+ engine.name = modname
36 if not hasattr(engine, 'request') or not hasattr(engine, 'response'):
39 if not hasattr(engine, 'request') or not hasattr(engine, 'response'):
37 continue
40 continue
38 engines[modname] = engine
41 engines[modname] = engine
42+ if not hasattr(engine, 'categories'):
43+ categories['general'].append(engine)
44+ else:
45+ for category_name in engine.categories:
46+ categories.setdefault(category_name, []).append(engine)
39
47
40def default_request_params():
48def default_request_params():
41 return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}
49 return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}
searx/templates/search.html+2−2
@@ -2,8 +2,8 @@
2 <input type="text" class="q" name="q" tabindex="1" autocomplete="off" {% if q %}value="{{ q }}"{% endif %}/>
2 <input type="text" class="q" name="q" tabindex="1" autocomplete="off" {% if q %}value="{{ q }}"{% endif %}/>
3 <input type="submit" value="search" />
3 <input type="submit" value="search" />
4 <p>
4 <p>
5− {% for engine in engines %}
5+ {% for category in categories %}
6− {{ engine }}: <input type="checkbox" name="engine_{{ engine }}" checked="checked"/>
6+ {{ category }}: <input type="checkbox" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
7 {% endfor %}
7 {% endfor %}
8 </p>
8 </p>
9</form>
9</form>
searx/webapp.py+15−6
@@ -25,7 +25,7 @@ if __name__ == "__main__":
25from flask import Flask, request, flash, render_template, url_for, Response
25from flask import Flask, request, flash, render_template, url_for, Response
26import ConfigParser
26import ConfigParser
27from os import getenv
27from os import getenv
28−from searx.engines import search, engines
28+from searx.engines import search, categories
29import json
29import json
30
30
31cfg = ConfigParser.SafeConfigParser()
31cfg = ConfigParser.SafeConfigParser()
@@ -51,27 +51,36 @@ opensearch_xml = '''<?xml version="1.0" encoding="utf-8"?>
51'''
51'''
52
52
53def render(template_name, **kwargs):
53def render(template_name, **kwargs):
54− kwargs['engines'] = engines.keys()
54+ global categories
55+ kwargs['categories'] = categories.keys()
56+ if not 'selected_categories' in kwargs:
57+ kwargs['selected_categories'] = ['general']
55 return render_template(template_name, **kwargs)
58 return render_template(template_name, **kwargs)
56
59
57@app.route('/', methods=['GET', 'POST'])
60@app.route('/', methods=['GET', 'POST'])
58def index():
61def index():
62+ global categories
59 if request.method=='POST':
63 if request.method=='POST':
60 if not request.form.get('q'):
64 if not request.form.get('q'):
61 flash('Wrong post data')
65 flash('Wrong post data')
62 return render('index.html')
66 return render('index.html')
63 selected_engines = []
67 selected_engines = []
68+ selected_categories = []
64 for pd_name,pd in request.form.items():
69 for pd_name,pd in request.form.items():
65− if pd_name.startswith('engine_'):
70+ if pd_name.startswith('category_'):
66− selected_engines.append(pd_name[7:])
71+ category = pd_name[9:]
72+ if not category in categories:
73+ continue
74+ selected_categories.append(category)
75+ selected_engines.extend(x.name for x in categories[category])
67 if not len(selected_engines):
76 if not len(selected_engines):
68− selected_engines = engines.keys()
77+ selected_engines = [x.name for x in categories['general']]
69 query = request.form['q'].encode('utf-8')
78 query = request.form['q'].encode('utf-8')
70 results = search(query, request, selected_engines)
79 results = search(query, request, selected_engines)
71 if request.form.get('format') == 'json':
80 if request.form.get('format') == 'json':
72 # TODO HTTP headers
81 # TODO HTTP headers
73 return json.dumps({'query': query, 'results': results})
82 return json.dumps({'query': query, 'results': results})
74− return render('results.html', results=results, q=query.decode('utf-8'))
83+ return render('results.html', results=results, q=query.decode('utf-8'), selected_categories=selected_categories)
75 return render('index.html')
84 return render('index.html')
76
85
77@app.route('/favicon.ico', methods=['GET'])
86@app.route('/favicon.ico', methods=['GET'])