瀏覽代碼

Merge pull request #634 from kvch/advanced-search

support time range search
Adam Tauber 8 年之前
父節點
當前提交
7d9c898170

+ 2
- 1
searx/engines/__init__.py 查看文件

@@ -42,7 +42,8 @@ engine_default_args = {'paging': False,
42 42
                        'shortcut': '-',
43 43
                        'disabled': False,
44 44
                        'suspend_end_time': 0,
45
-                       'continuous_errors': 0}
45
+                       'continuous_errors': 0,
46
+                       'time_range_support': False}
46 47
 
47 48
 
48 49
 def load_module(filename):

+ 8
- 0
searx/engines/deviantart.py 查看文件

@@ -21,10 +21,16 @@ from searx.engines.xpath import extract_text
21 21
 # engine dependent config
22 22
 categories = ['images']
23 23
 paging = True
24
+time_range_support = True
24 25
 
25 26
 # search-url
26 27
 base_url = 'https://www.deviantart.com/'
27 28
 search_url = base_url + 'browse/all/?offset={offset}&{query}'
29
+time_range_url = '&order={range}'
30
+
31
+time_range_dict = {'day': 11,
32
+                   'week': 14,
33
+                   'month': 15}
28 34
 
29 35
 
30 36
 # do search-request
@@ -33,6 +39,8 @@ def request(query, params):
33 39
 
34 40
     params['url'] = search_url.format(offset=offset,
35 41
                                       query=urlencode({'q': query}))
42
+    if params['time_range']:
43
+        params['url'] += time_range_url.format(range=time_range_dict[params['time_range']])
36 44
 
37 45
     return params
38 46
 

+ 9
- 0
searx/engines/duckduckgo.py 查看文件

@@ -22,9 +22,15 @@ from searx.languages import language_codes
22 22
 categories = ['general']
23 23
 paging = True
24 24
 language_support = True
25
+time_range_support = True
25 26
 
26 27
 # search-url
27 28
 url = 'https://duckduckgo.com/html?{query}&s={offset}'
29
+time_range_url = '&df={range}'
30
+
31
+time_range_dict = {'day': 'd',
32
+                   'week': 'w',
33
+                   'month': 'm'}
28 34
 
29 35
 # specific xpath variables
30 36
 result_xpath = '//div[@class="result results_links results_links_deep web-result "]'  # noqa
@@ -61,6 +67,9 @@ def request(query, params):
61 67
         params['url'] = url.format(
62 68
             query=urlencode({'q': query}), offset=offset)
63 69
 
70
+    if params['time_range']:
71
+        params['url'] += time_range_url.format(range=time_range_dict[params['time_range']])
72
+
64 73
     return params
65 74
 
66 75
 

+ 8
- 0
searx/engines/google.py 查看文件

@@ -24,6 +24,7 @@ categories = ['general']
24 24
 paging = True
25 25
 language_support = True
26 26
 use_locale_domain = True
27
+time_range_support = True
27 28
 
28 29
 # based on https://en.wikipedia.org/wiki/List_of_Google_domains and tests
29 30
 default_hostname = 'www.google.com'
@@ -92,6 +93,11 @@ search_url = ('https://{hostname}' +
92 93
               search_path +
93 94
               '?{query}&start={offset}&gws_rd=cr&gbv=1&lr={lang}&ei=x')
94 95
 
96
+time_range_search = "&tbs=qdr:{range}"
97
+time_range_dict = {'day': 'd',
98
+                   'week': 'w',
99
+                   'month': 'm'}
100
+
95 101
 # other URLs
96 102
 map_hostname_start = 'maps.google.'
97 103
 maps_path = '/maps'
@@ -179,6 +185,8 @@ def request(query, params):
179 185
                                       query=urlencode({'q': query}),
180 186
                                       hostname=google_hostname,
181 187
                                       lang=url_lang)
188
+    if params['time_range']:
189
+        params['url'] += time_range_search.format(range=time_range_dict[params['time_range']])
182 190
 
183 191
     params['headers']['Accept-Language'] = language
184 192
     params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'

+ 7
- 0
searx/engines/google_images.py 查看文件

@@ -19,12 +19,17 @@ from lxml import html
19 19
 categories = ['images']
20 20
 paging = True
21 21
 safesearch = True
