[enh] add autocompletion for searx-specific strings
This commit is contained in:
		
							parent
							
								
									29a526ff0e
								
							
						
					
					
						commit
						4e2dae30f0
					
				| @ -20,6 +20,85 @@ from lxml import etree | ||||
| from requests import get | ||||
| from json import loads | ||||
| from urllib import urlencode | ||||
| from searx.languages import language_codes | ||||
| from searx.engines import ( | ||||
|     categories, engines, engine_shortcuts | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| def searx_bang(full_query): | ||||
|     '''check if the searchQuery contain a bang, and create fitting autocompleter results''' | ||||
|     # check if there is a query which can be parsed | ||||
|     if len(full_query.getSearchQuery()) == 0: | ||||
|         return [] | ||||
| 
 | ||||
|     results = [] | ||||
| 
 | ||||
|     # check if current query stats with !bang | ||||
|     if full_query.getSearchQuery()[0] == '!': | ||||
|         if len(full_query.getSearchQuery()) == 1: | ||||
|             # show some example queries | ||||
|             # TODO, check if engine is not avaliable | ||||
|             results.append("!images") | ||||
|             results.append("!wikipedia") | ||||
|             results.append("!osm") | ||||
|         else: | ||||
|             engine_query = full_query.getSearchQuery()[1:] | ||||
| 
 | ||||
|             # check if query starts with categorie name | ||||
|             for categorie in categories: | ||||
|                 if categorie.startswith(engine_query): | ||||
|                     results.append('!{categorie}'.format(categorie=categorie)) | ||||
| 
 | ||||
|             # check if query starts with engine name | ||||
|             for engine in engines: | ||||
|                 if engine.startswith(engine_query): | ||||
|                     results.append('!{engine}'.format(engine=engine.replace(' ', '_'))) | ||||
| 
 | ||||
|             # check if query starts with engine shortcut | ||||
|             for engine_shortcut in engine_shortcuts: | ||||
|                 if engine_shortcut.startswith(engine_query): | ||||
|                     results.append('!{engine_shortcut}'.format(engine_shortcut=engine_shortcut)) | ||||
| 
 | ||||
|     # check if current query stats with :bang | ||||
|     elif full_query.getSearchQuery()[0] == ':': | ||||
|         if len(full_query.getSearchQuery()) == 1: | ||||
|             # show some example queries | ||||
|             results.append(":en") | ||||
|             results.append(":en_us") | ||||
|             results.append(":english") | ||||
|             results.append(":united_kingdom") | ||||
|         else: | ||||
|             engine_query = full_query.getSearchQuery()[1:] | ||||
| 
 | ||||
|             for lc in language_codes: | ||||
|                 lang_id, lang_name, country = map(str.lower, lc) | ||||
| 
 | ||||
|                 # check if query starts with language-id | ||||
|                 if lang_id.startswith(engine_query): | ||||
|                     if len(engine_query) <= 2: | ||||
|                         results.append(':{lang_id}'.format(lang_id=lang_id.split('_')[0])) | ||||
|                     else: | ||||
|                         results.append(':{lang_id}'.format(lang_id=lang_id)) | ||||
| 
 | ||||
|                 # check if query starts with language name | ||||
|                 if lang_name.startswith(engine_query): | ||||
|                     results.append(':{lang_name}'.format(lang_name=lang_name)) | ||||
| 
 | ||||
|                 # check if query starts with country | ||||
|                 if country.startswith(engine_query): | ||||
|                     results.append(':{country}'.format(country=country.replace(' ', '_'))) | ||||
| 
 | ||||
|     # remove duplicates | ||||
|     result_set = set(results) | ||||
| 
 | ||||
|     # remove results which are already contained in the query | ||||
|     for query_part in full_query.query_parts: | ||||
|         if query_part in result_set: | ||||
|             result_set.remove(query_part) | ||||
| 
 | ||||
|     # convert result_set back to list | ||||
|     return list(result_set) | ||||
| 
 | ||||
| 
 | ||||
| def dbpedia(query): | ||||
|  | ||||
| @ -77,7 +77,7 @@ class Query(object): | ||||
|                     if lang == lang_id\ | ||||
|                        or lang_id.startswith(lang)\ | ||||
|                        or lang == lang_name\ | ||||
|                        or lang == country: | ||||
|                        or lang.replace('_', ' ') == country: | ||||
|                         parse_next = True | ||||
|                         self.languages.append(lang) | ||||
|                         break | ||||
|  | ||||
| @ -46,7 +46,7 @@ from searx.languages import language_codes | ||||
| from searx.https_rewrite import https_url_rewrite | ||||
| from searx.search import Search | ||||
| from searx.query import Query | ||||
| from searx.autocomplete import backends as autocomplete_backends | ||||
| from searx.autocomplete import searx_bang, backends as autocomplete_backends | ||||
| from searx import logger | ||||
| 
 | ||||
| 
 | ||||
| @ -352,8 +352,11 @@ def autocompleter(): | ||||
|     if not completer: | ||||
|         return | ||||
| 
 | ||||
|     # parse searx specific autocompleter results like !bang | ||||
|     raw_results = searx_bang(query) | ||||
| 
 | ||||
|     # run autocompletion | ||||
|     raw_results = completer(query.getSearchQuery()) | ||||
|     raw_results.extend(completer(query.getSearchQuery())) | ||||
| 
 | ||||
|     # parse results (write :language and !engine back to result string) | ||||
|     results = [] | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Thomas Pointhuber
						Thomas Pointhuber