Merge 476a3811d451388901799eed5cec70eb5974c504 into cd64fb966e7e9d764e622e42b177a1f13dc65ec0

This commit is contained in:
Grant Lanham Jr 2025-05-15 13:08:01 +02:00 committed by GitHub
commit 923ebc2001
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 33 additions and 28 deletions

View File

@ -1,10 +1,9 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# pylint: disable=invalid-name, missing-module-docstring, missing-class-docstring
from __future__ import annotations
from abc import abstractmethod, ABC
import re
from searx import settings
from searx.sxng_locales import sxng_locales
from searx.engines import categories, engines, engine_shortcuts
@ -274,14 +273,17 @@ class RawTextQuery:
# internal properties
self.query_parts = [] # use self.getFullQuery()
self.user_query_parts = [] # use self.getQuery()
self.autocomplete_location = None
self.redirect_to_first_result = False
self._parse_query()
self.autocomplete_location = self._parse_query()
def _parse_query(self):
"""
parse self.query, if tags are set, which
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
@ -307,28 +309,25 @@ class RawTextQuery:
qlist.append(query_part)
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] = text
return self.getFullQuery()
def changeQuery(self, query):
self.user_query_parts = query.strip().split()
self.query = self.getFullQuery()
self.autocomplete_location = (self.user_query_parts, len(self.user_query_parts) - 1)
self.autocomplete_list = []
return self
def getQuery(self):
def getQuery(self) -> str:
return ' '.join(self.user_query_parts)
def getFullQuery(self):
"""
get full query including whitespaces
"""
return '{0} {1}'.format(' '.join(self.query_parts), self.getQuery()).strip()
def getFullQuery(self, new_query: str | None = None):
def format_query(query: str) -> str:
return '{0} {1}'.format(' '.join(self.query_parts), query).strip()
if new_query is None:
return format_query(self.getQuery())
return format_query(new_query.strip())
def __str__(self):
return self.getFullQuery()

View File

@ -144,6 +144,7 @@ class EngineProcessor(ABC):
- A page-number > 1 when engine does not support paging.
- A time range when the engine does not support time range.
"""
# if paging is not supported, skip
if search_query.pageno > 1 and not self.engine.paging:
return None

View File

@ -699,14 +699,14 @@ def search():
# suggestions: use RawTextQuery to get the suggestion URLs with the same bang
suggestion_urls = list(
map(
lambda suggestion: {'url': raw_text_query.changeQuery(suggestion).getFullQuery(), 'title': suggestion},
lambda suggestion: {'url': raw_text_query.getFullQuery(suggestion), 'title': suggestion},
result_container.suggestions,
)
)
correction_urls = list(
map(
lambda correction: {'url': raw_text_query.changeQuery(correction).getFullQuery(), 'title': correction},
lambda correction: {'url': raw_text_query.getFullQuery(correction), 'title': correction},
result_container.corrections,
)
)
@ -801,10 +801,8 @@ def autocompleter():
backend_name = sxng_request.preferences.get_value('autocomplete')
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:
results.append(raw_text_query.changeQuery(result).getFullQuery())
results.append(raw_text_query.getNewFullQuery(result))
if len(raw_text_query.autocomplete_list) > 0:
for autocomplete_text in raw_text_query.autocomplete_list:

View File

@ -39,12 +39,19 @@ class TestQuery(SearxTestCase):
r = repr(query)
self.assertTrue(r.startswith(f"<RawTextQuery query='{query_text}' "))
def test_change_query(self):
def test_get_full_query(self):
query_text = '<8 the query'
query = RawTextQuery(query_text, [])
another_query = query.changeQuery('another text')
self.assertEqual(query, another_query)
self.assertEqual(query.getFullQuery(), '<8 another text')
full_query = query.getFullQuery()
new_full_query = query.getFullQuery('another text')
self.assertNotEqual(full_query, new_full_query)
def test_get_full_query_trim(self):
query_text = 'foo bar'
query = RawTextQuery(query_text, [])
new_query = 'bizz bazz'
new_full_query = query.getFullQuery(" " + new_query + " ")
self.assertEqual(new_query, new_full_query)
class TestLanguageParser(SearxTestCase):