22
+time_range_support = True
22 23
 
23 24
 search_url = 'https://www.google.com/search'\
24 25
     '?{query}'\
25 26
     '&tbm=isch'\
26 27
     '&ijn=1'\
27 28
     '&start={offset}'
29
+time_range_search = "&tbs=qdr:{range}"
30
+time_range_dict = {'day': 'd',
31
+                   'week': 'w',
32
+                   'month': 'm'}
28 33
 
29 34
 
30 35
 # do search-request
@@ -34,6 +39,8 @@ def request(query, params):
34 39
     params['url'] = search_url.format(query=urlencode({'q': query}),
35 40
                                       offset=offset,
36 41
                                       safesearch=safesearch)
42
+    if params['time_range']:
43
+        params['url'] += time_range_search.format(range=time_range_dict[params['time_range']])
37 44
 
38 45
     if safesearch and params['safesearch']:
39 46
         params['url'] += '&' + urlencode({'safe': 'active'})

+ 26
- 8
searx/engines/yahoo.py 查看文件

@@ -20,10 +20,12 @@ from searx.engines.xpath import extract_text, extract_url
20 20
 categories = ['general']
21 21
 paging = True
22 22
 language_support = True
23
+time_range_support = True
23 24
 
24 25
 # search-url
25 26
 base_url = 'https://search.yahoo.com/'
26 27
 search_url = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}'
28
+search_url_with_time = 'search?{query}&b={offset}&fl=1&vl=lang_{lang}&age={age}&btf={btf}&fr2=time'
27 29
 
28 30
 # specific xpath variables
29 31
 results_xpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' Sr ')]"
@@ -32,6 +34,10 @@ title_xpath = './/h3/a'
32 34
 content_xpath = './/div[@class="compText aAbs"]'
33 35
 suggestion_xpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' AlsoTry ')]//a"
34 36
 
37
+time_range_dict = {'day': ['1d', 'd'],
38
+                   'week': ['1w', 'w'],
39
+                   'month': ['1m', 'm']}
40
+
35 41
 
36 42
 # remove yahoo-specific tracking-url
37 43
 def parse_url(url_string):
@@ -51,18 +57,30 @@ def parse_url(url_string):
51 57
         return unquote(url_string[start:end])
52 58
 
53 59
 
60
+def _get_url(query, offset, language, time_range):
61
+    if time_range:
62
+        return base_url + search_url_with_time.format(offset=offset,
63
+                                                      query=urlencode({'p': query}),
64
+                                                      lang=language,
65
+                                                      age=time_range_dict[time_range][0],
66
+                                                      btf=time_range_dict[time_range][1])
67
+    return base_url + search_url.format(offset=offset,
68
+                                        query=urlencode({'p': query}),
69
+                                        lang=language)
70
+
71
+
72
+def _get_language(params):
73
+    if params['language'] == 'all':
74
+        return 'en'
75
+    return params['language'].split('_')[0]
76
+
77
+
54 78
 # do search-request
55 79
 def request(query, params):
56 80
     offset = (params['pageno'] - 1) * 10 + 1
81
+    language = _get_language(params)
57 82
 
58
-    if params['language'] == 'all':
59
-        language = 'en'
60
-    else:
61
-        language = params['language'].split('_')[0]
62
-
63
-    params['url'] = base_url + search_url.format(offset=offset,
64
-                                                 query=urlencode({'p': query}),
65
-                                                 lang=language)
83
+    params['url'] = _get_url(query, offset, language, params['time_range'])
66 84
 
67 85
     # TODO required?
68 86
     params['cookies']['sB'] = 'fl=1&vl=lang_{lang}&sh=1&rw=new&v=1'\

+ 10
- 2
searx/search.py 查看文件

@@ -138,6 +138,8 @@ class Search(object):
138 138
         self.paging = False
139 139
         self.pageno = 1
140 140
         self.lang = 'all'
141
+        self.time_range = None
142
+        self.is_advanced = None
141 143
 
142 144
         # set blocked engines
143 145
         self.disabled_engines = request.preferences.engines.get_disabled()
@@ -178,9 +180,10 @@ class Search(object):
178 180
         if len(query_obj.languages):
179 181
             self.lang = query_obj.languages[-1]
180 182
 
