瀏覽代碼

using Query class for parsing of search query

Thomas Pointhuber 10 年之前
父節點
當前提交
62d1a70c84
共有 2 個文件被更改,包括 13 次插入56 次删除
  1. 3
    1
      searx/query.py
  2. 10
    55
      searx/search.py

+ 3
- 1
searx/query.py 查看文件

39
         self.engines = []
39
         self.engines = []
40
         self.languages = []
40
         self.languages = []
41
     
41
     
42
+    # parse query, if tags are set, which change the serch engine or search-language
42
     def parse_query(self):
43
     def parse_query(self):
43
         self.query_parts = []
44
         self.query_parts = []
44
         
45
         
55
             parse_next = False
56
             parse_next = False
56
            
57
            
57
             # part does only contain spaces, skip
58
             # part does only contain spaces, skip
58
-            if query_part.isspace():
59
+            if query_part.isspace()\
60
+               or query_part == '':
59
                 parse_next = True
61
                 parse_next = True
60
                 self.query_parts.append(query_part)
62
                 self.query_parts.append(query_part)
61
                 continue
63
                 continue

+ 10
- 55
searx/search.py 查看文件

25
 )
25
 )
26
 from searx.languages import language_codes
26
 from searx.languages import language_codes
27
 from searx.utils import gen_useragent
27
 from searx.utils import gen_useragent
28
+from searx.query import Query
28
 
29
 
29
 
30
 
30
 number_of_searches = 0
31
 number_of_searches = 0
235
         self.pageno = int(pageno_param)
236
         self.pageno = int(pageno_param)
236
 
237
 
237
         # parse query, if tags are set, which change the serch engine or search-language
238
         # parse query, if tags are set, which change the serch engine or search-language
238
-        self.parse_query()
239
+        query_obj = Query(self.query, self.blocked_engines)
240
+        query_obj.parse_query()        
241
+
242
+        # get last selected language in query, if possible
243
+        # TODO support search with multible languages
244
+        if len(query_obj.languages):
245
+            self.lang = query_obj.languages[-1]
246
+
247
+        self.engines = query_obj.engines
239
 
248
 
240
         self.categories = []
249
         self.categories = []
241
 
250
 
276
                                     for x in categories[categ]
285
                                     for x in categories[categ]
277
                                     if not x.name in self.blocked_engines)
286
                                     if not x.name in self.blocked_engines)
278
 
287
 
279
-    # parse query, if tags are set, which change the serch engine or search-language
280
-    def parse_query(self):
281
-        query_parts = self.query.split()
282
-        modified = False
283
-
284
-        # check if language-prefix is set
285
-        if query_parts[0].startswith(':'):
286
-            lang = query_parts[0][1:].lower()
287
-
288
-            # check if any language-code is equal with declared language-codes
289
-            for lc in language_codes:
290
-                lang_id, lang_name, country = map(str.lower, lc)
291
-
292
-                # if correct language-code is found, set it as new search-language
293
-                if lang == lang_id\
294
-                   or lang_id.startswith(lang)\
295
-                   or lang == lang_name\
296
-                   or lang == country:
297
-                    self.lang = lang
298
-                    modified = True
299
-                    break
300
-
301
-        # check if category/engine prefix is set
302
-        elif query_parts[0].startswith('!'):
303
-            prefix = query_parts[0][1:].replace('_', ' ')
304
-
305
-            # check if prefix is equal with engine shortcut
306
-            if prefix in engine_shortcuts\
307
-               and not engine_shortcuts[prefix] in self.blocked_engines:
308
-                modified = True
309
-                self.engines.append({'category': 'none',
310
-                                     'name': engine_shortcuts[prefix]})
311
-
312
-            # check if prefix is equal with engine name
313
-            elif prefix in engines\
314
-                    and not prefix in self.blocked_engines:
315
-                modified = True
316
-                self.engines.append({'category': 'none',
317
-                                    'name': prefix})
318
-
319
-            # check if prefix is equal with categorie name
320
-            elif prefix in categories:
321
-                modified = True
322
-                # using all engines for that search, which are declared under that categorie name
323
-                self.engines.extend({'category': prefix,
324
-                                    'name': engine.name}
325
-                                    for engine in categories[prefix]
326
-                                    if not engine in self.blocked_engines)
327
-
328
-        # if language, category or engine were specificed in this query, search for more tags which does the same
329
-        if modified:
330
-            self.query = self.query.replace(query_parts[0], '', 1).strip()
331
-            self.parse_query()
332
-
333
     # do search-request
288
     # do search-request
334
     def search(self, request):
289
     def search(self, request):
335
         global number_of_searches
290
         global number_of_searches