4from abc
import abstractmethod, ABC
7from searx
import settings
17 __slots__ =
"raw_text_query",
"enable_autocomplete"
22 """Check if raw_value can be parsed"""
24 def __init__(self, raw_text_query, enable_autocomplete):
30 """Try to parse raw_value: set the self.raw_text_query properties
32 return True if raw_value has been parsed
34 self.raw_text_query.autocomplete_list is also modified
35 if self.enable_autocomplete is True
39 if value
not in self.raw_text_query.autocomplete_list:
40 self.raw_text_query.autocomplete_list.append(value)
46 return raw_value[0] ==
'<'
50 found = self.
_parse(value)
if len(value) > 0
else False
56 if not value.isdigit():
58 raw_timeout_limit = int(value)
59 if raw_timeout_limit < 100:
68 for suggestion
in [
'<3',
'<850']:
75 return raw_value[0] ==
':'
78 value = raw_value[1:].lower().replace(
'_',
'-')
79 found = self.
_parse(value)
if len(value) > 0
else False
88 for lc
in sxng_locales:
89 lang_id, lang_name, country, english_name, _flag = map(str.lower, lc)
95 value == lang_id
or value == lang_name
or value == english_name
or value.replace(
'-',
' ') == country
98 lang_parts = lang_id.split(
'-')
99 if len(lang_parts) == 2:
100 self.
raw_text_query.languages.append(lang_parts[0] +
'-' + lang_parts[1].upper())
108 if VALID_LANGUAGE_CODE.match(value)
or value ==
'auto':
109 lang_parts = value.split(
'-')
110 if len(lang_parts) > 1:
111 value = lang_parts[0].lower() +
'-' + lang_parts[1].upper()
121 if len(settings[
'search'][
'languages']) < 10:
122 for lang
in settings[
'search'][
'languages']:
125 for lang
in [
":en",
":en_us",
":english",
":united_kingdom"]:
129 for lc
in sxng_locales:
130 if lc[0]
not in settings[
'search'][
'languages']:
132 lang_id, lang_name, country, english_name, _flag = map(str.lower, lc)
135 if lang_id.startswith(value):
142 if lang_name.startswith(value)
or english_name.startswith(value):
147 if country.startswith(value.replace(
'-',
' ')):
154 return raw_value.startswith(
'!!')
and len(raw_value) > 2
157 value = raw_value[2:]
158 found, bang_ac_list = self.
_parse(value)
if len(value) > 0
else (
False, [])
165 bang_definition, bang_ac_list = get_bang_definition_and_autocomplete(value)
166 if bang_definition
is not None:
169 return found, bang_ac_list
173 bang_ac_list = [
'g',
'ddg',
'bing']
174 for external_bang
in bang_ac_list:
182 return raw_value[0] ==
'!' and (len(raw_value) < 2
or raw_value[1] !=
'!')
185 value = raw_value[1:].replace(
'-',
' ').replace(
'_',
' ')
186 found = self.
_parse(value)
if len(value) > 0
else False
187 if found
and raw_value[0] ==
'!':
195 if value
in engine_shortcuts:
196 value = engine_shortcuts[value]
204 if value
in categories:
209 for engine
in categories[value]
210 if (engine.name, value)
not in self.
raw_text_query.disabled_engines
219 for suggestion
in [
'images',
'wikipedia',
'osm']:
220 if suggestion
not in self.
raw_text_query.disabled_engines
or suggestion
in categories:
225 for category
in categories:
226 if category.startswith(value):
230 for engine
in engines:
231 if engine.startswith(value):
235 for engine_shortcut
in engine_shortcuts:
236 if engine_shortcut.startswith(value):
243 return raw_value ==
'!!'
251 """parse raw text query (the value from the html input)"""
262 assert isinstance(query, str)
282 parse self.query, if tags are set, which
283 change the search engine or search-language
287 raw_query_parts = re.split(
r'(\s+)', self.
query)
289 last_index_location =
None
290 autocomplete_index = len(raw_query_parts) - 1
292 for i, query_part
in enumerate(raw_query_parts):
294 if query_part.isspace()
or query_part ==
'':
299 for parser_class
in RawTextQuery.PARSER_CLASSES:
300 if parser_class.check(query_part):
301 special_part = parser_class(self, i == autocomplete_index)(query_part)
306 qlist.append(query_part)
307 last_index_location = (qlist, len(qlist) - 1)
313 qlist[position] = text
328 get full query including whitespaces
337 f
"<{self.__class__.__name__} "
338 + f
"query={self.query!r} "
339 + f
"disabled_engines={self.disabled_engines!r}\n "
340 + f
"languages={self.languages!r} "
341 + f
"timeout_limit={self.timeout_limit!r} "
342 + f
"external_bang={self.external_bang!r} "
343 + f
"specific={self.specific!r} "
344 + f
"enginerefs={self.enginerefs!r}\n "
345 + f
"autocomplete_list={self.autocomplete_list!r}\n "
346 + f
"query_parts={self.query_parts!r}\n "
347 + f
"user_query_parts={self.user_query_parts!r} >\n"
348 + f
"redirect_to_first_result={self.redirect_to_first_result!r}"
_autocomplete(self, first_char, value)
__call__(self, raw_value)
_autocomplete(self, bang_ac_list)
__call__(self, raw_value)
__call__(self, raw_value)
_autocomplete(self, value)
__call__(self, raw_value)
_add_autocomplete(self, value)
__call__(self, raw_value)
__init__(self, raw_text_query, enable_autocomplete)
__init__(self, query, disabled_engines)
get_autocomplete_full_query(self, text)
__call__(self, raw_value)