summaryrefslogtreecommitdiff
path: root/searx/query.py
diff options
context:
space:
mode:
Diffstat (limited to 'searx/query.py')
-rw-r--r--searx/query.py75
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)