Browse Source

[enh] add autocompletion for searx-specific strings

Thomas Pointhuber 10 years ago
parent
commit
4e2dae30f0
3 changed files with 85 additions and 3 deletions
  1. 79
    0
      searx/autocomplete.py
  2. 1
    1
      searx/query.py
  3. 5
    2
      searx/webapp.py

+ 79
- 0
searx/autocomplete.py View File

20
 from requests import get
20
 from requests import get
21
 from json import loads
21
 from json import loads
22
 from urllib import urlencode
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):
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):
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
 def dbpedia(query):
104
 def dbpedia(query):

+ 1
- 1
searx/query.py View File

77
                     if lang == lang_id\
77
                     if lang == lang_id\
78
                        or lang_id.startswith(lang)\
78
                        or lang_id.startswith(lang)\
79
                        or lang == lang_name\
79
                        or lang == lang_name\
80
-                       or lang == country:
80
+                       or lang.replace('_', ' ') == country:
81
                         parse_next = True
81
                         parse_next = True
82
                         self.languages.append(lang)
82
                         self.languages.append(lang)
83
                         break
83
                         break

+ 5
- 2
searx/webapp.py View File

46
 from searx.https_rewrite import https_url_rewrite
46
 from searx.https_rewrite import https_url_rewrite
47
 from searx.search import Search
47
 from searx.search import Search
48
 from searx.query import Query
48
 from searx.query import Query
49
-from searx.autocomplete import backends as autocomplete_backends
49
+from searx.autocomplete import searx_bang, backends as autocomplete_backends
50
 from searx import logger
50
 from searx import logger
51
 
51
 
52
 
52
 
352
     if not completer:
352
     if not completer:
353
         return
353
         return
354
 
354
 
355
+    # parse searx specific autocompleter results like !bang
356
+    raw_results = searx_bang(query)
357
+
355
     # run autocompletion
358
     # run autocompletion
356
-    raw_results = completer(query.getSearchQuery())
359
+    raw_results.extend(completer(query.getSearchQuery()))
357
 
360
 
358
     # parse results (write :language and !engine back to result string)
361
     # parse results (write :language and !engine back to result string)
359
     results = []
362
     results = []