|  | @@ -20,6 +20,85 @@ from lxml import etree
 | 
	
		
			
			| 20 | 20 |  from requests import get
 | 
	
		
			
			| 21 | 21 |  from json import loads
 | 
	
		
			
			| 22 | 22 |  from urllib import urlencode
 | 
	
		
			
			|  | 23 | +from searx.languages import language_codes
 | 
	
		
			
			|  | 24 | +from searx.engines import (
 | 
	
		
			
			|  | 25 | +    categories, engines, engine_shortcuts
 | 
	
		
			
			|  | 26 | +)
 | 
	
		
			
			|  | 27 | +
 | 
	
		
			
			|  | 28 | +
 | 
	
		
			
			|  | 29 | +def searx_bang(full_query):
 | 
	
		
			
			|  | 30 | +    '''check if the searchQuery contain a bang, and create fitting autocompleter results'''
 | 
	
		
			
			|  | 31 | +    # check if there is a query which can be parsed
 | 
	
		
			
			|  | 32 | +    if len(full_query.getSearchQuery()) == 0:
 | 
	
		
			
			|  | 33 | +        return []
 | 
	
		
			
			|  | 34 | +
 | 
	
		
			
			|  | 35 | +    results = []
 | 
	
		
			
			|  | 36 | +
 | 
	
		
			
			|  | 37 | +    # check if current query stats with !bang
 | 
	
		
			
			|  | 38 | +    if full_query.getSearchQuery()[0] == '!':
 | 
	
		
			
			|  | 39 | +        if len(full_query.getSearchQuery()) == 1:
 | 
	
		
			
			|  | 40 | +            # show some example queries
 | 
	
		
			
			|  | 41 | +            # TODO, check if engine is not avaliable
 | 
	
		
			
			|  | 42 | +            results.append("!images")
 | 
	
		
			
			|  | 43 | +            results.append("!wikipedia")
 | 
	
		
			
			|  | 44 | +            results.append("!osm")
 | 
	
		
			
			|  | 45 | +        else:
 | 
	
		
			
			|  | 46 | +            engine_query = full_query.getSearchQuery()[1:]
 | 
	
		
			
			|  | 47 | +
 | 
	
		
			
			|  | 48 | +            # check if query starts with categorie name
 | 
	
		
			
			|  | 49 | +            for categorie in categories:
 | 
	
		
			
			|  | 50 | +                if categorie.startswith(engine_query):
 | 
	
		
			
			|  | 51 | +                    results.append('!{categorie}'.format(categorie=categorie))
 | 
	
		
			
			|  | 52 | +
 | 
	
		
			
			|  | 53 | +            # check if query starts with engine name
 | 
	
		
			
			|  | 54 | +            for engine in engines:
 | 
	
		
			
			|  | 55 | +                if engine.startswith(engine_query.replace('_', ' ')):
 | 
	
		
			
			|  | 56 | +                    results.append('!{engine}'.format(engine=engine.replace(' ', '_')))
 | 
	
		
			
			|  | 57 | +
 | 
	
		
			
			|  | 58 | +            # check if query starts with engine shortcut
 | 
	
		
			
			|  | 59 | +            for engine_shortcut in engine_shortcuts:
 | 
	
		
			
			|  | 60 | +                if engine_shortcut.startswith(engine_query):
 | 
	
		
			
			|  | 61 | +                    results.append('!{engine_shortcut}'.format(engine_shortcut=engine_shortcut))
 | 
	
		
			
			|  | 62 | +
 | 
	
		
			
			|  | 63 | +    # check if current query stats with :bang
 | 
	
		
			
			|  | 64 | +    elif full_query.getSearchQuery()[0] == ':':
 | 
	
		
			
			|  | 65 | +        if len(full_query.getSearchQuery()) == 1:
 | 
	
		
			
			|  | 66 | +            # show some example queries
 | 
	
		
			
			|  | 67 | +            results.append(":en")
 | 
	
		
			
			|  | 68 | +            results.append(":en_us")
 | 
	
		
			
			|  | 69 | +            results.append(":english")
 | 
	
		
			
			|  | 70 | +            results.append(":united_kingdom")
 | 
	
		
			
			|  | 71 | +        else:
 | 
	
		
			
			|  | 72 | +            engine_query = full_query.getSearchQuery()[1:]
 | 
	
		
			
			|  | 73 | +
 | 
	
		
			
			|  | 74 | +            for lc in language_codes:
 | 
	
		
			
			|  | 75 | +                lang_id, lang_name, country = map(str.lower, lc)
 | 
	
		
			
			|  | 76 | +
 | 
	
		
			
			|  | 77 | +                # check if query starts with language-id
 | 
	
		
			
			|  | 78 | +                if lang_id.startswith(engine_query):
 | 
	
		
			
			|  | 79 | +                    if len(engine_query) <= 2:
 | 
	
		
			
			|  | 80 | +                        results.append(':{lang_id}'.format(lang_id=lang_id.split('_')[0]))
 | 
	
		
			
			|  | 81 | +                    else:
 | 
	
		
			
			|  | 82 | +                        results.append(':{lang_id}'.format(lang_id=lang_id))
 | 
	
		
			
			|  | 83 | +
 | 
	
		
			
			|  | 84 | +                # check if query starts with language name
 | 
	
		
			
			|  | 85 | +                if lang_name.startswith(engine_query):
 | 
	
		
			
			|  | 86 | +                    results.append(':{lang_name}'.format(lang_name=lang_name))
 | 
	
		
			
			|  | 87 | +
 | 
	
		
			
			|  | 88 | +                # check if query starts with country
 | 
	
		
			
			|  | 89 | +                if country.startswith(engine_query.replace('_', ' ')):
 | 
	
		
			
			|  | 90 | +                    results.append(':{country}'.format(country=country.replace(' ', '_')))
 | 
	
		
			
			|  | 91 | +
 | 
	
		
			
			|  | 92 | +    # remove duplicates
 | 
	
		
			
			|  | 93 | +    result_set = set(results)
 | 
	
		
			
			|  | 94 | +
 | 
	
		
			
			|  | 95 | +    # remove results which are already contained in the query
 | 
	
		
			
			|  | 96 | +    for query_part in full_query.query_parts:
 | 
	
		
			
			|  | 97 | +        if query_part in result_set:
 | 
	
		
			
			|  | 98 | +            result_set.remove(query_part)
 | 
	
		
			
			|  | 99 | +
 | 
	
		
			
			|  | 100 | +    # convert result_set back to list
 | 
	
		
			
			|  | 101 | +    return list(result_set)
 | 
	
		
			
			| 23 | 102 |  
 | 
	
		
			
			| 24 | 103 |  
 | 
	
		
			
			| 25 | 104 |  def dbpedia(query):
 |