Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
searx-engine
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gargantext
searx-engine
Commits
12f42d15
Unverified
Commit
12f42d15
authored
Oct 16, 2019
by
Adam Tauber
Committed by
GitHub
Oct 16, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1700 from kvch/intro-offline-engines
Initialize support for offline engines
parents
2946c5f1
5796dc60
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
227 additions
and
61 deletions
+227
-61
__init__.py
searx/engines/__init__.py
+15
-12
soundcloud.py
searx/engines/soundcloud.py
+1
-1
wolframalpha_noapi.py
searx/engines/wolframalpha_noapi.py
+1
-1
https_rewrite.py
searx/plugins/https_rewrite.py
+3
-0
oa_doi_rewrite.py
searx/plugins/oa_doi_rewrite.py
+3
-0
tracker_url_remover.py
searx/plugins/tracker_url_remover.py
+3
-0
results.py
searx/results.py
+45
-29
search.py
searx/search.py
+61
-13
style.css
searx/static/themes/courgette/css/style.css
+1
-1
style.less
searx/static/themes/courgette/less/style.less
+4
-0
style.css
searx/static/themes/legacy/css/style.css
+1
-1
style.less
searx/static/themes/legacy/less/style.less
+4
-0
key-value.html
searx/templates/courgette/result_templates/key-value.html
+13
-0
key-value.html
searx/templates/legacy/result_templates/key-value.html
+13
-0
macros.html
searx/templates/oscar/macros.html
+9
-1
key-value.html
searx/templates/oscar/result_templates/key-value.html
+19
-0
key-value.html
searx/templates/simple/result_templates/key-value.html
+11
-0
utils.py
searx/utils.py
+15
-0
webapp.py
searx/webapp.py
+5
-2
No files found.
searx/engines/__init__.py
View file @
12f42d15
...
@@ -27,7 +27,7 @@ from json import loads
...
@@ -27,7 +27,7 @@ from json import loads
from
requests
import
get
from
requests
import
get
from
searx
import
settings
from
searx
import
settings
from
searx
import
logger
from
searx
import
logger
from
searx.utils
import
load_module
,
match_language
from
searx.utils
import
load_module
,
match_language
,
get_engine_from_settings
logger
=
logger
.
getChild
(
'engines'
)
logger
=
logger
.
getChild
(
'engines'
)
...
@@ -53,7 +53,8 @@ engine_default_args = {'paging': False,
...
@@ -53,7 +53,8 @@ engine_default_args = {'paging': False,
'disabled'
:
False
,
'disabled'
:
False
,
'suspend_end_time'
:
0
,
'suspend_end_time'
:
0
,
'continuous_errors'
:
0
,
'continuous_errors'
:
0
,
'time_range_support'
:
False
}
'time_range_support'
:
False
,
'offline'
:
False
}
def
load_engine
(
engine_data
):
def
load_engine
(
engine_data
):
...
@@ -128,14 +129,16 @@ def load_engine(engine_data):
...
@@ -128,14 +129,16 @@ def load_engine(engine_data):
engine
.
stats
=
{
engine
.
stats
=
{
'result_count'
:
0
,
'result_count'
:
0
,
'search_count'
:
0
,
'search_count'
:
0
,
'page_load_time'
:
0
,
'page_load_count'
:
0
,
'engine_time'
:
0
,
'engine_time'
:
0
,
'engine_time_count'
:
0
,
'engine_time_count'
:
0
,
'score_count'
:
0
,
'score_count'
:
0
,
'errors'
:
0
'errors'
:
0
}
}
if
not
engine
.
offline
:
engine
.
stats
[
'page_load_time'
]
=
0
engine
.
stats
[
'page_load_count'
]
=
0
for
category_name
in
engine
.
categories
:
for
category_name
in
engine
.
categories
:
categories
.
setdefault
(
category_name
,
[])
.
append
(
engine
)
categories
.
setdefault
(
category_name
,
[])
.
append
(
engine
)
...
@@ -173,11 +176,6 @@ def get_engines_stats():
...
@@ -173,11 +176,6 @@ def get_engines_stats():
results_num
=
\
results_num
=
\
engine
.
stats
[
'result_count'
]
/
float
(
engine
.
stats
[
'search_count'
])
engine
.
stats
[
'result_count'
]
/
float
(
engine
.
stats
[
'search_count'
])
if
engine
.
stats
[
'page_load_count'
]
!=
0
:
load_times
=
engine
.
stats
[
'page_load_time'
]
/
float
(
engine
.
stats
[
'page_load_count'
])
# noqa
else
:
load_times
=
0
if
engine
.
stats
[
'engine_time_count'
]
!=
0
:
if
engine
.
stats
[
'engine_time_count'
]
!=
0
:
this_engine_time
=
engine
.
stats
[
'engine_time'
]
/
float
(
engine
.
stats
[
'engine_time_count'
])
# noqa
this_engine_time
=
engine
.
stats
[
'engine_time'
]
/
float
(
engine
.
stats
[
'engine_time_count'
])
# noqa
else
:
else
:
...
@@ -189,14 +187,19 @@ def get_engines_stats():
...
@@ -189,14 +187,19 @@ def get_engines_stats():
else
:
else
:
score
=
score_per_result
=
0.0
score
=
score_per_result
=
0.0
max_pageload
=
max
(
load_times
,
max_pageload
)
if
not
engine
.
offline
:
load_times
=
0
if
engine
.
stats
[
'page_load_count'
]
!=
0
:
load_times
=
engine
.
stats
[
'page_load_time'
]
/
float
(
engine
.
stats
[
'page_load_count'
])
# noqa
max_pageload
=
max
(
load_times
,
max_pageload
)
pageloads
.
append
({
'avg'
:
load_times
,
'name'
:
engine
.
name
})
max_engine_times
=
max
(
this_engine_time
,
max_engine_times
)
max_engine_times
=
max
(
this_engine_time
,
max_engine_times
)
max_results
=
max
(
results_num
,
max_results
)
max_results
=
max
(
results_num
,
max_results
)
max_score
=
max
(
score
,
max_score
)
max_score
=
max
(
score
,
max_score
)
max_score_per_result
=
max
(
score_per_result
,
max_score_per_result
)
max_score_per_result
=
max
(
score_per_result
,
max_score_per_result
)
max_errors
=
max
(
max_errors
,
engine
.
stats
[
'errors'
])
max_errors
=
max
(
max_errors
,
engine
.
stats
[
'errors'
])
pageloads
.
append
({
'avg'
:
load_times
,
'name'
:
engine
.
name
})
engine_times
.
append
({
'avg'
:
this_engine_time
,
'name'
:
engine
.
name
})
engine_times
.
append
({
'avg'
:
this_engine_time
,
'name'
:
engine
.
name
})
results
.
append
({
'avg'
:
results_num
,
'name'
:
engine
.
name
})
results
.
append
({
'avg'
:
results_num
,
'name'
:
engine
.
name
})
scores
.
append
({
'avg'
:
score
,
'name'
:
engine
.
name
})
scores
.
append
({
'avg'
:
score
,
'name'
:
engine
.
name
})
...
@@ -255,7 +258,7 @@ def initialize_engines(engine_list):
...
@@ -255,7 +258,7 @@ def initialize_engines(engine_list):
load_engines
(
engine_list
)
load_engines
(
engine_list
)
def
engine_init
(
engine_name
,
init_fn
):
def
engine_init
(
engine_name
,
init_fn
):
init_fn
()
init_fn
(
get_engine_from_settings
(
engine_name
)
)
logger
.
debug
(
'
%
s engine: Initialized'
,
engine_name
)
logger
.
debug
(
'
%
s engine: Initialized'
,
engine_name
)
for
engine_name
,
engine
in
engines
.
items
():
for
engine_name
,
engine
in
engines
.
items
():
...
...
searx/engines/soundcloud.py
View file @
12f42d15
...
@@ -66,7 +66,7 @@ def get_client_id():
...
@@ -66,7 +66,7 @@ def get_client_id():
return
""
return
""
def
init
():
def
init
(
engine_settings
=
None
):
global
guest_client_id
global
guest_client_id
# api-key
# api-key
guest_client_id
=
get_client_id
()
guest_client_id
=
get_client_id
()
...
...
searx/engines/wolframalpha_noapi.py
View file @
12f42d15
...
@@ -55,7 +55,7 @@ def obtain_token():
...
@@ -55,7 +55,7 @@ def obtain_token():
return
token
return
token
def
init
():
def
init
(
engine_settings
=
None
):
obtain_token
()
obtain_token
()
...
...
searx/plugins/https_rewrite.py
View file @
12f42d15
...
@@ -225,6 +225,9 @@ def https_url_rewrite(result):
...
@@ -225,6 +225,9 @@ def https_url_rewrite(result):
def
on_result
(
request
,
search
,
result
):
def
on_result
(
request
,
search
,
result
):
if
'parsed_url'
not
in
result
:
return
True
if
result
[
'parsed_url'
]
.
scheme
==
'http'
:
if
result
[
'parsed_url'
]
.
scheme
==
'http'
:
https_url_rewrite
(
result
)
https_url_rewrite
(
result
)
return
True
return
True
...
...
searx/plugins/oa_doi_rewrite.py
View file @
12f42d15
...
@@ -35,6 +35,9 @@ def get_doi_resolver(args, preference_doi_resolver):
...
@@ -35,6 +35,9 @@ def get_doi_resolver(args, preference_doi_resolver):
def
on_result
(
request
,
search
,
result
):
def
on_result
(
request
,
search
,
result
):
if
'parsed_url'
not
in
result
:
return
True
doi
=
extract_doi
(
result
[
'parsed_url'
])
doi
=
extract_doi
(
result
[
'parsed_url'
])
if
doi
and
len
(
doi
)
<
50
:
if
doi
and
len
(
doi
)
<
50
:
for
suffix
in
(
'/'
,
'.pdf'
,
'/full'
,
'/meta'
,
'/abstract'
):
for
suffix
in
(
'/'
,
'.pdf'
,
'/full'
,
'/meta'
,
'/abstract'
):
...
...
searx/plugins/tracker_url_remover.py
View file @
12f42d15
...
@@ -30,6 +30,9 @@ preference_section = 'privacy'
...
@@ -30,6 +30,9 @@ preference_section = 'privacy'
def
on_result
(
request
,
search
,
result
):
def
on_result
(
request
,
search
,
result
):
if
'parsed_url'
not
in
result
:
return
True
query
=
result
[
'parsed_url'
]
.
query
query
=
result
[
'parsed_url'
]
.
query
if
query
==
""
:
if
query
==
""
:
...
...
searx/results.py
View file @
12f42d15
...
@@ -197,6 +197,13 @@ class ResultContainer(object):
...
@@ -197,6 +197,13 @@ class ResultContainer(object):
self
.
infoboxes
.
append
(
infobox
)
self
.
infoboxes
.
append
(
infobox
)
def
_merge_result
(
self
,
result
,
position
):
def
_merge_result
(
self
,
result
,
position
):
if
'url'
in
result
:
self
.
__merge_url_result
(
result
,
position
)
return
self
.
__merge_result_no_url
(
result
,
position
)
def
__merge_url_result
(
self
,
result
,
position
):
result
[
'parsed_url'
]
=
urlparse
(
result
[
'url'
])
result
[
'parsed_url'
]
=
urlparse
(
result
[
'url'
])
# if the result has no scheme, use http as default
# if the result has no scheme, use http as default
...
@@ -210,51 +217,60 @@ class ResultContainer(object):
...
@@ -210,51 +217,60 @@ class ResultContainer(object):
if
result
.
get
(
'content'
):
if
result
.
get
(
'content'
):
result
[
'content'
]
=
WHITESPACE_REGEX
.
sub
(
' '
,
result
[
'content'
])
result
[
'content'
]
=
WHITESPACE_REGEX
.
sub
(
' '
,
result
[
'content'
])
# check for duplicates
duplicated
=
self
.
__find_duplicated_http_result
(
result
)
duplicated
=
False
if
duplicated
:
self
.
__merge_duplicated_http_result
(
duplicated
,
result
,
position
)
return
# if there is no duplicate found, append result
result
[
'positions'
]
=
[
position
]
with
RLock
():
self
.
_merged_results
.
append
(
result
)
def
__find_duplicated_http_result
(
self
,
result
):
result_template
=
result
.
get
(
'template'
)
result_template
=
result
.
get
(
'template'
)
for
merged_result
in
self
.
_merged_results
:
for
merged_result
in
self
.
_merged_results
:
if
'parsed_url'
not
in
merged_result
:
continue
if
compare_urls
(
result
[
'parsed_url'
],
merged_result
[
'parsed_url'
])
\
if
compare_urls
(
result
[
'parsed_url'
],
merged_result
[
'parsed_url'
])
\
and
result_template
==
merged_result
.
get
(
'template'
):
and
result_template
==
merged_result
.
get
(
'template'
):
if
result_template
!=
'images.html'
:
if
result_template
!=
'images.html'
:
# not an image, same template, same url : it's a duplicate
# not an image, same template, same url : it's a duplicate
duplicated
=
merged_result
return
merged_result
break
else
:
else
:
# it's an image
# it's an image
# it's a duplicate if the parsed_url, template and img_src are differents
# it's a duplicate if the parsed_url, template and img_src are differents
if
result
.
get
(
'img_src'
,
''
)
==
merged_result
.
get
(
'img_src'
,
''
):
if
result
.
get
(
'img_src'
,
''
)
==
merged_result
.
get
(
'img_src'
,
''
):
duplicated
=
merged_result
return
merged_result
break
return
None
# merge duplicates together
def
__merge_duplicated_http_result
(
self
,
duplicated
,
result
,
position
):
if
duplicated
:
# using content with more text
# using content with more text
if
result_content_len
(
result
.
get
(
'content'
,
''
))
>
\
if
result_content_len
(
result
.
get
(
'content'
,
''
))
>
\
result_content_len
(
duplicated
.
get
(
'content'
,
''
)):
result_content_len
(
duplicated
.
get
(
'content'
,
''
)):
duplicated
[
'content'
]
=
result
[
'content'
]
duplicated
[
'content'
]
=
result
[
'content'
]
# merge all result's parameters not found in duplicate
# merge all result's parameters not found in duplicate
for
key
in
result
.
keys
():
for
key
in
result
.
keys
():
if
not
duplicated
.
get
(
key
):
if
not
duplicated
.
get
(
key
):
duplicated
[
key
]
=
result
.
get
(
key
)
duplicated
[
key
]
=
result
.
get
(
key
)
# add the new position
# add the new position
duplicated
[
'positions'
]
.
append
(
position
)
duplicated
[
'positions'
]
.
append
(
position
)
# add engine to list of result-engines
# add engine to list of result-engines
duplicated
[
'engines'
]
.
add
(
result
[
'engine'
])
duplicated
[
'engines'
]
.
add
(
result
[
'engine'
])
# using https if possible
# using https if possible
if
duplicated
[
'parsed_url'
]
.
scheme
!=
'https'
and
result
[
'parsed_url'
]
.
scheme
==
'https'
:
if
duplicated
[
'parsed_url'
]
.
scheme
!=
'https'
and
result
[
'parsed_url'
]
.
scheme
==
'https'
:
duplicated
[
'url'
]
=
result
[
'parsed_url'
]
.
geturl
()
duplicated
[
'url'
]
=
result
[
'parsed_url'
]
.
geturl
()
duplicated
[
'parsed_url'
]
=
result
[
'parsed_url'
]
duplicated
[
'parsed_url'
]
=
result
[
'parsed_url'
]
# if there is no duplicate found, append result
def
__merge_result_no_url
(
self
,
result
,
position
):
else
:
result
[
'engines'
]
=
set
([
result
[
'engine'
]])
result
[
'positions'
]
=
[
position
]
result
[
'positions'
]
=
[
position
]
with
RLock
():
with
RLock
():
self
.
_merged_results
.
append
(
result
)
self
.
_merged_results
.
append
(
result
)
def
order_results
(
self
):
def
order_results
(
self
):
for
result
in
self
.
_merged_results
:
for
result
in
self
.
_merged_results
:
...
...
searx/search.py
View file @
12f42d15
...
@@ -77,7 +77,7 @@ def send_http_request(engine, request_params):
...
@@ -77,7 +77,7 @@ def send_http_request(engine, request_params):
return
req
(
request_params
[
'url'
],
**
request_args
)
return
req
(
request_params
[
'url'
],
**
request_args
)
def
search_one_request
(
engine
,
query
,
request_params
):
def
search_one_
http_
request
(
engine
,
query
,
request_params
):
# update request parameters dependent on
# update request parameters dependent on
# search-engine (contained in engines folder)
# search-engine (contained in engines folder)
engine
.
request
(
query
,
request_params
)
engine
.
request
(
query
,
request_params
)
...
@@ -97,7 +97,53 @@ def search_one_request(engine, query, request_params):
...
@@ -97,7 +97,53 @@ def search_one_request(engine, query, request_params):
return
engine
.
response
(
response
)
return
engine
.
response
(
response
)
def
search_one_offline_request
(
engine
,
query
,
request_params
):
return
engine
.
search
(
query
,
request_params
)
def
search_one_request_safe
(
engine_name
,
query
,
request_params
,
result_container
,
start_time
,
timeout_limit
):
def
search_one_request_safe
(
engine_name
,
query
,
request_params
,
result_container
,
start_time
,
timeout_limit
):
if
engines
[
engine_name
]
.
offline
:
return
search_one_offline_request_safe
(
engine_name
,
query
,
request_params
,
result_container
,
start_time
,
timeout_limit
)
# noqa
return
search_one_http_request_safe
(
engine_name
,
query
,
request_params
,
result_container
,
start_time
,
timeout_limit
)
def
search_one_offline_request_safe
(
engine_name
,
query
,
request_params
,
result_container
,
start_time
,
timeout_limit
):
engine
=
engines
[
engine_name
]
try
:
search_results
=
search_one_offline_request
(
engine
,
query
,
request_params
)
if
search_results
:
result_container
.
extend
(
engine_name
,
search_results
)
engine_time
=
time
()
-
start_time
result_container
.
add_timing
(
engine_name
,
engine_time
,
engine_time
)
with
threading
.
RLock
():
engine
.
stats
[
'engine_time'
]
+=
engine_time
engine
.
stats
[
'engine_time_count'
]
+=
1
except
ValueError
as
e
:
record_offline_engine_stats_on_error
(
engine
,
result_container
,
start_time
)
logger
.
exception
(
'engine {0} : invalid input : {1}'
.
format
(
engine_name
,
e
))
except
Exception
as
e
:
record_offline_engine_stats_on_error
(
engine
,
result_container
,
start_time
)
result_container
.
add_unresponsive_engine
((
engine_name
,
u'{0}: {1}'
.
format
(
gettext
(
'unexpected crash'
),
e
),
))
logger
.
exception
(
'engine {0} : exception : {1}'
.
format
(
engine_name
,
e
))
def
record_offline_engine_stats_on_error
(
engine
,
result_container
,
start_time
):
engine_time
=
time
()
-
start_time
result_container
.
add_timing
(
engine
.
name
,
engine_time
,
engine_time
)
with
threading
.
RLock
():
engine
.
stats
[
'errors'
]
+=
1
def
search_one_http_request_safe
(
engine_name
,
query
,
request_params
,
result_container
,
start_time
,
timeout_limit
):
# set timeout for all HTTP requests
# set timeout for all HTTP requests
requests_lib
.
set_timeout_for_thread
(
timeout_limit
,
start_time
=
start_time
)
requests_lib
.
set_timeout_for_thread
(
timeout_limit
,
start_time
=
start_time
)
# reset the HTTP total time
# reset the HTTP total time
...
@@ -111,7 +157,7 @@ def search_one_request_safe(engine_name, query, request_params, result_container
...
@@ -111,7 +157,7 @@ def search_one_request_safe(engine_name, query, request_params, result_container
try
:
try
:
# send requests and parse the results
# send requests and parse the results
search_results
=
search_one_request
(
engine
,
query
,
request_params
)
search_results
=
search_one_
http_
request
(
engine
,
query
,
request_params
)
# check if the engine accepted the request
# check if the engine accepted the request
if
search_results
is
not
None
:
if
search_results
is
not
None
:
...
@@ -427,19 +473,21 @@ class Search(object):
...
@@ -427,19 +473,21 @@ class Search(object):
continue
continue
# set default request parameters
# set default request parameters
request_params
=
default_request_params
()
request_params
=
{}
request_params
[
'headers'
][
'User-Agent'
]
=
user_agent
if
not
engine
.
offline
:
request_params
[
'category'
]
=
selected_engine
[
'category'
]
request_params
=
default_request_params
()
request_params
[
'pageno'
]
=
search_query
.
pageno
request_params
[
'headers'
][
'User-Agent'
]
=
user_agent
if
hasattr
(
engine
,
'language'
)
and
engine
.
language
:
if
hasattr
(
engine
,
'language'
)
and
engine
.
language
:
request_params
[
'language'
]
=
engine
.
language
request_params
[
'language'
]
=
engine
.
language
else
:
else
:
request_params
[
'language'
]
=
search_query
.
lang
request_params
[
'language'
]
=
search_query
.
lang
# 0 = None, 1 = Moderate, 2 = Strict
request_params
[
'safesearch'
]
=
search_query
.
safesearch
request_params
[
'safesearch'
]
=
search_query
.
safesearch
request_params
[
'time_range'
]
=
search_query
.
time_range
request_params
[
'time_range'
]
=
search_query
.
time_range
request_params
[
'category'
]
=
selected_engine
[
'category'
]
request_params
[
'pageno'
]
=
search_query
.
pageno
# append request to list
# append request to list
requests
.
append
((
selected_engine
[
'name'
],
search_query
.
query
,
request_params
))
requests
.
append
((
selected_engine
[
'name'
],
search_query
.
query
,
request_params
))
...
...
searx/static/themes/courgette/css/style.css
View file @
12f42d15
a
,
h2
{
color
:
#666
}
.center
,
html
{
position
:
relative
}
#categories_container
>
div
,
.top_margin
a
{
display
:
inline-block
}
#categories
,
.center
{
text-align
:
center
}
#categories
.hidden
,
.cache_link
,
.highlight
.c
,
.highlight
.cm
,
.highlight
.ge
,
.highlight
.sd
{
font-style
:
italic
}
*
{
-webkit-box-sizing
:
border-box
;
-moz-box-sizing
:
border-box
;
box-sizing
:
border-box
}
input
[
type
=
search
]
{
-webkit-appearance
:
textfield
}
h2
{
text-transform
:
uppercase
}
body
{
font-family
:
sans-serif
;
line-height
:
1.5
;
margin
:
0
;
background
:
#EEE
}
html
{
min-height
:
100%
}
.title
h1
{
font-size
:
7em
;
color
:
#3498DB
;
margin
:
-20px
auto
0
;
line-height
:
100px
;
padding-bottom
:
20px
}
.center
{
max-width
:
70em
;
background
:
rgba
(
255
,
255
,
255
,
.6
);
padding
:
2em
;
margin
:
7%
auto
0
}
.center.search
{
position
:
static
;
width
:
auto
;
background
:
0
0
;
margin
:
auto
;
padding-top
:
1.8em
}
@media
screen
and
(
min-width
:
1001px
){
.center
:after
{
content
:
""
;
z-index
:
-1
;
background
:
url(../img/bg-body-index.jpg)
no-repeat
;
background-size
:
cover
;
width
:
100%
;
height
:
100%
;
top
:
0
;
left
:
0
;
position
:
fixed
}
.center.search
:after
{
content
:
none
}}
.autocompleter-choices
{
position
:
absolute
;
margin
:
0
;
padding
:
0
;
background
:
#FFF
}
.autocompleter-choices
li
{
padding
:
.5em
1em
}
.autocompleter-choices
li
:hover
{
background
:
#3498DB
;
color
:
#FFF
;
cursor
:
pointer
}
.top_margin
{
position
:
absolute
;
bottom
:
-3.5em
;
width
:
100%
;
left
:
0
}
.top_margin
a
{
margin-right
:
1em
;
color
:
#FFF
;
text-decoration
:
none
}
.top_margin
a
:focus
,
.top_margin
a
:hover
{
text-decoration
:
underline
}
@media
screen
and
(
max-width
:
1000px
){
.center
{
background
:
0
0
}
.top_margin
a
{
color
:
#333
}}
.checkbox_container
{
margin-top
:
1.5em
}
.checkbox_container
label
{
padding
:
.5em
1em
;
color
:
#333
;
cursor
:
pointer
;
font-size
:
.9em
}
.checkbox_container
input
[
type
=
checkbox
]
:checked
+
label
,
.checkbox_container
label
:hover
{
background
:
#3498DB
;
color
:
#FFF
}
.checkbox_container
input
[
type
=
checkbox
]
{
position
:
absolute
;
top
:
-9999px
}
#categories
.hidden
{
display
:
none
;
position
:
absolute
;
bottom
:
1em
;
left
:
0
;
text-align
:
center
;
width
:
100%
;
font-size
:
.9em
;
color
:
#333
}
#categories
:hover
.hidden
,
.right
a
{
display
:
block
}
@media
screen
and
(
max-width
:
900px
){
#categories_container
{
letter-spacing
:
-5px
}
#categories_container
>
div
{
letter-spacing
:
normal
;
margin-top
:
1em
}
.checkbox_container
{
margin
:
0
}
.checkbox_container
label
{
display
:
block
;
background
:
#CCC
;
padding
:
1em
;
border
:
1px
solid
#FFF
}
.top_margin
{
position
:
static
}
#categories
.hidden
{
position
:
static
;
display
:
block
}}
@media
screen
and
(
max-width
:
900px
)
and
(
min-width
:
501px
){
#categories_container
>
div
{
width
:
31%
;
margin-left
:
2.333%
}
#categories_container
>
div
:nth-child
(
3n
+
1
)
{
margin-left
:
0
}}
@media
screen
and
(
max-width
:
500px
){
#categories_container
>
div
{
width
:
48%
;
margin-left
:
2%
;
font-size
:
.9em
}
#categories_container
>
div
:nth-child
(
2n
+
1
)
{
margin-left
:
0
}
.title
h1
{
background
:
url(../img/searx-mobile.png)
no-repeat
;
width
:
200px
;
height
:
39px
}}
#search_wrapper
{
position
:
relative
}
.q
{
padding
:
.5em
3em
.5em
1em
;
width
:
100%
;
font-size
:
1.5em
;
border
:
0
;
color
:
#666
}
.cache_link
,
.result
p
{
font-size
:
.9em
}
#search_submit
{
position
:
absolute
;
top
:
0
;
right
:
0
;
border
:
0
;
background
:
url(../img/search-icon.png)
center
center
/
65%
auto
no-repeat
#3498DB
;
text-indent
:
-9999px
;
width
:
5em
;
height
:
100%
;
cursor
:
pointer
}
#sidebar
,
.right
{
position
:
fixed
;
width
:
15em
;
right
:
0
;
text-align
:
right
}
#search_submit
:focus
,
#search_submit
:hover
{
background-color
:
#0665A2
}
#sidebar
{
background
:
#3498DB
;
top
:
0
;
height
:
100%
;
padding
:
1.5em
}
.right
{
bottom
:
1.5em
;
z-index
:
1
;
padding
:
0
1.5em
}
.right
a
{
color
:
#FFF
;
text-decoration
:
none
}
#sidebar
form
,
#suggestions
form
,
.row
fieldset
{
display
:
inline-block
}
.right
a
:focus
,
.right
a
:hover
{
text-decoration
:
underline
}
#preferences
{
background
:
url(../img/preference-icon.png)
right
center
/
12%
auto
no-repeat
;
padding-right
:
1.8em
}
#search_url
input
{
border
:
0
;
padding
:
.5em
}
#sidebar
>
div
{
margin-bottom
:
1em
;
color
:
#FFF
}
#sidebar
input
[
type
=
submit
]
{
background
:
#CCC
;
border
:
0
;
padding
:
.5em
1em
;
cursor
:
pointer
;
margin-top
:
.5em
}
#sidebar
input
[
type
=
submit
]
:focus
,
#sidebar
input
[
type
=
submit
]
:hover
{
color
:
#FFF
;
background-color
:
#0665A2
}
#results
{
padding
:
0
17em
0
2em
}
.result
.content
{
margin
:
0
;
color
:
#666
}
.result
.url
{
margin-top
:
0
;
color
:
#FF6530
}
.result
.favicon
{
float
:
left
;
position
:
relative
;
top
:
.5em
;
margin-right
:
.5em
}
.definition_result
{
background
:
#CCC
;
padding
:
1em
}
.definition_result
.result_title
,
.definition_result
p
{
margin
:
0
}
.result_title
{
margin-bottom
:
0
;
font-weight
:
400
}
.result_title
a
{
color
:
#3498DB
;
text-decoration
:
none
}
#answers
,
#suggestions
span
{
color
:
#666
}
.result_title
a
:focus
,
.result_title
a
:hover
{
text-decoration
:
underline
}
.cache_link
{
color
:
#666
}
.search.center
{
padding-right
:
17em
}
#answers
{
border
:
2px
solid
#3498DB
;
padding
:
20px
;
text-align
:
center
;
max-width
:
70em
;
margin
:
0
auto
20px
}
#suggestions
{
margin-bottom
:
1em
}
#suggestions
form
{
vertical-align
:
top
;
margin-bottom
:
.5em
}
#suggestions
input
[
type
=
submit
]
{
color
:
#333
;
padding
:
.5em
1em
;
border
:
0
;
background
:
#CCC
;
cursor
:
pointer
}
#suggestions
input
[
type
=
submit
]
:focus
,
#suggestions
input
[
type
=
submit
]
:hover
{
background
:
#3498DB
;
color
:
#FFF
}
#pagination
{
margin
:
1.5em
0
2em
}
#pagination
form
+
form
{
float
:
right
;
margin-top
:
-2em
}
input
[
type
=
submit
]
{
display
:
inline-block
;
background
:
#3498DB
;
color
:
#FFF
;
border
:
0
;
padding
:
.6em
1em
;
cursor
:
pointer
}
input
[
type
=
submit
]
:focus
,
input
[
type
=
submit
]
:hover
{
background
:
#0665A2
}
.row
{
max-width
:
60em
;
margin
:
auto
}
.row
a
{
color
:
#3498DB
}
.row
form
{
letter-spacing
:
-5px
}
.row
form
>*
{
letter-spacing
:
normal
}
.row
p
{
margin
:
0
}
.row
fieldset
{
width
:
48%
;
vertical-align
:
top
}
.row
fieldset
:last-of-type
{
display
:
block
;
width
:
auto
;
background
:
0
0
;
padding
:
0
}
fieldset
,
table
tr
:nth-child
(
odd
)
{
background
:
#CCC
}
.row
fieldset
:nth-child
(
odd
)
{
margin-right
:
2%
}
.row
fieldset
:nth-child
(
2
)
{
min-height
:
10.5em
}
@media
screen
and
(
max-width
:
900px
){
.row
{
margin
:
0
1em
}
.row
fieldset
{
width
:
49%
}
.row
fieldset
,
.row
fieldset
:nth-child
(
odd
)
{
margin-right
:
0
}
.row
fieldset
:first-child
{
width
:
100%
;
margin-right
:
0
}
.row
fieldset
:nth-child
(
even
)
{
margin-right
:
2%
}}
@media
screen
and
(
max-width
:
800px
){
.row
fieldset
,
select
{
width
:
100%
}
table
{
font-size
:
.8em
}
#sidebar
,
.right
{
display
:
none
}
#results
{
padding
:
0
2em
}
.search.center
{
padding-right
:
2em
}}
@media
screen
and
(
max-width
:
400px
){
.row
#categories_container
>
div
{
width
:
100%
;
margin-left
:
0
}}
fieldset
{
border
:
0
;
margin
:
1em
0
;
padding
:
1.5em
}
table
{
width
:
100%
;
text-align
:
left
;
border
:
1px
solid
#CCC
;
border-collapse
:
collapse
}
table
th
{
background
:
#999
;
color
:
#FFF
}
table
td
,
table
th
{
padding
:
.5em
1em
;
border
:
1px
solid
#FFF
}
.engine_checkbox
label
{
padding
:
.5em
;
background
:
#3498DB
;
color
:
#FFF
;
cursor
:
pointer
}
.engine_checkbox
.deny
{
background
:
#3498DB
}
.engine_checkbox
.allow
{
display
:
none
;
background
:
#666
}
.engine_checkbox
input
{
display
:
none
}
.engine_checkbox
input
:checked
+
.allow
{
display
:
inline
}
.engine_checkbox
input
:checked
+
.allow
+
.deny
{
display
:
none
}
.row
input
[
type
=
submit
]
{
font-size
:
1em
;
margin
:
1em
0
2em
}
.row
.right
{
position
:
static
;
display
:
inline-block
}
.row
.right
a
{
color
:
#333
;
width
:
auto
;
text-align
:
left
;
padding
:
0
}
.small_font
{
font-size
:
.8em
}
table
th
{
padding
:
1em
}
legend
{
background
:
#EEE
;
padding
:
0
1em
;
position
:
relative
}
select
{
border
:
1px
solid
#DDD
;
padding
:
.5em
.8em
;
font-size
:
1em
}
.highlight
.hll
{
background-color
:
#ffc
}
.highlight
{
font-weight
:
700
;
background
:
#f8f8f8
}
.highlight
.c
{
color
:
#408080
}
.highlight
.err
{
border
:
1px
solid
red
}
.highlight
.k
{
color
:
green
;
font-weight
:
700
}
.highlight
.o
{
color
:
#666
}
.highlight
.cm
{
color
:
#408080
}
.highlight
.cp
{
color
:
#BC7A00
}
.highlight
.c1
,
.highlight
.cs
{
color
:
#408080
;
font-style
:
italic
}
.highlight
.gd
{
color
:
#A00000
}
.highlight
.gr
{
color
:
red
}
.highlight
.gh
{
color
:
navy
;
font-weight
:
700
}
.highlight
.gi
{
color
:
#00A000
}
.highlight
.go
{
color
:
#888
}
.highlight
.gp
{
color
:
navy
;
font-weight
:
700
}
.highlight
.gs
{
font-weight
:
700
}
.highlight
.gu
{
color
:
purple
;
font-weight
:
700
}
.highlight
.gt
{
color
:
#04D
}
.highlight
.kc
,
.highlight
.kd
,
.highlight
.kn
{
color
:
green
;
font-weight
:
700
}
.highlight
.kp
{
color
:
green
}
.highlight
.kr
{
color
:
green
;
font-weight
:
700
}
.highlight
.kt
{
color
:
#B00040
}
.highlight
.m
{
color
:
#666
}
.highlight
.s
{
color
:
#BA2121
}
.highlight
.na
{
color
:
#7D9029
}
.highlight
.nb
{
color
:
green
}
.highlight
.nc
{
color
:
#00F
;
font-weight
:
700
}
.highlight
.no
{
color
:
#800
}
.highlight
.nd
{
color
:
#A2F
}
.highlight
.ni
{
color
:
#999
;
font-weight
:
700
}
.highlight
.ne
{
color
:
#D2413A
;
font-weight
:
700
}
.highlight
.nf
{
color
:
#00F
}
.highlight
.nl
{
color
:
#A0A000
}
.highlight
.nn
{
color
:
#00F
;
font-weight
:
700
}
.highlight
.nt
{
color
:
green
;
font-weight
:
700
}
.highlight
.nv
{
color
:
#19177C
}
.highlight
.ow
{
color
:
#A2F
;
font-weight
:
700
}
.highlight
.w
{
color
:
#bbb
}
.highlight
.mf
,
.highlight
.mh
,
.highlight
.mi
,
.highlight
.mo
{
color
:
#666
}
.highlight
.s2
,
.highlight
.sb
,
.highlight
.sc
{
color
:
#BA2121
}
.highlight
.sd
{
color
:
#BA2121
}
.highlight
.se
{
color
:
#B62
;
font-weight
:
700
}
.highlight
.sh
{
color
:
#BA2121
}
.highlight
.si
{
color
:
#B68
;
font-weight
:
700
}
.highlight
.sx
{
color
:
green
}
.highlight
.sr
{
color
:
#B68
}
.highlight
.s1
{
color
:
#BA2121
}
.highlight
.ss
{
color
:
#19177C
}
.highlight
.bp
{
color
:
green
}
.highlight
.vc
,
.highlight
.vg
,
.highlight
.vi
{
color
:
#19177C
}
.highlight
.il
{
color
:
#666
}
.highlight
pre
{
overflow
:
auto
}
.highlight
.lineno
{
-webkit-touch-callout
:
none
;
-webkit-user-select
:
none
;
-khtml-user-select
:
none
;
-moz-user-select
:
none
;
-ms-user-select
:
none
;
user-select
:
none
;
cursor
:
default
}
.highlight
.lineno
::selection
{
background
:
0
0
}
.highlight
.lineno
::-moz-selection
{
background
:
0
0
}
a
,
h2
{
color
:
#666
}
.center
,
html
{
position
:
relative
}
#categories_container
>
div
,
.top_margin
a
{
display
:
inline-block
}
#categories
,
.center
{
text-align
:
center
}
#categories
.hidden
,
.cache_link
,
.highlight
.c
,
.highlight
.cm
,
.highlight
.ge
,
.highlight
.sd
{
font-style
:
italic
}
*
{
-webkit-box-sizing
:
border-box
;
-moz-box-sizing
:
border-box
;
box-sizing
:
border-box
}
input
[
type
=
search
]
{
-webkit-appearance
:
textfield
}
h2
{
text-transform
:
uppercase
}
body
{
font-family
:
sans-serif
;
line-height
:
1.5
;
margin
:
0
;
background
:
#EEE
}
html
{
min-height
:
100%
}
.title
h1
{
font-size
:
7em
;
color
:
#3498DB
;
margin
:
-20px
auto
0
;
line-height
:
100px
;
padding-bottom
:
20px
}
.center
{
max-width
:
70em
;
background
:
rgba
(
255
,
255
,
255
,
.6
);
padding
:
2em
;
margin
:
7%
auto
0
}
.center.search
{
position
:
static
;
width
:
auto
;
background
:
0
0
;
margin
:
auto
;
padding-top
:
1.8em
}
@media
screen
and
(
min-width
:
1001px
){
.center
:after
{
content
:
""
;
z-index
:
-1
;
background
:
url(../img/bg-body-index.jpg)
no-repeat
;
background-size
:
cover
;
width
:
100%
;
height
:
100%
;
top
:
0
;
left
:
0
;
position
:
fixed
}
.center.search
:after
{
content
:
none
}}
.autocompleter-choices
{
position
:
absolute
;
margin
:
0
;
padding
:
0
;
background
:
#FFF
}
.autocompleter-choices
li
{
padding
:
.5em
1em
}
.autocompleter-choices
li
:hover
{
background
:
#3498DB
;
color
:
#FFF
;
cursor
:
pointer
}
.top_margin
{
position
:
absolute
;
bottom
:
-3.5em
;
width
:
100%
;
left
:
0
}
.top_margin
a
{
margin-right
:
1em
;
color
:
#FFF
;
text-decoration
:
none
}
.top_margin
a
:focus
,
.top_margin
a
:hover
{
text-decoration
:
underline
}
@media
screen
and
(
max-width
:
1000px
){
.center
{
background
:
0
0
}
.top_margin
a
{
color
:
#333
}}
.checkbox_container
{
margin-top
:
1.5em
}
.checkbox_container
label
{
padding
:
.5em
1em
;
color
:
#333
;
cursor
:
pointer
;
font-size
:
.9em
}
.checkbox_container
input
[
type
=
checkbox
]
:checked
+
label
,
.checkbox_container
label
:hover
{
background
:
#3498DB
;
color
:
#FFF
}
.checkbox_container
input
[
type
=
checkbox
]
{
position
:
absolute
;
top
:
-9999px
}
#categories
.hidden
{
display
:
none
;
position
:
absolute
;
bottom
:
1em
;
left
:
0
;
text-align
:
center
;
width
:
100%
;
font-size
:
.9em
;
color
:
#333
}
#categories
:hover
.hidden
,
.right
a
{
display
:
block
}
@media
screen
and
(
max-width
:
900px
){
#categories_container
{
letter-spacing
:
-5px
}
#categories_container
>
div
{
letter-spacing
:
normal
;
margin-top
:
1em
}
.checkbox_container
{
margin
:
0
}
.checkbox_container
label
{
display
:
block
;
background
:
#CCC
;
padding
:
1em
;
border
:
1px
solid
#FFF
}
.top_margin
{
position
:
static
}
#categories
.hidden
{
position
:
static
;
display
:
block
}}
@media
screen
and
(
max-width
:
900px
)
and
(
min-width
:
501px
){
#categories_container
>
div
{
width
:
31%
;
margin-left
:
2.333%
}
#categories_container
>
div
:nth-child
(
3n
+
1
)
{
margin-left
:
0
}}
@media
screen
and
(
max-width
:
500px
){
#categories_container
>
div
{
width
:
48%
;
margin-left
:
2%
;
font-size
:
.9em
}
#categories_container
>
div
:nth-child
(
2n
+
1
)
{
margin-left
:
0
}
.title
h1
{
background
:
url(../img/searx-mobile.png)
no-repeat
;
width
:
200px
;
height
:
39px
}}
#search_wrapper
{
position
:
relative
}
.q
{
padding
:
.5em
3em
.5em
1em
;
width
:
100%
;
font-size
:
1.5em
;
border
:
0
;
color
:
#666
}
.cache_link
,
.result
p
{
font-size
:
.9em
}
#search_submit
{
position
:
absolute
;
top
:
0
;
right
:
0
;
border
:
0
;
background
:
url(../img/search-icon.png)
center
center
/
65%
auto
no-repeat
#3498DB
;
text-indent
:
-9999px
;
width
:
5em
;
height
:
100%
;
cursor
:
pointer
}
#sidebar
,
.right
{
position
:
fixed
;
width
:
15em
;
right
:
0
;
text-align
:
right
}
#search_submit
:focus
,
#search_submit
:hover
{
background-color
:
#0665A2
}
#sidebar
{
background
:
#3498DB
;
top
:
0
;
height
:
100%
;
padding
:
1.5em
}
.right
{
bottom
:
1.5em
;
z-index
:
1
;
padding
:
0
1.5em
}
.right
a
{
color
:
#FFF
;
text-decoration
:
none
}
#sidebar
form
,
#suggestions
form
,
.row
fieldset
{
display
:
inline-block
}
.right
a
:focus
,
.right
a
:hover
{
text-decoration
:
underline
}
#preferences
{
background
:
url(../img/preference-icon.png)
right
center
/
12%
auto
no-repeat
;
padding-right
:
1.8em
}
#search_url
input
{
border
:
0
;
padding
:
.5em
}
#sidebar
>
div
{
margin-bottom
:
1em
;
color
:
#FFF
}
#sidebar
input
[
type
=
submit
]
{
background
:
#CCC
;
border
:
0
;
padding
:
.5em
1em
;
cursor
:
pointer
;
margin-top
:
.5em
}
#sidebar
input
[
type
=
submit
]
:focus
,
#sidebar
input
[
type
=
submit
]
:hover
{
color
:
#FFF
;
background-color
:
#0665A2
}
#results
{
padding
:
0
17em
0
2em
}
.result
.engines
{
text-align
:
right
}
.result
.content
{
margin
:
0
;
color
:
#666
}
.result
.url
{
margin-top
:
0
;
color
:
#FF6530
}
.result
.favicon
{
float
:
left
;
position
:
relative
;
top
:
.5em
;
margin-right
:
.5em
}
.definition_result
{
background
:
#CCC
;
padding
:
1em
}
.definition_result
.result_title
,
.definition_result
p
{
margin
:
0
}
.result_title
{
margin-bottom
:
0
;
font-weight
:
400
}
.result_title
a
{
color
:
#3498DB
;
text-decoration
:
none
}
#answers
,
#suggestions
span
{
color
:
#666
}
.result_title
a
:focus
,
.result_title
a
:hover
{
text-decoration
:
underline
}
.cache_link
{
color
:
#666
}
.search.center
{
padding-right
:
17em
}
#answers
{
border
:
2px
solid
#3498DB
;
padding
:
20px
;
text-align
:
center
;
max-width
:
70em
;
margin
:
0
auto
20px
}
#suggestions
{
margin-bottom
:
1em
}
#suggestions
form
{
vertical-align
:
top
;
margin-bottom
:
.5em
}
#suggestions
input
[
type
=
submit
]
{
color
:
#333
;
padding
:
.5em
1em
;
border
:
0
;
background
:
#CCC
;
cursor
:
pointer
}
#suggestions
input
[
type
=
submit
]
:focus
,
#suggestions
input
[
type
=
submit
]
:hover
{
background
:
#3498DB
;
color
:
#FFF
}
#pagination
{
margin
:
1.5em
0
2em
}
#pagination
form
+
form
{
float
:
right
;
margin-top
:
-2em
}
input
[
type
=
submit
]
{
display
:
inline-block
;
background
:
#3498DB
;
color
:
#FFF
;
border
:
0
;
padding
:
.6em
1em
;
cursor
:
pointer
}
input
[
type
=
submit
]
:focus
,
input
[
type
=
submit
]
:hover
{
background
:
#0665A2
}
.row
{
max-width
:
60em
;
margin
:
auto
}
.row
a
{
color
:
#3498DB
}
.row
form
{
letter-spacing
:
-5px
}
.row
form
>*
{
letter-spacing
:
normal
}
.row
p
{
margin
:
0
}
.row
fieldset
{
width
:
48%
;
vertical-align
:
top
}
.row
fieldset
:last-of-type
{
display
:
block
;
width
:
auto
;
background
:
0
0
;
padding
:
0
}
fieldset
,
table
tr
:nth-child
(
odd
)
{
background
:
#CCC
}
.row
fieldset
:nth-child
(
odd
)
{
margin-right
:
2%
}
.row
fieldset
:nth-child
(
2
)
{
min-height
:
10.5em
}
@media
screen
and
(
max-width
:
900px
){
.row
{
margin
:
0
1em
}
.row
fieldset
{
width
:
49%
}
.row
fieldset
,
.row
fieldset
:nth-child
(
odd
)
{
margin-right
:
0
}
.row
fieldset
:first-child
{
width
:
100%
;
margin-right
:
0
}
.row
fieldset
:nth-child
(
even
)
{
margin-right
:
2%
}}
@media
screen
and
(
max-width
:
800px
){
.row
fieldset
,
select
{
width
:
100%
}
table
{
font-size
:
.8em
}
#sidebar
,
.right
{
display
:
none
}
#results
{
padding
:
0
2em
}
.search.center
{
padding-right
:
2em
}}
@media
screen
and
(
max-width
:
400px
){
.row
#categories_container
>
div
{
width
:
100%
;
margin-left
:
0
}}
fieldset
{
border
:
0
;
margin
:
1em
0
;
padding
:
1.5em
}
table
{
width
:
100%
;
text-align
:
left
;
border
:
1px
solid
#CCC
;
border-collapse
:
collapse
}
table
th
{
background
:
#999
;
color
:
#FFF
}
table
td
,
table
th
{
padding
:
.5em
1em
;
border
:
1px
solid
#FFF
}
.engine_checkbox
label
{
padding
:
.5em
;
background
:
#3498DB
;
color
:
#FFF
;
cursor
:
pointer
}
.engine_checkbox
.deny
{
background
:
#3498DB
}
.engine_checkbox
.allow
{
display
:
none
;
background
:
#666
}
.engine_checkbox
input
{
display
:
none
}
.engine_checkbox
input
:checked
+
.allow
{
display
:
inline
}
.engine_checkbox
input
:checked
+
.allow
+
.deny
{
display
:
none
}
.row
input
[
type
=
submit
]
{
font-size
:
1em
;
margin
:
1em
0
2em
}
.row
.right
{
position
:
static
;
display
:
inline-block
}
.row
.right
a
{
color
:
#333
;
width
:
auto
;
text-align
:
left
;
padding
:
0
}
.small_font
{
font-size
:
.8em
}
table
th
{
padding
:
1em
}
legend
{
background
:
#EEE
;
padding
:
0
1em
;
position
:
relative
}
select
{
border
:
1px
solid
#DDD
;
padding
:
.5em
.8em
;
font-size
:
1em
}
.highlight
.hll
{
background-color
:
#ffc
}
.highlight
{
font-weight
:
700
;
background
:
#f8f8f8
}
.highlight
.c
{
color
:
#408080
}
.highlight
.err
{
border
:
1px
solid
red
}
.highlight
.k
{
color
:
green
;
font-weight
:
700
}
.highlight
.o
{
color
:
#666
}
.highlight
.cm
{
color
:
#408080
}
.highlight
.cp
{
color
:
#BC7A00
}
.highlight
.c1
,
.highlight
.cs
{
color
:
#408080
;
font-style
:
italic
}
.highlight
.gd
{
color
:
#A00000
}
.highlight
.gr
{
color
:
red
}
.highlight
.gh
{
color
:
navy
;
font-weight
:
700
}
.highlight
.gi
{
color
:
#00A000
}
.highlight
.go
{
color
:
#888
}
.highlight
.gp
{
color
:
navy
;
font-weight
:
700
}
.highlight
.gs
{
font-weight
:
700
}
.highlight
.gu
{
color
:
purple
;
font-weight
:
700
}
.highlight
.gt
{
color
:
#04D
}
.highlight
.kc
,
.highlight
.kd
,
.highlight
.kn
{
color
:
green
;
font-weight
:
700
}
.highlight
.kp
{
color
:
green
}
.highlight
.kr
{
color
:
green
;
font-weight
:
700
}
.highlight
.kt
{
color
:
#B00040
}
.highlight
.m
{
color
:
#666
}
.highlight
.s
{
color
:
#BA2121
}
.highlight
.na
{
color
:
#7D9029
}
.highlight
.nb
{
color
:
green
}
.highlight
.nc
{
color
:
#00F
;
font-weight
:
700
}
.highlight
.no
{
color
:
#800
}
.highlight
.nd
{
color
:
#A2F
}
.highlight
.ni
{
color
:
#999
;
font-weight
:
700
}
.highlight
.ne
{
color
:
#D2413A
;
font-weight
:
700
}
.highlight
.nf
{
color
:
#00F
}
.highlight
.nl
{
color
:
#A0A000
}
.highlight
.nn
{
color
:
#00F
;
font-weight
:
700
}
.highlight
.nt
{
color
:
green
;
font-weight
:
700
}
.highlight
.nv
{
color
:
#19177C
}
.highlight
.ow
{
color
:
#A2F
;
font-weight
:
700
}
.highlight
.w
{
color
:
#bbb
}
.highlight
.mf
,
.highlight
.mh
,
.highlight
.mi
,
.highlight
.mo
{
color
:
#666
}
.highlight
.s2
,
.highlight
.sb
,
.highlight
.sc
{
color
:
#BA2121
}
.highlight
.sd
{
color
:
#BA2121
}
.highlight
.se
{
color
:
#B62
;
font-weight
:
700
}
.highlight
.sh
{
color
:
#BA2121
}
.highlight
.si
{
color
:
#B68
;
font-weight
:
700
}
.highlight
.sx
{
color
:
green
}
.highlight
.sr
{
color
:
#B68
}
.highlight
.s1
{
color
:
#BA2121
}
.highlight
.ss
{
color
:
#19177C
}
.highlight
.bp
{
color
:
green
}
.highlight
.vc
,
.highlight
.vg
,
.highlight
.vi
{
color
:
#19177C
}
.highlight
.il
{
color
:
#666
}
.highlight
pre
{
overflow
:
auto
}
.highlight
.lineno
{
-webkit-touch-callout
:
none
;
-webkit-user-select
:
none
;
-khtml-user-select
:
none
;
-moz-user-select
:
none
;
-ms-user-select
:
none
;
user-select
:
none
;
cursor
:
default
}
.highlight
.lineno
::selection
{
background
:
0
0
}
.highlight
.lineno
::-moz-selection
{
background
:
0
0
}
\ No newline at end of file
\ No newline at end of file
searx/static/themes/courgette/less/style.less
View file @
12f42d15
...
@@ -325,6 +325,10 @@ a {
...
@@ -325,6 +325,10 @@ a {
font-size: 0.9em;
font-size: 0.9em;
}
}
.result .engines {
text-align: right;
}
.result .content {
.result .content {
margin: 0;
margin: 0;
color: #666;
color: #666;
...
...
searx/static/themes/legacy/css/style.css
View file @
12f42d15
.highlight
.c
,
.highlight
.cm
,
.highlight
.ge
,
.highlight
.sd
{
font-style
:
italic
}
#categories
,
.highlight
.lineno
{
-webkit-user-select
:
none
;
-moz-user-select
:
none
;
-ms-user-select
:
none
}
#container
,
.search
,
body
,
html
{
padding
:
0
;
margin
:
0
}
div
.title
h1
,
input
[
type
=
checkbox
]
{
visibility
:
hidden
}
#categories
,
.checkbox_container
label
,
.engine_checkbox
label
,
.highlight
.lineno
{
-webkit-touch-callout
:
none
;
-khtml-user-select
:
none
}
#answers
input
[
type
=
submit
],
#infoboxes
input
[
type
=
submit
],
#sidebar
input
[
type
=
submit
],
#suggestions
input
[
type
=
submit
],
.result_title
a
:hover
,
.torrent_result
a
:hover
{
text-decoration
:
underline
}
#infoboxes
,
.result
.content
,
.result
.url
,
.result
h3
{
word-wrap
:
break-word
}
#apis
,
#infoboxes
.infobox
br
,
#pagination
,
#pagination
br
,
.result
,
.result
.content
br
.last
{
clear
:
both
}
.highlight
.hll
{
background-color
:
#ffc
}
.highlight
{
background
:
#f8f8f8
}
.highlight
.c
{
color
:
#408080
}
.highlight
.err
{
border
:
1px
solid
red
}
.highlight
.k
{
color
:
green
;
font-weight
:
700
}
.highlight
.o
{
color
:
#666
}
.highlight
.cm
{
color
:
#408080
}
.highlight
.cp
{
color
:
#BC7A00
}
.highlight
.c1
,
.highlight
.cs
{
color
:
#408080
;
font-style
:
italic
}
.highlight
.gd
{
color
:
#A00000
}
.highlight
.gr
{
color
:
red
}
.highlight
.gh
{
color
:
navy
;
font-weight
:
700
}
.highlight
.gi
{
color
:
#00A000
}
.highlight
.go
{
color
:
#888
}
.highlight
.gp
{
color
:
navy
;
font-weight
:
700
}
.highlight
.gs
{
font-weight
:
700
}
.highlight
.gu
{
color
:
purple
;
font-weight
:
700
}
.highlight
.gt
{
color
:
#04D
}
.highlight
.kc
,
.highlight
.kd
,
.highlight
.kn
{
color
:
green
;
font-weight
:
700
}
.highlight
.kp
{
color
:
green
}
.highlight
.kr
{
color
:
green
;
font-weight
:
700
}
.highlight
.kt
{
color
:
#B00040
}
.highlight
.m
{
color
:
#666
}
.highlight
.s
{
color
:
#BA2121
}
.highlight
.na
{
color
:
#7D9029
}
.highlight
.nb
{
color
:
green
}
.highlight
.nc
{
color
:
#00F
;
font-weight
:
700
}
.highlight
.no
{
color
:
#800
}
.highlight
.nd
{
color
:
#A2F
}
.highlight
.ni
{
color
:
#999
;
font-weight
:
700
}
.highlight
.ne
{
color
:
#D2413A
;
font-weight
:
700
}
.highlight
.nf
{
color
:
#00F
}
.highlight
.nl
{
color
:
#A0A000
}
.highlight
.nn
{
color
:
#00F
;
font-weight
:
700
}
.highlight
.nt
{
color
:
green
;
font-weight
:
700
}
.highlight
.nv
{
color
:
#19177C
}
.highlight
.ow
{
color
:
#A2F
;
font-weight
:
700
}
.highlight
.w
{
color
:
#bbb
}
.highlight
.mf
,
.highlight
.mh
,
.highlight
.mi
,
.highlight
.mo
{
color
:
#666
}
.highlight
.s2
,
.highlight
.sb
,
.highlight
.sc
{
color
:
#BA2121
}
.highlight
.sd
{
color
:
#BA2121
}
.highlight
.se
{
color
:
#B62
;
font-weight
:
700
}
.highlight
.sh
{
color
:
#BA2121
}
.highlight
.si
{
color
:
#B68
;
font-weight
:
700
}
.highlight
.sx
{
color
:
green
}
.highlight
.sr
{
color
:
#B68
}
.highlight
.s1
{
color
:
#BA2121
}
.highlight
.ss
{
color
:
#19177C
}
.highlight
.bp
{
color
:
green
}
.highlight
.vc
,
.highlight
.vg
,
.highlight
.vi
{
color
:
#19177C
}
.highlight
.il
{
color
:
#666
}
.highlight
pre
{
overflow
:
auto
}
.highlight
.lineno
{
user-select
:
none
;
cursor
:
default
}
.highlight
.lineno
::selection
{
background
:
0
0
}
.highlight
.lineno
::-moz-selection
{
background
:
0
0
}
html
{
font-family
:
sans-serif
;
font-size
:
.9em
;
-webkit-text-size-adjust
:
100%
;
-ms-text-size-adjust
:
100%
;
-moz-text-size-adjust
:
100%
;
text-size-adjust
:
100%
;
color
:
#444
}
#container
{
width
:
100%
;
position
:
absolute
;
top
:
0
}
.search
.checkbox_container
label
{
font-size
:
.9em
;
border-bottom
:
2px
solid
#E8E7E6
}
.search
.checkbox_container
label
:hover
{
border-bottom
:
2px
solid
#3498DB
}
.search
.checkbox_container
input
[
type
=
checkbox
]
:checked
+
label
{
border-bottom
:
2px
solid
#2980B9
}
#search_wrapper
{
position
:
relative
;
width
:
50em
;
padding
:
10px
}
.center
#search_wrapper
{
margin-left
:
auto
;
margin-right
:
auto
}
.q
,
ul
.autocompleter-choices
{
margin
:
0
;
border
:
1px
solid
#3498DB
}
.q
{
background
:
#FFF
;
color
:
#222
;
font-size
:
16px
;
height
:
28px
;
outline
:
0
;
padding
:
2px
2px
2px
8px
;
padding-right
:
0
!important
;
width
:
100%
;
z-index
:
2
}
#search_submit
{
position
:
absolute
;
top
:
13px
;
right
:
1px
;
padding
:
0
;
border
:
0
;
background
:
url(../img/search-icon.png)
no-repeat
;
background-size
:
24px
24px
;
opacity
:
.8
;
width
:
24px
;
height
:
30px
;
font-size
:
0
}
@media
screen
and
(
max-width
:
50em
){
#search_wrapper
{
width
:
90%
;
clear
:
both
;
overflow
:
hidden
}}
ul
.autocompleter-choices
{
position
:
absolute
;
padding
:
0
;
list-style
:
none
;
border-left-color
:
#3498DB
;
border-right-color
:
#3498DB
;
border-bottom-color
:
#3498DB
;
text-align
:
left
;
font-family
:
Verdana
,
Geneva
,
Arial
,
Helvetica
,
sans-serif
;
z-index
:
50
;
background-color
:
#FFF
;
color
:
#444
}
ul
.autocompleter-choices
li
{
position
:
relative
;
margin
:
-2px
0
0
;
padding
:
.2em
1.5em
.2em
1em
;
display
:
block
;
float
:
none
!important
;
cursor
:
pointer
;
font-weight
:
400
;
white-space
:
nowrap
;
font-size
:
1em
;
line-height
:
1.5em
}
ul
.autocompleter-choices
li
.autocompleter-selected
{
background-color
:
#444
;
color
:
#FFF
}
ul
.autocompleter-choices
li
.autocompleter-selected
span
.autocompleter-queried
{
color
:
#9FCFFF
}
ul
.autocompleter-choices
span
.autocompleter-queried
{
display
:
inline
;
float
:
none
;
font-weight
:
700
;
margin
:
0
;
padding
:
0
}
.row
{
max-width
:
800px
;
margin
:
20px
auto
;
text-align
:
justify
}
.row
h1
{
font-size
:
3em
;
margin-top
:
50px
}
.row
p
{
padding
:
0
10px
;
max-width
:
700px
}
.row
h3
,
.row
ul
{
margin
:
4px
8px
}
.hmarg
{
margin
:
0
20px
;
border
:
1px
solid
#3498DB
;
padding
:
4px
10px
}
a
:active
.hmarg
,
a
:hover
.hmarg
,
a
:link
.hmarg
,
a
:visited
.hmarg
{
color
:
#3498DB
}
.top_margin
{
margin-top
:
60px
}
.center
{
text-align
:
center
}
h1
{
font-size
:
5em
}
div
.title
{
background
:
url(../img/searx.png)
center
no-repeat
;
width
:
100%
;
min-height
:
80px
}
input
[
type
=
submit
]
{
padding
:
2px
6px
;
margin
:
2px
4px
;
display
:
inline-block
;
background
:
#3498DB
;
color
:
#FFF
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
border
:
0
;
cursor
:
pointer
}
fieldset
{
margin
:
8px
;
border
:
1px
solid
#3498DB
}
#categories
{
margin
:
0
10px
;
user-select
:
none
}
.checkbox_container
{
display
:
inline-block
;
position
:
relative
;
margin
:
0
3px
;
padding
:
0
}
.checkbox_container
input
{
display
:
none
}
.checkbox_container
label
,
.engine_checkbox
label
{
cursor
:
pointer
;
padding
:
4px
10px
;
margin
:
0
;
display
:
block
;
text-transform
:
capitalize
;
-webkit-user-select
:
none
;
-moz-user-select
:
none
;
-ms-user-select
:
none
;
user-select
:
none
}
.checkbox_container
input
[
type
=
checkbox
]
:checked
+
label
{
background
:
#3498DB
;
color
:
#FFF
}
.engine_checkbox
{
padding
:
4px
}
label
.allow
{
background
:
#E74C3C
;
padding
:
4px
8px
;
color
:
#FFF
;
display
:
none
}
label
.deny
{
background
:
#2ECC71
;
padding
:
4px
8px
;
color
:
#444
;
display
:
inline
}
.engine_checkbox
input
[
type
=
checkbox
]
:checked
+
label
:nth-child
(
2
)+
label
{
display
:
none
}
.engine_checkbox
input
[
type
=
checkbox
]
:checked
+
label
.allow
{
display
:
inline
}
a
{
text-decoration
:
none
;
color
:
#1a11be
}
a
:visited
{
color
:
#8E44AD
}
.result
{
margin
:
19px
0
18px
;
padding
:
0
}
.result_title
{
margin-bottom
:
0
}
.result_title
a
{
color
:
#2980B9
;
font-weight
:
400
;
font-size
:
1.1em
}
.result_title
a
:visited
{
color
:
#8E44AD
}
.cache_link
{
font-size
:
10px
!important
}
.result
h3
{
font-size
:
1em
;
margin
:
5px
0
1px
;
padding
:
0
}
.result
.content
,
.result
.url
,
.small_font
{
font-size
:
.8em
}
.result
.content
{
margin
:
0
;
padding
:
0
;
max-width
:
54em
;
line-height
:
1.24
}
.result
.content
img
{
float
:
left
;
margin-right
:
5px
;
max-width
:
200px
;
max-height
:
100px
}
.result
.url
{
margin
:
0
0
3px
;
padding
:
0
;
max-width
:
54em
;
color
:
#C0392B
}
.result
.published_date
{
font-size
:
.8em
;
color
:
#888
;
Margin
:
5px
20px
}
.result
.thumbnail
{
width
:
400px
}
.engines
{
color
:
#888
}
.small
p
{
margin
:
2px
0
}
.right
{
float
:
right
}
.invisible
{
display
:
none
}
.left
{
float
:
left
}
.highlight
{
color
:
#094089
}
.content
.highlight
{
color
:
#000
}
.image_result
{
display
:
inline-block
;
margin
:
10px
;
position
:
relative
;
max-height
:
160px
}
.image_result
img
{
border
:
0
;
max-height
:
160px
}
.image_result
p
{
margin
:
0
;
padding
:
0
}
.image_result
p
span
a
{
display
:
none
;
color
:
#FFF
}
.image_result
p
:hover
span
a
{
display
:
block
;
position
:
absolute
;
bottom
:
0
;
right
:
0
;
padding
:
4px
;
background-color
:
rgba
(
0
,
0
,
0
,
.6
);
font-size
:
.7em
}
#categories_container
,
.percentage
{
position
:
relative
}
.torrent_result
{
border-left
:
10px
solid
#d3d3d3
;
padding-left
:
3px
}
.torrent_result
p
{
margin
:
3px
;
font-size
:
.8em
}
.torrent_result
a
{
color
:
#2980B9
}
.torrent_result
a
:visited
{
color
:
#8E44AD
}
.definition_result
{
border-left
:
10px
solid
gray
;
padding-left
:
3px
}
#infoboxes
,
#sidebar
{
margin
:
0
2px
5px
5px
;
padding
:
0
2px
2px
}
.percentage
{
width
:
300px
}
.percentage
div
{
background
:
#444
}
table
{
width
:
100%
}
td
{
padding
:
0
4px
}
tr
:hover
{
background
:
#DDD
}
#results
{
margin
:
auto
auto
20px
;
padding
:
0
;
width
:
50em
}
#sidebar
{
position
:
fixed
;
bottom
:
10px
;
left
:
10px
;
width
:
14em
}
#answers
input
,
#infoboxes
input
,
#sidebar
input
,
#suggestions
input
{
padding
:
0
;
margin
:
3px
;
font-size
:
.8em
;
display
:
inline-block
;
background
:
0
0
;
color
:
#444
;
cursor
:
pointer
}
#suggestions
form
{
display
:
inline
}
#answers
,
#suggestions
{
margin-top
:
20px
;
max-width
:
45em
}
#suggestions-title
{
color
:
#888
}
#answers
{
border
:
2px
solid
#2980B9
;
padding
:
20px
}
#answers
form
,
#infoboxes
form
{
min-width
:
210px
}
#infoboxes
{
position
:
absolute
;
top
:
100px
;
right
:
20px
;
max-width
:
21em
}
#infoboxes
.infobox
{
margin
:
10px
0
;
border
:
1px
solid
#ddd
;
padding
:
5px
;
font-size
:
.8em
}
#infoboxes
.infobox
img
{
max-width
:
90%
;
max-heigt
:
12em
;
display
:
block
;
margin
:
5px
;
padding
:
5px
}
#infoboxes
.infobox
h2
{
margin
:
0
}
#apis
,
#search_url
{
margin-top
:
8px
}
#infoboxes
.infobox
table
{
table-layout
:
fixed
}
#infoboxes
.infobox
table
td
{
vertical-align
:
top
}
#infoboxes
.infobox
input
{
font-size
:
1em
}
#search_url
input
{
border
:
1px
solid
#888
;
padding
:
4px
;
color
:
#444
;
width
:
14em
;
display
:
block
;
margin
:
4px
;
font-size
:
.8em
}
#preferences
{
top
:
10px
;
padding
:
0
;
border
:
0
;
background
:
url(../img/preference-icon.png)
no-repeat
;
background-size
:
28px
28px
;
opacity
:
.8
;
width
:
28px
;
height
:
30px
;
display
:
block
}
#preferences
*
{
display
:
none
}
@media
screen
and
(
max-width
:
50em
){
#results
{
margin
:
auto
;
padding
:
0
;
width
:
90%
}
.github
{
display
:
none
}
.checkbox_container
{
display
:
block
;
width
:
90%
}
.checkbox_container
label
{
border-bottom
:
0
}
.preferences_container
{
display
:
none
;
postion
:
fixed
!important
;
top
:
100px
;
right
:
0
}}
@media
screen
and
(
max-width
:
75em
){
div
.title
h1
{
font-size
:
1em
}
html
.touch
#categories
{
width
:
95%
;
height
:
30px
;
text-align
:
left
;
overflow-x
:
scroll
;
overflow-y
:
hidden
;
-webkit-overflow-scrolling
:
touch
}
html
.touch
#categories
#categories_container
{
width
:
1000px
;
width
:
-moz-max-content
;
width
:
-webkit-max-content
;
width
:
max-content
}
html
.touch
#categories
#categories_container
.checkbox_container
{
display
:
inline-block
;
width
:
auto
}
#answers
,
#suggestions
{
margin-top
:
5px
}
#infoboxes
{
position
:
inherit
;
max-width
:
inherit
}
#infoboxes
.infobox
{
clear
:
both
}
#infoboxes
.infobox
img
{
float
:
left
;
max-width
:
10em
}
#categories
{
font-size
:
90%
;
clear
:
both
}
#categories
.checkbox_container
{
margin
:
auto
}
#sidebar
{
position
:
static
;
max-width
:
50em
;
margin
:
0
0
2px
;
padding
:
0
;
float
:
none
;
border
:
none
;
width
:
auto
}
#sidebar
input
{
border
:
0
}
#apis
,
#search_url
{
display
:
none
}
.result
{
border-top
:
1px
solid
#E8E7E6
;
margin
:
8px
0
}
.image_result
,
.image_result
img
,
.result
.thumbnail
{
max-width
:
98%
}}
.favicon
{
float
:
left
;
margin-right
:
4px
;
margin-top
:
2px
}
.preferences_back
{
background
:
#3498DB
;
border
:
0
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
cursor
:
pointer
;
display
:
inline-block
;
margin
:
2px
4px
;
padding
:
4px
6px
}
.preferences_back
a
{
color
:
#FFF
}
.hidden
{
opacity
:
0
;
overflow
:
hidden
;
font-size
:
.8em
;
position
:
absolute
;
bottom
:
-20px
;
width
:
100%
;
text-position
:
center
;
background
:
#fff
;
transition
:
opacity
1s
ease
}
#categories_container
:hover
.hidden
{
transition
:
opacity
1s
ease
;
opacity
:
.8
}
.highlight
.c
,
.highlight
.cm
,
.highlight
.ge
,
.highlight
.sd
{
font-style
:
italic
}
#categories
,
.highlight
.lineno
{
-webkit-user-select
:
none
;
-moz-user-select
:
none
;
-ms-user-select
:
none
}
#container
,
.search
,
body
,
html
{
padding
:
0
;
margin
:
0
}
div
.title
h1
,
input
[
type
=
checkbox
]
{
visibility
:
hidden
}
#categories
,
.checkbox_container
label
,
.engine_checkbox
label
,
.highlight
.lineno
{
-webkit-touch-callout
:
none
;
-khtml-user-select
:
none
}
#answers
input
[
type
=
submit
],
#infoboxes
input
[
type
=
submit
],
#sidebar
input
[
type
=
submit
],
#suggestions
input
[
type
=
submit
],
.result_title
a
:hover
,
.torrent_result
a
:hover
{
text-decoration
:
underline
}
#infoboxes
,
.result
.content
,
.result
.url
,
.result
h3
{
word-wrap
:
break-word
}
#apis
,
#infoboxes
.infobox
br
,
#pagination
,
#pagination
br
,
.result
,
.result
.content
br
.last
{
clear
:
both
}
.highlight
.hll
{
background-color
:
#ffc
}
.highlight
{
background
:
#f8f8f8
}
.highlight
.c
{
color
:
#408080
}
.highlight
.err
{
border
:
1px
solid
red
}
.highlight
.k
{
color
:
green
;
font-weight
:
700
}
.highlight
.o
{
color
:
#666
}
.highlight
.cm
{
color
:
#408080
}
.highlight
.cp
{
color
:
#BC7A00
}
.highlight
.c1
,
.highlight
.cs
{
color
:
#408080
;
font-style
:
italic
}
.highlight
.gd
{
color
:
#A00000
}
.highlight
.gr
{
color
:
red
}
.highlight
.gh
{
color
:
navy
;
font-weight
:
700
}
.highlight
.gi
{
color
:
#00A000
}
.highlight
.go
{
color
:
#888
}
.highlight
.gp
{
color
:
navy
;
font-weight
:
700
}
.highlight
.gs
{
font-weight
:
700
}
.highlight
.gu
{
color
:
purple
;
font-weight
:
700
}
.highlight
.gt
{
color
:
#04D
}
.highlight
.kc
,
.highlight
.kd
,
.highlight
.kn
{
color
:
green
;
font-weight
:
700
}
.highlight
.kp
{
color
:
green
}
.highlight
.kr
{
color
:
green
;
font-weight
:
700
}
.highlight
.kt
{
color
:
#B00040
}
.highlight
.m
{
color
:
#666
}
.highlight
.s
{
color
:
#BA2121
}
.highlight
.na
{
color
:
#7D9029
}
.highlight
.nb
{
color
:
green
}
.highlight
.nc
{
color
:
#00F
;
font-weight
:
700
}
.highlight
.no
{
color
:
#800
}
.highlight
.nd
{
color
:
#A2F
}
.highlight
.ni
{
color
:
#999
;
font-weight
:
700
}
.highlight
.ne
{
color
:
#D2413A
;
font-weight
:
700
}
.highlight
.nf
{
color
:
#00F
}
.highlight
.nl
{
color
:
#A0A000
}
.highlight
.nn
{
color
:
#00F
;
font-weight
:
700
}
.highlight
.nt
{
color
:
green
;
font-weight
:
700
}
.highlight
.nv
{
color
:
#19177C
}
.highlight
.ow
{
color
:
#A2F
;
font-weight
:
700
}
.highlight
.w
{
color
:
#bbb
}
.highlight
.mf
,
.highlight
.mh
,
.highlight
.mi
,
.highlight
.mo
{
color
:
#666
}
.highlight
.s2
,
.highlight
.sb
,
.highlight
.sc
{
color
:
#BA2121
}
.highlight
.sd
{
color
:
#BA2121
}
.highlight
.se
{
color
:
#B62
;
font-weight
:
700
}
.highlight
.sh
{
color
:
#BA2121
}
.highlight
.si
{
color
:
#B68
;
font-weight
:
700
}
.highlight
.sx
{
color
:
green
}
.highlight
.sr
{
color
:
#B68
}
.highlight
.s1
{
color
:
#BA2121
}
.highlight
.ss
{
color
:
#19177C
}
.highlight
.bp
{
color
:
green
}
.highlight
.vc
,
.highlight
.vg
,
.highlight
.vi
{
color
:
#19177C
}
.highlight
.il
{
color
:
#666
}
.highlight
pre
{
overflow
:
auto
}
.highlight
.lineno
{
user-select
:
none
;
cursor
:
default
}
.highlight
.lineno
::selection
{
background
:
0
0
}
.highlight
.lineno
::-moz-selection
{
background
:
0
0
}
html
{
font-family
:
sans-serif
;
font-size
:
.9em
;
-webkit-text-size-adjust
:
100%
;
-ms-text-size-adjust
:
100%
;
-moz-text-size-adjust
:
100%
;
text-size-adjust
:
100%
;
color
:
#444
}
#container
{
width
:
100%
;
position
:
absolute
;
top
:
0
}
.search
.checkbox_container
label
{
font-size
:
.9em
;
border-bottom
:
2px
solid
#E8E7E6
}
.search
.checkbox_container
label
:hover
{
border-bottom
:
2px
solid
#3498DB
}
.search
.checkbox_container
input
[
type
=
checkbox
]
:checked
+
label
{
border-bottom
:
2px
solid
#2980B9
}
#search_wrapper
{
position
:
relative
;
width
:
50em
;
padding
:
10px
}
.center
#search_wrapper
{
margin-left
:
auto
;
margin-right
:
auto
}
.q
,
ul
.autocompleter-choices
{
margin
:
0
;
border
:
1px
solid
#3498DB
}
.q
{
background
:
#FFF
;
color
:
#222
;
font-size
:
16px
;
height
:
28px
;
outline
:
0
;
padding
:
2px
2px
2px
8px
;
padding-right
:
0
!important
;
width
:
100%
;
z-index
:
2
}
#search_submit
{
position
:
absolute
;
top
:
13px
;
right
:
1px
;
padding
:
0
;
border
:
0
;
background
:
url(../img/search-icon.png)
no-repeat
;
background-size
:
24px
24px
;
opacity
:
.8
;
width
:
24px
;
height
:
30px
;
font-size
:
0
}
@media
screen
and
(
max-width
:
50em
){
#search_wrapper
{
width
:
90%
;
clear
:
both
;
overflow
:
hidden
}}
ul
.autocompleter-choices
{
position
:
absolute
;
padding
:
0
;
list-style
:
none
;
border-left-color
:
#3498DB
;
border-right-color
:
#3498DB
;
border-bottom-color
:
#3498DB
;
text-align
:
left
;
font-family
:
Verdana
,
Geneva
,
Arial
,
Helvetica
,
sans-serif
;
z-index
:
50
;
background-color
:
#FFF
;
color
:
#444
}
ul
.autocompleter-choices
li
{
position
:
relative
;
margin
:
-2px
0
0
;
padding
:
.2em
1.5em
.2em
1em
;
display
:
block
;
float
:
none
!important
;
cursor
:
pointer
;
font-weight
:
400
;
white-space
:
nowrap
;
font-size
:
1em
;
line-height
:
1.5em
}
ul
.autocompleter-choices
li
.autocompleter-selected
{
background-color
:
#444
;
color
:
#FFF
}
ul
.autocompleter-choices
li
.autocompleter-selected
span
.autocompleter-queried
{
color
:
#9FCFFF
}
ul
.autocompleter-choices
span
.autocompleter-queried
{
display
:
inline
;
float
:
none
;
font-weight
:
700
;
margin
:
0
;
padding
:
0
}
.row
{
max-width
:
800px
;
margin
:
20px
auto
;
text-align
:
justify
}
.row
h1
{
font-size
:
3em
;
margin-top
:
50px
}
.row
p
{
padding
:
0
10px
;
max-width
:
700px
}
.row
h3
,
.row
ul
{
margin
:
4px
8px
}
.hmarg
{
margin
:
0
20px
;
border
:
1px
solid
#3498DB
;
padding
:
4px
10px
}
a
:active
.hmarg
,
a
:hover
.hmarg
,
a
:link
.hmarg
,
a
:visited
.hmarg
{
color
:
#3498DB
}
.top_margin
{
margin-top
:
60px
}
.center
{
text-align
:
center
}
h1
{
font-size
:
5em
}
div
.title
{
background
:
url(../img/searx.png)
center
no-repeat
;
width
:
100%
;
min-height
:
80px
}
input
[
type
=
submit
]
{
padding
:
2px
6px
;
margin
:
2px
4px
;
display
:
inline-block
;
background
:
#3498DB
;
color
:
#FFF
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
border
:
0
;
cursor
:
pointer
}
fieldset
{
margin
:
8px
;
border
:
1px
solid
#3498DB
}
#categories
{
margin
:
0
10px
;
user-select
:
none
}
.checkbox_container
{
display
:
inline-block
;
position
:
relative
;
margin
:
0
3px
;
padding
:
0
}
.checkbox_container
input
{
display
:
none
}
.checkbox_container
label
,
.engine_checkbox
label
{
cursor
:
pointer
;
padding
:
4px
10px
;
margin
:
0
;
display
:
block
;
text-transform
:
capitalize
;
-webkit-user-select
:
none
;
-moz-user-select
:
none
;
-ms-user-select
:
none
;
user-select
:
none
}
.checkbox_container
input
[
type
=
checkbox
]
:checked
+
label
{
background
:
#3498DB
;
color
:
#FFF
}
.engine_checkbox
{
padding
:
4px
}
label
.allow
{
background
:
#E74C3C
;
padding
:
4px
8px
;
color
:
#FFF
;
display
:
none
}
label
.deny
{
background
:
#2ECC71
;
padding
:
4px
8px
;
color
:
#444
;
display
:
inline
}
.engine_checkbox
input
[
type
=
checkbox
]
:checked
+
label
:nth-child
(
2
)+
label
{
display
:
none
}
.engine_checkbox
input
[
type
=
checkbox
]
:checked
+
label
.allow
{
display
:
inline
}
a
{
text-decoration
:
none
;
color
:
#1a11be
}
a
:visited
{
color
:
#8E44AD
}
.result
{
margin
:
19px
0
18px
;
padding
:
0
}
.result_title
{
margin-bottom
:
0
}
.result_title
a
{
color
:
#2980B9
;
font-weight
:
400
;
font-size
:
1.1em
}
.result_title
a
:visited
{
color
:
#8E44AD
}
.cache_link
{
font-size
:
10px
!important
}
.result
h3
{
font-size
:
1em
;
margin
:
5px
0
1px
;
padding
:
0
}
.result
.content
,
.result
.url
,
.small_font
{
font-size
:
.8em
}
.result
.content
{
margin
:
0
;
padding
:
0
;
max-width
:
54em
;
line-height
:
1.24
}
.result
.content
img
{
float
:
left
;
margin-right
:
5px
;
max-width
:
200px
;
max-height
:
100px
}
.result
.url
{
margin
:
0
0
3px
;
padding
:
0
;
max-width
:
54em
;
color
:
#C0392B
}
.result
.published_date
{
font-size
:
.8em
;
color
:
#888
;
Margin
:
5px
20px
}
.result
.thumbnail
{
width
:
400px
}
.engines
{
color
:
#888
}
.small
p
{
margin
:
2px
0
}
.right
{
float
:
right
}
.invisible
{
display
:
none
}
.left
{
float
:
left
}
.highlight
{
color
:
#094089
}
.content
.highlight
{
color
:
#000
}
.image_result
{
display
:
inline-block
;
margin
:
10px
;
position
:
relative
;
max-height
:
160px
}
.image_result
img
{
border
:
0
;
max-height
:
160px
}
.image_result
p
{
margin
:
0
;
padding
:
0
}
.image_result
p
span
a
{
display
:
none
;
color
:
#FFF
}
.image_result
p
:hover
span
a
{
display
:
block
;
position
:
absolute
;
bottom
:
0
;
right
:
0
;
padding
:
4px
;
background-color
:
rgba
(
0
,
0
,
0
,
.6
);
font-size
:
.7em
}
#categories_container
,
.percentage
{
position
:
relative
}
.torrent_result
{
border-left
:
10px
solid
#d3d3d3
;
padding-left
:
3px
}
.torrent_result
p
{
margin
:
3px
;
font-size
:
.8em
}
.torrent_result
a
{
color
:
#2980B9
}
.torrent_result
a
:visited
{
color
:
#8E44AD
}
.definition_result
{
border-left
:
10px
solid
gray
;
padding-left
:
3px
}
.percentage
{
width
:
300px
}
.percentage
div
{
background
:
#444
}
table
{
width
:
100%
}
.result-table
{
margin-bottom
:
10px
}
#infoboxes
,
#sidebar
{
margin
:
0
2px
5px
5px
;
padding
:
0
2px
2px
}
td
{
padding
:
0
4px
}
tr
:hover
{
background
:
#DDD
}
#results
{
margin
:
auto
auto
20px
;
padding
:
0
;
width
:
50em
}
#sidebar
{
position
:
fixed
;
bottom
:
10px
;
left
:
10px
;
width
:
14em
}
#answers
input
,
#infoboxes
input
,
#sidebar
input
,
#suggestions
input
{
padding
:
0
;
margin
:
3px
;
font-size
:
.8em
;
display
:
inline-block
;
background
:
0
0
;
color
:
#444
;
cursor
:
pointer
}
#suggestions
form
{
display
:
inline
}
#answers
,
#suggestions
{
margin-top
:
20px
;
max-width
:
45em
}
#suggestions-title
{
color
:
#888
}
#answers
{
border
:
2px
solid
#2980B9
;
padding
:
20px
}
#answers
form
,
#infoboxes
form
{
min-width
:
210px
}
#infoboxes
{
position
:
absolute
;
top
:
100px
;
right
:
20px
;
max-width
:
21em
}
#infoboxes
.infobox
{
margin
:
10px
0
;
border
:
1px
solid
#ddd
;
padding
:
5px
;
font-size
:
.8em
}
#infoboxes
.infobox
img
{
max-width
:
90%
;
max-heigt
:
12em
;
display
:
block
;
margin
:
5px
;
padding
:
5px
}
#infoboxes
.infobox
h2
{
margin
:
0
}
#apis
,
#search_url
{
margin-top
:
8px
}
#infoboxes
.infobox
table
{
table-layout
:
fixed
}
#infoboxes
.infobox
table
td
{
vertical-align
:
top
}
#infoboxes
.infobox
input
{
font-size
:
1em
}
#search_url
input
{
border
:
1px
solid
#888
;
padding
:
4px
;
color
:
#444
;
width
:
14em
;
display
:
block
;
margin
:
4px
;
font-size
:
.8em
}
#preferences
{
top
:
10px
;
padding
:
0
;
border
:
0
;
background
:
url(../img/preference-icon.png)
no-repeat
;
background-size
:
28px
28px
;
opacity
:
.8
;
width
:
28px
;
height
:
30px
;
display
:
block
}
#preferences
*
{
display
:
none
}
@media
screen
and
(
max-width
:
50em
){
#results
{
margin
:
auto
;
padding
:
0
;
width
:
90%
}
.github
{
display
:
none
}
.checkbox_container
{
display
:
block
;
width
:
90%
}
.checkbox_container
label
{
border-bottom
:
0
}
.preferences_container
{
display
:
none
;
postion
:
fixed
!important
;
top
:
100px
;
right
:
0
}}
@media
screen
and
(
max-width
:
75em
){
div
.title
h1
{
font-size
:
1em
}
html
.touch
#categories
{
width
:
95%
;
height
:
30px
;
text-align
:
left
;
overflow-x
:
scroll
;
overflow-y
:
hidden
;
-webkit-overflow-scrolling
:
touch
}
html
.touch
#categories
#categories_container
{
width
:
1000px
;
width
:
-moz-max-content
;
width
:
-webkit-max-content
;
width
:
max-content
}
html
.touch
#categories
#categories_container
.checkbox_container
{
display
:
inline-block
;
width
:
auto
}
#answers
,
#suggestions
{
margin-top
:
5px
}
#infoboxes
{
position
:
inherit
;
max-width
:
inherit
}
#infoboxes
.infobox
{
clear
:
both
}
#infoboxes
.infobox
img
{
float
:
left
;
max-width
:
10em
}
#categories
{
font-size
:
90%
;
clear
:
both
}
#categories
.checkbox_container
{
margin
:
auto
}
#sidebar
{
position
:
static
;
max-width
:
50em
;
margin
:
0
0
2px
;
padding
:
0
;
float
:
none
;
border
:
none
;
width
:
auto
}
#sidebar
input
{
border
:
0
}
#apis
,
#search_url
{
display
:
none
}
.result
{
border-top
:
1px
solid
#E8E7E6
;
margin
:
8px
0
}
.image_result
,
.image_result
img
,
.result
.thumbnail
{
max-width
:
98%
}}
.favicon
{
float
:
left
;
margin-right
:
4px
;
margin-top
:
2px
}
.preferences_back
{
background
:
#3498DB
;
border
:
0
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
cursor
:
pointer
;
display
:
inline-block
;
margin
:
2px
4px
;
padding
:
4px
6px
}
.preferences_back
a
{
color
:
#FFF
}
.hidden
{
opacity
:
0
;
overflow
:
hidden
;
font-size
:
.8em
;
position
:
absolute
;
bottom
:
-20px
;
width
:
100%
;
text-position
:
center
;
background
:
#fff
;
transition
:
opacity
1s
ease
}
#categories_container
:hover
.hidden
{
transition
:
opacity
1s
ease
;
opacity
:
.8
}
\ No newline at end of file
\ No newline at end of file
searx/static/themes/legacy/less/style.less
View file @
12f42d15
...
@@ -376,6 +376,10 @@ table {
...
@@ -376,6 +376,10 @@ table {
width: 100%;
width: 100%;
}
}
.result-table {
margin-bottom: 10px;
}
td {
td {
padding: 0 4px;
padding: 0 4px;
}
}
...
...
searx/templates/courgette/result_templates/key-value.html
0 → 100644
View file @
12f42d15
<div
class=
"result"
>
<table>
{% for key, value in result.items() %}
{% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions'] %}
{% continue %}
{% endif %}
<tr>
<td><b>
{{ key|upper }}
</b>
: {{ value|safe }}
</td>
</tr>
{% endfor %}
</table>
<p
class=
"engines"
>
{{ result.engines|join(', ') }}
</p>
</div>
searx/templates/legacy/result_templates/key-value.html
0 → 100644
View file @
12f42d15
<table
class=
"result-table"
>
{% for key, value in result.items() %}
{% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions'] %}
{% continue %}
{% endif %}
<tr>
<td><b>
{{ key|upper }}
</b>
: {{ value|safe }}
</td>
</tr>
{% endfor %}
<tr>
<td><b>
ENGINES
</b>
: {{ result.engines|join(', ') }}
</td>
</tr>
</table>
searx/templates/oscar/macros.html
View file @
12f42d15
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
<!-- Draw result header -->
<!-- Draw result header -->
{% macro result_header(result, favicons) -%}
{% macro result_header(result, favicons) -%}
<h4
class=
"result_header"
>
{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{
{ result_link(result.url, result.title|safe) }
}
</h4>
<h4
class=
"result_header"
>
{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{
% if result.url %}{{ result_link(result.url, result.title|safe) }}{% else %}{{ result.title|safe}}{% endif %
}
</h4>
{%- endmacro %}
{%- endmacro %}
<!-- Draw result sub header -->
<!-- Draw result sub header -->
...
@@ -31,12 +31,16 @@
...
@@ -31,12 +31,16 @@
{% for engine in result.engines %}
{% for engine in result.engines %}
<span
class=
"label label-default"
>
{{ engine }}
</span>
<span
class=
"label label-default"
>
{{ engine }}
</span>
{% endfor %}
{% endfor %}
{% if result.url %}
<small>
{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}
</small>
<small>
{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}
</small>
{% endif %}
{% if proxify %}
{% if proxify %}
<small>
{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}
</small>
<small>
{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}
</small>
{% endif %}
{% endif %}
</div>
</div>
{% if result.pretty_url %}
<div
class=
"external-link"
>
{{ result.pretty_url }}
</div>
<div
class=
"external-link"
>
{{ result.pretty_url }}
</div>
{% endif %}
{%- endmacro %}
{%- endmacro %}
<!-- Draw result footer -->
<!-- Draw result footer -->
...
@@ -45,11 +49,15 @@
...
@@ -45,11 +49,15 @@
{% for engine in result.engines %}
{% for engine in result.engines %}
<span
class=
"label label-default"
>
{{ engine }}
</span>
<span
class=
"label label-default"
>
{{ engine }}
</span>
{% endfor %}
{% endfor %}
{% if result.url %}
<small>
{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}
</small>
<small>
{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}
</small>
{% endif %}
{% if proxify %}
{% if proxify %}
<small>
{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}
</small>
<small>
{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}
</small>
{% endif %}
{% endif %}
{% if result.pretty_url %}
<div
class=
"external-link"
>
{{ result.pretty_url }}
</div>
<div
class=
"external-link"
>
{{ result.pretty_url }}
</div>
{% endif %}
{%- endmacro %}
{%- endmacro %}
{% macro preferences_item_header(info, label, rtl) -%}
{% macro preferences_item_header(info, label, rtl) -%}
...
...
searx/templates/oscar/result_templates/key-value.html
0 → 100644
View file @
12f42d15
{% from 'oscar/macros.html' import result_footer, result_footer_rtl with context %}
<div
class=
"panel panel-default"
>
<table
class=
"table table-responsive table-bordered table-condensed"
>
{% for key, value in result.items() %}
{% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions'] %}
{% continue %}
{% endif %}
<tr>
<td><b>
{{ key|upper }}
</b>
: {{ value }}
</td>
</tr>
{% endfor %}
</table>
{% if rtl %}
{{ result_footer_rtl(result) }}
{% else %}
{{ result_footer(result) }}
{% endif %}
</div>
searx/templates/simple/result_templates/key-value.html
0 → 100644
View file @
12f42d15
<table>
{% for key, value in result.items() %}
{% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions'] %}
{% continue %}
{% endif %}
<tr>
<td><b>
{{ key|upper }}
</b>
: {{ value }}
</td>
</tr>
{% endfor %}
</table>
<div
class=
"engines"
>
{% for engine in result.engines %}
<span>
{{ engine }}
</span>
{% endfor %}
</div>
{{- '' -}}
searx/utils.py
View file @
12f42d15
...
@@ -435,3 +435,18 @@ def ecma_unescape(s):
...
@@ -435,3 +435,18 @@ def ecma_unescape(s):
# "%20" becomes " ", "%F3" becomes "ó"
# "%20" becomes " ", "%F3" becomes "ó"
s
=
ecma_unescape2_re
.
sub
(
lambda
e
:
unichr
(
int
(
e
.
group
(
1
),
16
)),
s
)
s
=
ecma_unescape2_re
.
sub
(
lambda
e
:
unichr
(
int
(
e
.
group
(
1
),
16
)),
s
)
return
s
return
s
def
get_engine_from_settings
(
name
):
"""Return engine configuration from settings.yml of a given engine name"""
if
'engines'
not
in
settings
:
return
{}
for
engine
in
settings
[
'engines'
]:
if
'name'
not
in
engine
:
continue
if
name
==
engine
[
'name'
]:
return
engine
return
{}
searx/webapp.py
View file @
12f42d15
...
@@ -124,6 +124,7 @@ app = Flask(
...
@@ -124,6 +124,7 @@ app = Flask(
app
.
jinja_env
.
trim_blocks
=
True
app
.
jinja_env
.
trim_blocks
=
True
app
.
jinja_env
.
lstrip_blocks
=
True
app
.
jinja_env
.
lstrip_blocks
=
True
app
.
jinja_env
.
add_extension
(
'jinja2.ext.loopcontrols'
)
app
.
secret_key
=
settings
[
'server'
][
'secret_key'
]
app
.
secret_key
=
settings
[
'server'
][
'secret_key'
]
if
not
searx_debug
\
if
not
searx_debug
\
...
@@ -538,14 +539,16 @@ def index():
...
@@ -538,14 +539,16 @@ def index():
if
output_format
==
'html'
:
if
output_format
==
'html'
:
if
'content'
in
result
and
result
[
'content'
]:
if
'content'
in
result
and
result
[
'content'
]:
result
[
'content'
]
=
highlight_content
(
escape
(
result
[
'content'
][:
1024
]),
search_query
.
query
)
result
[
'content'
]
=
highlight_content
(
escape
(
result
[
'content'
][:
1024
]),
search_query
.
query
)
result
[
'title'
]
=
highlight_content
(
escape
(
result
[
'title'
]
or
u''
),
search_query
.
query
)
if
'title'
in
result
and
result
[
'title'
]:
result
[
'title'
]
=
highlight_content
(
escape
(
result
[
'title'
]
or
u''
),
search_query
.
query
)
else
:
else
:
if
result
.
get
(
'content'
):
if
result
.
get
(
'content'
):
result
[
'content'
]
=
html_to_text
(
result
[
'content'
])
.
strip
()
result
[
'content'
]
=
html_to_text
(
result
[
'content'
])
.
strip
()
# removing html content and whitespace duplications
# removing html content and whitespace duplications
result
[
'title'
]
=
' '
.
join
(
html_to_text
(
result
[
'title'
])
.
strip
()
.
split
())
result
[
'title'
]
=
' '
.
join
(
html_to_text
(
result
[
'title'
])
.
strip
()
.
split
())
result
[
'pretty_url'
]
=
prettify_url
(
result
[
'url'
])
if
'url'
in
result
:
result
[
'pretty_url'
]
=
prettify_url
(
result
[
'url'
])
# TODO, check if timezone is calculated right
# TODO, check if timezone is calculated right
if
'publishedDate'
in
result
:
if
'publishedDate'
in
result
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment