Merge 81f0cb01e8 into a1e2b25467
				
					
				
			This commit is contained in:
		
						commit
						ad2c551794
					
				| @ -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 | ||||||
|  | |||||||
| @ -730,14 +730,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, | ||||||
|         ) |         ) | ||||||
|     ) |     ) | ||||||
| @ -832,10 +832,8 @@ def autocompleter(): | |||||||
|         backend_name = sxng_request.preferences.get_value('autocomplete') |         backend_name = sxng_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: | ||||||
|  | |||||||
| @ -39,12 +39,19 @@ class TestQuery(SearxTestCase): | |||||||
|         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): | class TestLanguageParser(SearxTestCase): | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user