181
-        self.engines = query_obj.engines
183
+        self.time_range = self.request_data.get('time_range')
184
+        self.is_advanced = self.request_data.get('advanced_search')
182 185
 
183
-        self.categories = []
186
+        self.engines = query_obj.engines
184 187
 
185 188
         # if engines are calculated from query,
186 189
         # set categories by using that informations
@@ -279,6 +282,9 @@ class Search(object):
279 282
             if self.lang != 'all' and not engine.language_support:
280 283
                 continue
281 284
 
285
+            if self.time_range and not engine.time_range_support:
286
+                continue
287
+
282 288
             # set default request parameters
283 289
             request_params = default_request_params()
284 290
             request_params['headers']['User-Agent'] = user_agent
@@ -293,6 +299,8 @@ class Search(object):
293 299
 
294 300
             # 0 = None, 1 = Moderate, 2 = Strict
295 301
             request_params['safesearch'] = request.preferences.get_value('safesearch')
302
+            request_params['time_range'] = self.time_range
303
+            request_params['advanced_search'] = self.is_advanced
296 304
 
297 305
             # update request parameters dependent on
298 306
             # search-engine (contained in engines folder)

+ 6
- 3
searx/static/plugins/js/search_on_category_select.js 查看文件

@@ -4,13 +4,16 @@ $(document).ready(function() {
4 4
             $('#categories input[type="checkbox"]').each(function(i, checkbox) {
5 5
                 $(checkbox).prop('checked', false);
6 6
             });
7
-            $('#categories label').removeClass('btn-primary').removeClass('active').addClass('btn-default');
8
-            $(this).removeClass('btn-default').addClass('btn-primary').addClass('active');
9
-            $($(this).children()[0]).prop('checked', 'checked');
7
+            $(document.getElementById($(this).attr("for"))).prop('checked', true);
10 8
             if($('#q').val()) {
11 9
                 $('#search_form').submit();
12 10
             }
13 11
             return false;
14 12
         });
13
+        $('#time-range > option').click(function(e) {
14
+            if($('#q').val()) {
15
+                $('#search_form').submit();
16
+            }
17
+        });
15 18
     }
16 19
 });

+ 1
- 1
searx/static/themes/oscar/css/logicodev.min.css
文件差異過大導致無法顯示
查看文件


+ 1
- 1
searx/static/themes/oscar/css/pointhi.min.css
文件差異過大導致無法顯示
查看文件


+ 68
- 0
searx/static/themes/oscar/less/logicodev/advanced.less 查看文件

@@ -0,0 +1,68 @@
1
+#advanced-search-container {
2
+    display:none;
3
+    text-align:left;
4
+    margin-bottom:1rem;
5
+
6
+    label, .input-group-addon {
7
+        font-size: 1.2rem;
8
+        font-weight:normal;
9
+        background-color: white;
10
+        border: @mild-gray 1px solid;
11
+        border-right: none;
12
+        color: @dark-gray;
13
+        padding-bottom: 0.4rem;
14
+        padding-top: 0.4rem;
15
+        padding-left: 0.5rem;
16
+        padding-right: 0.5rem;
17
+    }
18
+
19
+    label:last-child, .input-group-addon:last-child {
20
+        border-right: @mild-gray 1px solid;
21
+    }
22
+
23
+    input[type="radio"] {
24
+        display: none;
25
+    }
26
+
27
+    input[type="radio"]:checked + label{
28
+        color: @black;
29
+        font-weight:bold;
30
+        border-bottom: @light-green 5px solid;
31
+    }
32
+    select {
33
+        appearance: none;
34
+        -webkit-appearance: none;
35
+        -moz-appearance: none;
36
+        font-size: 1.2rem;
37
+        font-weight:normal;
38
+        background-color: white;
39
+        border: @mild-gray 1px solid;
40
+        color: @dark-gray;
41
+        padding-bottom: 0.4rem;
42
+        padding-top: 0.4rem;
43
+        padding-left: 1rem;
44
+        padding-right: 5rem;
45
+        margin-right: 0.5rem;
46
+        background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
47
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZ
48
+cwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGn
49
+sAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW8
50
+6/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0
51
+ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0w
52
+Ny0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb
53
+7jwaAAAAAElFTkSuQmCC) 96% no-repeat;
54
+    }
55
+}
56
+
57
+#check-advanced {
58
+    display: none;
59
+}
60
+
61
+#check-advanced:checked ~ #advanced-search-container {
62
+    display:block;
63
+}
64
+
65
+.advanced {
66
+    margin-top:1rem;
67
+    text-align:right;
68
+}

