on master help sign in
using Query class for parsing of search query
62d1a70Thomas Pointhuber
searx/query.py+3−1
@@ -39,6 +39,7 @@ class Query(object):
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,7 +56,8 @@ class Query(object):
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
searx/search.py+10−55
@@ -25,6 +25,7 @@ from searx.engines import (
25)
25)
26from searx.languages import language_codes
26from searx.languages import language_codes
27from searx.utils import gen_useragent
27from searx.utils import gen_useragent
28+from searx.query import Query
28
29
29
30
30number_of_searches = 0
31number_of_searches = 0
@@ -235,7 +236,15 @@ class Search(object):
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
239+ query_obj = Query(self.query, self.blocked_engines)
238− self.parse_query()
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,60 +285,6 @@ class Search(object):
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