|  | @@ -23,7 +23,7 @@ if __name__ == "__main__":
 | 
	
		
			
			| 23 | 23 |      path.append(realpath(dirname(realpath(__file__))+'/../'))
 | 
	
		
			
			| 24 | 24 |  
 | 
	
		
			
			| 25 | 25 |  from flask import Flask, request, render_template, url_for, Response, make_response
 | 
	
		
			
			| 26 |  | -from searx.engines import search, categories, get_engines_stats
 | 
	
		
			
			|  | 26 | +from searx.engines import search, categories, engines, get_engines_stats
 | 
	
		
			
			| 27 | 27 |  from searx import settings
 | 
	
		
			
			| 28 | 28 |  import json
 | 
	
		
			
			| 29 | 29 |  
 | 
	
	
		
			
			|  | @@ -56,6 +56,14 @@ def render(template_name, **kwargs):
 | 
	
		
			
			| 56 | 56 |              kwargs['selected_categories'] = ['general']
 | 
	
		
			
			| 57 | 57 |      return render_template(template_name, **kwargs)
 | 
	
		
			
			| 58 | 58 |  
 | 
	
		
			
			|  | 59 | +def parse_query(query):
 | 
	
		
			
			|  | 60 | +    query_engines = []
 | 
	
		
			
			|  | 61 | +    query_parts = query.split()
 | 
	
		
			
			|  | 62 | +    if query_parts[0].startswith('-') and query_parts[0][1:] in engines:
 | 
	
		
			
			|  | 63 | +        query_engines.append({'category': 'TODO', 'name': query_parts[0][1:]})
 | 
	
		
			
			|  | 64 | +        query = query.replace(query_parts[0], '', 1).strip()
 | 
	
		
			
			|  | 65 | +    return query, query_engines
 | 
	
		
			
			|  | 66 | +
 | 
	
		
			
			| 59 | 67 |  @app.route('/', methods=['GET', 'POST'])
 | 
	
		
			
			| 60 | 68 |  def index():
 | 
	
		
			
			| 61 | 69 |      global categories
 | 
	
	
		
			
			|  | @@ -66,26 +74,27 @@ def index():
 | 
	
		
			
			| 66 | 74 |      if not request_data.get('q'):
 | 
	
		
			
			| 67 | 75 |          return render('index.html')
 | 
	
		
			
			| 68 | 76 |  
 | 
	
		
			
			| 69 |  | -    query = request_data['q'].encode('utf-8')
 | 
	
		
			
			| 70 |  | -
 | 
	
		
			
			| 71 | 77 |      selected_categories = []
 | 
	
		
			
			| 72 |  | -    for pd_name,pd in request_data.items():
 | 
	
		
			
			| 73 |  | -        if pd_name.startswith('category_'):
 | 
	
		
			
			| 74 |  | -            category = pd_name[9:]
 | 
	
		
			
			| 75 |  | -            if not category in categories:
 | 
	
		
			
			| 76 |  | -                continue
 | 
	
		
			
			| 77 |  | -            selected_categories.append(category)
 | 
	
		
			
			| 78 |  | -    if not len(selected_categories):
 | 
	
		
			
			| 79 |  | -        cookie_categories = request.cookies.get('categories', '').split(',')
 | 
	
		
			
			| 80 |  | -        for ccateg in cookie_categories:
 | 
	
		
			
			| 81 |  | -            if ccateg in categories:
 | 
	
		
			
			| 82 |  | -                selected_categories.append(ccateg)
 | 
	
		
			
			| 83 |  | -    if not len(selected_categories):
 | 
	
		
			
			| 84 |  | -        selected_categories = ['general']
 | 
	
		
			
			| 85 | 78 |  
 | 
	
		
			
			| 86 |  | -    selected_engines = []
 | 
	
		
			
			| 87 |  | -    for categ in selected_categories:
 | 
	
		
			
			| 88 |  | -        selected_engines.extend({'category': categ, 'name': x.name} for x in categories[categ])
 | 
	
		
			
			|  | 79 | +    query, selected_engines = parse_query(request_data['q'].encode('utf-8'))
 | 
	
		
			
			|  | 80 | +
 | 
	
		
			
			|  | 81 | +    if not len(selected_engines):
 | 
	
		
			
			|  | 82 | +        for pd_name,pd in request_data.items():
 | 
	
		
			
			|  | 83 | +            if pd_name.startswith('category_'):
 | 
	
		
			
			|  | 84 | +                category = pd_name[9:]
 | 
	
		
			
			|  | 85 | +                if not category in categories:
 | 
	
		
			
			|  | 86 | +                    continue
 | 
	
		
			
			|  | 87 | +                selected_categories.append(category)
 | 
	
		
			
			|  | 88 | +        if not len(selected_categories):
 | 
	
		
			
			|  | 89 | +            cookie_categories = request.cookies.get('categories', '').split(',')
 | 
	
		
			
			|  | 90 | +            for ccateg in cookie_categories:
 | 
	
		
			
			|  | 91 | +                if ccateg in categories:
 | 
	
		
			
			|  | 92 | +                    selected_categories.append(ccateg)
 | 
	
		
			
			|  | 93 | +        if not len(selected_categories):
 | 
	
		
			
			|  | 94 | +            selected_categories = ['general']
 | 
	
		
			
			|  | 95 | +
 | 
	
		
			
			|  | 96 | +        for categ in selected_categories:
 | 
	
		
			
			|  | 97 | +            selected_engines.extend({'category': categ, 'name': x.name} for x in categories[categ])
 | 
	
		
			
			| 89 | 98 |  
 | 
	
		
			
			| 90 | 99 |      results = search(query, request, selected_engines)
 | 
	
		
			
			| 91 | 100 |      for result in results:
 | 
	
	
		
			
			|  | @@ -97,7 +106,7 @@ def index():
 | 
	
		
			
			| 97 | 106 |          return Response(json.dumps({'query': query, 'results': results}), mimetype='application/json')
 | 
	
		
			
			| 98 | 107 |      template = render('results.html'
 | 
	
		
			
			| 99 | 108 |                          ,results=results
 | 
	
		
			
			| 100 |  | -                        ,q=query.decode('utf-8')
 | 
	
		
			
			|  | 109 | +                        ,q=request_data['q']
 | 
	
		
			
			| 101 | 110 |                          ,selected_categories=selected_categories
 | 
	
		
			
			| 102 | 111 |                          ,number_of_results=len(results)
 | 
	
		
			
			| 103 | 112 |                          )
 |