Parcourir la source

[enh] paging support

asciimoo il y a 11 ans
Parent
révision
8bb94e3dc4
4 fichiers modifiés avec 41 ajouts et 10 suppressions
  1. 7
    1
      searx/engines/__init__.py
  2. 0
    2
      searx/static/css/style.css
  3. 22
    4
      searx/templates/results.html
  4. 12
    3
      searx/webapp.py

+ 7
- 1
searx/engines/__init__.py Voir le fichier

53
 for engine_data in settings['engines']:
53
 for engine_data in settings['engines']:
54
     engine_name = engine_data['engine']
54
     engine_name = engine_data['engine']
55
     engine = load_module(engine_name + '.py')
55
     engine = load_module(engine_name + '.py')
56
+    if not hasattr(engine, 'paging'):
57
+        engine.paging = False
56
     for param_name in engine_data:
58
     for param_name in engine_data:
57
         if param_name == 'engine':
59
         if param_name == 'engine':
58
             continue
60
             continue
156
     return sorted(results, key=itemgetter('score'), reverse=True)
158
     return sorted(results, key=itemgetter('score'), reverse=True)
157
 
159
 
158
 
160
 
159
-def search(query, request, selected_engines):
161
+def search(query, request, selected_engines, pageno=1):
160
     global engines, categories, number_of_searches
162
     global engines, categories, number_of_searches
161
     requests = []
163
     requests = []
162
     results = {}
164
     results = {}
171
 
173
 
172
         engine = engines[selected_engine['name']]
174
         engine = engines[selected_engine['name']]
173
 
175
 
176
+        if pageno > 1 and not engine.paging:
177
+            continue
178
+
174
         request_params = default_request_params()
179
         request_params = default_request_params()
175
         request_params['headers']['User-Agent'] = user_agent
180
         request_params['headers']['User-Agent'] = user_agent
176
         request_params['category'] = selected_engine['category']
181
         request_params['category'] = selected_engine['category']
177
         request_params['started'] = datetime.now()
182
         request_params['started'] = datetime.now()
183
+        request_params['pageno'] = pageno
178
         request_params = engine.request(query, request_params)
184
         request_params = engine.request(query, request_params)
179
 
185
 
180
         callback = make_callback(
186
         callback = make_callback(

+ 0
- 2
searx/static/css/style.css Voir le fichier

151
 
151
 
152
 #results { margin: 10px; padding: 0; }
152
 #results { margin: 10px; padding: 0; }
153
 
153
 
154
-#result_count { font-size: 0.8em; margin: 2px 0 2px 0; padding: 0 }
155
-
156
 #suggestions { position: absolute; left: 54em; width: 12em; margin: 0 2px 5px 5px; padding: 0 2px 2px 2px; }
154
 #suggestions { position: absolute; left: 54em; width: 12em; margin: 0 2px 5px 5px; padding: 0 2px 2px 2px; }
157
 #suggestions span { display: block; font-size: 0.8em; margin: 0 2px 10px 2px; padding: 0; }
155
 #suggestions span { display: block; font-size: 0.8em; margin: 0 2px 10px 2px; padding: 0; }
158
 #suggestions form { display: block; }
156
 #suggestions form { display: block; }

+ 22
- 4
searx/templates/results.html Voir le fichier

11
     {% endif %}
11
     {% endif %}
12
 
12
 
13
 
13
 
14
-    <div id ="result_count">
15
-        {{ _('Number of results') }}: {{ number_of_results }}
16
-    </div>
17
-
18
     {% for result in results %}
14
     {% for result in results %}
19
         {% if result['template'] %}
15
         {% if result['template'] %}
20
             {% include 'result_templates/'+result['template'] %}
16
             {% include 'result_templates/'+result['template'] %}
22
             {% include 'result_templates/default.html' %}
18
             {% include 'result_templates/default.html' %}
23
         {% endif %}
19
         {% endif %}
24
     {% endfor %}
20
     {% endfor %}
21
+
22
+    {% if paging %}
23
+    <div id="paging">
24
+        {% if pageno > 1 %}
25
+            <form method="post" action="/">
26
+                <div class="left">
27
+                <input type="hidden" name="q" value="{{ q }}" />
28
+                <input type="hidden" name="pageno" value="{{ pageno-1 }}" />
29
+                <input type="submit" value="<< {{ _('previous page') }}" />
30
+                </div>
31
+            </form>
32
+        {% endif %}
33
+        <form method="post" action="/">
34
+            <div class="left">
35
+            <input type="hidden" name="q" value="{{ q }}" />
36
+            <input type="hidden" name="pageno" value="{{ pageno+1 }}" />
37
+            <input type="submit" value="{{ _('next page') }} >>" />
38
+            </div>
39
+        </form>
40
+    </div>
41
+    {% endif %}
42
+
25
     <div id="apis">
43
     <div id="apis">
26
       {{ _('Download results') }}
44
       {{ _('Download results') }}
27
       <form method="post" action="/">
45
       <form method="post" action="/">

+ 12
- 3
searx/webapp.py Voir le fichier

129
 
129
 
130
 @app.route('/', methods=['GET', 'POST'])
130
 @app.route('/', methods=['GET', 'POST'])
131
 def index():
131
 def index():
132
-    global categories
132
+    paging = False
133
 
133
 
134
     if request.method == 'POST':
134
     if request.method == 'POST':
135
         request_data = request.form
135
         request_data = request.form
138
     if not request_data.get('q'):
138
     if not request_data.get('q'):
139
         return render('index.html')
139
         return render('index.html')
140
 
140
 
141
+    pageno_param = request_data.get('pageno', '1')
142
+    if not pageno_param.isdigit() or int(pageno_param) < 1:
143
+        return render('index.html')
144
+
145
+    pageno = int(pageno_param)
146
+
141
     selected_categories = []
147
     selected_categories = []
142
 
148
 
143
     query, selected_engines = parse_query(request_data['q'].encode('utf-8'))
149
     query, selected_engines = parse_query(request_data['q'].encode('utf-8'))
166
                                      'name': x.name}
172
                                      'name': x.name}
167
                                     for x in categories[categ])
173
                                     for x in categories[categ])
168
 
174
 
169
-    results, suggestions = search(query, request, selected_engines)
175
+    results, suggestions = search(query, request, selected_engines, pageno)
170
 
176
 
171
     featured_results = []
177
     featured_results = []
172
     for result in results:
178
     for result in results:
179
+        if not paging and engines[result['engine']].paging:
180
+            paging = True
173
         if request_data.get('format', 'html') == 'html':
181
         if request_data.get('format', 'html') == 'html':
174
             if 'content' in result:
182
             if 'content' in result:
175
                 result['content'] = highlight_content(result['content'], query)
183
                 result['content'] = highlight_content(result['content'], query)
219
         results=results,
227
         results=results,
220
         q=request_data['q'],
228
         q=request_data['q'],
221
         selected_categories=selected_categories,
229
         selected_categories=selected_categories,
222
-        number_of_results=len(results) + len(featured_results),
230
+        paging=paging,
231
+        pageno=pageno,
223
         featured_results=featured_results,
232
         featured_results=featured_results,
224
         suggestions=suggestions
233
         suggestions=suggestions
225
     )
234
     )