+ 2
- 0
searx/static/themes/oscar/less/logicodev/oscar.less 查看文件

@@ -12,6 +12,8 @@
12 12
 
13 13
 @import "search.less";
14 14
 
15
+@import "advanced.less";
16
+
15 17
 @import "cursor.less";
16 18
 
17 19
 @import "code.less";

+ 18
- 26
searx/static/themes/oscar/less/logicodev/search.less 查看文件

@@ -1,36 +1,28 @@
1 1
 .search_categories, #categories {
2
-  margin: 10px 0 4px 0;
3 2
   text-transform: capitalize;
4
-  
5
-  label{
6
-    border: none;
7
-    box-shadow: none;
8
-    font-size: 13px;
9
-    padding-bottom: 2px;
10
-    color: @gray;
11
-    margin-bottom: 5px;
12
-
13
-    &:hover{
14
-        color: @black;
15
-        background-color: transparent;
16
-    }
3
+  margin-bottom: 0.5rem;
17 4
 
18
-      &:active{
19
-        box-shadow: none;
20
-      }
5
+  label, .input-group-addon {
6
+    font-size: 1.2rem;
7
+    font-weight:normal;
8
+    background-color: white;
9
+    border: @mild-gray 1px solid;
10
+    border-right: none;
11
+    color: @dark-gray;
12
+    padding-bottom: 0.4rem;
13
+    padding-top: 0.4rem;
14
+    padding-left: 0.5rem;
15
+    padding-right: 0.5rem;
16
+  }
17
+  label:last-child, .input-group-addon:last-child {
18
+      border-right: @mild-gray 1px solid;
21 19
   }
22 20
 
23
-  .active, .btn-primary{
21
+  input[type="checkbox"]:checked + label {
24 22
     color: @black;
25
-    font-weight: 700;
26
-    border-bottom: 5px solid @light-green;
27
-    background-color: transparent;
23
+    font-weight:bold;
24
+    border-bottom: @light-green 5px solid;
28 25
   }
29
-
30
-}
31
-
32
-#categories{
33
-    margin: 0;
34 26
 }
35 27
 
36 28
 #main-logo{

+ 2
- 0
searx/static/themes/oscar/less/logicodev/variables.less 查看文件

@@ -2,6 +2,8 @@
2 2
 @gray: #A4A4A4;
3 3
 @dim-gray: #F6F9FA;
4 4
 @dark-gray: #666;
5
+@middle-gray: #F5F5F5;
6
+@mild-gray: #DDD;
5 7
 @blue: #0088CC; 
6 8
 @red: #F35E77;
7 9
 @violet: #684898;

+ 45
- 0
searx/static/themes/oscar/less/pointhi/advanced.less 查看文件

@@ -0,0 +1,45 @@
1
+#advanced-search-container {
2
+    display:none;
3
+    text-align:center;
4
+    margin-bottom:1rem;
5
+
6
+    label, .input-group-addon {
7
+        font-size: 1.3rem;
8
+        font-weight:normal;
9
+        background-color: white;
10
+        border: #DDD 1px solid;
11
+        border-right: none;
12
+        color: #333;
13
+        padding-bottom: 0.8rem;
14
+        padding-top: 0.8rem;
15
+        padding-left: 1.2rem;
16
+        padding-right: 1.2rem;
17
+    }
18
+
19
+    label:last-child, .input-group-addon:last-child {
20
+        border-right: #DDD 1px solid;
21
+    }
22
+    
23
+    input[type="radio"] {
24
+        display: none;
25
+    }
26
+    
27
+    input[type="radio"]:checked + label{
28
+        color: black;
29
+        font-weight:bold;
30
+        background-color: #EEE;
31
+    }
32
+}
33
+
34
+#check-advanced {
35
+    display: none;
36
+}
37
+
38
+#check-advanced:checked ~ #advanced-search-container {
39
+    display:block;
40
+}
41
+
42
+.advanced {
43
+    margin-top:1rem;
44
+    text-align:right;
45
+}

