| 
				
			 | 
			
			
				@@ -25,6 +25,7 @@ from searx.engines import ( 
			 | 
		
	
		
			
			| 
				25
			 | 
			
				25
			 | 
			
			
				 ) 
			 | 
		
	
		
			
			| 
				26
			 | 
			
				26
			 | 
			
			
				 from searx.languages import language_codes 
			 | 
		
	
		
			
			| 
				27
			 | 
			
				27
			 | 
			
			
				 from searx.utils import gen_useragent 
			 | 
		
	
		
			
			| 
				
			 | 
			
				28
			 | 
			
			
				+from searx.query import Query 
			 | 
		
	
		
			
			| 
				28
			 | 
			
				29
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				29
			 | 
			
				30
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				30
			 | 
			
				31
			 | 
			
			
				 number_of_searches = 0 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -235,7 +236,15 @@ class Search(object): 
			 | 
		
	
		
			
			| 
				235
			 | 
			
				236
			 | 
			
			
				         self.pageno = int(pageno_param) 
			 | 
		
	
		
			
			| 
				236
			 | 
			
				237
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				237
			 | 
			
				238
			 | 
			
			
				         # parse query, if tags are set, which change the serch engine or search-language 
			 | 
		
	
		
			
			| 
				238
			 | 
			
				
			 | 
			
			
				-        self.parse_query() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				239
			 | 
			
			
				+        query_obj = Query(self.query, self.blocked_engines) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				240
			 | 
			
			
				+        query_obj.parse_query()         
			 | 
		
	
		
			
			| 
				
			 | 
			
				241
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				242
			 | 
			
			
				+        # get last selected language in query, if possible 
			 | 
		
	
		
			
			| 
				
			 | 
			
				243
			 | 
			
			
				+        # TODO support search with multible languages 
			 | 
		
	
		
			
			| 
				
			 | 
			
				244
			 | 
			
			
				+        if len(query_obj.languages): 
			 | 
		
	
		
			
			| 
				
			 | 
			
				245
			 | 
			
			
				+            self.lang = query_obj.languages[-1] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				246
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				247
			 | 
			
			
				+        self.engines = query_obj.engines 
			 | 
		
	
		
			
			| 
				239
			 | 
			
				248
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				240
			 | 
			
				249
			 | 
			
			
				         self.categories = [] 
			 | 
		
	
		
			
			| 
				241
			 | 
			
				250
			 | 
			
			
				  
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -276,60 +285,6 @@ class Search(object): 
			 | 
		
	
		
			
			| 
				276
			 | 
			
				285
			 | 
			
			
				                                     for x in categories[categ] 
			 | 
		
	
		
			
			| 
				277
			 | 
			
				286
			 | 
			
			
				                                     if not x.name in self.blocked_engines) 
			 | 
		
	
		
			
			| 
				278
			 | 
			
				287
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				279
			 | 
			
				
			 | 
			
			
				-    # parse query, if tags are set, which change the serch engine or search-language 
			 | 
		
	
		
			
			| 
				280
			 | 
			
				
			 | 
			
			
				-    def parse_query(self): 
			 | 
		
	
		
			
			| 
				281
			 | 
			
				
			 | 
			
			
				-        query_parts = self.query.split() 
			 | 
		
	
		
			
			| 
				282
			 | 
			
				
			 | 
			
			
				-        modified = False 
			 | 
		
	
		
			
			| 
				283
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				284
			 | 
			
				
			 | 
			
			
				-        # check if language-prefix is set 
			 | 
		
	
		
			
			| 
				285
			 | 
			
				
			 | 
			
			
				-        if query_parts[0].startswith(':'): 
			 | 
		
	
		
			
			| 
				286
			 | 
			
				
			 | 
			
			
				-            lang = query_parts[0][1:].lower() 
			 | 
		
	
		
			
			| 
				287
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				288
			 | 
			
				
			 | 
			
			
				-            # check if any language-code is equal with declared language-codes 
			 | 
		
	
		
			
			| 
				289
			 | 
			
				
			 | 
			
			
				-            for lc in language_codes: 
			 | 
		
	
		
			
			| 
				290
			 | 
			
				
			 | 
			
			
				-                lang_id, lang_name, country = map(str.lower, lc) 
			 | 
		
	
		
			
			| 
				291
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				292
			 | 
			
				
			 | 
			
			
				-                # if correct language-code is found, set it as new search-language 
			 | 
		
	
		
			
			| 
				293
			 | 
			
				
			 | 
			
			
				-                if lang == lang_id\ 
			 | 
		
	
		
			
			| 
				294
			 | 
			
				
			 | 
			
			
				-                   or lang_id.startswith(lang)\ 
			 | 
		
	
		
			
			| 
				295
			 | 
			
				
			 | 
			
			
				-                   or lang == lang_name\ 
			 | 
		
	
		
			
			| 
				296
			 | 
			
				
			 | 
			
			
				-                   or lang == country: 
			 | 
		
	
		
			
			| 
				297
			 | 
			
				
			 | 
			
			
				-                    self.lang = lang 
			 | 
		
	
		
			
			| 
				298
			 | 
			
				
			 | 
			
			
				-                    modified = True 
			 | 
		
	
		
			
			| 
				299
			 | 
			
				
			 | 
			
			
				-                    break 
			 | 
		
	
		
			
			| 
				300
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				301
			 | 
			
				
			 | 
			
			
				-        # check if category/engine prefix is set 
			 | 
		
	
		
			
			| 
				302
			 | 
			
				
			 | 
			
			
				-        elif query_parts[0].startswith('!'): 
			 | 
		
	
		
			
			| 
				303
			 | 
			
				
			 | 
			
			
				-            prefix = query_parts[0][1:].replace('_', ' ') 
			 | 
		
	
		
			
			| 
				304
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				305
			 | 
			
				
			 | 
			
			
				-            # check if prefix is equal with engine shortcut 
			 | 
		
	
		
			
			| 
				306
			 | 
			
				
			 | 
			
			
				-            if prefix in engine_shortcuts\ 
			 | 
		
	
		
			
			| 
				307
			 | 
			
				
			 | 
			
			
				-               and not engine_shortcuts[prefix] in self.blocked_engines: 
			 | 
		
	
		
			
			| 
				308
			 | 
			
				
			 | 
			
			
				-                modified = True 
			 | 
		
	
		
			
			| 
				309
			 | 
			
				
			 | 
			
			
				-                self.engines.append({'category': 'none', 
			 | 
		
	
		
			
			| 
				310
			 | 
			
				
			 | 
			
			
				-                                     'name': engine_shortcuts[prefix]}) 
			 | 
		
	
		
			
			| 
				311
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				312
			 | 
			
				
			 | 
			
			
				-            # check if prefix is equal with engine name 
			 | 
		
	
		
			
			| 
				313
			 | 
			
				
			 | 
			
			
				-            elif prefix in engines\ 
			 | 
		
	
		
			
			| 
				314
			 | 
			
				
			 | 
			
			
				-                    and not prefix in self.blocked_engines: 
			 | 
		
	
		
			
			| 
				315
			 | 
			
				
			 | 
			
			
				-                modified = True 
			 | 
		
	
		
			
			| 
				316
			 | 
			
				
			 | 
			
			
				-                self.engines.append({'category': 'none', 
			 | 
		
	
		
			
			| 
				317
			 | 
			
				
			 | 
			
			
				-                                    'name': prefix}) 
			 | 
		
	
		
			
			| 
				318
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				319
			 | 
			
				
			 | 
			
			
				-            # check if prefix is equal with categorie name 
			 | 
		
	
		
			
			| 
				320
			 | 
			
				
			 | 
			
			
				-            elif prefix in categories: 
			 | 
		
	
		
			
			| 
				321
			 | 
			
				
			 | 
			
			
				-                modified = True 
			 | 
		
	
		
			
			| 
				322
			 | 
			
				
			 | 
			
			
				-                # using all engines for that search, which are declared under that categorie name 
			 | 
		
	
		
			
			| 
				323
			 | 
			
				
			 | 
			
			
				-                self.engines.extend({'category': prefix, 
			 | 
		
	
		
			
			| 
				324
			 | 
			
				
			 | 
			
			
				-                                    'name': engine.name} 
			 | 
		
	
		
			
			| 
				325
			 | 
			
				
			 | 
			
			
				-                                    for engine in categories[prefix] 
			 | 
		
	
		
			
			| 
				326
			 | 
			
				
			 | 
			
			
				-                                    if not engine in self.blocked_engines) 
			 | 
		
	
		
			
			| 
				327
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				328
			 | 
			
				
			 | 
			
			
				-        # if language, category or engine were specificed in this query, search for more tags which does the same 
			 | 
		
	
		
			
			| 
				329
			 | 
			
				
			 | 
			
			
				-        if modified: 
			 | 
		
	
		
			
			| 
				330
			 | 
			
				
			 | 
			
			
				-            self.query = self.query.replace(query_parts[0], '', 1).strip() 
			 | 
		
	
		
			
			| 
				331
			 | 
			
				
			 | 
			
			
				-            self.parse_query() 
			 | 
		
	
		
			
			| 
				332
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				333
			 | 
			
				288
			 | 
			
			
				     # do search-request 
			 | 
		
	
		
			
			| 
				334
			 | 
			
				289
			 | 
			
			
				     def search(self, request): 
			 | 
		
	
		
			
			| 
				335
			 | 
			
				290
			 | 
			
			
				         global number_of_searches 
			 |