diff options
Diffstat (limited to 'searx/query.py')
| -rw-r--r-- | searx/query.py | 75 |
1 files changed, 53 insertions, 22 deletions
diff --git a/searx/query.py b/searx/query.py index 828a6fb30..79afa0245 100644 --- a/searx/query.py +++ b/searx/query.py @@ -22,7 +22,6 @@ from searx.engines import ( categories, engines, engine_shortcuts ) import re -import string import sys if sys.version_info[0] == 3: @@ -44,6 +43,7 @@ class RawTextQuery(object): self.query_parts = [] self.engines = [] self.languages = [] + self.timeout_limit = None self.specific = False # parse query, if tags are set, which @@ -52,7 +52,7 @@ class RawTextQuery(object): self.query_parts = [] # split query, including whitespaces - raw_query_parts = re.split(r'(\s+)', self.query) + raw_query_parts = re.split(r'(\s+)' if isinstance(self.query, str) else b'(\s+)', self.query) parse_next = True @@ -70,15 +70,25 @@ class RawTextQuery(object): self.query_parts.append(query_part) continue + # this force the timeout + if query_part[0] == '<': + try: + raw_timeout_limit = int(query_part[1:]) + if raw_timeout_limit < 100: + # below 100, the unit is the second ( <3 = 3 seconds timeout ) + self.timeout_limit = float(raw_timeout_limit) + else: + # 100 or above, the unit is the millisecond ( <850 = 850 milliseconds timeout ) + self.timeout_limit = raw_timeout_limit / 1000.0 + parse_next = True + except ValueError: + # error not reported to the user + pass + # this force a language if query_part[0] == ':': lang = query_part[1:].lower().replace('_', '-') - # user may set a valid, yet not selectable language - if VALID_LANGUAGE_CODE.match(lang): - self.languages.append(lang) - parse_next = True - # check if any language-code is equal with # declared language-codes for lc in language_codes: @@ -86,16 +96,29 @@ class RawTextQuery(object): # if correct language-code is found # set it as new search-language - if lang == lang_id\ - or lang_id.startswith(lang)\ - or lang == lang_name\ - or lang == english_name\ - or lang.replace('-', ' ') == country: + if (lang == lang_id + or lang == lang_name + or lang == english_name + or lang.replace('-', ' ') == country)\ + and lang not in self.languages: + parse_next = True + lang_parts = lang_id.split('-') + if len(lang_parts) == 2: + self.languages.append(lang_parts[0] + '-' + lang_parts[1].upper()) + else: + self.languages.append(lang_id) + # to ensure best match (first match is not necessarily the best one) + if lang == lang_id: + break + + # user may set a valid, yet not selectable language + if VALID_LANGUAGE_CODE.match(lang): + lang_parts = lang.split('-') + if len(lang_parts) > 1: + lang = lang_parts[0].lower() + '-' + lang_parts[1].upper() + if lang not in self.languages: + self.languages.append(lang) parse_next = True - self.languages.append(lang_id) - # to ensure best match (first match is not necessarily the best one) - if lang == lang_id: - break # this force a engine or category if query_part[0] == '!' or query_part[0] == '?': @@ -104,14 +127,18 @@ class RawTextQuery(object): # check if prefix is equal with engine shortcut if prefix in engine_shortcuts: parse_next = True - self.engines.append({'category': 'none', - 'name': engine_shortcuts[prefix]}) + engine_name = engine_shortcuts[prefix] + if engine_name in engines: + self.engines.append({'category': 'none', + 'name': engine_name, + 'from_bang': True}) # check if prefix is equal with engine name elif prefix in engines: parse_next = True self.engines.append({'category': 'none', - 'name': prefix}) + 'name': prefix, + 'from_bang': True}) # check if prefix is equal with categorie name elif prefix in categories: @@ -134,6 +161,7 @@ class RawTextQuery(object): self.query_parts[-1] = search_query else: self.query_parts.append(search_query) + return self def getSearchQuery(self): if len(self.query_parts): @@ -143,20 +171,23 @@ class RawTextQuery(object): def getFullQuery(self): # get full querry including whitespaces - return string.join(self.query_parts, '') + return u''.join(self.query_parts) class SearchQuery(object): """container for all the search parameters (query, language, etc...)""" - def __init__(self, query, engines, categories, lang, safesearch, pageno, time_range): + def __init__(self, query, engines, categories, lang, safesearch, pageno, time_range, + timeout_limit=None, preferences=None): self.query = query.encode('utf-8') self.engines = engines self.categories = categories self.lang = lang self.safesearch = safesearch self.pageno = pageno - self.time_range = time_range + self.time_range = None if time_range in ('', 'None', None) else time_range + self.timeout_limit = timeout_limit + self.preferences = preferences def __str__(self): return str(self.query) + ";" + str(self.engines) |