+ 2
- 0
searx/static/themes/oscar/less/pointhi/oscar.less 查看文件

@@ -8,6 +8,8 @@
8 8
 
9 9
 @import "search.less";
10 10
 
11
+@import "advanced.less";
12
+
11 13
 @import "cursor.less";
12 14
 
13 15
 @import "code.less";

+ 27
- 3
searx/static/themes/oscar/less/pointhi/search.less 查看文件

@@ -1,4 +1,28 @@
1
-.search_categories {
2
-  margin:10px 0;
3
-  text-transform: capitalize;
1
+.search_categories, #categories {
2
+    text-transform: capitalize;
3
+    margin-bottom:1.5rem;
4
+    margin-top:1.5rem;
5
+
6
+    label, .input-group-addon {
7
+        font-size: 1.3rem;
8
+        font-weight:normal;
9
+        background-color: white;
10
+        border: #DDD 1px solid;
11
+        border-right: none;
12
+        color: #333;
13
+        padding-bottom: 0.8rem;
14
+        padding-top: 0.8rem;
15
+        padding-left: 1.2rem;
16
+        padding-right: 1.2rem;
17
+    }
18
+
19
+    label:last-child, .input-group-addon:last-child {
20
+        border-right: #DDD 1px solid;
21
+    }
22
+
23
+    input[type="checkbox"]:checked + label{
24
+        color: black;
25
+        font-weight:bold;
26
+        background-color: #EEE;
27
+    }
4 28
 }

+ 11
- 0
searx/templates/oscar/advanced.html 查看文件

@@ -0,0 +1,11 @@
1
+<div class="input-group col-sm-12 advanced">
2
+    <input type="checkbox" name="advanced_search" id="check-advanced" {% if advanced_search %} checked="checked"{% endif %}>
3
+    <label for="check-advanced">
4
+        <span class="glyphicon glyphicon-cog"></span>
5
+        {{ _('Advanced settings') }}
6
+    </label>
7
+    <div id="advanced-search-container">
8
+        {% include 'oscar/categories.html' %}
9
+        {% include 'oscar/time-range.html' %}
10
+    </div>
11
+</div>

+ 10
- 38
searx/templates/oscar/categories.html 查看文件

@@ -1,42 +1,14 @@
1
-<!-- used if scripts are disabled -->
2
-<noscript>
3
-<div id="categories" class="btn-group btn-toggle">
1
+<div id="categories">
4 2
 {% if rtl %}
5
-{% for category in categories | reverse %}
6
-    <!--<div class="checkbox">-->
7
-        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}_nojs" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
8
-        <label class="btn btn-sm btn-primary active label_hide_if_not_checked" for="checkbox_{{ category|replace(' ', '_') }}_nojs">{{ _(category) }}</label>
9
-        <label class="btn btn-sm btn-default label_hide_if_checked" for="checkbox_{{ category|replace(' ', '_') }}_nojs">{{ _(category) }}</label>
10
-    <!--</div>-->
11
-    {% if category in selected_categories %}<input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}_dis_activation" name="category_{{ category }}" value="off" checked="checked"/>{% endif %}
12
-{% endfor %}
3
+    {% for category in categories | reverse %}
4
+        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
5
+        <label class="input-group-addon" for="checkbox_{{ category|replace(' ', '_') }}">{{ _(category) }}</label>
6
+        </label>
7
+    {% endfor %}
13 8
 {% else %}
14
-{% for category in categories %}
15
-    <!--<div class="checkbox">-->
16
-        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}_nojs" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
17
-        <label class="btn btn-sm btn-primary active label_hide_if_not_checked" for="checkbox_{{ category|replace(' ', '_') }}_nojs">{{ _(category) }}</label>
18
-        <label class="btn btn-sm btn-default label_hide_if_checked" for="checkbox_{{ category|replace(' ', '_') }}_nojs">{{ _(category) }}</label>
19
-    <!--</div>-->
20
-    {% if category in selected_categories %}<input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}_dis_activation" name="category_{{ category }}" value="off" checked="checked"/>{% endif %}
21
-{% endfor %}
9
+    {% for category in categories %}
10
+        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
11
+        <label class="input-group-addon" for="checkbox_{{ category|replace(' ', '_') }}">{{ _(category) }}</label>
12
+    {% endfor %}
22 13
 {% endif %}
