summaryrefslogtreecommitdiff
path: root/searx/search.py
diff options
context:
space:
mode:
authorasciimoo <asciimoo@gmail.com>2014-02-07 01:19:07 +0100
committerasciimoo <asciimoo@gmail.com>2014-02-07 01:19:07 +0100
commit0540ea9ee21a2465b417249af4abed9b50917603 (patch)
tree83d9141a9efe8724e6a255bd25662bfe1c3a3af4 /searx/search.py
parente56d7a58c7e6680f3fbcf6dc3c691a08c04ee674 (diff)
downloadsearxng-0540ea9ee21a2465b417249af4abed9b50917603.tar.gz
searxng-0540ea9ee21a2465b417249af4abed9b50917603.zip
[enh][mod] code refactor ++ search engine filtering
Diffstat (limited to 'searx/search.py')
-rw-r--r--searx/search.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/searx/search.py b/searx/search.py
new file mode 100644
index 000000000..2727624bd
--- /dev/null
+++ b/searx/search.py
@@ -0,0 +1,94 @@
+from searx.engines import (
+ categories, engines, engine_shortcuts
+)
+from searx.languages import language_codes
+
+
+class Search(object):
+
+ """Search information container"""
+
+ def __init__(self, request):
+ super(Search, self).__init__()
+ self.query = None
+ self.engines = []
+ self.categories = []
+ query_engines = []
+ self.paging = False
+ self.pageno = 1
+ self.lang = 'all'
+ if request.cookies.get('blocked_engines'):
+ self.blocked_engines = request.cookies['blocked_engines'].split(',')
+ else:
+ self.blocked_engines = []
+ self.results = []
+ self.suggestions = []
+ self.request_data = {}
+
+ if request.cookies.get('language')\
+ and request.cookies['language'] in (x[0] for x in language_codes):
+ self.lang = request.cookies['language']
+
+ if request.method == 'POST':
+ self.request_data = request.form
+ else:
+ self.request_data = request.args
+
+ # TODO better exceptions
+ if not self.request_data.get('q'):
+ raise Exception('noquery')
+
+ self.query = self.request_data['q']
+
+ pageno_param = self.request_data.get('pageno', '1')
+ if not pageno_param.isdigit() or int(pageno_param) < 1:
+ raise Exception('wrong pagenumber')
+
+ self.pageno = int(pageno_param)
+
+ query_parts = self.query.split()
+ if query_parts[0].startswith('!'):
+ prefix = query_parts[0][1:].replace('_', ' ')
+ if prefix in engine_shortcuts\
+ and not engine_shortcuts[prefix] in self.blocked_engines:
+ self.engines.append({'category': 'none',
+ 'name': engine_shortcuts[prefix]})
+ elif prefix in engines\
+ and not prefix in self.blocked_engines:
+ self.engines.append({'category': 'none',
+ 'name': prefix})
+ elif prefix in categories:
+ self.engines.extend({'category': prefix,
+ 'name': engine.name}
+ for engine in categories[prefix]
+ if not engine in self.blocked_engines)
+
+ if len(query_engines):
+ self.query = self.query.replace(query_parts[0], '', 1).strip()
+
+ self.categories = []
+
+ if len(self.engines):
+ self.categories = list(set(engine['category']
+ for engine in self.engines))
+ else:
+ for pd_name, pd in self.request_data.items():
+ if pd_name.startswith('category_'):
+ category = pd_name[9:]
+ if not category in categories:
+ continue
+ self.categories.append(category)
+ if not len(self.categories):
+ cookie_categories = request.cookies.get('categories', '')
+ cookie_categories = cookie_categories.split(',')
+ for ccateg in cookie_categories:
+ if ccateg in categories:
+ self.categories.append(ccateg)
+ if not len(self.categories):
+ self.categories = ['general']
+
+ for categ in self.categories:
+ self.engines.extend({'category': categ,
+ 'name': x.name}
+ for x in categories[categ]
+ if not x.name in self.blocked_engines)