on master help sign in
using Query class for parsing of search query
commit62d1a70c84367403222c15e25f597a8d6b336151 authorThomas Pointhuber <thomas.pointhuber@gmx.at> dateWed 1 Oct 2014, 17:57 (12 years ago) parent510aba5
2 files changed+13−56
searx/query.py+3−1 searx/search.py+10−55
searx/query.py+3−1
@@ -39,6 +39,7 @@ class Query(object):
3939 self.engines = []
4040 self.languages = []
4141
42+ # parse query, if tags are set, which change the serch engine or search-language
4243 def parse_query(self):
4344 self.query_parts = []
4445
@@ -55,7 +56,8 @@ class Query(object):
5556 parse_next = False
5657
5758 # part does only contain spaces, skip
58− if query_part.isspace():
59+ if query_part.isspace()\
60+ or query_part == '':
5961 parse_next = True
6062 self.query_parts.append(query_part)
6163 continue
searx/search.py+10−55
@@ -25,6 +25,7 @@ from searx.engines import (
2525)
2626from searx.languages import language_codes
2727from searx.utils import gen_useragent
28+from searx.query import Query
2829
2930
3031number_of_searches = 0
@@ -235,7 +236,15 @@ class Search(object):
235236 self.pageno = int(pageno_param)
236237
237238 # 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
239248
240249 self.categories = []
241250
@@ -276,60 +285,6 @@ class Search(object):
276285 for x in categories[categ]
277286 if not x.name in self.blocked_engines)
278287
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−
333288 # do search-request
334289 def search(self, request):
335290 global number_of_searches