23 14
 </div>
24
-</noscript>
25
-
26
-<div id="categories" class="btn-group btn-toggle hide_if_nojs" data-toggle="buttons">
27
-{% if rtl %}
28
-{% for category in categories | reverse %}
29
-	<label class="btn btn-sm {% if category in selected_categories %}btn-primary active{% else %}btn-default{% endif %}" data-btn-class="primary">
30
-        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />{{ _(category) }}
31
-    </label>
32
-{% endfor %}
33
-{% else %}
34
-{% for category in categories %}
35
-    <label class="btn btn-sm {% if category in selected_categories %}btn-primary active{% else %}btn-default{% endif %}" data-btn-class="primary">
36
-        <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />{{ _(category) }}
37
-    </label>
38
-{% endfor %}
39
-{% endif %}
40
-</div>
41
-
42
-

+ 1
- 1
searx/templates/oscar/preferences.html 查看文件

@@ -36,7 +36,7 @@
36 36
                         <label class="col-sm-3 col-md-2">{{ _('Default categories') }}</label>
37 37
                         {% else %}
38 38
                         <label class="col-sm-3 col-md-2">{{ _('Default categories') }}</label>
39
-                        <div class="col-sm-11 col-md-10">
39
+                        <div class="col-sm-11 col-md-10 search-categories">
40 40
                             {% include 'oscar/categories.html' %}
41 41
                         </div>
42 42
                         {% endif %}

+ 7
- 2
searx/templates/oscar/results.html 查看文件

@@ -1,6 +1,6 @@
1 1
 {% extends "oscar/base.html" %}
2 2
 {% block title %}{{ q }} - {% endblock %}
