asciimoo 11 лет назад
Родитель
Сommit
f76d80de54
3 измененных файлов: 25 добавлений и 8 удалений
  1. 8
    0
      searx/engines/__init__.py
  2. 2
    2
      searx/templates/search.html
  3. 15
    6
      searx/webapp.py

+ 8
- 0
searx/engines/__init__.py Просмотреть файл

27
 
27
 
28
 engines = {}
28
 engines = {}
29
 
29
 
30
+categories = {'general': []}
31
+
30
 for filename in listdir(engine_dir):
32
 for 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
 
40
 def default_request_params():
48
 def default_request_params():
41
     return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}
49
     return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}

+ 2
- 2
searx/templates/search.html Просмотреть файл

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 %}
6
-        {{ engine }}: <input type="checkbox" name="engine_{{ engine }}" checked="checked"/>
5
+    {% for category in categories %}
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>

+ 15
- 6
searx/webapp.py Просмотреть файл

25
 from flask import Flask, request, flash, render_template, url_for, Response
25
 from flask import Flask, request, flash, render_template, url_for, Response
26
 import ConfigParser
26
 import ConfigParser
27
 from os import getenv
27
 from os import getenv
28
-from searx.engines import search, engines
28
+from searx.engines import search, categories
29
 import json
29
 import json
30
 
30
 
31
 cfg = ConfigParser.SafeConfigParser()
31
 cfg = ConfigParser.SafeConfigParser()
51
 '''
51
 '''
52
 
52
 
53
 def render(template_name, **kwargs):
53
 def 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'])
58
 def index():
61
 def 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_'):
66
-                selected_engines.append(pd_name[7:])
70
+            if pd_name.startswith('category_'):
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'])