mirror of https://github.com/searxng/searxng.git
Compare commits
2 Commits
9a8d763e82
...
c90654aa61
Author | SHA1 | Date |
---|---|---|
Grant Lanham Jr | c90654aa61 | |
Grant Lanham | 81f0cb01e8 |
|
@ -1,10 +1,10 @@
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
# pylint: disable=invalid-name, missing-module-docstring, missing-class-docstring
|
# pylint: disable=invalid-name, missing-module-docstring, missing-class-docstring
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from abc import abstractmethod, ABC
|
from abc import abstractmethod, ABC
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from searx import settings
|
from searx import settings
|
||||||
from searx.sxng_locales import sxng_locales
|
from searx.sxng_locales import sxng_locales
|
||||||
from searx.engines import categories, engines, engine_shortcuts
|
from searx.engines import categories, engines, engine_shortcuts
|
||||||
|
@ -272,16 +272,19 @@ class RawTextQuery:
|
||||||
self.specific = False
|
self.specific = False
|
||||||
self.autocomplete_list = []
|
self.autocomplete_list = []
|
||||||
# internal properties
|
# internal properties
|
||||||
self.query_parts = [] # use self.getFullQuery()
|
self.query_parts = [] # use self.getFullQuery() or self.getNewFullQuery(query)
|
||||||
self.user_query_parts = [] # use self.getQuery()
|
self.user_query_parts = [] # use self.getQuery()
|
||||||
self.autocomplete_location = None
|
|
||||||
self.redirect_to_first_result = False
|
self.redirect_to_first_result = False
|
||||||
self._parse_query()
|
self.autocomplete_location = self._parse_query()
|
||||||
|
|
||||||
def _parse_query(self):
|
def _parse_query(self):
|
||||||
"""
|
"""
|
||||||
parse self.query, if tags are set, which
|
parse self.query, if tags are set, which
|
||||||
change the search engine or search-language
|
change the search engine or search-language
|
||||||
|
|
||||||
|
Returns a tuple:
|
||||||
|
[0] The query parts as a list
|
||||||
|
[1] The indexor into the above list
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# split query, including whitespaces
|
# split query, including whitespaces
|
||||||
|
@ -307,28 +310,33 @@ class RawTextQuery:
|
||||||
qlist.append(query_part)
|
qlist.append(query_part)
|
||||||
last_index_location = (qlist, len(qlist) - 1)
|
last_index_location = (qlist, len(qlist) - 1)
|
||||||
|
|
||||||
self.autocomplete_location = last_index_location
|
return last_index_location
|
||||||
|
|
||||||
def get_autocomplete_full_query(self, text):
|
def get_autocomplete_full_query(self, text: str) -> str:
|
||||||
|
assert self.autocomplete_location is not None
|
||||||
qlist, position = self.autocomplete_location
|
qlist, position = self.autocomplete_location
|
||||||
qlist[position] = text
|
qlist[position] = text
|
||||||
return self.getFullQuery()
|
return self.getFullQuery()
|
||||||
|
|
||||||
def changeQuery(self, query):
|
def getNewFullQuery(self, query: str):
|
||||||
self.user_query_parts = query.strip().split()
|
"""
|
||||||
self.query = self.getFullQuery()
|
Generate a new FullQuery based on the input query rather than the internal
|
||||||
self.autocomplete_location = (self.user_query_parts, len(self.user_query_parts) - 1)
|
user_query_parts
|
||||||
self.autocomplete_list = []
|
"""
|
||||||
return self
|
return RawTextQuery._getFullQuery(self.query_parts, query.strip())
|
||||||
|
|
||||||
def getQuery(self):
|
def getQuery(self) -> str:
|
||||||
return ' '.join(self.user_query_parts)
|
return ' '.join(self.user_query_parts)
|
||||||
|
|
||||||
def getFullQuery(self):
|
def getFullQuery(self) -> str:
|
||||||
"""
|
"""
|
||||||
get full query including whitespaces
|
Get full query including whitespaces
|
||||||
"""
|
"""
|
||||||
return '{0} {1}'.format(' '.join(self.query_parts), self.getQuery()).strip()
|
return RawTextQuery._getFullQuery(self.query_parts, self.getQuery())
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _getFullQuery(query_parts: list[str], query: str) -> str:
|
||||||
|
return '{0} {1}'.format(' '.join(query_parts), query).strip()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.getFullQuery()
|
return self.getFullQuery()
|
||||||
|
|
|
@ -144,6 +144,7 @@ class EngineProcessor(ABC):
|
||||||
- A page-number > 1 when engine does not support paging.
|
- A page-number > 1 when engine does not support paging.
|
||||||
- A time range when the engine does not support time range.
|
- A time range when the engine does not support time range.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# if paging is not supported, skip
|
# if paging is not supported, skip
|
||||||
if search_query.pageno > 1 and not self.engine.paging:
|
if search_query.pageno > 1 and not self.engine.paging:
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -753,14 +753,14 @@ def search():
|
||||||
# suggestions: use RawTextQuery to get the suggestion URLs with the same bang
|
# suggestions: use RawTextQuery to get the suggestion URLs with the same bang
|
||||||
suggestion_urls = list(
|
suggestion_urls = list(
|
||||||
map(
|
map(
|
||||||
lambda suggestion: {'url': raw_text_query.changeQuery(suggestion).getFullQuery(), 'title': suggestion},
|
lambda suggestion: {'url': raw_text_query.getNewFullQuery(suggestion), 'title': suggestion},
|
||||||
result_container.suggestions,
|
result_container.suggestions,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
correction_urls = list(
|
correction_urls = list(
|
||||||
map(
|
map(
|
||||||
lambda correction: {'url': raw_text_query.changeQuery(correction).getFullQuery(), 'title': correction},
|
lambda correction: {'url': raw_text_query.getNewFullQuery(correction), 'title': correction},
|
||||||
result_container.corrections,
|
result_container.corrections,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -851,10 +851,8 @@ def autocompleter():
|
||||||
backend_name = request.preferences.get_value('autocomplete')
|
backend_name = request.preferences.get_value('autocomplete')
|
||||||
|
|
||||||
for result in search_autocomplete(backend_name, sug_prefix, sxng_locale):
|
for result in search_autocomplete(backend_name, sug_prefix, sxng_locale):
|
||||||
# attention: this loop will change raw_text_query object and this is
|
|
||||||
# the reason why the sug_prefix was stored before (see above)
|
|
||||||
if result != sug_prefix:
|
if result != sug_prefix:
|
||||||
results.append(raw_text_query.changeQuery(result).getFullQuery())
|
results.append(raw_text_query.getNewFullQuery(result))
|
||||||
|
|
||||||
if len(raw_text_query.autocomplete_list) > 0:
|
if len(raw_text_query.autocomplete_list) > 0:
|
||||||
for autocomplete_text in raw_text_query.autocomplete_list:
|
for autocomplete_text in raw_text_query.autocomplete_list:
|
||||||
|
|
|
@ -51,12 +51,19 @@ class TestQuery(SearxTestCase): # pylint:disable=missing-class-docstring
|
||||||
r = repr(query)
|
r = repr(query)
|
||||||
self.assertTrue(r.startswith(f"<RawTextQuery query='{query_text}' "))
|
self.assertTrue(r.startswith(f"<RawTextQuery query='{query_text}' "))
|
||||||
|
|
||||||
def test_change_query(self):
|
def test_get_new_full_query(self):
|
||||||
query_text = '<8 the query'
|
query_text = '<8 the query'
|
||||||
query = RawTextQuery(query_text, [])
|
query = RawTextQuery(query_text, [])
|
||||||
another_query = query.changeQuery('another text')
|
full_query = query.getFullQuery()
|
||||||
self.assertEqual(query, another_query)
|
new_full_query = query.getNewFullQuery('another text')
|
||||||
self.assertEqual(query.getFullQuery(), '<8 another text')
|
self.assertNotEqual(full_query, new_full_query)
|
||||||
|
|
||||||
|
def test_get_new_full_query_trim(self):
|
||||||
|
query_text = 'foo bar'
|
||||||
|
query = RawTextQuery(query_text, [])
|
||||||
|
new_query = 'bizz bazz'
|
||||||
|
new_full_query = query.getNewFullQuery(" " + new_query + " ")
|
||||||
|
self.assertEqual(new_query, new_full_query)
|
||||||
|
|
||||||
|
|
||||||
class TestLanguageParser(SearxTestCase): # pylint:disable=missing-class-docstring
|
class TestLanguageParser(SearxTestCase): # pylint:disable=missing-class-docstring
|
||||||
|
|
Loading…
Reference in New Issue