Browse Source

using Query class for parsing of search query

Thomas Pointhuber 10 years ago
parent
commit
62d1a70c84
2 changed files with 13 additions and 56 deletions
  1. 3
    1
      searx/query.py
  2. 10
    55
      searx/search.py

+ 3
- 1
searx/query.py View File

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

+ 10
- 55
searx/search.py View File

@@ -25,6 +25,7 @@ from searx.engines import (
25 25
 )
26 26
 from searx.languages import language_codes
27 27
 from searx.utils import gen_useragent
28
+from searx.query import Query
28 29
 
29 30
 
30 31
 number_of_searches = 0
@@ -235,7 +236,15 @@ class Search(object):
235 236
         self.pageno = int(pageno_param)
236 237
 
237 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 249
         self.categories = []
241 250
 
@@ -276,60 +285,6 @@ class Search(object):
276 285
                                     for x in categories[categ]
277 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 288
     # do search-request
334 289
     def search(self, request):
335 290
         global number_of_searches