3
-{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;format=rss&amp;{% for category in selected_categories %}category_{{ category }}=1&amp;{% endfor %}pageno={{ pageno }}">{% endblock %}
3
+{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;format=rss&amp;{% for category in selected_categories %}category_{{ category }}=1&amp;{% endfor %}pageno={{ pageno }}&amp;time_range={{ time_range }}">{% endblock %}
4 4
 {% block content %}
5 5
     <div class="row">
6 6
         <div class="col-sm-8" id="main_results">
@@ -41,6 +41,7 @@
41 41
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
42 42
                         <input type="hidden" name="q" value="{{ q }}" />
43 43
                         <input type="hidden" name="pageno" value="{{ pageno+1 }}" />
44
+                        <input type="hidden" name="time_range" value="{{ time_range }}" />
44 45
                         <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-backward"></span> {{ _('next page') }}</button>
45 46
                     </form>
46 47
                 </div>
@@ -48,6 +49,7 @@
48 49
                     <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}"  class="pull-left">
49 50
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
50 51
                         <input type="hidden" name="pageno" value="{{ pageno-1 }}" />
52
+                        <input type="hidden" name="time_range" value="{{ time_range }}" />
51 53
                         <button type="submit" class="btn btn-default" {% if pageno == 1 %}disabled{% endif %}><span class="glyphicon glyphicon-forward"></span> {{ _('previous page') }}</button>
52 54
                     </form>
53 55
                 </div>
@@ -60,6 +62,7 @@
60 62
                         <input type="hidden" name="q" value="{{ q }}" />
61 63
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
62 64
                         <input type="hidden" name="pageno" value="{{ pageno-1 }}" />
65
+                        <input type="hidden" name="time_range" value="{{ time_range }}" />
63 66
                         <button type="submit" class="btn btn-default" {% if pageno == 1 %}disabled{% endif %}><span class="glyphicon glyphicon-backward"></span> {{ _('previous page') }}</button>
64 67
                     </form>
65 68
                 </div>
@@ -68,6 +71,7 @@
68 71
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
69 72
                         <input type="hidden" name="q" value="{{ q }}" />
70 73
                         <input type="hidden" name="pageno" value="{{ pageno+1 }}" />
74
+                        <input type="hidden" name="time_range" value="{{ time_range }}" />
71 75
                         <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-forward"></span> {{ _('next page') }}</button>
72 76
                     </form>
73 77
                 </div>
@@ -118,7 +122,7 @@
118 122
                     <form role="form">
119 123
                         <div class="form-group">
120 124
                             <label for="search_url">{{ _('Search URL') }}</label>
121
-                            <input id="search_url" type="url" class="form-control select-all-on-click cursor-text" name="search_url" value="{{ base_url }}?q={{ q|urlencode }}{% if selected_categories %}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}{% if pageno > 1 %}&amp;pageno={{ pageno }}{% endif %}" readonly>
125
+                            <input id="search_url" type="url" class="form-control select-all-on-click cursor-text" name="search_url" value="{{ base_url }}?q={{ q|urlencode }}{% if selected_categories %}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}{% if pageno > 1 %}&amp;pageno={{ pageno }}{% endif %}{% if time_range %}&amp;time_range={{ time_range }}{% endif %}" readonly>
122 126
                         </div>
123 127
                     </form>
124 128
 
@@ -130,6 +134,7 @@
130 134
                         <input type="hidden" name="format" value="{{ output_type }}">
131 135
                         {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1">{% endfor %}
132 136
                         <input type="hidden" name="pageno" value="{{ pageno }}">
137
+                        <input type="hidden" name="time_range" value="{{ time_range }}" />
133 138
                         <button type="submit" class="btn btn-default">{{ output_type }}</button>
134 139
                     </form>
135 140
                     {% endfor %}

+ 1
- 3
searx/templates/oscar/search.html 查看文件

@@ -6,7 +6,5 @@
6 6
             <button type="submit" class="btn btn-default"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="hidden active_if_nojs">{{ _('Start search') }}</span></button>
7 7
         </span>
8 8
     </div>
9
-    <div class="search_categories">
10
-            {% include 'oscar/categories.html' %}
11
-    </div><!-- / #search_categories -->
9
+    {% include 'oscar/advanced.html' %}
12 10
 </form><!-- / #search_form_full -->

+ 3
- 6
searx/templates/oscar/search_full.html 查看文件

@@ -11,11 +11,8 @@
11 11
             <button type="submit" class="btn btn-default input-lg"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="hidden active_if_nojs">{{ _('Start search') }}</span></button>
12 12
         </span>
13 13
     </div>
14
+    <div class="input-group col-md-8 col-md-offset-2">
15
+        {% include 'oscar/advanced.html' %}
16
+    </div>
14 17
 
15
-    <button type="button" class="btn btn-link btn-collapse center-block collapsed hide_if_nojs" data-toggle="collapse" data-target="#search_categories" data-btn-text-collapsed="{{ _('Show search filters') }}" data-btn-text-not-collapsed="{{ _('Hide search filters') }}">{{ _('Show search filters') }}</button>
16
-    <div class="row collapse active_if_nojs margin_top_if_nojs" id="search_categories">
17
-        <div class="col-md-12 text-center">
18
-            {% include 'oscar/categories.html' %}
19
-        </div>
20
-    </div><!-- / #search_categories -->
21 18
 </form><!-- / #search_form_full -->

+ 14
- 0
searx/templates/oscar/time-range.html 查看文件

@@ -0,0 +1,14 @@
1
+<select name="time_range" id="time-range">
2
+    <option id="time-range-anytime" value="" {{ "selected" if time_range=="" or not time_range  else ""}}>
3
+        {{ _('Anytime') }}
4
+    </option>
5
+    <option id="time-range-day" value="day" {{ "selected" if time_range=="day" else ""}}>
6
+        {{ _('Last day') }}
7
+    </option>
8
+    <option id="time-range-week" value="week" {{ "selected" if time_range=="week" else ""}}>
9
+        {{ _('Last week') }}
10
+    </option>
11
+    <option id="time-range-month" value="month" {{ "selected" if time_range=="month" else ""}}>
12
+        {{ _('Last month') }}
13
+    </option>
14
+</select>

+ 2
- 0
searx/webapp.py 查看文件

@@ -459,6 +459,8 @@ def index():
459 459
         paging=search.paging,
460 460
         number_of_results=format_decimal(number_of_results),
461 461
         pageno=search.pageno,
462
+        advanced_search=search.is_advanced,
463
+        time_range=search.time_range,
462 464
         base_url=get_base_url(),
463 465
         suggestions=search.result_container.suggestions,
464 466
         answers=search.result_container.answers,