Browse Source

Merge branch 'master' into patch-2

Adam Tauber 6 years ago
parent
commit
b75f1b6cc3
100 changed files with 3351 additions and 1499 deletions
  1. 1 1
      Dockerfile
  2. 2 0
      README.rst
  3. 5 3
      manage.sh
  4. 7 7
      requirements.txt
  5. 14 2
      searx/data/currencies.json
  6. 0 0
      searx/data/engines_languages.json
  7. 14 0
      searx/data/useragents.json
  8. 20 1
      searx/engines/__init__.py
  9. 75 0
      searx/engines/acgsou.py
  10. 2 2
      searx/engines/archlinux.py
  11. 1 1
      searx/engines/base.py
  12. 7 2
      searx/engines/bing.py
  13. 2 21
      searx/engines/bing_images.py
  14. 3 3
      searx/engines/bing_news.py
  15. 4 3
      searx/engines/bing_videos.py
  16. 5 9
      searx/engines/currency_convert.py
  17. 2 1
      searx/engines/dailymotion.py
  18. 20 31
      searx/engines/duckduckgo.py
  19. 4 3
      searx/engines/duckduckgo_definitions.py
  20. 4 1
      searx/engines/duckduckgo_images.py
  21. 115 0
      searx/engines/findx.py
  22. 2 0
      searx/engines/gigablast.py
  23. 15 19
      searx/engines/google.py
  24. 16 25
      searx/engines/google_images.py
  25. 6 4
      searx/engines/google_news.py
  26. 2 2
      searx/engines/nyaa.py
  27. 1 1
      searx/engines/piratebay.py
  28. 4 11
      searx/engines/qwant.py
  29. 3 5
      searx/engines/swisscows.py
  30. 10 9
      searx/engines/wikidata.py
  31. 2 7
      searx/engines/wikipedia.py
  32. 1 1
      searx/engines/xpath.py
  33. 12 12
      searx/engines/yahoo.py
  34. 5 2
      searx/engines/yahoo_news.py
  35. 16 24
      searx/languages.py
  36. 3 2
      searx/plugins/oa_doi_rewrite.py
  37. 0 4
      searx/preferences.py
  38. 18 7
      searx/query.py
  39. 7 2
      searx/search.py
  40. 31 5
      searx/settings.yml
  41. 3 0
      searx/static/plugins/css/infinite_scroll.css
  42. 0 0
      searx/static/themes/oscar/css/logicodev-dark.min.css
  43. 0 0
      searx/static/themes/oscar/css/logicodev.min.css
  44. 0 0
      searx/static/themes/oscar/css/pointhi.min.css
  45. BIN
      searx/static/themes/oscar/img/icons/youtube.png
  46. 1 0
      searx/static/themes/oscar/less/logicodev/search.less
  47. 1 0
      searx/static/themes/oscar/less/pointhi/search.less
  48. 264 137
      searx/static/themes/simple/css/searx-rtl.css
  49. 0 0
      searx/static/themes/simple/css/searx-rtl.min.css
  50. 264 137
      searx/static/themes/simple/css/searx.css
  51. 0 0
      searx/static/themes/simple/css/searx.min.css
  52. 10 5
      searx/static/themes/simple/fonts/ion.css
  53. BIN
      searx/static/themes/simple/fonts/ion.eot
  54. 12 5
      searx/static/themes/simple/fonts/ion.html
  55. 36 34
      searx/static/themes/simple/fonts/ion.svg
  56. BIN
      searx/static/themes/simple/fonts/ion.ttf
  57. BIN
      searx/static/themes/simple/fonts/ion.woff
  58. BIN
      searx/static/themes/simple/fonts/ion.woff2
  59. 7 2
      searx/static/themes/simple/gruntfile.js
  60. BIN
      searx/static/themes/simple/img/loader.gif
  61. 70 31
      searx/static/themes/simple/js/searx.js
  62. 1 1
      searx/static/themes/simple/js/searx.min.js
  63. 0 0
      searx/static/themes/simple/js/searx.min.js.map
  64. 10 1
      searx/static/themes/simple/js/searx_src/00_searx_toolkit.js
  65. 34 28
      searx/static/themes/simple/js/searx_src/searx_keyboard.js
  66. 3 2
      searx/static/themes/simple/js/searx_src/searx_mapresult.js
  67. 23 0
      searx/static/themes/simple/js/searx_src/searx_search.js
  68. BIN
      searx/static/themes/simple/leaflet/images/marker-icon-2x.png
  69. 636 624
      searx/static/themes/simple/leaflet/leaflet.css
  70. 0 4
      searx/static/themes/simple/leaflet/leaflet.js
  71. 0 0
      searx/static/themes/simple/less/#toolkit_loader.less#
  72. 1 0
      searx/static/themes/simple/less/.#toolkit_loader.less
  73. 12 5
      searx/static/themes/simple/less/ion.less
  74. 1 1
      searx/static/themes/simple/less/mixins.less
  75. 23 129
      searx/static/themes/simple/less/normalize.less
  76. 25 0
      searx/static/themes/simple/less/preferences.less
  77. 33 1
      searx/static/themes/simple/less/search.less
  78. 29 17
      searx/static/themes/simple/less/style.less
  79. 128 6
      searx/static/themes/simple/less/toolkit.less
  80. 41 0
      searx/static/themes/simple/less/toolkit_loader.less
  81. 5 5
      searx/static/themes/simple/package.json
  82. 2 2
      searx/templates/oscar/preferences.html
  83. 49 3
      searx/templates/simple/preferences.html
  84. 6 9
      searx/templates/simple/result_templates/map.html
  85. 19 12
      searx/templates/simple/results.html
  86. 1 0
      searx/templates/simple/search.html
  87. BIN
      searx/translations/ar/LC_MESSAGES/messages.mo
  88. 2 2
      searx/translations/ar/LC_MESSAGES/messages.po
  89. BIN
      searx/translations/da/LC_MESSAGES/messages.mo
  90. 23 22
      searx/translations/da/LC_MESSAGES/messages.po
  91. BIN
      searx/translations/fil/LC_MESSAGES/messages.mo
  92. 3 3
      searx/translations/fil/LC_MESSAGES/messages.po
  93. BIN
      searx/translations/pl/LC_MESSAGES/messages.mo
  94. 1014 0
      searx/translations/pl/LC_MESSAGES/messages.po
  95. BIN
      searx/translations/pt_BR/LC_MESSAGES/messages.mo
  96. 5 5
      searx/translations/pt_BR/LC_MESSAGES/messages.po
  97. BIN
      searx/translations/ru/LC_MESSAGES/messages.mo
  98. 7 6
      searx/translations/ru/LC_MESSAGES/messages.po
  99. 70 19
      searx/utils.py
  100. 16 8
      searx/webapp.py

+ 1 - 1
Dockerfile

@@ -1,4 +1,4 @@
-FROM alpine:3.6
+FROM alpine:3.7
 LABEL maintainer="searx <https://github.com/asciimoo/searx>"
 LABEL maintainer="searx <https://github.com/asciimoo/searx>"
 LABEL description="A privacy-respecting, hackable metasearch engine."
 LABEL description="A privacy-respecting, hackable metasearch engine."
 
 

+ 2 - 0
README.rst

@@ -4,6 +4,8 @@ searx
 A privacy-respecting, hackable `metasearch
 A privacy-respecting, hackable `metasearch
 engine <https://en.wikipedia.org/wiki/Metasearch_engine>`__.
 engine <https://en.wikipedia.org/wiki/Metasearch_engine>`__.
 
 
+Pronunciation: səːks
+
 List of `running
 List of `running
 instances <https://github.com/asciimoo/searx/wiki/Searx-instances>`__.
 instances <https://github.com/asciimoo/searx/wiki/Searx-instances>`__.
 
 

+ 5 - 3
manage.sh

@@ -1,15 +1,17 @@
 #!/bin/sh
 #!/bin/sh
 
 
 BASE_DIR="$(dirname -- "`readlink -f -- "$0"`")"
 BASE_DIR="$(dirname -- "`readlink -f -- "$0"`")"
-export PATH="$BASE_DIR/node_modules/.bin":$PATH
+
+cd -- "$BASE_DIR"
+set -e
+
+export PATH="$(npm bin)":$PATH
 
 
 # subshell
 # subshell
 PYTHONPATH="$BASE_DIR"
 PYTHONPATH="$BASE_DIR"
 SEARX_DIR="$BASE_DIR/searx"
 SEARX_DIR="$BASE_DIR/searx"
 ACTION="$1"
 ACTION="$1"
 
 
-cd -- "$BASE_DIR"
-set -e
 
 
 #
 #
 # Python
 # Python

+ 7 - 7
requirements.txt

@@ -1,10 +1,10 @@
 certifi==2017.11.5
 certifi==2017.11.5
-flask==0.12.2
+flask==1.0.2
 flask-babel==0.11.2
 flask-babel==0.11.2
-lxml==4.1.1
+lxml==4.2.3
-idna==2.5
+idna==2.7
 pygments==2.1.3
 pygments==2.1.3
-pyopenssl==17.4.0
+pyopenssl==18.0.0
-python-dateutil==2.6.1
+python-dateutil==2.7.3
-pyyaml==3.12
+pyyaml==3.13
-requests[socks]==2.18.4
+requests[socks]==2.19.1

+ 14 - 2
searx/data/currencies.json

@@ -6163,9 +6163,21 @@
         ], 
         ], 
         "scellino keniota": [
         "scellino keniota": [
             "KES"
             "KES"
-        ]
+        ],
+	"bitcoin": [
+		"XBT"
+	]	
     }, 
     }, 
     "iso4217": {
     "iso4217": {
+	"XBT":{
+	    "fr": "Bitcoin", 
+            "en": "Bitcoin", 
+            "nl": "Bitcoin", 
+            "de": "Bitcoin", 
+            "it": "Bitcoin", 
+            "hu": "Bitcoin", 
+            "es": "Bitcoin"
+	},	
         "DZD": {
         "DZD": {
             "fr": "Dinar alg\u00e9rien", 
             "fr": "Dinar alg\u00e9rien", 
             "en": "Algerian dinar", 
             "en": "Algerian dinar", 
@@ -7652,4 +7664,4 @@
             "es": "Libra sudanesa"
             "es": "Libra sudanesa"
         }
         }
     }
     }
-}
+}

File diff suppressed because it is too large
+ 0 - 0
searx/data/engines_languages.json


+ 14 - 0
searx/data/useragents.json

@@ -0,0 +1,14 @@
+{
+    "ua": "Mozilla/5.0 ({os}; rv:{version}) Gecko/20100101 Firefox/{version}",
+    "versions": [
+        "61.0.1",
+        "61.0",
+        "60.0.2",
+        "60.0.1",
+        "60.0"
+    ],
+    "os": [
+        "Windows NT 10; WOW64",
+        "X11; Linux x86_64"
+    ]
+}

+ 20 - 1
searx/engines/__init__.py

@@ -20,13 +20,14 @@ import sys
 import threading
 import threading
 from os.path import realpath, dirname
 from os.path import realpath, dirname
 from io import open
 from io import open
+from babel.localedata import locale_identifiers
 from flask_babel import gettext
 from flask_babel import gettext
 from operator import itemgetter
 from operator import itemgetter
 from json import loads
 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
+from searx.utils import load_module, match_language
 
 
 
 
 logger = logger.getChild('engines')
 logger = logger.getChild('engines')
@@ -38,6 +39,8 @@ engines = {}
 categories = {'general': []}
 categories = {'general': []}
 
 
 languages = loads(open(engine_dir + '/../data/engines_languages.json', 'r', encoding='utf-8').read())
 languages = loads(open(engine_dir + '/../data/engines_languages.json', 'r', encoding='utf-8').read())
+babel_langs = [lang_parts[0] + '-' + lang_parts[-1] if len(lang_parts) > 1 else lang_parts[0]
+               for lang_parts in (lang_code.split('_') for lang_code in locale_identifiers())]
 
 
 engine_shortcuts = {}
 engine_shortcuts = {}
 engine_default_args = {'paging': False,
 engine_default_args = {'paging': False,
@@ -97,6 +100,22 @@ def load_engine(engine_data):
     if engine_data['name'] in languages:
     if engine_data['name'] in languages:
         setattr(engine, 'supported_languages', languages[engine_data['name']])
         setattr(engine, 'supported_languages', languages[engine_data['name']])
 
 
+    # find custom aliases for non standard language codes
+    if hasattr(engine, 'supported_languages'):
+        if hasattr(engine, 'language_aliases'):
+            language_aliases = getattr(engine, 'language_aliases')
+        else:
+            language_aliases = {}
+
+        for engine_lang in getattr(engine, 'supported_languages'):
+            iso_lang = match_language(engine_lang, babel_langs, fallback=None)
+            if iso_lang and iso_lang != engine_lang and not engine_lang.startswith(iso_lang) and \
+               iso_lang not in getattr(engine, 'supported_languages'):
+                language_aliases[iso_lang] = engine_lang
+
+        if language_aliases:
+            setattr(engine, 'language_aliases', language_aliases)
+
     # assign language fetching method if auxiliary method exists
     # assign language fetching method if auxiliary method exists
     if hasattr(engine, '_fetch_supported_languages'):
     if hasattr(engine, '_fetch_supported_languages'):
         setattr(engine, 'fetch_supported_languages',
         setattr(engine, 'fetch_supported_languages',

+ 75 - 0
searx/engines/acgsou.py

@@ -0,0 +1,75 @@
+"""
+ Acgsou (Japanese Animation/Music/Comics Bittorrent tracker)
+
+ @website      https://www.acgsou.com/
+ @provide-api  no
+ @using-api    no
+ @results      HTML
+ @stable       no (HTML can change)
+ @parse        url, title, content, seed, leech, torrentfile
+"""
+
+from lxml import html
+from searx.engines.xpath import extract_text
+from searx.url_utils import urlencode
+from searx.utils import get_torrent_size, int_or_zero
+
+# engine dependent config
+categories = ['files', 'images', 'videos', 'music']
+paging = True
+
+# search-url
+base_url = 'http://www.acgsou.com/'
+search_url = base_url + 'search.php?{query}&page={offset}'
+# xpath queries
+xpath_results = '//table[contains(@class, "list_style table_fixed")]//tr[not(th)]'
+xpath_category = './/td[2]/a[1]'
+xpath_title = './/td[3]/a[last()]'
+xpath_torrent_links = './/td[3]/a'
+xpath_filesize = './/td[4]/text()'
+
+
+def request(query, params):
+    query = urlencode({'keyword': query})
+    params['url'] = search_url.format(query=query, offset=params['pageno'])
+    return params
+
+
+def response(resp):
+    results = []
+    dom = html.fromstring(resp.text)
+    for result in dom.xpath(xpath_results):
+        # defaults
+        filesize = 0
+        magnet_link = "magnet:?xt=urn:btih:{}&tr=http://tracker.acgsou.com:2710/announce"
+        torrent_link = ""
+
+        try:
+            category = extract_text(result.xpath(xpath_category)[0])
+        except:
+            pass
+
+        page_a = result.xpath(xpath_title)[0]
+        title = extract_text(page_a)
+        href = base_url + page_a.attrib.get('href')
+
+        magnet_link = magnet_link.format(page_a.attrib.get('href')[5:-5])
+
+        try:
+            filesize_info = result.xpath(xpath_filesize)[0]
+            filesize = filesize_info[:-2]
+            filesize_multiplier = filesize_info[-2:]
+            filesize = get_torrent_size(filesize, filesize_multiplier)
+        except:
+            pass
+        # I didn't add download/seed/leech count since as I figured out they are generated randomly everytime
+        content = u'Category: "{category}".'
+        content = content.format(category=category)
+
+        results.append({'url': href,
+                        'title': title,
+                        'content': content,
+                        'filesize': filesize,
+                        'magnetlink': magnet_link,
+                        'template': 'torrent.html'})
+    return results

+ 2 - 2
searx/engines/archlinux.py

@@ -99,13 +99,13 @@ supported_languages = dict(lang_urls, **main_langs)
 
 
 # do search-request
 # do search-request
 def request(query, params):
 def request(query, params):
-    # translate the locale (e.g. 'en_US') to language code ('en')
+    # translate the locale (e.g. 'en-US') to language code ('en')
     language = locale_to_lang_code(params['language'])
     language = locale_to_lang_code(params['language'])
 
 
     # if our language is hosted on the main site, we need to add its name
     # if our language is hosted on the main site, we need to add its name
     # to the query in order to narrow the results to that language
     # to the query in order to narrow the results to that language
     if language in main_langs:
     if language in main_langs:
-        query += '(' + main_langs[language] + ')'
+        query += b' (' + main_langs[language] + b')'
 
 
     # prepare the request parameters
     # prepare the request parameters
     query = urlencode({'search': query})
     query = urlencode({'search': query})

+ 1 - 1
searx/engines/base.py

@@ -55,7 +55,7 @@ shorcut_dict = {
 def request(query, params):
 def request(query, params):
     # replace shortcuts with API advanced search keywords
     # replace shortcuts with API advanced search keywords
     for key in shorcut_dict.keys():
     for key in shorcut_dict.keys():
-        query = re.sub(str(key), str(shorcut_dict[key]), query)
+        query = re.sub(key, shorcut_dict[key], str(query))
 
 
     # basic search
     # basic search
     offset = (params['pageno'] - 1) * number_of_results
     offset = (params['pageno'] - 1) * number_of_results

+ 7 - 2
searx/engines/bing.py

@@ -16,12 +16,14 @@
 from lxml import html
 from lxml import html
 from searx.engines.xpath import extract_text
 from searx.engines.xpath import extract_text
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
+from searx.utils import match_language, gen_useragent
 
 
 # engine dependent config
 # engine dependent config
 categories = ['general']
 categories = ['general']
 paging = True
 paging = True
 language_support = True
 language_support = True
 supported_languages_url = 'https://www.bing.com/account/general'
 supported_languages_url = 'https://www.bing.com/account/general'
+language_aliases = {'zh-CN': 'zh-CHS', 'zh-TW': 'zh-CHT', 'zh-HK': 'zh-CHT'}
 
 
 # search-url
 # search-url
 base_url = 'https://www.bing.com/'
 base_url = 'https://www.bing.com/'
@@ -32,15 +34,18 @@ search_string = 'search?{query}&first={offset}'
 def request(query, params):
 def request(query, params):
     offset = (params['pageno'] - 1) * 10 + 1
     offset = (params['pageno'] - 1) * 10 + 1
 
 
-    lang = params['language'].split('-')[0].upper()
+    lang = match_language(params['language'], supported_languages, language_aliases)
 
 
-    query = u'language:{} {}'.format(lang, query.decode('utf-8')).encode('utf-8')
+    query = u'language:{} {}'.format(lang.split('-')[0].upper(), query.decode('utf-8')).encode('utf-8')
 
 
     search_path = search_string.format(
     search_path = search_string.format(
         query=urlencode({'q': query}),
         query=urlencode({'q': query}),
         offset=offset)
         offset=offset)
 
 
     params['url'] = base_url + search_path
     params['url'] = base_url + search_path
+
+    params['headers']['User-Agent'] = gen_useragent('Windows NT 6.3; WOW64')
+
     return params
     return params
 
 
 
 

+ 2 - 21
searx/engines/bing_images.py

@@ -19,6 +19,7 @@ from lxml import html
 from json import loads
 from json import loads
 import re
 import re
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
+from searx.utils import match_language
 
 
 # engine dependent config
 # engine dependent config
 categories = ['images']
 categories = ['images']
@@ -46,26 +47,6 @@ safesearch_types = {2: 'STRICT',
 _quote_keys_regex = re.compile('({|,)([a-z][a-z0-9]*):(")', re.I | re.U)
 _quote_keys_regex = re.compile('({|,)([a-z][a-z0-9]*):(")', re.I | re.U)
 
 
 
 
-# get supported region code
-def get_region_code(lang, lang_list=None):
-    region = None
-    if lang in (lang_list or supported_languages):
-        region = lang
-    elif lang.startswith('no'):
-        region = 'nb-NO'
-    else:
-        # try to get a supported country code with language
-        lang = lang.split('-')[0]
-        for lc in (lang_list or supported_languages):
-            if lang == lc.split('-')[0]:
-                region = lc
-                break
-    if region:
-        return region.lower()
-    else:
-        return 'en-us'
-
-
 # do search-request
 # do search-request
 def request(query, params):
 def request(query, params):
     offset = (params['pageno'] - 1) * 10 + 1
     offset = (params['pageno'] - 1) * 10 + 1
@@ -74,7 +55,7 @@ def request(query, params):
         query=urlencode({'q': query}),
         query=urlencode({'q': query}),
         offset=offset)
         offset=offset)
 
 
-    language = get_region_code(params['language'])
+    language = match_language(params['language'], supported_languages).lower()
 
 
     params['cookies']['SRCHHPGUSR'] = \
     params['cookies']['SRCHHPGUSR'] = \
         'ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE')
         'ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE')

+ 3 - 3
searx/engines/bing_news.py

@@ -14,8 +14,8 @@
 from datetime import datetime
 from datetime import datetime
 from dateutil import parser
 from dateutil import parser
 from lxml import etree
 from lxml import etree
-from searx.utils import list_get
+from searx.utils import list_get, match_language
-from searx.engines.bing import _fetch_supported_languages, supported_languages_url
+from searx.engines.bing import _fetch_supported_languages, supported_languages_url, language_aliases
 from searx.url_utils import urlencode, urlparse, parse_qsl
 from searx.url_utils import urlencode, urlparse, parse_qsl
 
 
 # engine dependent config
 # engine dependent config
@@ -71,7 +71,7 @@ def request(query, params):
 
 
     offset = (params['pageno'] - 1) * 10 + 1
     offset = (params['pageno'] - 1) * 10 + 1
 
 
-    language = params['language']
+    language = match_language(params['language'], supported_languages, language_aliases)
 
 
     params['url'] = _get_url(query, language, offset, params['time_range'])
     params['url'] = _get_url(query, language, offset, params['time_range'])
 
 

+ 4 - 3
searx/engines/bing_videos.py

@@ -12,9 +12,10 @@
 
 
 from json import loads
 from json import loads
 from lxml import html
 from lxml import html
-from searx.engines.bing_images import _fetch_supported_languages, supported_languages_url, get_region_code
+from searx.engines.bing_images import _fetch_supported_languages, supported_languages_url
 from searx.engines.xpath import extract_text
 from searx.engines.xpath import extract_text
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
+from searx.utils import match_language
 
 
 
 
 categories = ['videos']
 categories = ['videos']
@@ -47,8 +48,8 @@ def request(query, params):
         'ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE')
         'ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE')
 
 
     # language cookie
     # language cookie
-    region = get_region_code(params['language'], lang_list=supported_languages)
+    language = match_language(params['language'], supported_languages).lower()
-    params['cookies']['_EDGE_S'] = 'mkt=' + region + '&F=1'
+    params['cookies']['_EDGE_S'] = 'mkt=' + language + '&F=1'
 
 
     # query and paging
     # query and paging
     params['url'] = search_url.format(query=urlencode({'q': query}),
     params['url'] = search_url.format(query=urlencode({'q': query}),

+ 5 - 9
searx/engines/currency_convert.py

@@ -11,7 +11,7 @@ if sys.version_info[0] == 3:
     unicode = str
     unicode = str
 
 
 categories = []
 categories = []
-url = 'https://finance.google.com/finance/converter?a=1&from={0}&to={1}'
+url = 'https://duckduckgo.com/js/spice/currency/1/{0}/{1}'
 weight = 100
 weight = 100
 
 
 parser_re = re.compile(b'.*?(\\d+(?:\\.\\d+)?) ([^.0-9]+) (?:in|to) ([^.0-9]+)', re.I)
 parser_re = re.compile(b'.*?(\\d+(?:\\.\\d+)?) ([^.0-9]+) (?:in|to) ([^.0-9]+)', re.I)
@@ -44,7 +44,6 @@ def request(query, params):
     if not m:
     if not m:
         # wrong query
         # wrong query
         return params
         return params
-
     amount, from_currency, to_currency = m.groups()
     amount, from_currency, to_currency = m.groups()
     amount = float(amount)
     amount = float(amount)
     from_currency = name_to_iso4217(from_currency.strip())
     from_currency = name_to_iso4217(from_currency.strip())
@@ -63,16 +62,13 @@ def request(query, params):
 
 
 
 
 def response(resp):
 def response(resp):
+    """remove first and last lines to get only json"""
+    json_resp = resp.text[resp.text.find('\n') + 1:resp.text.rfind('\n') - 2]
     results = []
     results = []
-    pat = '<span class=bld>(.+) {0}</span>'.format(
-        resp.search_params['to'].upper())
-
     try:
     try:
-        conversion_rate = re.findall(pat, resp.text)[0]
+        conversion_rate = float(json.loads(json_resp)['conversion']['converted-amount'])
-        conversion_rate = float(conversion_rate)
     except:
     except:
         return results
         return results
-
     answer = '{0} {1} = {2} {3}, 1 {1} ({5}) = {4} {3} ({6})'.format(
     answer = '{0} {1} = {2} {3}, 1 {1} ({5}) = {4} {3} ({6})'.format(
         resp.search_params['amount'],
         resp.search_params['amount'],
         resp.search_params['from'],
         resp.search_params['from'],
@@ -83,7 +79,7 @@ def response(resp):
         resp.search_params['to_name'],
         resp.search_params['to_name'],
     )
     )
 
 
-    url = 'https://finance.google.com/finance?q={0}{1}'.format(
+    url = 'https://duckduckgo.com/js/spice/currency/1/{0}/{1}'.format(
         resp.search_params['from'].upper(), resp.search_params['to'])
         resp.search_params['from'].upper(), resp.search_params['to'])
 
 
     results.append({'answer': answer, 'url': url})
     results.append({'answer': answer, 'url': url})

+ 2 - 1
searx/engines/dailymotion.py

@@ -15,6 +15,7 @@
 from json import loads
 from json import loads
 from datetime import datetime
 from datetime import datetime
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
+from searx.utils import match_language
 
 
 # engine dependent config
 # engine dependent config
 categories = ['videos']
 categories = ['videos']
@@ -32,7 +33,7 @@ supported_languages_url = 'https://api.dailymotion.com/languages'
 
 
 # do search-request
 # do search-request
 def request(query, params):
 def request(query, params):
-    locale = params['language']
+    locale = match_language(params['language'], supported_languages)
 
 
     params['url'] = search_url.format(
     params['url'] = search_url.format(
         query=urlencode({'search': query, 'localization': locale}),
         query=urlencode({'search': query, 'localization': locale}),

+ 20 - 31
searx/engines/duckduckgo.py

@@ -18,16 +18,27 @@ from json import loads
 from searx.engines.xpath import extract_text
 from searx.engines.xpath import extract_text
 from searx.poolrequests import get
 from searx.poolrequests import get
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
+from searx.utils import match_language
 
 
 # engine dependent config
 # engine dependent config
 categories = ['general']
 categories = ['general']
 paging = True
 paging = True
 language_support = True
 language_support = True
-supported_languages_url = 'https://duckduckgo.com/d2030.js'
+supported_languages_url = 'https://duckduckgo.com/util/u172.js'
 time_range_support = True
 time_range_support = True
 
 
+language_aliases = {
+    'ar-SA': 'ar-XA',
+    'es-419': 'es-XL',
+    'ja': 'jp-JP',
+    'ko': 'kr-KR',
+    'sl-SI': 'sl-SL',
+    'zh-TW': 'tzh-TW',
+    'zh-HK': 'tzh-HK'
+}
+
 # search-url
 # search-url
-url = 'https://duckduckgo.com/html?{query}&s={offset}&api=/d.js&o=json&dc={dc_param}'
+url = 'https://duckduckgo.com/html?{query}&s={offset}&dc={dc_param}'
 time_range_url = '&df={range}'
 time_range_url = '&df={range}'
 
 
 time_range_dict = {'day': 'd',
 time_range_dict = {'day': 'd',
@@ -42,34 +53,12 @@ content_xpath = './/a[@class="result__snippet"]'
 
 
 
 
 # match query's language to a region code that duckduckgo will accept
 # match query's language to a region code that duckduckgo will accept
-def get_region_code(lang, lang_list=None):
+def get_region_code(lang, lang_list=[]):
-    # custom fixes for languages
+    lang_code = match_language(lang, lang_list, language_aliases, 'wt-WT')
-    if lang[:2] == 'ja':
+    lang_parts = lang_code.split('-')
-        region_code = 'jp-jp'
+
-    elif lang[:2] == 'sl':
+    # country code goes first
-        region_code = 'sl-sl'
+    return lang_parts[1].lower() + '-' + lang_parts[0].lower()
-    elif lang == 'zh-TW':
-        region_code = 'tw-tzh'
-    elif lang == 'zh-HK':
-        region_code = 'hk-tzh'
-    elif lang[-2:] == 'SA':
-        region_code = 'xa-' + lang.split('-')[0]
-    elif lang[-2:] == 'GB':
-        region_code = 'uk-' + lang.split('-')[0]
-    else:
-        region_code = lang.split('-')
-        if len(region_code) == 2:
-            # country code goes first
-            region_code = region_code[1].lower() + '-' + region_code[0].lower()
-        else:
-            # tries to get a country code from language
-            region_code = region_code[0].lower()
-            for lc in (lang_list or supported_languages):
-                lc = lc.split('-')
-                if region_code == lc[0]:
-                    region_code = lc[1].lower() + '-' + lc[0].lower()
-                    break
-    return region_code
 
 
 
 
 # do search-request
 # do search-request
@@ -79,7 +68,7 @@ def request(query, params):
 
 
     offset = (params['pageno'] - 1) * 30
     offset = (params['pageno'] - 1) * 30
 
 
-    region_code = get_region_code(params['language'])
+    region_code = get_region_code(params['language'], supported_languages)
     params['url'] = url.format(
     params['url'] = url.format(
         query=urlencode({'q': query, 'kl': region_code}), offset=offset, dc_param=offset)
         query=urlencode({'q': query, 'kl': region_code}), offset=offset, dc_param=offset)
 
 

+ 4 - 3
searx/engines/duckduckgo_definitions.py

@@ -2,9 +2,9 @@ import json
 from lxml import html
 from lxml import html
 from re import compile
 from re import compile
 from searx.engines.xpath import extract_text
 from searx.engines.xpath import extract_text
-from searx.engines.duckduckgo import _fetch_supported_languages, supported_languages_url
+from searx.engines.duckduckgo import _fetch_supported_languages, supported_languages_url, language_aliases
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
-from searx.utils import html_to_text
+from searx.utils import html_to_text, match_language
 
 
 url = 'https://api.duckduckgo.com/'\
 url = 'https://api.duckduckgo.com/'\
     + '?{query}&format=json&pretty=0&no_redirect=1&d=1'
     + '?{query}&format=json&pretty=0&no_redirect=1&d=1'
@@ -24,7 +24,8 @@ def result_to_text(url, text, htmlResult):
 
 
 def request(query, params):
 def request(query, params):
     params['url'] = url.format(query=urlencode({'q': query}))
     params['url'] = url.format(query=urlencode({'q': query}))
-    params['headers']['Accept-Language'] = params['language'].split('-')[0]
+    language = match_language(params['language'], supported_languages, language_aliases)
+    params['headers']['Accept-Language'] = language.split('-')[0]
     return params
     return params
 
 
 
 

+ 4 - 1
searx/engines/duckduckgo_images.py

@@ -15,7 +15,10 @@
 
 
 from json import loads
 from json import loads
 from searx.engines.xpath import extract_text
 from searx.engines.xpath import extract_text
-from searx.engines.duckduckgo import _fetch_supported_languages, supported_languages_url, get_region_code
+from searx.engines.duckduckgo import (
+    _fetch_supported_languages, supported_languages_url,
+    get_region_code, language_aliases
+)
 from searx.poolrequests import get
 from searx.poolrequests import get
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
 
 

+ 115 - 0
searx/engines/findx.py

@@ -0,0 +1,115 @@
+"""
+FindX (General, Images, Videos)
+
+@website     https://www.findx.com
+@provide-api no
+@using-api   no
+@results     HTML
+@stable      no
+@parse       url, title, content, embedded, img_src, thumbnail_src
+"""
+
+from dateutil import parser
+from json import loads
+import re
+
+from lxml import html
+
+from searx import logger
+from searx.engines.xpath import extract_text
+from searx.engines.youtube_noapi import base_youtube_url, embedded_url
+from searx.url_utils import urlencode
+
+
+paging = True
+results_xpath = '//script[@id="initial-state"]'
+search_url = 'https://www.findx.com/{category}?{q}'
+type_map = {
+    'none': 'web',
+    'general': 'web',
+    'images': 'images',
+    'videos': 'videos',
+}
+
+
+def request(query, params):
+    params['url'] = search_url.format(
+        category=type_map[params['category']],
+        q=urlencode({
+            'q': query,
+            'page': params['pageno']
+        })
+    )
+    return params
+
+
+def response(resp):
+    dom = html.fromstring(resp.text)
+    results_raw_json = dom.xpath(results_xpath)
+    results_json = loads(extract_text(results_raw_json))
+
+    if len(results_json['web']['results']) > 0:
+        return _general_results(results_json['web']['results']['webSearch']['results'])
+
+    if len(results_json['images']['results']) > 0:
+        return _images_results(results_json['images']['results'])
+
+    if len(results_json['video']['results']) > 0:
+        return _videos_results(results_json['video']['results'])
+
+    return []
+
+
+def _general_results(general_results):
+    results = []
+    for result in general_results:
+        results.append({
+            'url': result['url'],
+            'title': result['title'],
+            'content': result['sum'],
+        })
+    return results
+
+
+def _images_results(image_results):
+    results = []
+    for result in image_results:
+        results.append({
+            'url': result['sourceURL'],
+            'title': result['title'],
+            'content': result['source'],
+            'thumbnail_src': _extract_url(result['assets']['thumb']['url']),
+            'img_src': _extract_url(result['assets']['file']['url']),
+            'template': 'images.html',
+        })
+    return results
+
+
+def _videos_results(video_results):
+    results = []
+    for result in video_results:
+        if not result['kind'].startswith('youtube'):
+            logger.warn('Unknown video kind in findx: {}'.format(result['kind']))
+            continue
+
+        description = result['snippet']['description']
+        if len(description) > 300:
+            description = description[:300] + '...'
+
+        results.append({
+            'url': base_youtube_url + result['id'],
+            'title': result['snippet']['title'],
+            'content': description,
+            'thumbnail': _extract_url(result['snippet']['thumbnails']['default']['url']),
+            'publishedDate': parser.parse(result['snippet']['publishedAt']),
+            'embedded': embedded_url.format(videoid=result['id']),
+            'template': 'videos.html',
+        })
+    return results
+
+
+def _extract_url(url):
+    matching = re.search('(/https?://[^)]+)', url)
+    if matching:
+        return matching.group(0)[1:]
+    return ''

+ 2 - 0
searx/engines/gigablast.py

@@ -34,6 +34,7 @@ search_string = 'search?{query}'\
     '&qlang={lang}'\
     '&qlang={lang}'\
     '&ff={safesearch}'\
     '&ff={safesearch}'\
     '&rxiec={rxieu}'\
     '&rxiec={rxieu}'\
+    '&ulse={ulse}'\
     '&rand={rxikd}'  # current unix timestamp
     '&rand={rxikd}'  # current unix timestamp
 
 
 # specific xpath variables
 # specific xpath variables
@@ -64,6 +65,7 @@ def request(query, params):
                                        number_of_results=number_of_results,
                                        number_of_results=number_of_results,
                                        rxikd=int(time() * 1000),
                                        rxikd=int(time() * 1000),
                                        rxieu=random.randint(1000000000, 9999999999),
                                        rxieu=random.randint(1000000000, 9999999999),
+                                       ulse=random.randint(100000000, 999999999),
                                        lang=language,
                                        lang=language,
                                        safesearch=safesearch)
                                        safesearch=safesearch)
 
 

+ 15 - 19
searx/engines/google.py

@@ -14,6 +14,7 @@ from lxml import html, etree
 from searx.engines.xpath import extract_text, extract_url
 from searx.engines.xpath import extract_text, extract_url
 from searx import logger
 from searx import logger
 from searx.url_utils import urlencode, urlparse, parse_qsl
 from searx.url_utils import urlencode, urlparse, parse_qsl
+from searx.utils import match_language
 
 
 logger = logger.getChild('google engine')
 logger = logger.getChild('google engine')
 
 
@@ -72,7 +73,7 @@ country_to_hostname = {
     'RO': 'www.google.ro',  # Romania
     'RO': 'www.google.ro',  # Romania
     'RU': 'www.google.ru',  # Russia
     'RU': 'www.google.ru',  # Russia
     'SK': 'www.google.sk',  # Slovakia
     'SK': 'www.google.sk',  # Slovakia
-    'SL': 'www.google.si',  # Slovenia (SL -> si)
+    'SI': 'www.google.si',  # Slovenia
     'SE': 'www.google.se',  # Sweden
     'SE': 'www.google.se',  # Sweden
     'TH': 'www.google.co.th',  # Thailand
     'TH': 'www.google.co.th',  # Thailand
     'TR': 'www.google.com.tr',  # Turkey
     'TR': 'www.google.com.tr',  # Turkey
@@ -90,7 +91,7 @@ url_map = 'https://www.openstreetmap.org/'\
 search_path = '/search'
 search_path = '/search'
 search_url = ('https://{hostname}' +
 search_url = ('https://{hostname}' +
               search_path +
               search_path +
-              '?{query}&start={offset}&gws_rd=cr&gbv=1&lr={lang}&ei=x')
+              '?{query}&start={offset}&gws_rd=cr&gbv=1&lr={lang}&hl={lang_short}&ei=x')
 
 
 time_range_search = "&tbs=qdr:{range}"
 time_range_search = "&tbs=qdr:{range}"
 time_range_dict = {'day': 'd',
 time_range_dict = {'day': 'd',
@@ -165,22 +166,16 @@ def extract_text_from_dom(result, xpath):
 def request(query, params):
 def request(query, params):
     offset = (params['pageno'] - 1) * 10
     offset = (params['pageno'] - 1) * 10
 
 
-    # temporary fix until a way of supporting en-US is found
+    language = match_language(params['language'], supported_languages)
-    if params['language'] == 'en-US':
+    language_array = language.split('-')
-        params['language'] = 'en-GB'
+    if params['language'].find('-') > 0:
-
+        country = params['language'].split('-')[1]
-    if params['language'][:2] == 'jv':
+    elif len(language_array) == 2:
-        language = 'jw'
+        country = language_array[1]
-        country = 'ID'
-        url_lang = 'lang_jw'
     else:
     else:
-        language_array = params['language'].lower().split('-')
+        country = 'US'
-        if len(language_array) == 2:
+
-            country = language_array[1]
+    url_lang = 'lang_' + language
-        else:
-            country = 'US'
-        language = language_array[0] + ',' + language_array[0] + '-' + country
-        url_lang = 'lang_' + language_array[0]
 
 
     if use_locale_domain:
     if use_locale_domain:
         google_hostname = country_to_hostname.get(country.upper(), default_hostname)
         google_hostname = country_to_hostname.get(country.upper(), default_hostname)
@@ -192,11 +187,12 @@ def request(query, params):
     params['url'] = search_url.format(offset=offset,
     params['url'] = search_url.format(offset=offset,
                                       query=urlencode({'q': query}),
                                       query=urlencode({'q': query}),
                                       hostname=google_hostname,
                                       hostname=google_hostname,
-                                      lang=url_lang)
+                                      lang=url_lang,
+                                      lang_short=language)
     if params['time_range'] in time_range_dict:
     if params['time_range'] in time_range_dict:
         params['url'] += time_range_search.format(range=time_range_dict[params['time_range']])
         params['url'] += time_range_search.format(range=time_range_dict[params['time_range']])
 
 
-    params['headers']['Accept-Language'] = language
+    params['headers']['Accept-Language'] = language + ',' + language + '-' + country
     params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
     params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
 
 
     params['google_hostname'] = google_hostname
     params['google_hostname'] = google_hostname

+ 16 - 25
searx/engines/google_images.py

@@ -13,7 +13,7 @@
 from datetime import date, timedelta
 from datetime import date, timedelta
 from json import loads
 from json import loads
 from lxml import html
 from lxml import html
-from searx.url_utils import urlencode
+from searx.url_utils import urlencode, urlparse, parse_qs
 
 
 
 
 # engine dependent config
 # engine dependent config
@@ -25,10 +25,9 @@ number_of_results = 100
 
 
 search_url = 'https://www.google.com/search'\
 search_url = 'https://www.google.com/search'\
     '?{query}'\
     '?{query}'\
-    '&asearch=ichunk'\
-    '&async=_id:rg_s,_pms:s'\
     '&tbm=isch'\
     '&tbm=isch'\
-    '&yv=2'\
+    '&gbv=1'\
+    '&sa=G'\
     '&{search_options}'
     '&{search_options}'
 time_range_attr = "qdr:{range}"
 time_range_attr = "qdr:{range}"
 time_range_custom_attr = "cdr:1,cd_min:{start},cd_max{end}"
 time_range_custom_attr = "cdr:1,cd_min:{start},cd_max{end}"
@@ -66,30 +65,22 @@ def request(query, params):
 def response(resp):
 def response(resp):
     results = []
     results = []
 
 
-    g_result = loads(resp.text)
+    dom = html.fromstring(resp.text)
-
-    dom = html.fromstring(g_result[1][1])
 
 
     # parse results
     # parse results
-    for result in dom.xpath('//div[@data-ved]'):
+    for img in dom.xpath('//a'):
-
+        r = {
-        try:
+            'title': u' '.join(img.xpath('.//div[class="rg_ilmbg"]//text()')),
-            metadata = loads(''.join(result.xpath('./div[contains(@class, "rg_meta")]/text()')))
+            'content': '',
-        except:
+            'template': 'images.html',
-            continue
+        }
-
+        url = urlparse(img.xpath('.//@href')[0])
-        thumbnail_src = metadata['tu']
+        query = parse_qs(url.query)
-
+        r['url'] = query['imgrefurl'][0]
-        # http to https
+        r['img_src'] = query['imgurl'][0]
-        thumbnail_src = thumbnail_src.replace("http://", "https://")
+        r['thumbnail_src'] = r['img_src']
-
         # append result
         # append result
-        results.append({'url': metadata['ru'],
+        results.append(r)
-                        'title': metadata['pt'],
-                        'content': metadata['s'],
-                        'thumbnail_src': thumbnail_src,
-                        'img_src': metadata['ou'],
-                        'template': 'images.html'})
 
 
     # return results
     # return results
     return results
     return results

+ 6 - 4
searx/engines/google_news.py

@@ -13,6 +13,7 @@
 from lxml import html
 from lxml import html
 from searx.engines.google import _fetch_supported_languages, supported_languages_url
 from searx.engines.google import _fetch_supported_languages, supported_languages_url
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
+from searx.utils import match_language
 
 
 # search-url
 # search-url
 categories = ['news']
 categories = ['news']
@@ -50,8 +51,9 @@ def request(query, params):
     params['url'] = search_url.format(query=urlencode({'q': query}),
     params['url'] = search_url.format(query=urlencode({'q': query}),
                                       search_options=urlencode(search_options))
                                       search_options=urlencode(search_options))
 
 
-    language_array = params['language'].lower().split('-')
+    language = match_language(params['language'], supported_languages).split('-')[0]
-    params['url'] += '&lr=lang_' + language_array[0]
+    if language:
+        params['url'] += '&lr=lang_' + language
 
 
     return params
     return params
 
 
@@ -66,8 +68,8 @@ def response(resp):
     for result in dom.xpath('//div[@class="g"]|//div[@class="g _cy"]'):
     for result in dom.xpath('//div[@class="g"]|//div[@class="g _cy"]'):
         try:
         try:
             r = {
             r = {
-                'url': result.xpath('.//a[@class="l _PMs"]')[0].attrib.get("href"),
+                'url': result.xpath('.//a[@class="l lLrAF"]')[0].attrib.get("href"),
-                'title': ''.join(result.xpath('.//a[@class="l _PMs"]//text()')),
+                'title': ''.join(result.xpath('.//a[@class="l lLrAF"]//text()')),
                 'content': ''.join(result.xpath('.//div[@class="st"]//text()')),
                 'content': ''.join(result.xpath('.//div[@class="st"]//text()')),
             }
             }
         except:
         except:

+ 2 - 2
searx/engines/nyaa.py

@@ -1,7 +1,7 @@
 """
 """
  Nyaa.si (Anime Bittorrent tracker)
  Nyaa.si (Anime Bittorrent tracker)
 
 
- @website      http://www.nyaa.si/
+ @website      https://nyaa.si/
  @provide-api  no
  @provide-api  no
  @using-api    no
  @using-api    no
  @results      HTML
  @results      HTML
@@ -19,7 +19,7 @@ categories = ['files', 'images', 'videos', 'music']
 paging = True
 paging = True
 
 
 # search-url
 # search-url
-base_url = 'http://www.nyaa.si/'
+base_url = 'https://nyaa.si/'
 search_url = base_url + '?page=search&{query}&offset={offset}'
 search_url = base_url + '?page=search&{query}&offset={offset}'
 
 
 # xpath queries
 # xpath queries

+ 1 - 1
searx/engines/piratebay.py

@@ -18,7 +18,7 @@ categories = ['videos', 'music', 'files']
 paging = True
 paging = True
 
 
 # search-url
 # search-url
-url = 'https://thepiratebay.se/'
+url = 'https://thepiratebay.org/'
 search_url = url + 'search/{search_term}/{pageno}/99/{search_type}'
 search_url = url + 'search/{search_term}/{pageno}/99/{search_type}'
 
 
 # piratebay specific type-definitions
 # piratebay specific type-definitions

+ 4 - 11
searx/engines/qwant.py

@@ -14,6 +14,7 @@ from datetime import datetime
 from json import loads
 from json import loads
 from searx.utils import html_to_text
 from searx.utils import html_to_text
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
+from searx.utils import match_language
 
 
 # engine dependent config
 # engine dependent config
 categories = None
 categories = None
@@ -27,7 +28,7 @@ category_to_keyword = {'general': 'web',
                        'social media': 'social'}
                        'social media': 'social'}
 
 
 # search-url
 # search-url
-url = 'https://api.qwant.com/api/search/{keyword}?count=10&offset={offset}&f=&{query}'
+url = 'https://api.qwant.com/api/search/{keyword}?count=10&offset={offset}&f=&{query}&t={keyword}&uiv=4'
 
 
 
 
 # do search-request
 # do search-request
@@ -45,16 +46,8 @@ def request(query, params):
                                    offset=offset)
                                    offset=offset)
 
 
     # add language tag
     # add language tag
-    if params['language'] == 'no' or params['language'].startswith('no-'):
+    language = match_language(params['language'], supported_languages)
-        params['language'] = params['language'].replace('no', 'nb', 1)
+    params['url'] += '&locale=' + language.replace('-', '_').lower()
-    if params['language'].find('-') < 0:
-        # tries to get a country code from language
-        for lang in supported_languages:
-            lc = lang.split('-')
-            if params['language'] == lc[0]:
-                params['language'] = lang
-                break
-    params['url'] += '&locale=' + params['language'].replace('-', '_').lower()
 
 
     return params
     return params
 
 

+ 3 - 5
searx/engines/swisscows.py

@@ -14,6 +14,7 @@ from json import loads
 import re
 import re
 from lxml.html import fromstring
 from lxml.html import fromstring
 from searx.url_utils import unquote, urlencode
 from searx.url_utils import unquote, urlencode
+from searx.utils import match_language
 
 
 # engine dependent config
 # engine dependent config
 categories = ['general', 'images']
 categories = ['general', 'images']
@@ -35,11 +36,8 @@ regex_img_url_remove_start = re.compile(b'^https?://i\.swisscows\.ch/\?link=')
 
 
 # do search-request
 # do search-request
 def request(query, params):
 def request(query, params):
-    if params['language'].split('-')[0] == 'no':
+    region = match_language(params['language'], supported_languages)
-        region = 'nb-NO'
+    ui_language = region.split('-')[0]
-    else:
-        region = params['language']
-        ui_language = params['language'].split('-')[0]
 
 
     search_path = search_string.format(
     search_path = search_string.format(
         query=urlencode({'query': query, 'uiLanguage': ui_language, 'region': region}),
         query=urlencode({'query': query, 'uiLanguage': ui_language, 'region': region}),

+ 10 - 9
searx/engines/wikidata.py

@@ -16,6 +16,7 @@ from searx.poolrequests import get
 from searx.engines.xpath import extract_text
 from searx.engines.xpath import extract_text
 from searx.engines.wikipedia import _fetch_supported_languages, supported_languages_url
 from searx.engines.wikipedia import _fetch_supported_languages, supported_languages_url
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
+from searx.utils import match_language
 
 
 from json import loads
 from json import loads
 from lxml.html import fromstring
 from lxml.html import fromstring
@@ -26,7 +27,7 @@ result_count = 1
 # urls
 # urls
 wikidata_host = 'https://www.wikidata.org'
 wikidata_host = 'https://www.wikidata.org'
 url_search = wikidata_host \
 url_search = wikidata_host \
-    + '/wiki/Special:ItemDisambiguation?{query}'
+    + '/w/index.php?{query}'
 
 
 wikidata_api = wikidata_host + '/w/api.php'
 wikidata_api = wikidata_host + '/w/api.php'
 url_detail = wikidata_api\
 url_detail = wikidata_api\
@@ -39,7 +40,7 @@ url_map = 'https://www.openstreetmap.org/'\
 url_image = 'https://commons.wikimedia.org/wiki/Special:FilePath/{filename}?width=500&height=400'
 url_image = 'https://commons.wikimedia.org/wiki/Special:FilePath/{filename}?width=500&height=400'
 
 
 # xpaths
 # xpaths
-wikidata_ids_xpath = '//div/ul[@class="wikibase-disambiguation"]/li/a/@title'
+wikidata_ids_xpath = '//ul[@class="mw-search-results"]/li//a/@href'
 title_xpath = '//*[contains(@class,"wikibase-title-label")]'
 title_xpath = '//*[contains(@class,"wikibase-title-label")]'
 description_xpath = '//div[contains(@class,"wikibase-entitytermsview-heading-description")]'
 description_xpath = '//div[contains(@class,"wikibase-entitytermsview-heading-description")]'
 property_xpath = '//div[@id="{propertyid}"]'
 property_xpath = '//div[@id="{propertyid}"]'
@@ -53,25 +54,25 @@ value_xpath = './/div[contains(@class,"wikibase-statementview-mainsnak")]'\
     + '/*/div[contains(@class,"wikibase-snakview-value")]'
     + '/*/div[contains(@class,"wikibase-snakview-value")]'
 language_fallback_xpath = '//sup[contains(@class,"wb-language-fallback-indicator")]'
 language_fallback_xpath = '//sup[contains(@class,"wb-language-fallback-indicator")]'
 calendar_name_xpath = './/sup[contains(@class,"wb-calendar-name")]'
 calendar_name_xpath = './/sup[contains(@class,"wb-calendar-name")]'
+media_xpath = value_xpath + '//div[contains(@class,"commons-media-caption")]//a'
 
 
 
 
 def request(query, params):
 def request(query, params):
-    language = params['language'].split('-')[0]
-
     params['url'] = url_search.format(
     params['url'] = url_search.format(
-        query=urlencode({'label': query, 'language': language}))
+        query=urlencode({'search': query}))
     return params
     return params
 
 
 
 
 def response(resp):
 def response(resp):
     results = []
     results = []
     html = fromstring(resp.text)
     html = fromstring(resp.text)
-    wikidata_ids = html.xpath(wikidata_ids_xpath)
+    search_results = html.xpath(wikidata_ids_xpath)
 
 
-    language = resp.search_params['language'].split('-')[0]
+    language = match_language(resp.search_params['language'], supported_languages).split('-')[0]
 
 
     # TODO: make requests asynchronous to avoid timeout when result_count > 1
     # TODO: make requests asynchronous to avoid timeout when result_count > 1
-    for wikidata_id in wikidata_ids[:result_count]:
+    for search_result in search_results[:result_count]:
+        wikidata_id = search_result.split('/')[-1]
         url = url_detail.format(query=urlencode({'page': wikidata_id, 'uselang': language}))
         url = url_detail.format(query=urlencode({'page': wikidata_id, 'uselang': language}))
         htmlresponse = get(url)
         htmlresponse = get(url)
         jsonresponse = loads(htmlresponse.text)
         jsonresponse = loads(htmlresponse.text)
@@ -313,7 +314,7 @@ def add_image(result):
     for property_id in property_ids:
     for property_id in property_ids:
         image = result.xpath(property_xpath.replace('{propertyid}', property_id))
         image = result.xpath(property_xpath.replace('{propertyid}', property_id))
         if image:
         if image:
-            image_name = image[0].xpath(value_xpath)
+            image_name = image[0].xpath(media_xpath)
             image_src = url_image.replace('{filename}', extract_text(image_name[0]))
             image_src = url_image.replace('{filename}', extract_text(image_name[0]))
             return image_src
             return image_src
 
 

+ 2 - 7
searx/engines/wikipedia.py

@@ -13,6 +13,7 @@
 from json import loads
 from json import loads
 from lxml.html import fromstring
 from lxml.html import fromstring
 from searx.url_utils import quote, urlencode
 from searx.url_utils import quote, urlencode
+from searx.utils import match_language
 
 
 # search-url
 # search-url
 base_url = u'https://{language}.wikipedia.org/'
 base_url = u'https://{language}.wikipedia.org/'
@@ -30,13 +31,7 @@ supported_languages_url = 'https://meta.wikimedia.org/wiki/List_of_Wikipedias'
 
 
 # set language in base_url
 # set language in base_url
 def url_lang(lang):
 def url_lang(lang):
-    lang = lang.split('-')[0]
+    return match_language(lang, supported_languages).split('-')[0]
-    if lang not in supported_languages:
-        language = 'en'
-    else:
-        language = lang
-
-    return language
 
 
 
 
 # do search-request
 # do search-request

+ 1 - 1
searx/engines/xpath.py

@@ -53,7 +53,7 @@ def extract_url(xpath_results, search_url):
     if url.startswith('//'):
     if url.startswith('//'):
         # add http or https to this kind of url //example.com/
         # add http or https to this kind of url //example.com/
         parsed_search_url = urlparse(search_url)
         parsed_search_url = urlparse(search_url)
-        url = u'{0}:{1}'.format(parsed_search_url.scheme, url)
+        url = u'{0}:{1}'.format(parsed_search_url.scheme or 'http', url)
     elif url.startswith('/'):
     elif url.startswith('/'):
         # fix relative url to the search engine
         # fix relative url to the search engine
         url = urljoin(search_url, url)
         url = urljoin(search_url, url)

+ 12 - 12
searx/engines/yahoo.py

@@ -14,6 +14,7 @@
 from lxml import html
 from lxml import html
 from searx.engines.xpath import extract_text, extract_url
 from searx.engines.xpath import extract_text, extract_url
 from searx.url_utils import unquote, urlencode
 from searx.url_utils import unquote, urlencode
+from searx.utils import match_language
 
 
 # engine dependent config
 # engine dependent config
 categories = ['general']
 categories = ['general']
@@ -39,6 +40,8 @@ time_range_dict = {'day': ['1d', 'd'],
                    'week': ['1w', 'w'],
                    'week': ['1w', 'w'],
                    'month': ['1m', 'm']}
                    'month': ['1m', 'm']}
 
 
+language_aliases = {'zh-CN': 'zh-CHS', 'zh-TW': 'zh-CHT', 'zh-HK': 'zh-CHT'}
+
 
 
 # remove yahoo-specific tracking-url
 # remove yahoo-specific tracking-url
 def parse_url(url_string):
 def parse_url(url_string):
@@ -70,23 +73,16 @@ def _get_url(query, offset, language, time_range):
                                         lang=language)
                                         lang=language)
 
 
 
 
-def _get_language(params):
-    if params['language'][:2] == 'zh':
-        if params['language'] == 'zh' or params['language'] == 'zh-CH':
-            return 'szh'
-        else:
-            return 'tzh'
-    else:
-        return params['language'].split('-')[0]
-
-
 # do search-request
 # do search-request
 def request(query, params):
 def request(query, params):
     if params['time_range'] and params['time_range'] not in time_range_dict:
     if params['time_range'] and params['time_range'] not in time_range_dict:
         return params
         return params
 
 
     offset = (params['pageno'] - 1) * 10 + 1
     offset = (params['pageno'] - 1) * 10 + 1
-    language = _get_language(params)
+    language = match_language(params['language'], supported_languages, language_aliases)
+    if language not in language_aliases.values():
+        language = language.split('-')[0]
+    language = language.replace('-', '_').lower()
 
 
     params['url'] = _get_url(query, offset, language, params['time_range'])
     params['url'] = _get_url(query, offset, language, params['time_range'])
 
 
@@ -145,7 +141,11 @@ def _fetch_supported_languages(resp):
     dom = html.fromstring(resp.text)
     dom = html.fromstring(resp.text)
     options = dom.xpath('//div[@id="yschlang"]/span/label/input')
     options = dom.xpath('//div[@id="yschlang"]/span/label/input')
     for option in options:
     for option in options:
-        code = option.xpath('./@value')[0][5:].replace('_', '-')
+        code_parts = option.xpath('./@value')[0][5:].split('_')
+        if len(code_parts) == 2:
+            code = code_parts[0] + '-' + code_parts[1].upper()
+        else:
+            code = code_parts[0]
         supported_languages.append(code)
         supported_languages.append(code)
 
 
     return supported_languages
     return supported_languages

+ 5 - 2
searx/engines/yahoo_news.py

@@ -13,9 +13,12 @@ import re
 from datetime import datetime, timedelta
 from datetime import datetime, timedelta
 from lxml import html
 from lxml import html
 from searx.engines.xpath import extract_text, extract_url
 from searx.engines.xpath import extract_text, extract_url
-from searx.engines.yahoo import parse_url, _fetch_supported_languages, supported_languages_url
+from searx.engines.yahoo import (
+    parse_url, _fetch_supported_languages, supported_languages_url, language_aliases
+)
 from dateutil import parser
 from dateutil import parser
 from searx.url_utils import urlencode
 from searx.url_utils import urlencode
+from searx.utils import match_language
 
 
 # engine dependent config
 # engine dependent config
 categories = ['news']
 categories = ['news']
@@ -38,7 +41,7 @@ suggestion_xpath = '//div[contains(@class,"VerALSOTRY")]//a'
 def request(query, params):
 def request(query, params):
     offset = (params['pageno'] - 1) * 10 + 1
     offset = (params['pageno'] - 1) * 10 + 1
 
 
-    language = params['language'].split('-')[0]
+    language = match_language(params['language'], supported_languages, language_aliases).split('-')[0]
 
 
     params['url'] = search_url.format(offset=offset,
     params['url'] = search_url.format(offset=offset,
                                       query=urlencode({'p': query}),
                                       query=urlencode({'p': query}),

+ 16 - 24
searx/languages.py

@@ -5,11 +5,7 @@
 language_codes = (
 language_codes = (
     (u"ar-SA", u"العربية", u"", u"Arabic"),
     (u"ar-SA", u"العربية", u"", u"Arabic"),
     (u"bg-BG", u"Български", u"", u"Bulgarian"),
     (u"bg-BG", u"Български", u"", u"Bulgarian"),
-    (u"ca", u"Català", u"", u"Catalan"),
+    (u"ca-ES", u"Català", u"", u"Catalan"),
-    (u"ca-AD", u"Català", u"Andorra", u"Catalan"),
-    (u"ca-CT", u"Català", u"", u"Catalan"),
-    (u"ca-ES", u"Català", u"Espanya", u"Catalan"),
-    (u"ca-FR", u"Català", u"França", u"Catalan"),
     (u"cs-CZ", u"Čeština", u"", u"Czech"),
     (u"cs-CZ", u"Čeština", u"", u"Czech"),
     (u"da-DK", u"Dansk", u"", u"Danish"),
     (u"da-DK", u"Dansk", u"", u"Danish"),
     (u"de", u"Deutsch", u"", u"German"),
     (u"de", u"Deutsch", u"", u"German"),
@@ -21,55 +17,51 @@ language_codes = (
     (u"en-AU", u"English", u"Australia", u"English"),
     (u"en-AU", u"English", u"Australia", u"English"),
     (u"en-CA", u"English", u"Canada", u"English"),
     (u"en-CA", u"English", u"Canada", u"English"),
     (u"en-GB", u"English", u"United Kingdom", u"English"),
     (u"en-GB", u"English", u"United Kingdom", u"English"),
-    (u"en-ID", u"English", u"Indonesia", u"English"),
-    (u"en-IE", u"English", u"Ireland", u"English"),
     (u"en-IN", u"English", u"India", u"English"),
     (u"en-IN", u"English", u"India", u"English"),
     (u"en-MY", u"English", u"Malaysia", u"English"),
     (u"en-MY", u"English", u"Malaysia", u"English"),
-    (u"en-NZ", u"English", u"New Zealand", u"English"),
-    (u"en-PH", u"English", u"Philippines", u"English"),
-    (u"en-SG", u"English", u"Singapore", u"English"),
     (u"en-US", u"English", u"United States", u"English"),
     (u"en-US", u"English", u"United States", u"English"),
-    (u"en-ZA", u"English", u"South Africa", u"English"),
     (u"es", u"Español", u"", u"Spanish"),
     (u"es", u"Español", u"", u"Spanish"),
-    (u"es-AD", u"Español", u"Andorra", u"Spanish"),
     (u"es-AR", u"Español", u"Argentina", u"Spanish"),
     (u"es-AR", u"Español", u"Argentina", u"Spanish"),
-    (u"es-CL", u"Español", u"Chile", u"Spanish"),
-    (u"es-CO", u"Español", u"Colombia", u"Spanish"),
     (u"es-ES", u"Español", u"España", u"Spanish"),
     (u"es-ES", u"Español", u"España", u"Spanish"),
     (u"es-MX", u"Español", u"México", u"Spanish"),
     (u"es-MX", u"Español", u"México", u"Spanish"),
-    (u"es-PE", u"Español", u"Perú", u"Spanish"),
-    (u"es-US", u"Español", u"Estados Unidos", u"Spanish"),
     (u"et-EE", u"Eesti", u"", u"Estonian"),
     (u"et-EE", u"Eesti", u"", u"Estonian"),
+    (u"fa-IR", u"فارسی", u"", u"Persian"),
     (u"fi-FI", u"Suomi", u"", u"Finnish"),
     (u"fi-FI", u"Suomi", u"", u"Finnish"),
     (u"fr", u"Français", u"", u"French"),
     (u"fr", u"Français", u"", u"French"),
-    (u"fr-AD", u"Français", u"Andorre", u"French"),
     (u"fr-BE", u"Français", u"Belgique", u"French"),
     (u"fr-BE", u"Français", u"Belgique", u"French"),
     (u"fr-CA", u"Français", u"Canada", u"French"),
     (u"fr-CA", u"Français", u"Canada", u"French"),
     (u"fr-CH", u"Français", u"Suisse", u"French"),
     (u"fr-CH", u"Français", u"Suisse", u"French"),
     (u"fr-FR", u"Français", u"France", u"French"),
     (u"fr-FR", u"Français", u"France", u"French"),
     (u"he-IL", u"עברית", u"", u"Hebrew"),
     (u"he-IL", u"עברית", u"", u"Hebrew"),
+    (u"hr-HR", u"Hrvatski", u"", u"Croatian"),
     (u"hu-HU", u"Magyar", u"", u"Hungarian"),
     (u"hu-HU", u"Magyar", u"", u"Hungarian"),
-    (u"it", u"Italiano", u"", u"Italian"),
+    (u"id-ID", u"Indonesia", u"", u"Indonesian"),
-    (u"it-CH", u"Italiano", u"Svizzera", u"Italian"),
+    (u"is-IS", u"Íslenska", u"", u"Icelandic"),
-    (u"it-IT", u"Italiano", u"Italia", u"Italian"),
+    (u"it-IT", u"Italiano", u"", u"Italian"),
     (u"ja-JP", u"日本語", u"", u"Japanese"),
     (u"ja-JP", u"日本語", u"", u"Japanese"),
     (u"ko-KR", u"한국어", u"", u"Korean"),
     (u"ko-KR", u"한국어", u"", u"Korean"),
+    (u"lt-LT", u"Lietuvių", u"", u"Lithuanian"),
+    (u"lv-LV", u"Latviešu", u"", u"Latvian"),
+    (u"ms-MY", u"Bahasa Melayu", u"", u"Malay"),
+    (u"nb-NO", u"Norsk Bokmål", u"", u"Norwegian Bokmål"),
     (u"nl", u"Nederlands", u"", u"Dutch"),
     (u"nl", u"Nederlands", u"", u"Dutch"),
     (u"nl-BE", u"Nederlands", u"België", u"Dutch"),
     (u"nl-BE", u"Nederlands", u"België", u"Dutch"),
     (u"nl-NL", u"Nederlands", u"Nederland", u"Dutch"),
     (u"nl-NL", u"Nederlands", u"Nederland", u"Dutch"),
-    (u"no-NO", u"Norsk", u"", u"Norwegian"),
     (u"pl-PL", u"Polski", u"", u"Polish"),
     (u"pl-PL", u"Polski", u"", u"Polish"),
     (u"pt", u"Português", u"", u"Portuguese"),
     (u"pt", u"Português", u"", u"Portuguese"),
-    (u"pt-AD", u"Português", u"Andorra", u"Portuguese"),
     (u"pt-BR", u"Português", u"Brasil", u"Portuguese"),
     (u"pt-BR", u"Português", u"Brasil", u"Portuguese"),
     (u"pt-PT", u"Português", u"Portugal", u"Portuguese"),
     (u"pt-PT", u"Português", u"Portugal", u"Portuguese"),
     (u"ro-RO", u"Română", u"", u"Romanian"),
     (u"ro-RO", u"Română", u"", u"Romanian"),
     (u"ru-RU", u"Русский", u"", u"Russian"),
     (u"ru-RU", u"Русский", u"", u"Russian"),
+    (u"sk-SK", u"Slovenčina", u"", u"Slovak"),
+    (u"sl-SI", u"Slovenščina", u"", u"Slovenian"),
+    (u"sr-RS", u"Српски", u"", u"Serbian"),
     (u"sv-SE", u"Svenska", u"", u"Swedish"),
     (u"sv-SE", u"Svenska", u"", u"Swedish"),
     (u"th-TH", u"ไทย", u"", u"Thai"),
     (u"th-TH", u"ไทย", u"", u"Thai"),
     (u"tr-TR", u"Türkçe", u"", u"Turkish"),
     (u"tr-TR", u"Türkçe", u"", u"Turkish"),
+    (u"uk-UA", u"Українська", u"", u"Ukrainian"),
+    (u"vi-VN", u"Tiếng Việt", u"", u"Vietnamese"),
     (u"zh", u"中文", u"", u"Chinese"),
     (u"zh", u"中文", u"", u"Chinese"),
     (u"zh-CN", u"中文", u"中国", u"Chinese"),
     (u"zh-CN", u"中文", u"中国", u"Chinese"),
-    (u"zh-HK", u"中文", u"香港", u"Chinese"),
+    (u"zh-TW", u"中文", u"台灣", u"Chinese")
-    (u"zh-TW", u"中文", u"台湾", u"Chinese")
 )
 )

+ 3 - 2
searx/plugins/oa_doi_rewrite.py

@@ -9,7 +9,7 @@ regex = re.compile(r'10\.\d{4,9}/[^\s]+')
 name = gettext('Open Access DOI rewrite')
 name = gettext('Open Access DOI rewrite')
 description = gettext('Avoid paywalls by redirecting to open-access versions of publications when available')
 description = gettext('Avoid paywalls by redirecting to open-access versions of publications when available')
 default_on = False
 default_on = False
-preference_section = 'privacy'
+preference_section = 'general'
 
 
 doi_resolvers = settings['doi_resolvers']
 doi_resolvers = settings['doi_resolvers']
 
 
@@ -30,7 +30,8 @@ def get_doi_resolver(args, preference_doi_resolver):
     doi_resolver = args.get('doi_resolver', preference_doi_resolver)[0]
     doi_resolver = args.get('doi_resolver', preference_doi_resolver)[0]
     if doi_resolver not in doi_resolvers:
     if doi_resolver not in doi_resolvers:
         doi_resolvers = settings['default_doi_resolver']
         doi_resolvers = settings['default_doi_resolver']
-    return doi_resolver
+    doi_resolver_url = doi_resolvers[doi_resolver]
+    return doi_resolver_url
 
 
 
 
 def on_result(request, search, result):
 def on_result(request, search, result):

+ 0 - 4
searx/preferences.py

@@ -115,10 +115,6 @@ class SearchLanguageSetting(EnumStringSetting):
                 pass
                 pass
             elif lang in self.choices:
             elif lang in self.choices:
                 data = lang
                 data = lang
-            elif data == 'nb-NO':
-                data = 'no-NO'
-            elif data == 'ar-XA':
-                data = 'ar-SA'
             else:
             else:
                 data = self.value
                 data = self.value
         self.value = data
         self.value = data

+ 18 - 7
searx/query.py

@@ -96,9 +96,13 @@ class RawTextQuery(object):
                                 break
                                 break
 
 
                 # user may set a valid, yet not selectable language
                 # user may set a valid, yet not selectable language
-                if not self.languages and VALID_LANGUAGE_CODE.match(lang):
+                if VALID_LANGUAGE_CODE.match(lang):
-                    self.languages.append(lang)
+                    lang_parts = lang.split('-')
-                    parse_next = True
+                    if len(lang_parts) > 1:
+                        lang = lang_parts[0].lower() + '-' + lang_parts[1].upper()
+                    if lang not in self.languages:
+                        self.languages.append(lang)
+                        parse_next = True
 
 
             # this force a engine or category
             # this force a engine or category
             if query_part[0] == '!' or query_part[0] == '?':
             if query_part[0] == '!' or query_part[0] == '?':
@@ -107,14 +111,21 @@ class RawTextQuery(object):
                 # check if prefix is equal with engine shortcut
                 # check if prefix is equal with engine shortcut
                 if prefix in engine_shortcuts:
                 if prefix in engine_shortcuts:
                     parse_next = True
                     parse_next = True
-                    self.engines.append({'category': 'none',
+                    engine_name = engine_shortcuts[prefix]
-                                         'name': engine_shortcuts[prefix]})
+                    if engine_name in engines:
+                        for engine_category in engines[engine_name].categories:
+                            self.engines.append({'category': engine_category,
+                                                 'name': engine_name,
+                                                 'from_bang': True})
 
 
                 # check if prefix is equal with engine name
                 # check if prefix is equal with engine name
                 elif prefix in engines:
                 elif prefix in engines:
                     parse_next = True
                     parse_next = True
-                    self.engines.append({'category': 'none',
+                    if prefix in engines:
-                                         'name': prefix})
+                        for engine_category in engines[prefix].categories:
+                            self.engines.append({'category': engine_category,
+                                                 'name': prefix,
+                                                 'from_bang': True})
 
 
                 # check if prefix is equal with categorie name
                 # check if prefix is equal with categorie name
                 elif prefix in categories:
                 elif prefix in categories:

+ 7 - 2
searx/search.py

@@ -258,8 +258,13 @@ def get_search_query_from_webapp(preferences, form):
     # if engines are calculated from query,
     # if engines are calculated from query,
     # set categories by using that informations
     # set categories by using that informations
     if query_engines and raw_text_query.specific:
     if query_engines and raw_text_query.specific:
-        query_categories = list(set(engine['category']
+        additional_categories = set()
-                                    for engine in query_engines))
+        for engine in query_engines:
+            if 'from_bang' in engine and engine['from_bang']:
+                additional_categories.add('none')
+            else:
+                additional_categories.add(engine['category'])
+        query_categories = list(additional_categories)
 
 
     # otherwise, using defined categories to
     # otherwise, using defined categories to
     # calculate which engines should be used
     # calculate which engines should be used

+ 31 - 5
searx/settings.yml

@@ -174,6 +174,7 @@ engines:
   - name : wikidata
   - name : wikidata
     engine : wikidata
     engine : wikidata
     shortcut : wd
     shortcut : wd
+    timeout : 3.0
     weight : 2
     weight : 2
 
 
   - name : duckduckgo
   - name : duckduckgo
@@ -191,10 +192,9 @@ engines:
     engine : xpath
     engine : xpath
     paging : True
     paging : True
     search_url : http://etymonline.com/?search={query}&p={pageno}
     search_url : http://etymonline.com/?search={query}&p={pageno}
-    url_xpath : //dt/a[1]/@href
+    url_xpath : //a[contains(@class, "word--")]/@href
-    title_xpath : //dt
+    title_xpath : //p[contains(@class, "word__name--")]/text()
-    content_xpath : //dd
+    content_xpath : //section[contains(@class, "word__defination")]/object
-    suggestion_xpath : //a[@class="crossreference"]
     first_page_num : 0
     first_page_num : 0
     shortcut : et
     shortcut : et
     disabled : True
     disabled : True
@@ -218,6 +218,24 @@ engines:
     shortcut : fd
     shortcut : fd
     disabled : True
     disabled : True
 
 
+  - name : findx
+    engine : findx
+    shortcut : fx
+    categories : general
+    disabled : True
+
+  - name : findx images
+    engine : findx
+    shortcut : fxi
+    categories : images
+    disabled : True
+
+  - name : findx videos
+    engine : findx
+    shortcut : fxv
+    categories : videos
+    disabled : True
+
   - name : flickr
   - name : flickr
     categories : images
     categories : images
     shortcut : fl
     shortcut : fl
@@ -292,7 +310,7 @@ engines:
     engine : xpath
     engine : xpath
     paging : True
     paging : True
     search_url : https://scholar.google.com/scholar?start={pageno}&q={query}&hl=en&as_sdt=0,5&as_vis=1
     search_url : https://scholar.google.com/scholar?start={pageno}&q={query}&hl=en&as_sdt=0,5&as_vis=1
-    results_xpath : //div[@class="gs_r"]/div[@class="gs_ri"]
+    results_xpath : //div[contains(@class, "gs_r")]/div[@class="gs_ri"]
     url_xpath : .//h3/a/@href
     url_xpath : .//h3/a/@href
     title_xpath : .//h3/a
     title_xpath : .//h3/a
     content_xpath : .//div[@class="gs_rs"]
     content_xpath : .//div[@class="gs_rs"]
@@ -414,6 +432,12 @@ engines:
     engine : nyaa
     engine : nyaa
     shortcut : nt
     shortcut : nt
     disabled : True
     disabled : True
+  
+  - name : acgsou
+    engine : acgsou
+    shortcut : acg
+    disabled : True
+    timeout: 5.0
 
 
   - name : openairedatasets
   - name : openairedatasets
     engine : json_engine
     engine : json_engine
@@ -723,6 +747,7 @@ locales:
     it : Italiano (Italian)
     it : Italiano (Italian)
     ja : 日本語 (Japanese)
     ja : 日本語 (Japanese)
     nl : Nederlands (Dutch)
     nl : Nederlands (Dutch)
+    pl : Polski (Polish)
     pt : Português (Portuguese)
     pt : Português (Portuguese)
     pt_BR : Português (Portuguese_Brazil)
     pt_BR : Português (Portuguese_Brazil)
     ro : Română (Romanian)
     ro : Română (Romanian)
@@ -740,5 +765,6 @@ doi_resolvers :
   oadoi.org : 'https://oadoi.org/'
   oadoi.org : 'https://oadoi.org/'
   doi.org : 'https://doi.org/'
   doi.org : 'https://doi.org/'
   doai.io  : 'http://doai.io/'
   doai.io  : 'http://doai.io/'
+  sci-hub.tw : 'http://sci-hub.tw/'
 
 
 default_doi_resolver : 'oadoi.org'
 default_doi_resolver : 'oadoi.org'

+ 3 - 0
searx/static/plugins/css/infinite_scroll.css

@@ -14,3 +14,6 @@
     border-radius: 50% !important;
     border-radius: 50% !important;
     margin: 0 auto;
     margin: 0 auto;
 }
 }
+#pagination button {
+	visibility: hidden;
+}

File diff suppressed because it is too large
+ 0 - 0
searx/static/themes/oscar/css/logicodev-dark.min.css


File diff suppressed because it is too large
+ 0 - 0
searx/static/themes/oscar/css/logicodev.min.css


File diff suppressed because it is too large
+ 0 - 0
searx/static/themes/oscar/css/pointhi.min.css


BIN
searx/static/themes/oscar/img/icons/youtube.png


+ 1 - 0
searx/static/themes/oscar/less/logicodev/search.less

@@ -18,6 +18,7 @@
     padding-bottom: 0.4rem;
     padding-bottom: 0.4rem;
     padding-top: 0.4rem;
     padding-top: 0.4rem;
     text-align: center;
     text-align: center;
+    min-width: 50px;
   }
   }
   label:last-child, .input-group-addon:last-child {
   label:last-child, .input-group-addon:last-child {
       border-right: @mild-gray 1px solid;
       border-right: @mild-gray 1px solid;

+ 1 - 0
searx/static/themes/oscar/less/pointhi/search.less

@@ -18,6 +18,7 @@
         padding-bottom: 0.8rem;
         padding-bottom: 0.8rem;
         padding-top: 0.8rem;
         padding-top: 0.8rem;
         text-align: center;
         text-align: center;
+        min-width: 50px;
     }
     }
 
 
     label:last-child, .input-group-addon:last-child {
     label:last-child, .input-group-addon:last-child {

+ 264 - 137
searx/static/themes/simple/css/searx-rtl.css

@@ -1,44 +1,30 @@
-/*! searx | 03-12-2017 | https://github.com/asciimoo/searx */
+/*! searx | 14-08-2018 | https://github.com/asciimoo/searx */
 /*
 /*
 * searx, A privacy-respecting, hackable metasearch engine
 * searx, A privacy-respecting, hackable metasearch engine
 *
 *
 * To convert "style.less" to "style.css" run: $make styles
 * To convert "style.less" to "style.css" run: $make styles
 */
 */
-/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */
+/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */
 /* Document
 /* Document
    ========================================================================== */
    ========================================================================== */
 /**
 /**
  * 1. Correct the line height in all browsers.
  * 1. Correct the line height in all browsers.
- * 2. Prevent adjustments of font size after orientation changes in
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
- *    IE on Windows Phone and in iOS.
  */
  */
 html {
 html {
   line-height: 1.15;
   line-height: 1.15;
   /* 1 */
   /* 1 */
-  -ms-text-size-adjust: 100%;
-  /* 2 */
   -webkit-text-size-adjust: 100%;
   -webkit-text-size-adjust: 100%;
   /* 2 */
   /* 2 */
 }
 }
 /* Sections
 /* Sections
    ========================================================================== */
    ========================================================================== */
 /**
 /**
- * Remove the margin in all browsers (opinionated).
+ * Remove the margin in all browsers.
  */
  */
 body {
 body {
   margin: 0;
   margin: 0;
 }
 }
-/**
- * Add the correct display in IE 9-.
- */
-article,
-aside,
-footer,
-header,
-nav,
-section {
-  display: block;
-}
 /**
 /**
  * Correct the font size and margin on `h1` elements within `section` and
  * Correct the font size and margin on `h1` elements within `section` and
  * `article` contexts in Chrome, Firefox, and Safari.
  * `article` contexts in Chrome, Firefox, and Safari.
@@ -49,22 +35,6 @@ h1 {
 }
 }
 /* Grouping content
 /* Grouping content
    ========================================================================== */
    ========================================================================== */
-/**
- * Add the correct display in IE 9-.
- * 1. Add the correct display in IE.
- */
-figcaption,
-figure,
-main {
-  /* 1 */
-  display: block;
-}
-/**
- * Add the correct margin in IE 8.
- */
-figure {
-  margin: 1em 40px;
-}
 /**
 /**
  * 1. Add the correct box sizing in Firefox.
  * 1. Add the correct box sizing in Firefox.
  * 2. Show the overflow in Edge and IE.
  * 2. Show the overflow in Edge and IE.
@@ -90,17 +60,13 @@ pre {
 /* Text-level semantics
 /* Text-level semantics
    ========================================================================== */
    ========================================================================== */
 /**
 /**
- * 1. Remove the gray background on active links in IE 10.
+ * Remove the gray background on active links in IE 10.
- * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
  */
  */
 a {
 a {
   background-color: transparent;
   background-color: transparent;
-  /* 1 */
-  -webkit-text-decoration-skip: objects;
-  /* 2 */
 }
 }
 /**
 /**
- * 1. Remove the bottom border in Chrome 57- and Firefox 39-.
+ * 1. Remove the bottom border in Chrome 57-
  * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
  * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
  */
  */
 abbr[title] {
 abbr[title] {
@@ -111,13 +77,6 @@ abbr[title] {
   text-decoration: underline dotted;
   text-decoration: underline dotted;
   /* 2 */
   /* 2 */
 }
 }
-/**
- * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
- */
-b,
-strong {
-  font-weight: inherit;
-}
 /**
 /**
  * Add the correct font weight in Chrome, Edge, and Safari.
  * Add the correct font weight in Chrome, Edge, and Safari.
  */
  */
@@ -137,19 +96,6 @@ samp {
   font-size: 1em;
   font-size: 1em;
   /* 2 */
   /* 2 */
 }
 }
-/**
- * Add the correct font style in Android 4.3-.
- */
-dfn {
-  font-style: italic;
-}
-/**
- * Add the correct background and color in IE 9-.
- */
-mark {
-  background-color: #ff0;
-  color: #000;
-}
 /**
 /**
  * Add the correct font size in all browsers.
  * Add the correct font size in all browsers.
  */
  */
@@ -176,35 +122,15 @@ sup {
 /* Embedded content
 /* Embedded content
    ========================================================================== */
    ========================================================================== */
 /**
 /**
- * Add the correct display in IE 9-.
+ * Remove the border on images inside links in IE 10.
- */
-audio,
-video {
-  display: inline-block;
-}
-/**
- * Add the correct display in iOS 4-7.
- */
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-/**
- * Remove the border on images inside links in IE 10-.
  */
  */
 img {
 img {
   border-style: none;
   border-style: none;
 }
 }
-/**
- * Hide the overflow in IE.
- */
-svg:not(:root) {
-  overflow: hidden;
-}
 /* Forms
 /* Forms
    ========================================================================== */
    ========================================================================== */
 /**
 /**
- * 1. Change the font styles in all browsers (opinionated).
+ * 1. Change the font styles in all browsers.
  * 2. Remove the margin in Firefox and Safari.
  * 2. Remove the margin in Firefox and Safari.
  */
  */
 button,
 button,
@@ -212,7 +138,7 @@ input,
 optgroup,
 optgroup,
 select,
 select,
 textarea {
 textarea {
-  font-family: sans-serif;
+  font-family: inherit;
   /* 1 */
   /* 1 */
   font-size: 100%;
   font-size: 100%;
   /* 1 */
   /* 1 */
@@ -240,16 +166,13 @@ select {
   text-transform: none;
   text-transform: none;
 }
 }
 /**
 /**
- * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
+ * Correct the inability to style clickable types in iOS and Safari.
- *    controls in Android 4.
- * 2. Correct the inability to style clickable types in iOS and Safari.
  */
  */
 button,
 button,
-html [type="button"],
+[type="button"],
 [type="reset"],
 [type="reset"],
 [type="submit"] {
 [type="submit"] {
   -webkit-appearance: button;
   -webkit-appearance: button;
-  /* 2 */
 }
 }
 /**
 /**
  * Remove the inner border and padding in Firefox.
  * Remove the inner border and padding in Firefox.
@@ -297,24 +220,20 @@ legend {
   /* 1 */
   /* 1 */
 }
 }
 /**
 /**
- * 1. Add the correct display in IE 9-.
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
- * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
  */
  */
 progress {
 progress {
-  display: inline-block;
-  /* 1 */
   vertical-align: baseline;
   vertical-align: baseline;
-  /* 2 */
 }
 }
 /**
 /**
- * Remove the default vertical scrollbar in IE.
+ * Remove the default vertical scrollbar in IE 10+.
  */
  */
 textarea {
 textarea {
   overflow: auto;
   overflow: auto;
 }
 }
 /**
 /**
- * 1. Add the correct box sizing in IE 10-.
+ * 1. Add the correct box sizing in IE 10.
- * 2. Remove the padding in IE 10-.
+ * 2. Remove the padding in IE 10.
  */
  */
 [type="checkbox"],
 [type="checkbox"],
 [type="radio"] {
 [type="radio"] {
@@ -341,9 +260,8 @@ textarea {
   /* 2 */
   /* 2 */
 }
 }
 /**
 /**
- * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
+ * Remove the inner padding in Chrome and Safari on macOS.
  */
  */
-[type="search"]::-webkit-search-cancel-button,
 [type="search"]::-webkit-search-decoration {
 [type="search"]::-webkit-search-decoration {
   -webkit-appearance: none;
   -webkit-appearance: none;
 }
 }
@@ -360,11 +278,9 @@ textarea {
 /* Interactive
 /* Interactive
    ========================================================================== */
    ========================================================================== */
 /*
 /*
- * Add the correct display in IE 9-.
+ * Add the correct display in Edge, IE 10+, and Firefox.
- * 1. Add the correct display in Edge, IE, and Firefox.
  */
  */
-details,
+details {
-menu {
   display: block;
   display: block;
 }
 }
 /*
 /*
@@ -373,24 +289,16 @@ menu {
 summary {
 summary {
   display: list-item;
   display: list-item;
 }
 }
-/* Scripting
+/* Misc
    ========================================================================== */
    ========================================================================== */
 /**
 /**
- * Add the correct display in IE 9-.
+ * Add the correct display in IE 10+.
- */
-canvas {
-  display: inline-block;
-}
-/**
- * Add the correct display in IE.
  */
  */
 template {
 template {
   display: none;
   display: none;
 }
 }
-/* Hidden
-   ========================================================================== */
 /**
 /**
- * Add the correct display in IE 10-.
+ * Add the correct display in IE 10.
  */
  */
 [hidden] {
 [hidden] {
   display: none;
   display: none;
@@ -706,7 +614,14 @@ html.js .show_if_nojs {
   float: left;
   float: left;
 }
 }
 .invisible {
 .invisible {
-  display: none;
+  display: none !important;
+}
+.list-unstyled {
+  list-style-type: none;
+}
+.list-unstyled li {
+  margin-top: 4px;
+  margin-bottom: 4px;
 }
 }
 .danger {
 .danger {
   background-color: #fae1e1;
   background-color: #fae1e1;
@@ -722,6 +637,13 @@ html.js .show_if_nojs {
   padding: 1px 5px;
   padding: 1px 5px;
   border-radius: 5px;
   border-radius: 5px;
 }
 }
+kbd {
+  padding: 2px 4px;
+  margin: 1px;
+  font-size: 90%;
+  color: white;
+  background: black;
+}
 table {
 table {
   width: 100%;
   width: 100%;
 }
 }
@@ -737,6 +659,27 @@ td {
 tr:hover {
 tr:hover {
   background: #ececec;
   background: #ececec;
 }
 }
+div.selectable_url {
+  border: 1px solid #888;
+  padding: 4px;
+  color: #444;
+  width: 100%;
+  display: block;
+  margin: 0.1em;
+  overflow: hidden;
+  height: 1.2em;
+  line-height: 1.2em;
+}
+div.selectable_url pre {
+  display: block;
+  font-size: 0.8em;
+  word-break: break-all;
+  margin: 0.1em;
+  -webkit-user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: element;
+  user-select: all;
+}
 .dialog-error {
 .dialog-error {
   position: relative;
   position: relative;
   width: 70%;
   width: 70%;
@@ -768,6 +711,22 @@ tr:hover {
 .dialog-error p {
 .dialog-error p {
   margin: 1px 0 0 0;
   margin: 1px 0 0 0;
 }
 }
+.dialog-error table {
+  width: auto;
+}
+.dialog-error tr {
+  vertical-align: text-top;
+}
+.dialog-error tr:hover {
+  background: transparent;
+}
+.dialog-error td {
+  padding: 0 1em 0 0;
+}
+.dialog-error h4 {
+  margin-top: 0.3em;
+  margin-bottom: 0.3em;
+}
 .dialog-error:before {
 .dialog-error:before {
   content: "\f110";
   content: "\f110";
 }
 }
@@ -802,9 +761,78 @@ tr:hover {
 .dialog-warning p {
 .dialog-warning p {
   margin: 1px 0 0 0;
   margin: 1px 0 0 0;
 }
 }
+.dialog-warning table {
+  width: auto;
+}
+.dialog-warning tr {
+  vertical-align: text-top;
+}
+.dialog-warning tr:hover {
+  background: transparent;
+}
+.dialog-warning td {
+  padding: 0 1em 0 0;
+}
+.dialog-warning h4 {
+  margin-top: 0.3em;
+  margin-bottom: 0.3em;
+}
 .dialog-warning:before {
 .dialog-warning:before {
   content: "\f10f";
   content: "\f10f";
 }
 }
+.dialog-modal {
+  position: relative;
+  width: 70%;
+  padding: 1em 1em 1em 2.7em;
+  margin: 0em 8% 1em 8%;
+  border: 1px solid black;
+  border-radius: 4px;
+  text-align: left;
+  background: white;
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  /* bring your own prefixes */
+  transform: translate(-50%, -50%);
+  z-index: 100000;
+  margin: 0 50% 0 0;
+  box-shadow: 0 0 1em;
+}
+.dialog-modal:before {
+  position: absolute;
+  top: 0.5em;
+  left: 0.5em;
+  font-family: "ion";
+  font-size: 1.5em;
+}
+.dialog-modal .close {
+  float: right;
+  position: relative;
+  top: -3px;
+  color: inherit;
+  font-size: 1.5em;
+}
+.dialog-modal ul,
+.dialog-modal ol,
+.dialog-modal p {
+  margin: 1px 0 0 0;
+}
+.dialog-modal table {
+  width: auto;
+}
+.dialog-modal tr {
+  vertical-align: text-top;
+}
+.dialog-modal tr:hover {
+  background: transparent;
+}
+.dialog-modal td {
+  padding: 0 1em 0 0;
+}
+.dialog-modal h4 {
+  margin-top: 0.3em;
+  margin-bottom: 0.3em;
+}
 .btn-collapse {
 .btn-collapse {
   cursor: pointer;
   cursor: pointer;
 }
 }
@@ -816,6 +844,7 @@ tr:hover {
   margin: 0;
   margin: 0;
   border: none;
   border: none;
 }
 }
+/* -- tabs --*/
 .tabs .tabs > label {
 .tabs .tabs > label {
   font-size: 90%;
   font-size: 90%;
 }
 }
@@ -894,6 +923,7 @@ html body .tabs > input:checked + label {
 html body .tabs > input:checked + label + section {
 html body .tabs > input:checked + label + section {
   display: block;
   display: block;
 }
 }
+/* -- select -- */
 select {
 select {
   height: 28px;
   height: 28px;
   margin: 0 1em 0 0;
   margin: 0 1em 0 0;
@@ -924,6 +954,7 @@ select:focus {
     border-bottom: 1px solid #3498DB;
     border-bottom: 1px solid #3498DB;
   }
   }
 }
 }
+/* -- checkbox-onoff -- */
 @supports (border-radius: 50px) {
 @supports (border-radius: 50px) {
   .checkbox-onoff {
   .checkbox-onoff {
     display: inline-block;
     display: inline-block;
@@ -955,6 +986,7 @@ select:focus {
     background: #dcdcdc;
     background: #dcdcdc;
   }
   }
 }
 }
+/* -- checkbox --*/
 @supports (transform: rotate(-45deg)) {
 @supports (transform: rotate(-45deg)) {
   .checkbox {
   .checkbox {
     width: 20px;
     width: 20px;
@@ -1007,6 +1039,48 @@ select:focus {
     width: 100%;
     width: 100%;
   }
   }
 }
 }
+/* -- loader -- */
+.loader,
+.loader:after {
+  border-radius: 50%;
+  width: 2em;
+  height: 2em;
+}
+.loader {
+  margin: 1em auto;
+  font-size: 10px;
+  position: relative;
+  text-indent: -9999em;
+  border-top: 0.5em solid rgba(0, 0, 0, 0.2);
+  border-right: 0.5em solid rgba(0, 0, 0, 0.2);
+  border-bottom: 0.5em solid rgba(0, 0, 0, 0.2);
+  border-left: 0.5em solid rgba(255, 255, 255, 0);
+  -webkit-transform: translateZ(0);
+  -ms-transform: translateZ(0);
+  transform: translateZ(0);
+  -webkit-animation: load8 1.2s infinite linear;
+  animation: load8 1.2s infinite linear;
+}
+@-webkit-keyframes load8 {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+@keyframes load8 {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
 /*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */
 /*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */
 .autocomplete {
 .autocomplete {
   position: absolute;
   position: absolute;
@@ -1073,8 +1147,8 @@ select:focus {
 }
 }
 @font-face {
 @font-face {
   font-family: "ion";
   font-family: "ion";
-  src: url("../fonts/ion.eot?94af7082ea096aefe3a7b6642834716e");
+  src: url("../fonts/ion.eot?ce7a0ead692560b4405a96d5b8471f51");
-  src: url("../fonts/ion.eot?#iefix") format("embedded-opentype"), url("../fonts/ion.woff2?94af7082ea096aefe3a7b6642834716e") format("woff2"), url("../fonts/ion.woff?94af7082ea096aefe3a7b6642834716e") format("woff"), url("../fonts/ion.ttf?94af7082ea096aefe3a7b6642834716e") format("truetype"), url("../fonts/ion.svg?94af7082ea096aefe3a7b6642834716e#ion") format("svg");
+  src: url("../fonts/ion.eot?#iefix") format("embedded-opentype"), url("../fonts/ion.woff2?ce7a0ead692560b4405a96d5b8471f51") format("woff2"), url("../fonts/ion.woff?ce7a0ead692560b4405a96d5b8471f51") format("woff"), url("../fonts/ion.ttf?ce7a0ead692560b4405a96d5b8471f51") format("truetype"), url("../fonts/ion.svg?ce7a0ead692560b4405a96d5b8471f51#ion") format("svg");
   font-weight: normal;
   font-weight: normal;
   font-style: normal;
   font-style: normal;
 }
 }
@@ -1154,6 +1228,9 @@ select:focus {
 .ion-magnet:before {
 .ion-magnet:before {
   content: "\f114";
   content: "\f114";
 }
 }
+.ion-close:before {
+  content: "\f115";
+}
 .ion-icon-big {
 .ion-icon-big {
   display: inline-block;
   display: inline-block;
   vertical-align: middle;
   vertical-align: middle;
@@ -1240,6 +1317,22 @@ select:focus {
 #main_preferences table td {
 #main_preferences table td {
   text-align: center;
   text-align: center;
 }
 }
+#main_preferences table.cookies {
+  width: auto;
+}
+#main_preferences table.cookies th,
+#main_preferences table.cookies td {
+  text-align: left;
+  padding: 0.25em;
+}
+#main_preferences table.cookies th:first-child,
+#main_preferences table.cookies td:first-child {
+  padding-right: 4em;
+}
+#main_preferences table.cookies > tbody > tr:nth-child(even) > th,
+#main_preferences table.cookies > tbody > tr:nth-child(even) > td {
+  background-color: #ececec;
+}
 #main_preferences .name,
 #main_preferences .name,
 #main_preferences .shortcut {
 #main_preferences .shortcut {
   text-align: left;
   text-align: left;
@@ -1263,6 +1356,9 @@ select:focus {
 #main_preferences .preferences_back a::first-letter {
 #main_preferences .preferences_back a::first-letter {
   text-transform: uppercase;
   text-transform: uppercase;
 }
 }
+#main_preferences div.selectable_url pre {
+  width: 100%;
+}
 @media screen and (max-width: 75em) {
 @media screen and (max-width: 75em) {
   .preferences_back {
   .preferences_back {
     clear: both;
     clear: both;
@@ -1291,12 +1387,40 @@ select:focus {
 }
 }
 */
 */
 }
 }
+#clear_search {
+  display: block;
+  border-collapse: separate;
+  box-sizing: border-box;
+  width: 1.8em;
+  margin: 0;
+  padding: 2px;
+  height: 2.2em;
+  background: none repeat scroll 0 0 #FFF;
+  border-top: 1px solid #3498DB;
+  border-bottom: 1px solid #3498DB;
+  border-right: none;
+  border-left: none;
+  border-radius: 0px;
+  outline: none;
+  color: #222;
+  font-size: 16px;
+  z-index: 10000;
+}
+#clear_search:hover {
+  color: #3498DB;
+}
+#clear_search.empty * {
+  display: none;
+}
+#q::-ms-clear,
+#q::-webkit-search-cancel-button {
+  display: none;
+}
 #q,
 #q,
 #send_search {
 #send_search {
   display: block !important;
   display: block !important;
   border-collapse: separate;
   border-collapse: separate;
   box-sizing: border-box;
   box-sizing: border-box;
-  position: relative;
   margin: 0;
   margin: 0;
   padding: 2px;
   padding: 2px;
   height: 2.2em;
   height: 2.2em;
@@ -1857,27 +1981,8 @@ article.result-images[data-vim-selected]::before {
 #search_url {
 #search_url {
   margin-top: 8px;
   margin-top: 8px;
 }
 }
-#search_url div {
+#search_url div.selectable_url pre {
-  border: 1px solid #888;
-  padding: 4px;
-  color: #444;
-  width: 100%;
-  display: block;
-  margin: 0.1em;
-  overflow: hidden;
-  height: 1.2em;
-  line-height: 1.2em;
-}
-#search_url div pre {
-  display: block;
   width: 200em;
   width: 200em;
-  font-size: 0.8em;
-  word-break: break-all;
-  margin: 0.1em;
-  -webkit-user-select: all;
-  -moz-user-select: all;
-  -ms-user-select: all;
-  user-select: all;
 }
 }
 #linkto_preferences {
 #linkto_preferences {
   position: absolute;
   position: absolute;
@@ -2001,6 +2106,28 @@ article.result-images[data-vim-selected]::before {
     max-width: 98%;
     max-width: 98%;
   }
   }
 }
 }
+#main_results div#results.only_template_images {
+  flex-direction: column;
+  width: auto;
+  display: flex;
+}
+#main_results div#results.only_template_images #sidebar {
+  position: relative;
+  top: auto;
+  order: 2;
+}
+#main_results div#results.only_template_images #urls {
+  position: relative;
+  order: 1;
+}
+#main_results div#results.only_template_images #backToTop {
+  right: 0.5em;
+  left: auto;
+}
+#main_results div#results.only_template_images #pagination {
+  position: relative;
+  order: 3;
+}
 @media screen and (max-width: 50em) {
 @media screen and (max-width: 50em) {
   article[data-vim-selected]::before {
   article[data-vim-selected]::before {
     display: none;
     display: none;

File diff suppressed because it is too large
+ 0 - 0
searx/static/themes/simple/css/searx-rtl.min.css


+ 264 - 137
searx/static/themes/simple/css/searx.css

@@ -1,44 +1,30 @@
-/*! searx | 03-12-2017 | https://github.com/asciimoo/searx */
+/*! searx | 14-08-2018 | https://github.com/asciimoo/searx */
 /*
 /*
 * searx, A privacy-respecting, hackable metasearch engine
 * searx, A privacy-respecting, hackable metasearch engine
 *
 *
 * To convert "style.less" to "style.css" run: $make styles
 * To convert "style.less" to "style.css" run: $make styles
 */
 */
-/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */
+/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */
 /* Document
 /* Document
    ========================================================================== */
    ========================================================================== */
 /**
 /**
  * 1. Correct the line height in all browsers.
  * 1. Correct the line height in all browsers.
- * 2. Prevent adjustments of font size after orientation changes in
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
- *    IE on Windows Phone and in iOS.
  */
  */
 html {
 html {
   line-height: 1.15;
   line-height: 1.15;
   /* 1 */
   /* 1 */
-  -ms-text-size-adjust: 100%;
-  /* 2 */
   -webkit-text-size-adjust: 100%;
   -webkit-text-size-adjust: 100%;
   /* 2 */
   /* 2 */
 }
 }
 /* Sections
 /* Sections
    ========================================================================== */
    ========================================================================== */
 /**
 /**
- * Remove the margin in all browsers (opinionated).
+ * Remove the margin in all browsers.
  */
  */
 body {
 body {
   margin: 0;
   margin: 0;
 }
 }
-/**
- * Add the correct display in IE 9-.
- */
-article,
-aside,
-footer,
-header,
-nav,
-section {
-  display: block;
-}
 /**
 /**
  * Correct the font size and margin on `h1` elements within `section` and
  * Correct the font size and margin on `h1` elements within `section` and
  * `article` contexts in Chrome, Firefox, and Safari.
  * `article` contexts in Chrome, Firefox, and Safari.
@@ -49,22 +35,6 @@ h1 {
 }
 }
 /* Grouping content
 /* Grouping content
    ========================================================================== */
    ========================================================================== */
-/**
- * Add the correct display in IE 9-.
- * 1. Add the correct display in IE.
- */
-figcaption,
-figure,
-main {
-  /* 1 */
-  display: block;
-}
-/**
- * Add the correct margin in IE 8.
- */
-figure {
-  margin: 1em 40px;
-}
 /**
 /**
  * 1. Add the correct box sizing in Firefox.
  * 1. Add the correct box sizing in Firefox.
  * 2. Show the overflow in Edge and IE.
  * 2. Show the overflow in Edge and IE.
@@ -90,17 +60,13 @@ pre {
 /* Text-level semantics
 /* Text-level semantics
    ========================================================================== */
    ========================================================================== */
 /**
 /**
- * 1. Remove the gray background on active links in IE 10.
+ * Remove the gray background on active links in IE 10.
- * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
  */
  */
 a {
 a {
   background-color: transparent;
   background-color: transparent;
-  /* 1 */
-  -webkit-text-decoration-skip: objects;
-  /* 2 */
 }
 }
 /**
 /**
- * 1. Remove the bottom border in Chrome 57- and Firefox 39-.
+ * 1. Remove the bottom border in Chrome 57-
  * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
  * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
  */
  */
 abbr[title] {
 abbr[title] {
@@ -111,13 +77,6 @@ abbr[title] {
   text-decoration: underline dotted;
   text-decoration: underline dotted;
   /* 2 */
   /* 2 */
 }
 }
-/**
- * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
- */
-b,
-strong {
-  font-weight: inherit;
-}
 /**
 /**
  * Add the correct font weight in Chrome, Edge, and Safari.
  * Add the correct font weight in Chrome, Edge, and Safari.
  */
  */
@@ -137,19 +96,6 @@ samp {
   font-size: 1em;
   font-size: 1em;
   /* 2 */
   /* 2 */
 }
 }
-/**
- * Add the correct font style in Android 4.3-.
- */
-dfn {
-  font-style: italic;
-}
-/**
- * Add the correct background and color in IE 9-.
- */
-mark {
-  background-color: #ff0;
-  color: #000;
-}
 /**
 /**
  * Add the correct font size in all browsers.
  * Add the correct font size in all browsers.
  */
  */
@@ -176,35 +122,15 @@ sup {
 /* Embedded content
 /* Embedded content
    ========================================================================== */
    ========================================================================== */
 /**
 /**
- * Add the correct display in IE 9-.
+ * Remove the border on images inside links in IE 10.
- */
-audio,
-video {
-  display: inline-block;
-}
-/**
- * Add the correct display in iOS 4-7.
- */
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-/**
- * Remove the border on images inside links in IE 10-.
  */
  */
 img {
 img {
   border-style: none;
   border-style: none;
 }
 }
-/**
- * Hide the overflow in IE.
- */
-svg:not(:root) {
-  overflow: hidden;
-}
 /* Forms
 /* Forms
    ========================================================================== */
    ========================================================================== */
 /**
 /**
- * 1. Change the font styles in all browsers (opinionated).
+ * 1. Change the font styles in all browsers.
  * 2. Remove the margin in Firefox and Safari.
  * 2. Remove the margin in Firefox and Safari.
  */
  */
 button,
 button,
@@ -212,7 +138,7 @@ input,
 optgroup,
 optgroup,
 select,
 select,
 textarea {
 textarea {
-  font-family: sans-serif;
+  font-family: inherit;
   /* 1 */
   /* 1 */
   font-size: 100%;
   font-size: 100%;
   /* 1 */
   /* 1 */
@@ -240,16 +166,13 @@ select {
   text-transform: none;
   text-transform: none;
 }
 }
 /**
 /**
- * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
+ * Correct the inability to style clickable types in iOS and Safari.
- *    controls in Android 4.
- * 2. Correct the inability to style clickable types in iOS and Safari.
  */
  */
 button,
 button,
-html [type="button"],
+[type="button"],
 [type="reset"],
 [type="reset"],
 [type="submit"] {
 [type="submit"] {
   -webkit-appearance: button;
   -webkit-appearance: button;
-  /* 2 */
 }
 }
 /**
 /**
  * Remove the inner border and padding in Firefox.
  * Remove the inner border and padding in Firefox.
@@ -297,24 +220,20 @@ legend {
   /* 1 */
   /* 1 */
 }
 }
 /**
 /**
- * 1. Add the correct display in IE 9-.
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
- * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
  */
  */
 progress {
 progress {
-  display: inline-block;
-  /* 1 */
   vertical-align: baseline;
   vertical-align: baseline;
-  /* 2 */
 }
 }
 /**
 /**
- * Remove the default vertical scrollbar in IE.
+ * Remove the default vertical scrollbar in IE 10+.
  */
  */
 textarea {
 textarea {
   overflow: auto;
   overflow: auto;
 }
 }
 /**
 /**
- * 1. Add the correct box sizing in IE 10-.
+ * 1. Add the correct box sizing in IE 10.
- * 2. Remove the padding in IE 10-.
+ * 2. Remove the padding in IE 10.
  */
  */
 [type="checkbox"],
 [type="checkbox"],
 [type="radio"] {
 [type="radio"] {
@@ -341,9 +260,8 @@ textarea {
   /* 2 */
   /* 2 */
 }
 }
 /**
 /**
- * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
+ * Remove the inner padding in Chrome and Safari on macOS.
  */
  */
-[type="search"]::-webkit-search-cancel-button,
 [type="search"]::-webkit-search-decoration {
 [type="search"]::-webkit-search-decoration {
   -webkit-appearance: none;
   -webkit-appearance: none;
 }
 }
@@ -360,11 +278,9 @@ textarea {
 /* Interactive
 /* Interactive
    ========================================================================== */
    ========================================================================== */
 /*
 /*
- * Add the correct display in IE 9-.
+ * Add the correct display in Edge, IE 10+, and Firefox.
- * 1. Add the correct display in Edge, IE, and Firefox.
  */
  */
-details,
+details {
-menu {
   display: block;
   display: block;
 }
 }
 /*
 /*
@@ -373,24 +289,16 @@ menu {
 summary {
 summary {
   display: list-item;
   display: list-item;
 }
 }
-/* Scripting
+/* Misc
    ========================================================================== */
    ========================================================================== */
 /**
 /**
- * Add the correct display in IE 9-.
+ * Add the correct display in IE 10+.
- */
-canvas {
-  display: inline-block;
-}
-/**
- * Add the correct display in IE.
  */
  */
 template {
 template {
   display: none;
   display: none;
 }
 }
-/* Hidden
-   ========================================================================== */
 /**
 /**
- * Add the correct display in IE 10-.
+ * Add the correct display in IE 10.
  */
  */
 [hidden] {
 [hidden] {
   display: none;
   display: none;
@@ -706,7 +614,14 @@ html.js .show_if_nojs {
   float: left;
   float: left;
 }
 }
 .invisible {
 .invisible {
-  display: none;
+  display: none !important;
+}
+.list-unstyled {
+  list-style-type: none;
+}
+.list-unstyled li {
+  margin-top: 4px;
+  margin-bottom: 4px;
 }
 }
 .danger {
 .danger {
   background-color: #fae1e1;
   background-color: #fae1e1;
@@ -722,6 +637,13 @@ html.js .show_if_nojs {
   padding: 1px 5px;
   padding: 1px 5px;
   border-radius: 5px;
   border-radius: 5px;
 }
 }
+kbd {
+  padding: 2px 4px;
+  margin: 1px;
+  font-size: 90%;
+  color: white;
+  background: black;
+}
 table {
 table {
   width: 100%;
   width: 100%;
 }
 }
@@ -737,6 +659,27 @@ td {
 tr:hover {
 tr:hover {
   background: #ececec;
   background: #ececec;
 }
 }
+div.selectable_url {
+  border: 1px solid #888;
+  padding: 4px;
+  color: #444;
+  width: 100%;
+  display: block;
+  margin: 0.1em;
+  overflow: hidden;
+  height: 1.2em;
+  line-height: 1.2em;
+}
+div.selectable_url pre {
+  display: block;
+  font-size: 0.8em;
+  word-break: break-all;
+  margin: 0.1em;
+  -webkit-user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: element;
+  user-select: all;
+}
 .dialog-error {
 .dialog-error {
   position: relative;
   position: relative;
   width: 70%;
   width: 70%;
@@ -768,6 +711,22 @@ tr:hover {
 .dialog-error p {
 .dialog-error p {
   margin: 1px 0 0 0;
   margin: 1px 0 0 0;
 }
 }
+.dialog-error table {
+  width: auto;
+}
+.dialog-error tr {
+  vertical-align: text-top;
+}
+.dialog-error tr:hover {
+  background: transparent;
+}
+.dialog-error td {
+  padding: 0 1em 0 0;
+}
+.dialog-error h4 {
+  margin-top: 0.3em;
+  margin-bottom: 0.3em;
+}
 .dialog-error:before {
 .dialog-error:before {
   content: "\f110";
   content: "\f110";
 }
 }
@@ -802,9 +761,78 @@ tr:hover {
 .dialog-warning p {
 .dialog-warning p {
   margin: 1px 0 0 0;
   margin: 1px 0 0 0;
 }
 }
+.dialog-warning table {
+  width: auto;
+}
+.dialog-warning tr {
+  vertical-align: text-top;
+}
+.dialog-warning tr:hover {
+  background: transparent;
+}
+.dialog-warning td {
+  padding: 0 1em 0 0;
+}
+.dialog-warning h4 {
+  margin-top: 0.3em;
+  margin-bottom: 0.3em;
+}
 .dialog-warning:before {
 .dialog-warning:before {
   content: "\f10f";
   content: "\f10f";
 }
 }
+.dialog-modal {
+  position: relative;
+  width: 70%;
+  padding: 1em 1em 1em 2.7em;
+  margin: 0em 8% 1em 8%;
+  border: 1px solid black;
+  border-radius: 4px;
+  text-align: left;
+  background: white;
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  /* bring your own prefixes */
+  transform: translate(-50%, -50%);
+  z-index: 100000;
+  margin: 0 50% 0 0;
+  box-shadow: 0 0 1em;
+}
+.dialog-modal:before {
+  position: absolute;
+  top: 0.5em;
+  left: 0.5em;
+  font-family: "ion";
+  font-size: 1.5em;
+}
+.dialog-modal .close {
+  float: right;
+  position: relative;
+  top: -3px;
+  color: inherit;
+  font-size: 1.5em;
+}
+.dialog-modal ul,
+.dialog-modal ol,
+.dialog-modal p {
+  margin: 1px 0 0 0;
+}
+.dialog-modal table {
+  width: auto;
+}
+.dialog-modal tr {
+  vertical-align: text-top;
+}
+.dialog-modal tr:hover {
+  background: transparent;
+}
+.dialog-modal td {
+  padding: 0 1em 0 0;
+}
+.dialog-modal h4 {
+  margin-top: 0.3em;
+  margin-bottom: 0.3em;
+}
 .btn-collapse {
 .btn-collapse {
   cursor: pointer;
   cursor: pointer;
 }
 }
@@ -816,6 +844,7 @@ tr:hover {
   margin: 0;
   margin: 0;
   border: none;
   border: none;
 }
 }
+/* -- tabs --*/
 .tabs .tabs > label {
 .tabs .tabs > label {
   font-size: 90%;
   font-size: 90%;
 }
 }
@@ -894,6 +923,7 @@ html body .tabs > input:checked + label {
 html body .tabs > input:checked + label + section {
 html body .tabs > input:checked + label + section {
   display: block;
   display: block;
 }
 }
+/* -- select -- */
 select {
 select {
   height: 28px;
   height: 28px;
   margin: 0 1em 0 0;
   margin: 0 1em 0 0;
@@ -924,6 +954,7 @@ select:focus {
     border-bottom: 1px solid #3498DB;
     border-bottom: 1px solid #3498DB;
   }
   }
 }
 }
+/* -- checkbox-onoff -- */
 @supports (border-radius: 50px) {
 @supports (border-radius: 50px) {
   .checkbox-onoff {
   .checkbox-onoff {
     display: inline-block;
     display: inline-block;
@@ -955,6 +986,7 @@ select:focus {
     background: #dcdcdc;
     background: #dcdcdc;
   }
   }
 }
 }
+/* -- checkbox --*/
 @supports (transform: rotate(-45deg)) {
 @supports (transform: rotate(-45deg)) {
   .checkbox {
   .checkbox {
     width: 20px;
     width: 20px;
@@ -1007,6 +1039,48 @@ select:focus {
     width: 100%;
     width: 100%;
   }
   }
 }
 }
+/* -- loader -- */
+.loader,
+.loader:after {
+  border-radius: 50%;
+  width: 2em;
+  height: 2em;
+}
+.loader {
+  margin: 1em auto;
+  font-size: 10px;
+  position: relative;
+  text-indent: -9999em;
+  border-top: 0.5em solid rgba(0, 0, 0, 0.2);
+  border-right: 0.5em solid rgba(0, 0, 0, 0.2);
+  border-bottom: 0.5em solid rgba(0, 0, 0, 0.2);
+  border-left: 0.5em solid rgba(255, 255, 255, 0);
+  -webkit-transform: translateZ(0);
+  -ms-transform: translateZ(0);
+  transform: translateZ(0);
+  -webkit-animation: load8 1.2s infinite linear;
+  animation: load8 1.2s infinite linear;
+}
+@-webkit-keyframes load8 {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+@keyframes load8 {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
 /*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */
 /*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */
 .autocomplete {
 .autocomplete {
   position: absolute;
   position: absolute;
@@ -1073,8 +1147,8 @@ select:focus {
 }
 }
 @font-face {
 @font-face {
   font-family: "ion";
   font-family: "ion";
-  src: url("../fonts/ion.eot?94af7082ea096aefe3a7b6642834716e");
+  src: url("../fonts/ion.eot?ce7a0ead692560b4405a96d5b8471f51");
-  src: url("../fonts/ion.eot?#iefix") format("embedded-opentype"), url("../fonts/ion.woff2?94af7082ea096aefe3a7b6642834716e") format("woff2"), url("../fonts/ion.woff?94af7082ea096aefe3a7b6642834716e") format("woff"), url("../fonts/ion.ttf?94af7082ea096aefe3a7b6642834716e") format("truetype"), url("../fonts/ion.svg?94af7082ea096aefe3a7b6642834716e#ion") format("svg");
+  src: url("../fonts/ion.eot?#iefix") format("embedded-opentype"), url("../fonts/ion.woff2?ce7a0ead692560b4405a96d5b8471f51") format("woff2"), url("../fonts/ion.woff?ce7a0ead692560b4405a96d5b8471f51") format("woff"), url("../fonts/ion.ttf?ce7a0ead692560b4405a96d5b8471f51") format("truetype"), url("../fonts/ion.svg?ce7a0ead692560b4405a96d5b8471f51#ion") format("svg");
   font-weight: normal;
   font-weight: normal;
   font-style: normal;
   font-style: normal;
 }
 }
@@ -1154,6 +1228,9 @@ select:focus {
 .ion-magnet:before {
 .ion-magnet:before {
   content: "\f114";
   content: "\f114";
 }
 }
+.ion-close:before {
+  content: "\f115";
+}
 .ion-icon-big {
 .ion-icon-big {
   display: inline-block;
   display: inline-block;
   vertical-align: middle;
   vertical-align: middle;
@@ -1240,6 +1317,22 @@ select:focus {
 #main_preferences table td {
 #main_preferences table td {
   text-align: center;
   text-align: center;
 }
 }
+#main_preferences table.cookies {
+  width: auto;
+}
+#main_preferences table.cookies th,
+#main_preferences table.cookies td {
+  text-align: left;
+  padding: 0.25em;
+}
+#main_preferences table.cookies th:first-child,
+#main_preferences table.cookies td:first-child {
+  padding-right: 4em;
+}
+#main_preferences table.cookies > tbody > tr:nth-child(even) > th,
+#main_preferences table.cookies > tbody > tr:nth-child(even) > td {
+  background-color: #ececec;
+}
 #main_preferences .name,
 #main_preferences .name,
 #main_preferences .shortcut {
 #main_preferences .shortcut {
   text-align: left;
   text-align: left;
@@ -1263,6 +1356,9 @@ select:focus {
 #main_preferences .preferences_back a::first-letter {
 #main_preferences .preferences_back a::first-letter {
   text-transform: uppercase;
   text-transform: uppercase;
 }
 }
+#main_preferences div.selectable_url pre {
+  width: 100%;
+}
 @media screen and (max-width: 75em) {
 @media screen and (max-width: 75em) {
   .preferences_back {
   .preferences_back {
     clear: both;
     clear: both;
@@ -1291,12 +1387,40 @@ select:focus {
 }
 }
 */
 */
 }
 }
+#clear_search {
+  display: block;
+  border-collapse: separate;
+  box-sizing: border-box;
+  width: 1.8em;
+  margin: 0;
+  padding: 2px;
+  height: 2.2em;
+  background: none repeat scroll 0 0 #FFF;
+  border-top: 1px solid #3498DB;
+  border-bottom: 1px solid #3498DB;
+  border-right: none;
+  border-left: none;
+  border-radius: 0px;
+  outline: none;
+  color: #222;
+  font-size: 16px;
+  z-index: 10000;
+}
+#clear_search:hover {
+  color: #3498DB;
+}
+#clear_search.empty * {
+  display: none;
+}
+#q::-ms-clear,
+#q::-webkit-search-cancel-button {
+  display: none;
+}
 #q,
 #q,
 #send_search {
 #send_search {
   display: block !important;
   display: block !important;
   border-collapse: separate;
   border-collapse: separate;
   box-sizing: border-box;
   box-sizing: border-box;
-  position: relative;
   margin: 0;
   margin: 0;
   padding: 2px;
   padding: 2px;
   height: 2.2em;
   height: 2.2em;
@@ -1857,27 +1981,8 @@ article.result-images[data-vim-selected]::before {
 #search_url {
 #search_url {
   margin-top: 8px;
   margin-top: 8px;
 }
 }
-#search_url div {
+#search_url div.selectable_url pre {
-  border: 1px solid #888;
-  padding: 4px;
-  color: #444;
-  width: 100%;
-  display: block;
-  margin: 0.1em;
-  overflow: hidden;
-  height: 1.2em;
-  line-height: 1.2em;
-}
-#search_url div pre {
-  display: block;
   width: 200em;
   width: 200em;
-  font-size: 0.8em;
-  word-break: break-all;
-  margin: 0.1em;
-  -webkit-user-select: all;
-  -moz-user-select: all;
-  -ms-user-select: all;
-  user-select: all;
 }
 }
 #linkto_preferences {
 #linkto_preferences {
   position: absolute;
   position: absolute;
@@ -2001,6 +2106,28 @@ article.result-images[data-vim-selected]::before {
     max-width: 98%;
     max-width: 98%;
   }
   }
 }
 }
+#main_results div#results.only_template_images {
+  flex-direction: column;
+  width: auto;
+  display: flex;
+}
+#main_results div#results.only_template_images #sidebar {
+  position: relative;
+  top: auto;
+  order: 2;
+}
+#main_results div#results.only_template_images #urls {
+  position: relative;
+  order: 1;
+}
+#main_results div#results.only_template_images #backToTop {
+  right: 0.5em;
+  left: auto;
+}
+#main_results div#results.only_template_images #pagination {
+  position: relative;
+  order: 3;
+}
 @media screen and (max-width: 50em) {
 @media screen and (max-width: 50em) {
   article[data-vim-selected]::before {
   article[data-vim-selected]::before {
     display: none;
     display: none;

File diff suppressed because it is too large
+ 0 - 0
searx/static/themes/simple/css/searx.min.css


+ 10 - 5
searx/static/themes/simple/fonts/ion.css

@@ -3,12 +3,12 @@
 
 
 @font-face {
 @font-face {
 	font-family:"ion";
 	font-family:"ion";
-	src:url("../fonts/ion.eot?492c5e946f5ae6f02467d64ca0f55cd1");
+	src:url("../fonts/ion.eot?ce7a0ead692560b4405a96d5b8471f51");
 	src:url("../fonts/ion.eot?#iefix") format("embedded-opentype"),
 	src:url("../fonts/ion.eot?#iefix") format("embedded-opentype"),
-		url("../fonts/ion.woff2?492c5e946f5ae6f02467d64ca0f55cd1") format("woff2"),
+		url("../fonts/ion.woff2?ce7a0ead692560b4405a96d5b8471f51") format("woff2"),
-		url("../fonts/ion.woff?492c5e946f5ae6f02467d64ca0f55cd1") format("woff"),
+		url("../fonts/ion.woff?ce7a0ead692560b4405a96d5b8471f51") format("woff"),
-		url("../fonts/ion.ttf?492c5e946f5ae6f02467d64ca0f55cd1") format("truetype"),
+		url("../fonts/ion.ttf?ce7a0ead692560b4405a96d5b8471f51") format("truetype"),
-		url("../fonts/ion.svg?492c5e946f5ae6f02467d64ca0f55cd1#ion") format("svg");
+		url("../fonts/ion.svg?ce7a0ead692560b4405a96d5b8471f51#ion") format("svg");
 	font-weight:normal;
 	font-weight:normal;
 	font-style:normal;
 	font-style:normal;
 }
 }
@@ -132,3 +132,8 @@
 .ion-magnet:before {
 .ion-magnet:before {
 	content:"\f114";
 	content:"\f114";
 }
 }
+
+
+.ion-close:before {
+	content:"\f115";
+}

BIN
searx/static/themes/simple/fonts/ion.eot


+ 12 - 5
searx/static/themes/simple/fonts/ion.html

@@ -60,12 +60,12 @@
 
 
 @font-face {
 @font-face {
 	font-family:"ion";
 	font-family:"ion";
-	src:url("ion.eot?492c5e946f5ae6f02467d64ca0f55cd1");
+	src:url("ion.eot?ce7a0ead692560b4405a96d5b8471f51");
 	src:url("ion.eot?#iefix") format("embedded-opentype"),
 	src:url("ion.eot?#iefix") format("embedded-opentype"),
-		url("ion.woff2?492c5e946f5ae6f02467d64ca0f55cd1") format("woff2"),
+		url("ion.woff2?ce7a0ead692560b4405a96d5b8471f51") format("woff2"),
-		url("ion.woff?492c5e946f5ae6f02467d64ca0f55cd1") format("woff"),
+		url("ion.woff?ce7a0ead692560b4405a96d5b8471f51") format("woff"),
-		url("ion.ttf?492c5e946f5ae6f02467d64ca0f55cd1") format("truetype"),
+		url("ion.ttf?ce7a0ead692560b4405a96d5b8471f51") format("truetype"),
-		url("ion.svg?492c5e946f5ae6f02467d64ca0f55cd1#ion") format("svg");
+		url("ion.svg?ce7a0ead692560b4405a96d5b8471f51#ion") format("svg");
 	font-weight:normal;
 	font-weight:normal;
 	font-style:normal;
 	font-style:normal;
 }
 }
@@ -190,6 +190,11 @@
 	content:"\f114";
 	content:"\f114";
 }
 }
 
 
+
+.ion-close:before {
+	content:"\f115";
+}
+
 		</style>
 		</style>
 	</head>
 	</head>
 	<body>
 	<body>
@@ -237,6 +242,8 @@
 			
 			
 				<div class="icons__item" data-name="magnet"><i class="ion-icon ion-magnet"></i> ion-magnet</div>
 				<div class="icons__item" data-name="magnet"><i class="ion-icon ion-magnet"></i> ion-magnet</div>
 			
 			
+				<div class="icons__item" data-name="close"><i class="ion-icon ion-close"></i> ion-close</div>
+			
 		</div>
 		</div>
 
 
 		
 		

+ 36 - 34
searx/static/themes/simple/fonts/ion.svg

@@ -1,11 +1,11 @@
 <?xml version="1.0" standalone="no"?>
 <?xml version="1.0" standalone="no"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
 <!--
 <!--
-2017-12-3: Created.
+2018-8-11: Created with FontForge (http://fontforge.org)
 -->
 -->
-<svg xmlns="http://www.w3.org/2000/svg">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
 <metadata>
 <metadata>
-Created by FontForge 20120731 at Sun Dec  3 21:40:53 2017
+Created by FontForge 20170924 at Sat Aug 11 14:26:20 2018
  By alexandre,,,
  By alexandre,,,
 
 
 </metadata>
 </metadata>
@@ -13,16 +13,16 @@ Created by FontForge 20120731 at Sun Dec  3 21:40:53 2017
 <font id="ion" horiz-adv-x="512" >
 <font id="ion" horiz-adv-x="512" >
   <font-face 
   <font-face 
     font-family="ion"
     font-family="ion"
-    font-weight="500"
+    font-weight="400"
     font-stretch="normal"
     font-stretch="normal"
     units-per-em="512"
     units-per-em="512"
-    panose-1="2 0 6 9 0 0 0 0 0 0"
+    panose-1="2 0 5 9 0 0 0 0 0 0"
     ascent="448"
     ascent="448"
     descent="-64"
     descent="-64"
     bbox="27.2368 -31.9632 479.993 415.9"
     bbox="27.2368 -31.9632 479.993 415.9"
     underline-thickness="25.6"
     underline-thickness="25.6"
     underline-position="-51.2"
     underline-position="-51.2"
-    unicode-range="U+F101-F114"
+    unicode-range="U+F101-F115"
   />
   />
     <missing-glyph />
     <missing-glyph />
     <glyph glyph-name="arrow-down-a" unicode="&#xf108;" 
     <glyph glyph-name="arrow-down-a" unicode="&#xf108;" 
@@ -30,34 +30,36 @@ d="M256.5 -0.5l-192 192h112v192h160v-192h112z" />
     <glyph glyph-name="arrow-dropdown" unicode="&#xf10b;" 
     <glyph glyph-name="arrow-dropdown" unicode="&#xf10b;" 
 d="M128 256h256l-128 -128z" />
 d="M128 256h256l-128 -128z" />
     <glyph glyph-name="arrow-swap" unicode="&#xf10a;" 
     <glyph glyph-name="arrow-swap" unicode="&#xf10a;" 
-d="M64 120c0 4.40039 3.59961 7.99999 8 7.99999h248v64l128 -96l-128 -96v64h-248c-4.40039 0 -8 3.59961 -8 8v48zM448 264c0 -4.40039 -3.59961 -8 -8 -8h-248v-64l-128 96l128 96v-64h248c4.40039 0 8 -3.59961 8 -8v-48z" />
+d="M64 120c0 4.40039 3.59961 8 8 8h248v64l128 -96l-128 -96v64h-248c-4.40039 0 -8 3.59961 -8 8v48zM448 264c0 -4.40039 -3.59961 -8 -8 -8h-248v-64l-128 96l128 96v-64h248c4.40039 0 8 -3.59961 8 -8v-48z" />
     <glyph glyph-name="arrow-up-a" unicode="&#xf109;" 
     <glyph glyph-name="arrow-up-a" unicode="&#xf109;" 
 d="M256.5 383.5l192 -192h-112v-192h-160v192h-112z" />
 d="M256.5 383.5l192 -192h-112v-192h-160v192h-112z" />
     <glyph glyph-name="chevron-left" unicode="&#xf106;" 
     <glyph glyph-name="chevron-left" unicode="&#xf106;" 
-d="M213.7 192l167.2 -174.2c4.19922 -4.2998 4.09961 -11.3994 -0.200195 -15.7998l-29.9004 -30.5996c-4.2998 -4.40039 -11.2998 -4.5 -15.5 -0.200191l-204.2 212.7c-2.09961 2.19922 -3.09961 5.09961 -3 8.09961c-0.199219 2.90039 0.800781 5.90039 3 8.09961
+d="M213.7 192l167.2 -174.2c4.19922 -4.2998 4.09961 -11.3994 -0.200195 -15.7998l-29.9004 -30.5996c-4.2998 -4.40039 -11.2998 -4.5 -15.5 -0.200195l-204.2 212.7c-2.09961 2.19922 -3.09961 5.09961 -3 8.09961c-0.199219 2.90039 0.800781 5.90039 3 8.09961
 l204.2 212.601c4.2002 4.2998 11.2002 4.2002 15.5 -0.200195l29.9004 -30.5996c4.2998 -4.40039 4.39941 -11.5 0.200195 -15.8008l-167.2 -174.1v0v0z" />
 l204.2 212.601c4.2002 4.2998 11.2002 4.2002 15.5 -0.200195l29.9004 -30.5996c4.2998 -4.40039 4.39941 -11.5 0.200195 -15.8008l-167.2 -174.1v0v0z" />
     <glyph glyph-name="chevron-right" unicode="&#xf107;" 
     <glyph glyph-name="chevron-right" unicode="&#xf107;" 
 d="M298.3 192v0v0l-167.2 174.1c-4.19922 4.30078 -4.09961 11.4004 0.200195 15.8008l29.9004 30.5996c4.2998 4.40039 11.2998 4.5 15.5 0.200195l204.2 -212.7c2.19922 -2.2002 3.19922 -5.2002 3 -8.09961c0.0996094 -3 -0.900391 -5.90039 -3 -8.10059l-204.2 -212.6
 d="M298.3 192v0v0l-167.2 174.1c-4.19922 4.30078 -4.09961 11.4004 0.200195 15.8008l29.9004 30.5996c4.2998 4.40039 11.2998 4.5 15.5 0.200195l204.2 -212.7c2.19922 -2.2002 3.19922 -5.2002 3 -8.09961c0.0996094 -3 -0.900391 -5.90039 -3 -8.10059l-204.2 -212.6
-c-4.2002 -4.29981 -11.2002 -4.2002 -15.5 0.200191l-29.9004 30.5996c-4.2998 4.40039 -4.39941 11.5 -0.200195 15.7998z" />
+c-4.2002 -4.2998 -11.2002 -4.2002 -15.5 0.200195l-29.9004 30.5996c-4.2998 4.40039 -4.39941 11.5 -0.200195 15.7998z" />
     <glyph glyph-name="chevron-up" unicode="&#xf105;" 
     <glyph glyph-name="chevron-up" unicode="&#xf105;" 
 d="M256 234.3l-174.2 -167.2c-4.2998 -4.19922 -11.3994 -4.09961 -15.7998 0.200195l-30.5996 29.9004c-4.40039 4.2998 -4.5 11.2998 -0.200195 15.5l212.7 204.2c2.19922 2.09961 5.09961 3.09961 8.09961 3c2.90039 0.199219 5.90039 -0.800781 8.09961 -3l212.7 -204.2
 d="M256 234.3l-174.2 -167.2c-4.2998 -4.19922 -11.3994 -4.09961 -15.7998 0.200195l-30.5996 29.9004c-4.40039 4.2998 -4.5 11.2998 -0.200195 15.5l212.7 204.2c2.19922 2.09961 5.09961 3.09961 8.09961 3c2.90039 0.199219 5.90039 -0.800781 8.09961 -3l212.7 -204.2
-c4.2998 -4.2002 4.20016 -11.2002 -0.200226 -15.5l-30.5996 -29.9004c-4.40039 -4.2998 -11.5 -4.39941 -15.7998 -0.200195l-174.2 167.2v0v0z" />
+c4.2998 -4.2002 4.2002 -11.2002 -0.200195 -15.5l-30.5996 -29.9004c-4.40039 -4.2998 -11.5 -4.39941 -15.7998 -0.200195l-174.2 167.2v0v0z" />
+    <glyph glyph-name="close" unicode="&#xf115;" 
+d="M405 311.202l-119.202 -119.202l119.202 -119.202l-29.7979 -29.7979l-119.202 119.202l-119.202 -119.202l-29.7979 29.7979l119.202 119.202l-119.202 119.202l29.7979 29.7979l119.202 -119.202l119.202 119.202z" />
     <glyph glyph-name="error" unicode="&#xf110;" 
     <glyph glyph-name="error" unicode="&#xf110;" 
-d="M256 400c114.4 0 208 -93.6006 208 -208c0 -114.399 -93.5996 -208 -208 -208s-208 93.6006 -208 208c0 114.399 93.5996 208 208 208zM280 88v40h-48v-40h48zM280 176v128h-48v-128h48z" />
+d="M256 400c114.4 0 208 -93.6006 208 -208s-93.5996 -208 -208 -208s-208 93.6006 -208 208s93.5996 208 208 208zM280 88v40h-48v-40h48zM280 176v128h-48v-128h48z" />
     <glyph glyph-name="film-outline" unicode="&#xf111;" 
     <glyph glyph-name="film-outline" unicode="&#xf111;" 
 d="M56 360h400v-336h-400v336zM128 40v48h-56v-48h56zM128 104v48h-56v-48h56zM128 168v48h-56v-48h56zM128 232v48h-56v-48h56zM128 296v48h-56v-48h56zM368 40v144h-224v-144h224zM368 200v144h-224v-144h224zM440 40v48h-56v-48h56zM440 104v48h-56v-48h56zM440 168v48
 d="M56 360h400v-336h-400v336zM128 40v48h-56v-48h56zM128 104v48h-56v-48h56zM128 168v48h-56v-48h56zM128 232v48h-56v-48h56zM128 296v48h-56v-48h56zM368 40v144h-224v-144h224zM368 200v144h-224v-144h224zM440 40v48h-56v-48h56zM440 104v48h-56v-48h56zM440 168v48
 h-56v-48h56zM440 232v48h-56v-48h56zM440 296v48h-56v-48h56z" />
 h-56v-48h56zM440 232v48h-56v-48h56zM440 296v48h-56v-48h56z" />
     <glyph glyph-name="globe" unicode="&#xf10c;" 
     <glyph glyph-name="globe" unicode="&#xf10c;" 
-d="M256 400c114.875 0 208 -93.125 208 -208c0 -114.875 -93.125 -208 -208 -208c-114.876 0 -208 93.125 -208 208c0 114.875 93.124 208 208 208zM234.451 15.001c6.04297 15.0449 19.9453 28.6484 7.27342 39.1172c-8.17285 6.75 -15.6123 13.6279 -23.1104 21.125
+d="M256 400c114.875 0 208 -93.125 208 -208s-93.125 -208 -208 -208c-114.876 0 -208 93.125 -208 208s93.124 208 208 208zM234.451 15.001c6.04297 15.0449 19.9453 28.6484 7.27344 39.1172c-8.17285 6.75 -15.6123 13.6279 -23.1104 21.125
-c-2.47461 2.47363 -9.9082 19.7109 -8.35156 22.3916c5.10254 8.78613 5.76367 14.8613 8.12988 24.7236c2.94336 12.2627 -3.33398 15.4434 -13.3828 21.8389c-15.2256 9.68848 -28.9629 22.4844 -43.3223 33.4941c-7.11621 5.45508 -17.4355 10.0986 -20.0186 18.9521
+c-2.47461 2.47363 -9.9082 19.7109 -8.35156 22.3916c5.10254 8.78613 5.76367 14.8613 8.12988 24.7236c2.94336 12.2627 -3.33398 15.4434 -13.3828 21.8389c-15.2256 9.68848 -28.9629 22.4844 -43.3213 33.4941c-7.11719 5.45508 -17.4365 10.0986 -20.0195 18.9521
 c-2.64062 9.05078 -3.97363 20.2598 -9.40039 28.0781c-13.9277 20.0752 -11.5791 34.9678 -9.93945 58.7627c0.449219 6.52637 -1.30371 15.6572 -2.01367 24.1748c-27.5654 -32.2354 -42.6016 -72.7891 -42.6016 -115.659c0 -47.6221 18.5439 -92.3926 52.2178 -126.067
 c-2.64062 9.05078 -3.97363 20.2598 -9.40039 28.0781c-13.9277 20.0752 -11.5791 34.9678 -9.93945 58.7627c0.449219 6.52637 -1.30371 15.6572 -2.01367 24.1748c-27.5654 -32.2354 -42.6016 -72.7891 -42.6016 -115.659c0 -47.6221 18.5439 -92.3926 52.2178 -126.067
 c28.541 -28.54 65.0557 -46.2061 104.52 -50.9316zM382.067 65.9326c23.0352 23.0381 38.9873 51.2695 46.7686 82.0527c-8.34668 -1.19141 -18.3838 2.22754 -18.3838 2.22754s-21.7363 23.707 -23.5244 44.5723c-1.85645 21.667 0.498047 38.3945 -2.89551 56.8105
 c28.541 -28.54 65.0557 -46.2061 104.52 -50.9316zM382.067 65.9326c23.0352 23.0381 38.9873 51.2695 46.7686 82.0527c-8.34668 -1.19141 -18.3838 2.22754 -18.3838 2.22754s-21.7363 23.707 -23.5244 44.5723c-1.85645 21.667 0.498047 38.3945 -2.89551 56.8105
-c-2.87988 15.624 -19.2803 31.5 -26.6729 46.3018c-6.92188 13.8555 -13.7334 27.7031 -20.2646 41.7451c2.25098 -0.848633 4.90039 -1.40234 6.96484 -2.62305c4.99902 0.636719 9.43066 1.22949 13.4629 1.59082c-22.5381 15.6758 -48.2725 25.8418 -75.5225 29.7998
+c-2.87988 15.624 -19.2803 31.5 -26.6729 46.3018c-6.9209 13.8555 -13.7334 27.7031 -20.2646 41.7451c2.25098 -0.848633 4.90039 -1.40234 6.96484 -2.62305c4.99902 0.636719 9.43066 1.22949 13.4629 1.59082c-22.5381 15.6758 -48.2725 25.8418 -75.5225 29.7998
-v-8.33887l3.55273 -9.27734l-13.7793 -12.9951l-8.6748 2.79492l-9.92383 10.2334l-9.94434 11.8008l-14.084 5.66016c-15.7227 -2.36133 -30.9336 -6.78711 -45.3096 -13.1523c0.360352 -2.30762 0.662109 -4.64453 0.662109 -7.13281
+v-8.33887l3.55273 -9.27734l-13.7783 -12.9951l-8.67578 2.79492l-9.92383 10.2334l-9.94336 11.8008l-14.084 5.66016c-15.7236 -2.36133 -30.9346 -6.78711 -45.3105 -13.1523c0.360352 -2.30762 0.662109 -4.64453 0.662109 -7.13281
-c7.17383 2.98926 15.2764 5.04883 22.4502 8.03906c2.96289 1.23438 12.7529 -7.1748 15.6221 -8.96777c-4.0957 -4.70996 -20.5576 -15.4434 -21.3574 -21.3574c-0.317383 -2.33984 6.50586 -6.06348 6.45117 -9.69141
+c7.17383 2.98926 15.2764 5.04883 22.4502 8.03906c2.96289 1.23438 12.7529 -7.1748 15.6221 -8.96777c-4.0957 -4.70996 -20.5576 -15.4434 -21.3574 -21.3574c-0.316406 -2.33984 6.50586 -6.06348 6.45117 -9.69141
-c-0.0878906 -5.74609 -0.173828 -11.4912 -0.259766 -17.2373c3.24414 2.76172 20.0332 20.3672 21.9404 20.8594c12.7256 3.2832 34.3916 -17.7646 36.249 -25.1934c1.8584 -7.42871 -21.6514 -23.6826 -32.6113 -34.0469
+c-0.0878906 -5.74609 -0.173828 -11.4912 -0.259766 -17.2373c3.24414 2.76172 20.0342 20.3672 21.9404 20.8594c12.7256 3.2832 34.3916 -17.7646 36.249 -25.1934c1.8584 -7.42871 -21.6514 -23.6826 -32.6113 -34.0469
-c-8.39941 -7.94434 -24.8086 -12.5137 -19.8037 -24.2285c1.62695 -3.80957 10.0498 -20.0156 5.21191 -24.0586c-5.92188 -4.94824 -14.7686 8.97656 -17.3418 12.0938c-8.1543 9.87695 -25.626 6.02539 -37.9082 6.47852c0 -17.4209 -0.757812 -31.1885 14.9219 -42.9971
+c-8.39941 -7.94434 -24.8086 -12.5137 -19.8037 -24.2285c1.62695 -3.80957 10.0508 -20.0156 5.21191 -24.0586c-5.92188 -4.94824 -14.7686 8.97656 -17.3418 12.0938c-8.15332 9.87695 -25.626 6.02539 -37.9082 6.47852c0 -17.4209 -0.757812 -31.1885 14.9229 -42.9971
-c15.1953 -11.4434 29.5977 -24.7061 47.0781 -32.3389c12.7637 -5.57129 35.7158 6.53613 47.0205 -1.41699c15.8672 -11.165 29.3066 -21.624 47.1611 -29.375c7.93359 -3.44531 32.418 -19.8828 25.3525 -30.7812c-4.96582 -7.66211 -9.87305 -14.8848 -13.5771 -23.2168
+c15.1943 -11.4434 29.5967 -24.7061 47.0771 -32.3389c12.7637 -5.57129 35.7158 6.53613 47.0205 -1.41699c15.8672 -11.165 29.3066 -21.624 47.1611 -29.375c7.93359 -3.44531 32.418 -19.8828 25.3525 -30.7812c-4.96582 -7.66211 -9.87305 -14.8848 -13.5771 -23.2168
 c-3.70703 -8.34375 -12.5957 -18.876 -19.6924 -24.3525c-8.15918 -6.29199 -16.9551 -17.1455 -21.8955 -29.3623c34.8574 6.5957 66.9229 23.4482 92.5566 49.0811z" />
 c-3.70703 -8.34375 -12.5957 -18.876 -19.6924 -24.3525c-8.15918 -6.29199 -16.9551 -17.1455 -21.8955 -29.3623c34.8574 6.5957 66.9229 23.4482 92.5566 49.0811z" />
     <glyph glyph-name="link" unicode="&#xf104;" 
     <glyph glyph-name="link" unicode="&#xf104;" 
 d="M256.5 240h-0.5v0h0.5zM368.5 288c44.2002 0 79.5 -35.2998 79.5 -79.5v-32c0 -44.2002 -35.2998 -80.5 -79.5 -80.5h-112c-32.7002 0 -61 19.7998 -73.5996 48c-4.40039 10 -6.90039 21 -6.90039 32.5v31.5h48v-31.5c0 -17.5996 14.9004 -32.5 32.5 -32.5h112
 d="M256.5 240h-0.5v0h0.5zM368.5 288c44.2002 0 79.5 -35.2998 79.5 -79.5v-32c0 -44.2002 -35.2998 -80.5 -79.5 -80.5h-112c-32.7002 0 -61 19.7998 -73.5996 48c-4.40039 10 -6.90039 21 -6.90039 32.5v31.5h48v-31.5c0 -17.5996 14.9004 -32.5 32.5 -32.5h112
@@ -67,37 +69,37 @@ c-17.5996 0 -32.5 -13.9004 -32.5 -31.5v-32c0 -17.5996 14.9004 -32.5 32.5 -32.5h1
 d="M256 384c65.9004 0 119.3 -53.7002 119.3 -120c0 -114.6 -119.3 -264 -119.3 -264s-119.3 149.4 -119.3 264c0 66.2998 53.3994 120 119.3 120zM256 205.8c31.2002 0 56.4004 25.4004 56.4004 56.7002c0 31.4004 -25.2002 56.7998 -56.4004 56.7998
 d="M256 384c65.9004 0 119.3 -53.7002 119.3 -120c0 -114.6 -119.3 -264 -119.3 -264s-119.3 149.4 -119.3 264c0 66.2998 53.3994 120 119.3 120zM256 205.8c31.2002 0 56.4004 25.4004 56.4004 56.7002c0 31.4004 -25.2002 56.7998 -56.4004 56.7998
 c-31.0996 0 -56.4004 -25.5 -56.4004 -56.7998s25.2002 -56.7002 56.4004 -56.7002z" />
 c-31.0996 0 -56.4004 -25.5 -56.4004 -56.7998s25.2002 -56.7002 56.4004 -56.7002z" />
     <glyph glyph-name="magnet" unicode="&#xf114;" 
     <glyph glyph-name="magnet" unicode="&#xf114;" 
-d="M27.7061 117.644h86.2139v-67.7236h-86.2256zM252.787 283.909c0 40.4043 -40.4521 43.457 -68.0937 43.457c-0.200195 0 -0.367188 -0.166992 -0.367188 -0.366211s0.166992 -0.366211 0.367188 -0.366211c27.7676 0 67.3604 -3.08398 67.3604 -42.7246h0.733383z
+d="M27.7061 117.644h86.2139v-67.7236h-86.2256zM184.326 327c0 -0.199219 0.166992 -0.366211 0.367188 -0.366211c27.7676 0 67.3604 -3.08398 67.3604 -42.7246v-141.625c0 -0.197266 0.163086 -0.362305 0.358398 -0.366211
-M113.554 142.632c-28.2832 -0.604492 -56.9688 0.0244141 -85.4844 0.0078125c-0.223633 50.5547 0.00195312 101.386 0.00195312 150.508c0.249023 43.3125 13.4043 70.168 42.957 92.0605c32.9863 25.5547 71.2646 27.0957 112.144 27.2324
+c28.75 -0.636719 57.4912 0.0107422 86.2236 0c0.208984 -0.000976562 0.366211 0.183594 0.367188 0.364258c0.238281 50.8672 0 101.591 0 150.867c-0.250977 43.4795 -13.5273 70.627 -43.2588 92.6426c-33.1963 25.7178 -71.71 27.2451 -112.575 27.3818
-c40.8623 -0.136719 79.1436 -1.67773 112.13 -27.2324c29.5635 -21.8926 42.7188 -48.7461 42.9678 -92.0625c0 -49.1631 0.238281 -99.6865 0.00195312 -150.495c-28.3008 0.00585938 -56.9746 -0.62793 -85.4844 -0.0078125l-0.733383 -0.358398
+c-40.8711 -0.136719 -79.3877 -1.66406 -112.583 -27.3818c-29.7207 -22.0166 -42.9971 -49.1611 -43.248 -92.6445c0 -49.2715 -0.227539 -99.999 0 -150.876c0.000976562 -0.208984 0.185547 -0.365234 0.367188 -0.365234c28.7324 0.0224609 57.4854 -0.625 86.2236 0
-c0 -0.197266 0.163101 -0.362305 0.358414 -0.366211c28.75 -0.636719 57.4912 0.0107422 86.2246 0c0.208008 -0.000976562 0.365234 0.183594 0.366211 0.364258c0.238281 50.8672 0 101.591 0 150.867c-0.25 43.4795 -13.5273 70.626 -43.2588 92.6426
+c0.196289 0.00390625 0.358398 0.170898 0.358398 0.366211v141.625c0 39.6406 39.6045 42.7363 67.3604 42.7363c0.200195 0 0.367188 0.166992 0.367188 0.366211s-0.166992 0.366211 -0.367188 0.366211c-27.6299 0 -68.0938 -3.06348 -68.0938 -43.4688v-141.266
-c-33.1963 25.7178 -71.71 27.2451 -112.575 27.3818c-40.8711 -0.136719 -79.3877 -1.66406 -112.583 -27.3818c-29.7207 -22.0166 -42.9971 -49.1611 -43.248 -92.6445c0 -49.2715 -0.227539 -99.999 0 -150.876
+c-28.2832 -0.604492 -56.9688 0.0244141 -85.4844 0.0078125c-0.223633 50.5547 0.00195312 101.386 0.00195312 150.508c0.249023 43.3125 13.4043 70.168 42.957 92.0605c32.9863 25.5547 71.2646 27.0957 112.144 27.2324
-c0.000976562 -0.208984 0.185547 -0.365234 0.367188 -0.365234c28.7324 0.0224609 57.4853 -0.625 86.2236 0c0.196289 0.00390625 0.358406 0.170898 0.358406 0.366211zM114.287 283.897c0 39.6406 39.6045 42.7363 67.3604 42.7363
+c40.8623 -0.136719 79.1436 -1.67773 112.13 -27.2324c29.5645 -21.8926 42.7188 -48.7461 42.9678 -92.0625c0 -49.1631 0.238281 -99.6865 0.00195312 -150.495c-28.3008 0.00585938 -56.9746 -0.62793 -85.4844 -0.0078125v141.267
-c0.200195 0 0.367188 0.166992 0.367188 0.366211s-0.166992 0.366211 -0.367188 0.366211c-27.6299 0 -68.0937 -3.06348 -68.0937 -43.4688h0.733391zM184.692 327.005c27.7061 0 67.7236 -3.07129 67.7236 -43.1006v-141.615
+c0 40.4043 -40.4521 43.457 -68.0938 43.457c-0.200195 0 -0.367188 -0.166992 -0.367188 -0.366211zM184.692 327.005c27.7061 0 67.7236 -3.07227 67.7236 -43.1006v-141.615c28.7422 -0.639648 57.4834 0.0117188 86.2256 0c0.232422 50.8633 0 101.586 0 150.854
-c28.7422 -0.639648 57.4834 0.0117188 86.2256 0c0.232422 50.8633 0 101.586 0 150.854c-0.255859 43.4033 -13.4746 70.3994 -43.1133 92.3574c-33.0938 25.6348 -71.4932 27.1709 -112.36 27.3105c-40.8672 -0.139648 -79.2666 -1.67578 -112.36 -27.3105
+c-0.255859 43.4033 -13.4746 70.3994 -43.1133 92.3574c-33.0938 25.6348 -71.4932 27.1709 -112.36 27.3105c-40.8672 -0.139648 -79.2666 -1.67578 -112.36 -27.3105c-29.6377 -21.958 -42.8574 -48.9541 -43.1016 -92.3574c0 -49.2686 -0.232422 -99.9912 0 -150.866
-c-29.6377 -21.958 -42.8574 -48.9541 -43.1016 -92.3574c0 -49.2686 -0.232422 -99.9912 0 -150.866c28.7422 0.0234375 57.4834 -0.62793 86.2139 0v141.615c0 40.0293 40.0293 43.1123 67.7236 43.1123zM252.463 117.644h86.2022v-67.7236h-86.2022v67.7236z" />
+c28.7422 0.0234375 57.4834 -0.62793 86.2139 0v141.615c0 40.0293 40.0293 43.1123 67.7236 43.1123zM252.463 117.644h86.2021v-67.7236h-86.2021v67.7236z" />
     <glyph glyph-name="more-vertical" unicode="&#xf113;" 
     <glyph glyph-name="more-vertical" unicode="&#xf113;" 
 d="M296 312c0 -22.002 -17.998 -40 -40 -40s-40 17.998 -40 40s17.998 40 40 40s40 -17.998 40 -40zM296 72c0 -22.002 -17.998 -40 -40 -40s-40 17.998 -40 40s17.998 40 40 40s40 -17.998 40 -40zM296 192c0 -22.002 -17.998 -40 -40 -40s-40 17.998 -40 40
 d="M296 312c0 -22.002 -17.998 -40 -40 -40s-40 17.998 -40 40s17.998 40 40 40s40 -17.998 40 -40zM296 72c0 -22.002 -17.998 -40 -40 -40s-40 17.998 -40 40s17.998 40 40 40s40 -17.998 40 -40zM296 192c0 -22.002 -17.998 -40 -40 -40s-40 17.998 -40 40
 s17.998 40 40 40s40 -17.998 40 -40z" />
 s17.998 40 40 40s40 -17.998 40 -40z" />
     <glyph glyph-name="music-note" unicode="&#xf112;" 
     <glyph glyph-name="music-note" unicode="&#xf112;" 
 d="M426 415.9c12.0996 0 22 -9.5 22.0996 -21.2002v-302.8c0 -24.7002 -3 -42.9004 -12 -54.9004h-0.199219c-9.10059 -15 -25 -21 -43.2002 -21h-37.2002c-28.2998 0 -51.2002 19.9004 -51.2002 48s22.9004 48 51.2002 48h60.5v192l-208 -38v-232
 d="M426 415.9c12.0996 0 22 -9.5 22.0996 -21.2002v-302.8c0 -24.7002 -3 -42.9004 -12 -54.9004h-0.199219c-9.10059 -15 -25 -21 -43.2002 -21h-37.2002c-28.2998 0 -51.2002 19.9004 -51.2002 48s22.9004 48 51.2002 48h60.5v192l-208 -38v-232
-c0 -8.2998 -3.40039 -27 -13 -41.0996c-1 -1.80078 -2.09961 -3.40039 -3.40039 -5c-0.5 -0.600586 -0.899414 -1.5 -1.5 -2.10059c-0.0996094 -0.0996094 -0.299805 -0.0996103 -0.399414 -0.200196c-9.40039 -10.5996 -23 -17.5 -38.2998 -17.5h-36.2002
+c0 -8.2998 -3.40039 -27 -13 -41.0996c-1 -1.80078 -2.09961 -3.40039 -3.40039 -5c-0.5 -0.600586 -0.899414 -1.5 -1.5 -2.10059c-0.0996094 -0.0996094 -0.299805 -0.0996094 -0.399414 -0.200195c-9.40039 -10.5996 -23 -17.5 -38.2998 -17.5h-36.2002
 c-28.2002 0 -51.2998 20 -51.2998 48s23.0996 48 51.0996 48v-0.0996094h61v286.5c1 14.5 13.5 27.9004 27.2998 31.5996l217.601 33.2002s2.89941 0.600586 5.09961 0.600586z" />
 c-28.2002 0 -51.2998 20 -51.2998 48s23.0996 48 51.0996 48v-0.0996094h61v286.5c1 14.5 13.5 27.9004 27.2998 31.5996l217.601 33.2002s2.89941 0.600586 5.09961 0.600586z" />
     <glyph glyph-name="navicon-round" unicode="&#xf101;" 
     <glyph glyph-name="navicon-round" unicode="&#xf101;" 
 d="M417.4 224c16.8994 0 30.5996 -14.2998 30.5996 -32s-13.7002 -32 -30.5996 -32h-322.801c-16.8994 0 -30.5996 14.2998 -30.5996 32s13.7002 32 30.5996 32h322.801zM417.4 352c16.8994 0 30.5996 -14.2998 30.5996 -32s-13.7002 -32 -30.5996 -32h-322.801
 d="M417.4 224c16.8994 0 30.5996 -14.2998 30.5996 -32s-13.7002 -32 -30.5996 -32h-322.801c-16.8994 0 -30.5996 14.2998 -30.5996 32s13.7002 32 30.5996 32h322.801zM417.4 352c16.8994 0 30.5996 -14.2998 30.5996 -32s-13.7002 -32 -30.5996 -32h-322.801
 c-16.8994 0 -30.5996 14.2998 -30.5996 32s13.7002 32 30.5996 32h322.801zM417.4 96c16.8994 0 30.5996 -14.2998 30.5996 -32s-13.7002 -32 -30.5996 -32h-322.801c-16.8994 0 -30.5996 14.2998 -30.5996 32s13.7002 32 30.5996 32h322.801z" />
 c-16.8994 0 -30.5996 14.2998 -30.5996 32s13.7002 32 30.5996 32h322.801zM417.4 96c16.8994 0 30.5996 -14.2998 30.5996 -32s-13.7002 -32 -30.5996 -32h-322.801c-16.8994 0 -30.5996 14.2998 -30.5996 32s13.7002 32 30.5996 32h322.801z" />
     <glyph glyph-name="play" unicode="&#xf103;" 
     <glyph glyph-name="play" unicode="&#xf103;" 
-d="M405.2 215.1c6.59961 -5.59961 10.7998 -13.7998 10.7998 -23.0996s-4.2002 -17.5996 -10.7998 -23.0996l-278.101 -165.5c-3.69922 -2 -7.09962 -3.40039 -11.1992 -3.40039c-10.9004 0 -19.8008 9 -19.8008 20h-0.0996094v344h0.0996094c0 11 8.90039 20 19.8008 20
+d="M405.2 215.1c6.59961 -5.59961 10.7998 -13.7998 10.7998 -23.0996s-4.2002 -17.5996 -10.7998 -23.0996l-278.101 -165.5c-3.69922 -2 -7.09961 -3.40039 -11.1992 -3.40039c-10.9004 0 -19.8008 9 -19.8008 20h-0.0996094v344h0.0996094c0 11 8.90039 20 19.8008 20
-c4 0 7.49999 -1.2002 10.8994 -3.2002z" />
+c4 0 7.5 -1.2002 10.8994 -3.2002z" />
     <glyph glyph-name="search" unicode="&#xf102;" 
     <glyph glyph-name="search" unicode="&#xf102;" 
 d="M445 61.2998c4 -4 4 -10.3994 0 -14.5l-43.2998 -43.7998c-1.90039 -2 -4.60059 -3.09961 -7.2998 -3.09961c-2.7002 0 -5.40039 1.19922 -7.30078 3.09961l-84.3994 85.5996c-24.6006 -14.6992 -52.2002 -22.3994 -80.1006 -22.3994
 d="M445 61.2998c4 -4 4 -10.3994 0 -14.5l-43.2998 -43.7998c-1.90039 -2 -4.60059 -3.09961 -7.2998 -3.09961c-2.7002 0 -5.40039 1.19922 -7.30078 3.09961l-84.3994 85.5996c-24.6006 -14.6992 -52.2002 -22.3994 -80.1006 -22.3994
 c-87.3994 0 -158.6 71.2998 -158.6 158.899c0 87.6006 71.2002 158.9 158.6 158.9c87.4004 0 158.601 -71.2998 158.601 -158.9c0 -27 -7.2002 -53.7998 -21 -77.8994zM222.6 322.1c-53.3994 0 -96.7998 -43.5 -96.7998 -97s43.4004 -97 96.7998 -97
 c-87.3994 0 -158.6 71.2998 -158.6 158.899c0 87.6006 71.2002 158.9 158.6 158.9c87.4004 0 158.601 -71.2998 158.601 -158.9c0 -27 -7.2002 -53.7998 -21 -77.8994zM222.6 322.1c-53.3994 0 -96.7998 -43.5 -96.7998 -97s43.4004 -97 96.7998 -97
 c53.4004 0 96.8008 43.5 96.8008 97s-43.4004 97 -96.8008 97z" />
 c53.4004 0 96.8008 43.5 96.8008 97s-43.4004 97 -96.8008 97z" />
     <glyph glyph-name="time" unicode="&#xf10d;" 
     <glyph glyph-name="time" unicode="&#xf10d;" 
-d="M256 405c117.149 0 213 -95.8506 213 -213c0 -117.149 -94.7891 -213 -213 -213s-213 95.8506 -213 213c0 117.149 94.7891 213 213 213zM256 21.5996c93.7178 0 170.4 76.6826 170.4 170.4s-76.6826 170.4 -170.4 170.4s-170.4 -76.6836 -170.4 -170.4
+d="M256 405c117.149 0 213 -95.8506 213 -213s-94.7891 -213 -213 -213s-213 95.8506 -213 213s94.7891 213 213 213zM256 21.5996c93.7178 0 170.4 76.6826 170.4 170.4s-76.6826 170.4 -170.4 170.4s-170.4 -76.6836 -170.4 -170.4s76.6826 -170.4 170.4 -170.4z
-s76.6826 -170.4 170.4 -170.4zM266.65 298.5v-111.824l95.8496 -56.4434l-15.9746 -26.625l-111.825 67.0928v127.8h31.9502z" />
+M266.65 298.5v-111.824l95.8496 -56.4434l-15.9746 -26.625l-111.825 67.0928v127.8h31.9502z" />
     <glyph glyph-name="warning" unicode="&#xf10f;" 
     <glyph glyph-name="warning" unicode="&#xf10f;" 
-d="M476.7 25.7998c2.7998 -4.89941 4.7998 -13 1.7998 -17.8994c-2.90039 -4.90039 -8.20016 -7.90039 -14 -7.90039h-417.1c-5.80078 0 -11.1006 3 -14 7.90039c-2.90039 4.89941 -0.900391 12.8994 1.89941 17.8994l206.601 349.5c2.7998 5 8.1992 8.7002 14.0996 8.7002
+d="M476.7 25.7998c2.7998 -4.89941 4.7998 -13 1.7998 -17.8994c-2.90039 -4.90039 -8.2002 -7.90039 -14 -7.90039h-417.1c-5.80078 0 -11.1006 3 -14 7.90039c-2.90039 4.89941 -0.900391 12.8994 1.89941 17.8994l206.601 349.5c2.7998 5 8.19922 8.7002 14.0996 8.7002
 c5.7998 0 11.2002 -3.7002 14.0996 -8.7002zM288 48v48h-64v-48h64zM288 128v144h-64v-144h64z" />
 c5.7998 0 11.2002 -3.7002 14.0996 -8.7002zM288 48v48h-64v-48h64zM288 128v144h-64v-144h64z" />
   </font>
   </font>
 </defs></svg>
 </defs></svg>

BIN
searx/static/themes/simple/fonts/ion.ttf


BIN
searx/static/themes/simple/fonts/ion.woff


BIN
searx/static/themes/simple/fonts/ion.woff2


+ 7 - 2
searx/static/themes/simple/gruntfile.js

@@ -25,6 +25,10 @@ module.exports = function(grunt) {
 	output: {
 	output: {
 	    comments: 'some'
 	    comments: 'some'
 	},
 	},
+        ie8: false,
+        warnings: true,
+        compress: false,
+        mangle: true,
         sourceMap: true
         sourceMap: true
       },
       },
       dist: {
       dist: {
@@ -63,7 +67,7 @@ module.exports = function(grunt) {
           plugins: [
           plugins: [
             new (require('less-plugin-clean-css'))({
             new (require('less-plugin-clean-css'))({
               advanced: true,
               advanced: true,
-              compatibility: 'ie8'
+              compatibility: '*'
             })
             })
           ],
           ],
           banner: '/*! searx | <%= grunt.template.today("dd-mm-yyyy") %> | https://github.com/asciimoo/searx */\n'
           banner: '/*! searx | <%= grunt.template.today("dd-mm-yyyy") %> | https://github.com/asciimoo/searx */\n'
@@ -99,7 +103,8 @@ module.exports = function(grunt) {
           'node_modules/ionicons-npm/src/music-note.svg',
           'node_modules/ionicons-npm/src/music-note.svg',
           'node_modules/ionicons-npm/src/ion-close-round.svg',
           'node_modules/ionicons-npm/src/ion-close-round.svg',
           'node_modules/ionicons-npm/src/android-more-vertical.svg',
           'node_modules/ionicons-npm/src/android-more-vertical.svg',
-          'magnet.svg'
+          'magnet.svg',
+          'node_modules/ionicons-npm/src/android-close.svg',	  
         ],
         ],
         dest: 'fonts',
         dest: 'fonts',
         destLess: 'less',
         destLess: 'less',

BIN
searx/static/themes/simple/img/loader.gif


+ 70 - 31
searx/static/themes/simple/js/searx.js

@@ -147,10 +147,19 @@
     }
     }
   };
   };
 
 
+  searx.insertBefore = function (newNode, referenceNode) {
+    element.parentNode.insertBefore(newNode, referenceNode);
+  };
+
+  searx.insertAfter = function(newNode, referenceNode) {
+    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
+  };  
+
   searx.on('.close', 'click', function(e) {
   searx.on('.close', 'click', function(e) {
     var el = e.target || e.srcElement;
     var el = e.target || e.srcElement;
-    this.parentNode.style.display="None";
+    this.parentNode.classList.add('invisible');
   });
   });
+  
   return searx;
   return searx;
 })(window, document, window.searx);
 })(window, document, window.searx);
 ;(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.AutoComplete = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
 ;(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.AutoComplete = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
@@ -958,7 +967,7 @@ module.exports = AutoComplete;
     }
     }
   };
   };
 
 
-  searx.on(document, "keyup", function(e) {
+  searx.on(document, "keydown", function(e) {
     // check for modifiers so we don't break browser's hotkeys
     // check for modifiers so we don't break browser's hotkeys
     if (vimKeys.hasOwnProperty(e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
     if (vimKeys.hasOwnProperty(e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
       var tagName = e.target.tagName.toLowerCase();
       var tagName = e.target.tagName.toLowerCase();
@@ -968,6 +977,7 @@ module.exports = AutoComplete;
         }
         }
       } else {
       } else {
         if (e.target === document.body || tagName === 'a' || tagName === 'button') {
         if (e.target === document.body || tagName === 'a' || tagName === 'button') {
+          e.preventDefault();
           vimKeys[e.keyCode].fun();
           vimKeys[e.keyCode].fun();
         }
         }
       }
       }
@@ -1132,13 +1142,7 @@ module.exports = AutoComplete;
     };
     };
   }
   }
 
 
-  function toggleHelp() {
+  function initHelpContent(divElement) {
-    var helpPanel = document.querySelector('#vim-hotkeys-help');
-    if (helpPanel.length) {
-      helpPanel.classList.toggle('hidden');
-      return;
-    }
-
     var categories = {};
     var categories = {};
 
 
     for (var k in vimKeys) {
     for (var k in vimKeys) {
@@ -1155,14 +1159,9 @@ module.exports = AutoComplete;
       return;
       return;
     }
     }
 
 
-    var html = '<div id="vim-hotkeys-help" class="well vim-hotkeys-help">';
+  	var html = '<a href="#" class="close" aria-label="close" title="close">×</a>';
-    html += '<div class="container-fluid">';
+    html += '<h3>How to navigate searx with Vim-like hotkeys</h3>';			
-
+		html += '<table>';
-    html += '<div class="row">';
-    html += '<div class="col-sm-12">';
-    html += '<h3>How to navigate searx with Vim-like hotkeys</h3>';
-    html += '</div>'; // col-sm-12
-    html += '</div>'; // row
 
 
     for (var i = 0; i < sorted.length; i++) {
     for (var i = 0; i < sorted.length; i++) {
       var cat = categories[sorted[i]];
       var cat = categories[sorted[i]];
@@ -1171,13 +1170,11 @@ module.exports = AutoComplete;
       var first = i % 2 === 0;
       var first = i % 2 === 0;
 
 
       if (first) {
       if (first) {
-        html += '<div class="row dflex">';
+        html += '<tr>';
       }
       }
-      html += '<div class="col-sm-' + (first && lastCategory ? 12 : 6) + ' dflex">';
+      html += '<td>';
 
 
-      html += '<div class="panel panel-default iflex">';
+      html += '<h4>' + cat[0].cat + '</h4>';
-      html += '<div class="panel-heading">' + cat[0].cat + '</div>';
-      html += '<div class="panel-body">';
       html += '<ul class="list-unstyled">';
       html += '<ul class="list-unstyled">';
 
 
       for (var cj in cat) {
       for (var cj in cat) {
@@ -1185,20 +1182,38 @@ module.exports = AutoComplete;
       }
       }
 
 
       html += '</ul>';
       html += '</ul>';
-      html += '</div>'; // panel-body
+      html += '</td>'; // col-sm-*
-      html += '</div>'; // panel
-      html += '</div>'; // col-sm-*
 
 
       if (!first || lastCategory) {
       if (!first || lastCategory) {
-        html += '</div>'; // row
+        html += '</tr>'; // row
       }
       }
     }
     }
 
 
-    html += '</div>'; // container-fluid
+		html += '</table>';
-    html += '</div>'; // vim-hotkeys-help
+
+ 	  divElement.innerHTML = html;
+	}
+
+  function toggleHelp() {
+			var helpPanel = document.querySelector('#vim-hotkeys-help');
+			console.log(helpPanel);
+		if (helpPanel === undefined || helpPanel === null) {
+ 		  // first call
+			helpPanel = document.createElement('div');
+   			helpPanel.id = 'vim-hotkeys-help';
+				helpPanel.className='dialog-modal';
+				helpPanel.style='width: 40%';
+			initHelpContent(helpPanel);					
+			var body = document.getElementsByTagName('body')[0];
+			body.appendChild(helpPanel);
+		} else {
+ 		  // togggle hidden
+			helpPanel.classList.toggle('invisible');
+			return;
+		}
 
 
-    $('body').append(html);
   }
   }
+	
 });
 });
 ;/**
 ;/**
 * searx is free software: you can redistribute it and/or modify
 * searx is free software: you can redistribute it and/or modify
@@ -1292,13 +1307,14 @@ module.exports = AutoComplete;
                   newHtml += "</td></tr>";
                   newHtml += "</td></tr>";
                 }
                 }
               }
               }
-              result_table_loadicon.classList.add('invisible');
+	      result_table_loadicon.parentNode.removeChild(result_table_loadicon);
               result_table.classList.remove('invisible');
               result_table.classList.remove('invisible');
               result_table.querySelector("tbody").innerHTML = newHtml;
               result_table.querySelector("tbody").innerHTML = newHtml;
             }
             }
           })
           })
           .catch(function() {
           .catch(function() {
-            result_table_loadicon.innerHTML = result_table_loadicon.innerHTML + "<p class=\"text-muted\">could not load data!</p>";
+            result_table_loadicon.classList.remove('invisible');
+            result_table_loadicon.innerHTML = "could not load data!";
           });
           });
         }
         }
       }
       }
@@ -1473,6 +1489,26 @@ module.exports = AutoComplete;
     }
     }
   }
   }
 
 
+  function createClearButton(qinput) {
+    var cs = document.getElementById('clear_search');
+    var updateClearButton = function() {
+      if (qinput.value.length === 0) {
+	cs.classList.add("empty");
+      } else {
+	cs.classList.remove("empty");
+      }
+    };
+
+    // update status, event listener
+    updateClearButton();
+    cs.addEventListener('click', function() {
+      qinput.value='';
+      qinput.focus();
+      updateClearButton();
+    });
+    qinput.addEventListener('keyup', updateClearButton, false);
+  }
+
   searx.ready(function() {
   searx.ready(function() {
     qinput = d.getElementById(qinput_id);
     qinput = d.getElementById(qinput_id);
 
 
@@ -1486,6 +1522,9 @@ module.exports = AutoComplete;
     }
     }
 
 
     if (qinput !== null) {
     if (qinput !== null) {
+      // clear button
+      createClearButton(qinput);
+      
       // autocompleter
       // autocompleter
       if (searx.autocompleter) {
       if (searx.autocompleter) {
         searx.autocomplete = AutoComplete.call(w, {
         searx.autocomplete = AutoComplete.call(w, {

File diff suppressed because it is too large
+ 1 - 1
searx/static/themes/simple/js/searx.min.js


File diff suppressed because it is too large
+ 0 - 0
searx/static/themes/simple/js/searx.min.js.map


+ 10 - 1
searx/static/themes/simple/js/searx_src/00_searx_toolkit.js

@@ -147,9 +147,18 @@
     }
     }
   };
   };
 
 
+  searx.insertBefore = function (newNode, referenceNode) {
+    element.parentNode.insertBefore(newNode, referenceNode);
+  };
+
+  searx.insertAfter = function(newNode, referenceNode) {
+    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
+  };  
+
   searx.on('.close', 'click', function(e) {
   searx.on('.close', 'click', function(e) {
     var el = e.target || e.srcElement;
     var el = e.target || e.srcElement;
-    this.parentNode.style.display="None";
+    this.parentNode.classList.add('invisible');
   });
   });
+  
   return searx;
   return searx;
 })(window, document, window.searx);
 })(window, document, window.searx);

+ 34 - 28
searx/static/themes/simple/js/searx_src/searx_keyboard.js

@@ -116,7 +116,7 @@ searx.ready(function() {
     }
     }
   };
   };
 
 
-  searx.on(document, "keyup", function(e) {
+  searx.on(document, "keydown", function(e) {
     // check for modifiers so we don't break browser's hotkeys
     // check for modifiers so we don't break browser's hotkeys
     if (vimKeys.hasOwnProperty(e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
     if (vimKeys.hasOwnProperty(e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
       var tagName = e.target.tagName.toLowerCase();
       var tagName = e.target.tagName.toLowerCase();
@@ -126,6 +126,7 @@ searx.ready(function() {
         }
         }
       } else {
       } else {
         if (e.target === document.body || tagName === 'a' || tagName === 'button') {
         if (e.target === document.body || tagName === 'a' || tagName === 'button') {
+          e.preventDefault();
           vimKeys[e.keyCode].fun();
           vimKeys[e.keyCode].fun();
         }
         }
       }
       }
@@ -290,13 +291,7 @@ searx.ready(function() {
     };
     };
   }
   }
 
 
-  function toggleHelp() {
+  function initHelpContent(divElement) {
-    var helpPanel = document.querySelector('#vim-hotkeys-help');
-    if (helpPanel.length) {
-      helpPanel.classList.toggle('hidden');
-      return;
-    }
-
     var categories = {};
     var categories = {};
 
 
     for (var k in vimKeys) {
     for (var k in vimKeys) {
@@ -313,14 +308,9 @@ searx.ready(function() {
       return;
       return;
     }
     }
 
 
-    var html = '<div id="vim-hotkeys-help" class="well vim-hotkeys-help">';
+  	var html = '<a href="#" class="close" aria-label="close" title="close">×</a>';
-    html += '<div class="container-fluid">';
+    html += '<h3>How to navigate searx with Vim-like hotkeys</h3>';			
-
+		html += '<table>';
-    html += '<div class="row">';
-    html += '<div class="col-sm-12">';
-    html += '<h3>How to navigate searx with Vim-like hotkeys</h3>';
-    html += '</div>'; // col-sm-12
-    html += '</div>'; // row
 
 
     for (var i = 0; i < sorted.length; i++) {
     for (var i = 0; i < sorted.length; i++) {
       var cat = categories[sorted[i]];
       var cat = categories[sorted[i]];
@@ -329,13 +319,11 @@ searx.ready(function() {
       var first = i % 2 === 0;
       var first = i % 2 === 0;
 
 
       if (first) {
       if (first) {
-        html += '<div class="row dflex">';
+        html += '<tr>';
       }
       }
-      html += '<div class="col-sm-' + (first && lastCategory ? 12 : 6) + ' dflex">';
+      html += '<td>';
 
 
-      html += '<div class="panel panel-default iflex">';
+      html += '<h4>' + cat[0].cat + '</h4>';
-      html += '<div class="panel-heading">' + cat[0].cat + '</div>';
-      html += '<div class="panel-body">';
       html += '<ul class="list-unstyled">';
       html += '<ul class="list-unstyled">';
 
 
       for (var cj in cat) {
       for (var cj in cat) {
@@ -343,18 +331,36 @@ searx.ready(function() {
       }
       }
 
 
       html += '</ul>';
       html += '</ul>';
-      html += '</div>'; // panel-body
+      html += '</td>'; // col-sm-*
-      html += '</div>'; // panel
-      html += '</div>'; // col-sm-*
 
 
       if (!first || lastCategory) {
       if (!first || lastCategory) {
-        html += '</div>'; // row
+        html += '</tr>'; // row
       }
       }
     }
     }
 
 
-    html += '</div>'; // container-fluid
+		html += '</table>';
-    html += '</div>'; // vim-hotkeys-help
+
+ 	  divElement.innerHTML = html;
+	}
+
+  function toggleHelp() {
+			var helpPanel = document.querySelector('#vim-hotkeys-help');
+			console.log(helpPanel);
+		if (helpPanel === undefined || helpPanel === null) {
+ 		  // first call
+			helpPanel = document.createElement('div');
+   			helpPanel.id = 'vim-hotkeys-help';
+				helpPanel.className='dialog-modal';
+				helpPanel.style='width: 40%';
+			initHelpContent(helpPanel);					
+			var body = document.getElementsByTagName('body')[0];
+			body.appendChild(helpPanel);
+		} else {
+ 		  // togggle hidden
+			helpPanel.classList.toggle('invisible');
+			return;
+		}
 
 
-    $('body').append(html);
   }
   }
+	
 });
 });

+ 3 - 2
searx/static/themes/simple/js/searx_src/searx_mapresult.js

@@ -90,13 +90,14 @@
                   newHtml += "</td></tr>";
                   newHtml += "</td></tr>";
                 }
                 }
               }
               }
-              result_table_loadicon.classList.add('invisible');
+	      result_table_loadicon.parentNode.removeChild(result_table_loadicon);
               result_table.classList.remove('invisible');
               result_table.classList.remove('invisible');
               result_table.querySelector("tbody").innerHTML = newHtml;
               result_table.querySelector("tbody").innerHTML = newHtml;
             }
             }
           })
           })
           .catch(function() {
           .catch(function() {
-            result_table_loadicon.innerHTML = result_table_loadicon.innerHTML + "<p class=\"text-muted\">could not load data!</p>";
+            result_table_loadicon.classList.remove('invisible');
+            result_table_loadicon.innerHTML = "could not load data!";
           });
           });
         }
         }
       }
       }

+ 23 - 0
searx/static/themes/simple/js/searx_src/searx_search.js

@@ -33,6 +33,26 @@
     }
     }
   }
   }
 
 
+  function createClearButton(qinput) {
+    var cs = document.getElementById('clear_search');
+    var updateClearButton = function() {
+      if (qinput.value.length === 0) {
+	cs.classList.add("empty");
+      } else {
+	cs.classList.remove("empty");
+      }
+    };
+
+    // update status, event listener
+    updateClearButton();
+    cs.addEventListener('click', function() {
+      qinput.value='';
+      qinput.focus();
+      updateClearButton();
+    });
+    qinput.addEventListener('keyup', updateClearButton, false);
+  }
+
   searx.ready(function() {
   searx.ready(function() {
     qinput = d.getElementById(qinput_id);
     qinput = d.getElementById(qinput_id);
 
 
@@ -46,6 +66,9 @@
     }
     }
 
 
     if (qinput !== null) {
     if (qinput !== null) {
+      // clear button
+      createClearButton(qinput);
+      
       // autocompleter
       // autocompleter
       if (searx.autocompleter) {
       if (searx.autocompleter) {
         searx.autocomplete = AutoComplete.call(w, {
         searx.autocomplete = AutoComplete.call(w, {

BIN
searx/static/themes/simple/leaflet/images/marker-icon-2x.png


+ 636 - 624
searx/static/themes/simple/leaflet/leaflet.css

@@ -1,624 +1,636 @@
-/* required styles */
+/* required styles */
-
+
-.leaflet-pane,
+.leaflet-pane,
-.leaflet-tile,
+.leaflet-tile,
-.leaflet-marker-icon,
+.leaflet-marker-icon,
-.leaflet-marker-shadow,
+.leaflet-marker-shadow,
-.leaflet-tile-container,
+.leaflet-tile-container,
-.leaflet-pane > svg,
+.leaflet-pane > svg,
-.leaflet-pane > canvas,
+.leaflet-pane > canvas,
-.leaflet-zoom-box,
+.leaflet-zoom-box,
-.leaflet-image-layer,
+.leaflet-image-layer,
-.leaflet-layer {
+.leaflet-layer {
-	position: absolute;
+	position: absolute;
-	left: 0;
+	left: 0;
-	top: 0;
+	top: 0;
-	}
+	}
-.leaflet-container {
+.leaflet-container {
-	overflow: hidden;
+	overflow: hidden;
-	}
+	}
-.leaflet-tile,
+.leaflet-tile,
-.leaflet-marker-icon,
+.leaflet-marker-icon,
-.leaflet-marker-shadow {
+.leaflet-marker-shadow {
-	-webkit-user-select: none;
+	-webkit-user-select: none;
-	   -moz-user-select: none;
+	   -moz-user-select: none;
-	        user-select: none;
+	        user-select: none;
-	  -webkit-user-drag: none;
+	  -webkit-user-drag: none;
-	}
+	}
-/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
+/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
-.leaflet-safari .leaflet-tile {
+.leaflet-safari .leaflet-tile {
-	image-rendering: -webkit-optimize-contrast;
+	image-rendering: -webkit-optimize-contrast;
-	}
+	}
-/* hack that prevents hw layers "stretching" when loading new tiles */
+/* hack that prevents hw layers "stretching" when loading new tiles */
-.leaflet-safari .leaflet-tile-container {
+.leaflet-safari .leaflet-tile-container {
-	width: 1600px;
+	width: 1600px;
-	height: 1600px;
+	height: 1600px;
-	-webkit-transform-origin: 0 0;
+	-webkit-transform-origin: 0 0;
-	}
+	}
-.leaflet-marker-icon,
+.leaflet-marker-icon,
-.leaflet-marker-shadow {
+.leaflet-marker-shadow {
-	display: block;
+	display: block;
-	}
+	}
-/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
+/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
-/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
+/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
-.leaflet-container .leaflet-overlay-pane svg,
+.leaflet-container .leaflet-overlay-pane svg,
-.leaflet-container .leaflet-marker-pane img,
+.leaflet-container .leaflet-marker-pane img,
-.leaflet-container .leaflet-shadow-pane img,
+.leaflet-container .leaflet-shadow-pane img,
-.leaflet-container .leaflet-tile-pane img,
+.leaflet-container .leaflet-tile-pane img,
-.leaflet-container img.leaflet-image-layer {
+.leaflet-container img.leaflet-image-layer {
-	max-width: none !important;
+	max-width: none !important;
-	}
+	max-height: none !important;
-
+	}
-.leaflet-container.leaflet-touch-zoom {
+
-	-ms-touch-action: pan-x pan-y;
+.leaflet-container.leaflet-touch-zoom {
-	touch-action: pan-x pan-y;
+	-ms-touch-action: pan-x pan-y;
-	}
+	touch-action: pan-x pan-y;
-.leaflet-container.leaflet-touch-drag {
+	}
-	-ms-touch-action: pinch-zoom;
+.leaflet-container.leaflet-touch-drag {
-	}
+	-ms-touch-action: pinch-zoom;
-.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
+	/* Fallback for FF which doesn't support pinch-zoom */
-	-ms-touch-action: none;
+	touch-action: none;
-	touch-action: none;
+	touch-action: pinch-zoom;
-}
+}
-.leaflet-tile {
+.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
-	filter: inherit;
+	-ms-touch-action: none;
-	visibility: hidden;
+	touch-action: none;
-	}
+}
-.leaflet-tile-loaded {
+.leaflet-container {
-	visibility: inherit;
+	-webkit-tap-highlight-color: transparent;
-	}
+}
-.leaflet-zoom-box {
+.leaflet-container a {
-	width: 0;
+	-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
-	height: 0;
+}
-	-moz-box-sizing: border-box;
+.leaflet-tile {
-	     box-sizing: border-box;
+	filter: inherit;
-	z-index: 800;
+	visibility: hidden;
-	}
+	}
-/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
+.leaflet-tile-loaded {
-.leaflet-overlay-pane svg {
+	visibility: inherit;
-	-moz-user-select: none;
+	}
-	}
+.leaflet-zoom-box {
-
+	width: 0;
-.leaflet-pane         { z-index: 400; }
+	height: 0;
-
+	-moz-box-sizing: border-box;
-.leaflet-tile-pane    { z-index: 200; }
+	     box-sizing: border-box;
-.leaflet-overlay-pane { z-index: 400; }
+	z-index: 800;
-.leaflet-shadow-pane  { z-index: 500; }
+	}
-.leaflet-marker-pane  { z-index: 600; }
+/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
-.leaflet-tooltip-pane   { z-index: 650; }
+.leaflet-overlay-pane svg {
-.leaflet-popup-pane   { z-index: 700; }
+	-moz-user-select: none;
-
+	}
-.leaflet-map-pane canvas { z-index: 100; }
+
-.leaflet-map-pane svg    { z-index: 200; }
+.leaflet-pane         { z-index: 400; }
-
+
-.leaflet-vml-shape {
+.leaflet-tile-pane    { z-index: 200; }
-	width: 1px;
+.leaflet-overlay-pane { z-index: 400; }
-	height: 1px;
+.leaflet-shadow-pane  { z-index: 500; }
-	}
+.leaflet-marker-pane  { z-index: 600; }
-.lvml {
+.leaflet-tooltip-pane   { z-index: 650; }
-	behavior: url(#default#VML);
+.leaflet-popup-pane   { z-index: 700; }
-	display: inline-block;
+
-	position: absolute;
+.leaflet-map-pane canvas { z-index: 100; }
-	}
+.leaflet-map-pane svg    { z-index: 200; }
-
+
-
+.leaflet-vml-shape {
-/* control positioning */
+	width: 1px;
-
+	height: 1px;
-.leaflet-control {
+	}
-	position: relative;
+.lvml {
-	z-index: 800;
+	behavior: url(#default#VML);
-	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
+	display: inline-block;
-	pointer-events: auto;
+	position: absolute;
-	}
+	}
-.leaflet-top,
+
-.leaflet-bottom {
+
-	position: absolute;
+/* control positioning */
-	z-index: 1000;
+
-	pointer-events: none;
+.leaflet-control {
-	}
+	position: relative;
-.leaflet-top {
+	z-index: 800;
-	top: 0;
+	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
-	}
+	pointer-events: auto;
-.leaflet-right {
+	}
-	right: 0;
+.leaflet-top,
-	}
+.leaflet-bottom {
-.leaflet-bottom {
+	position: absolute;
-	bottom: 0;
+	z-index: 1000;
-	}
+	pointer-events: none;
-.leaflet-left {
+	}
-	left: 0;
+.leaflet-top {
-	}
+	top: 0;
-.leaflet-control {
+	}
-	float: left;
+.leaflet-right {
-	clear: both;
+	right: 0;
-	}
+	}
-.leaflet-right .leaflet-control {
+.leaflet-bottom {
-	float: right;
+	bottom: 0;
-	}
+	}
-.leaflet-top .leaflet-control {
+.leaflet-left {
-	margin-top: 10px;
+	left: 0;
-	}
+	}
-.leaflet-bottom .leaflet-control {
+.leaflet-control {
-	margin-bottom: 10px;
+	float: left;
-	}
+	clear: both;
-.leaflet-left .leaflet-control {
+	}
-	margin-left: 10px;
+.leaflet-right .leaflet-control {
-	}
+	float: right;
-.leaflet-right .leaflet-control {
+	}
-	margin-right: 10px;
+.leaflet-top .leaflet-control {
-	}
+	margin-top: 10px;
-
+	}
-
+.leaflet-bottom .leaflet-control {
-/* zoom and fade animations */
+	margin-bottom: 10px;
-
+	}
-.leaflet-fade-anim .leaflet-tile {
+.leaflet-left .leaflet-control {
-	will-change: opacity;
+	margin-left: 10px;
-	}
+	}
-.leaflet-fade-anim .leaflet-popup {
+.leaflet-right .leaflet-control {
-	opacity: 0;
+	margin-right: 10px;
-	-webkit-transition: opacity 0.2s linear;
+	}
-	   -moz-transition: opacity 0.2s linear;
+
-	     -o-transition: opacity 0.2s linear;
+
-	        transition: opacity 0.2s linear;
+/* zoom and fade animations */
-	}
+
-.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
+.leaflet-fade-anim .leaflet-tile {
-	opacity: 1;
+	will-change: opacity;
-	}
+	}
-.leaflet-zoom-animated {
+.leaflet-fade-anim .leaflet-popup {
-	-webkit-transform-origin: 0 0;
+	opacity: 0;
-	    -ms-transform-origin: 0 0;
+	-webkit-transition: opacity 0.2s linear;
-	        transform-origin: 0 0;
+	   -moz-transition: opacity 0.2s linear;
-	}
+	     -o-transition: opacity 0.2s linear;
-.leaflet-zoom-anim .leaflet-zoom-animated {
+	        transition: opacity 0.2s linear;
-	will-change: transform;
+	}
-	}
+.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
-.leaflet-zoom-anim .leaflet-zoom-animated {
+	opacity: 1;
-	-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
+	}
-	   -moz-transition:    -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
+.leaflet-zoom-animated {
-	     -o-transition:      -o-transform 0.25s cubic-bezier(0,0,0.25,1);
+	-webkit-transform-origin: 0 0;
-	        transition:         transform 0.25s cubic-bezier(0,0,0.25,1);
+	    -ms-transform-origin: 0 0;
-	}
+	        transform-origin: 0 0;
-.leaflet-zoom-anim .leaflet-tile,
+	}
-.leaflet-pan-anim .leaflet-tile {
+.leaflet-zoom-anim .leaflet-zoom-animated {
-	-webkit-transition: none;
+	will-change: transform;
-	   -moz-transition: none;
+	}
-	     -o-transition: none;
+.leaflet-zoom-anim .leaflet-zoom-animated {
-	        transition: none;
+	-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-	}
+	   -moz-transition:    -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
-
+	     -o-transition:      -o-transform 0.25s cubic-bezier(0,0,0.25,1);
-.leaflet-zoom-anim .leaflet-zoom-hide {
+	        transition:         transform 0.25s cubic-bezier(0,0,0.25,1);
-	visibility: hidden;
+	}
-	}
+.leaflet-zoom-anim .leaflet-tile,
-
+.leaflet-pan-anim .leaflet-tile {
-
+	-webkit-transition: none;
-/* cursors */
+	   -moz-transition: none;
-
+	     -o-transition: none;
-.leaflet-interactive {
+	        transition: none;
-	cursor: pointer;
+	}
-	}
+
-.leaflet-grab {
+.leaflet-zoom-anim .leaflet-zoom-hide {
-	cursor: -webkit-grab;
+	visibility: hidden;
-	cursor:    -moz-grab;
+	}
-	}
+
-.leaflet-crosshair,
+
-.leaflet-crosshair .leaflet-interactive {
+/* cursors */
-	cursor: crosshair;
+
-	}
+.leaflet-interactive {
-.leaflet-popup-pane,
+	cursor: pointer;
-.leaflet-control {
+	}
-	cursor: auto;
+.leaflet-grab {
-	}
+	cursor: -webkit-grab;
-.leaflet-dragging .leaflet-grab,
+	cursor:    -moz-grab;
-.leaflet-dragging .leaflet-grab .leaflet-interactive,
+	}
-.leaflet-dragging .leaflet-marker-draggable {
+.leaflet-crosshair,
-	cursor: move;
+.leaflet-crosshair .leaflet-interactive {
-	cursor: -webkit-grabbing;
+	cursor: crosshair;
-	cursor:    -moz-grabbing;
+	}
-	}
+.leaflet-popup-pane,
-
+.leaflet-control {
-/* marker & overlays interactivity */
+	cursor: auto;
-.leaflet-marker-icon,
+	}
-.leaflet-marker-shadow,
+.leaflet-dragging .leaflet-grab,
-.leaflet-image-layer,
+.leaflet-dragging .leaflet-grab .leaflet-interactive,
-.leaflet-pane > svg path,
+.leaflet-dragging .leaflet-marker-draggable {
-.leaflet-tile-container {
+	cursor: move;
-	pointer-events: none;
+	cursor: -webkit-grabbing;
-	}
+	cursor:    -moz-grabbing;
-
+	}
-.leaflet-marker-icon.leaflet-interactive,
+
-.leaflet-image-layer.leaflet-interactive,
+/* marker & overlays interactivity */
-.leaflet-pane > svg path.leaflet-interactive {
+.leaflet-marker-icon,
-	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
+.leaflet-marker-shadow,
-	pointer-events: auto;
+.leaflet-image-layer,
-	}
+.leaflet-pane > svg path,
-
+.leaflet-tile-container {
-/* visual tweaks */
+	pointer-events: none;
-
+	}
-.leaflet-container {
+
-	background: #ddd;
+.leaflet-marker-icon.leaflet-interactive,
-	outline: 0;
+.leaflet-image-layer.leaflet-interactive,
-	}
+.leaflet-pane > svg path.leaflet-interactive {
-.leaflet-container a {
+	pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
-	color: #0078A8;
+	pointer-events: auto;
-	}
+	}
-.leaflet-container a.leaflet-active {
+
-	outline: 2px solid orange;
+/* visual tweaks */
-	}
+
-.leaflet-zoom-box {
+.leaflet-container {
-	border: 2px dotted #38f;
+	background: #ddd;
-	background: rgba(255,255,255,0.5);
+	outline: 0;
-	}
+	}
-
+.leaflet-container a {
-
+	color: #0078A8;
-/* general typography */
+	}
-.leaflet-container {
+.leaflet-container a.leaflet-active {
-	font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
+	outline: 2px solid orange;
-	}
+	}
-
+.leaflet-zoom-box {
-
+	border: 2px dotted #38f;
-/* general toolbar styles */
+	background: rgba(255,255,255,0.5);
-
+	}
-.leaflet-bar {
+
-	box-shadow: 0 1px 5px rgba(0,0,0,0.65);
+
-	border-radius: 4px;
+/* general typography */
-	}
+.leaflet-container {
-.leaflet-bar a,
+	font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
-.leaflet-bar a:hover {
+	}
-	background-color: #fff;
+
-	border-bottom: 1px solid #ccc;
+
-	width: 26px;
+/* general toolbar styles */
-	height: 26px;
+
-	line-height: 26px;
+.leaflet-bar {
-	display: block;
+	box-shadow: 0 1px 5px rgba(0,0,0,0.65);
-	text-align: center;
+	border-radius: 4px;
-	text-decoration: none;
+	}
-	color: black;
+.leaflet-bar a,
-	}
+.leaflet-bar a:hover {
-.leaflet-bar a,
+	background-color: #fff;
-.leaflet-control-layers-toggle {
+	border-bottom: 1px solid #ccc;
-	background-position: 50% 50%;
+	width: 26px;
-	background-repeat: no-repeat;
+	height: 26px;
-	display: block;
+	line-height: 26px;
-	}
+	display: block;
-.leaflet-bar a:hover {
+	text-align: center;
-	background-color: #f4f4f4;
+	text-decoration: none;
-	}
+	color: black;
-.leaflet-bar a:first-child {
+	}
-	border-top-left-radius: 4px;
+.leaflet-bar a,
-	border-top-right-radius: 4px;
+.leaflet-control-layers-toggle {
-	}
+	background-position: 50% 50%;
-.leaflet-bar a:last-child {
+	background-repeat: no-repeat;
-	border-bottom-left-radius: 4px;
+	display: block;
-	border-bottom-right-radius: 4px;
+	}
-	border-bottom: none;
+.leaflet-bar a:hover {
-	}
+	background-color: #f4f4f4;
-.leaflet-bar a.leaflet-disabled {
+	}
-	cursor: default;
+.leaflet-bar a:first-child {
-	background-color: #f4f4f4;
+	border-top-left-radius: 4px;
-	color: #bbb;
+	border-top-right-radius: 4px;
-	}
+	}
-
+.leaflet-bar a:last-child {
-.leaflet-touch .leaflet-bar a {
+	border-bottom-left-radius: 4px;
-	width: 30px;
+	border-bottom-right-radius: 4px;
-	height: 30px;
+	border-bottom: none;
-	line-height: 30px;
+	}
-	}
+.leaflet-bar a.leaflet-disabled {
-
+	cursor: default;
-
+	background-color: #f4f4f4;
-/* zoom control */
+	color: #bbb;
-
+	}
-.leaflet-control-zoom-in,
+
-.leaflet-control-zoom-out {
+.leaflet-touch .leaflet-bar a {
-	font: bold 18px 'Lucida Console', Monaco, monospace;
+	width: 30px;
-	text-indent: 1px;
+	height: 30px;
-	}
+	line-height: 30px;
-.leaflet-control-zoom-out {
+	}
-	font-size: 20px;
+.leaflet-touch .leaflet-bar a:first-child {
-	}
+	border-top-left-radius: 2px;
-
+	border-top-right-radius: 2px;
-.leaflet-touch .leaflet-control-zoom-in {
+	}
-	font-size: 22px;
+.leaflet-touch .leaflet-bar a:last-child {
-	}
+	border-bottom-left-radius: 2px;
-.leaflet-touch .leaflet-control-zoom-out {
+	border-bottom-right-radius: 2px;
-	font-size: 24px;
+	}
-	}
+
-
+/* zoom control */
-
+
-/* layers control */
+.leaflet-control-zoom-in,
-
+.leaflet-control-zoom-out {
-.leaflet-control-layers {
+	font: bold 18px 'Lucida Console', Monaco, monospace;
-	box-shadow: 0 1px 5px rgba(0,0,0,0.4);
+	text-indent: 1px;
-	background: #fff;
+	}
-	border-radius: 5px;
+
-	}
+.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out  {
-.leaflet-control-layers-toggle {
+	font-size: 22px;
-	background-image: url(images/layers.png);
+	}
-	width: 36px;
+
-	height: 36px;
+
-	}
+/* layers control */
-.leaflet-retina .leaflet-control-layers-toggle {
+
-	background-image: url(images/layers-2x.png);
+.leaflet-control-layers {
-	background-size: 26px 26px;
+	box-shadow: 0 1px 5px rgba(0,0,0,0.4);
-	}
+	background: #fff;
-.leaflet-touch .leaflet-control-layers-toggle {
+	border-radius: 5px;
-	width: 44px;
+	}
-	height: 44px;
+.leaflet-control-layers-toggle {
-	}
+	background-image: url(images/layers.png);
-.leaflet-control-layers .leaflet-control-layers-list,
+	width: 36px;
-.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
+	height: 36px;
-	display: none;
+	}
-	}
+.leaflet-retina .leaflet-control-layers-toggle {
-.leaflet-control-layers-expanded .leaflet-control-layers-list {
+	background-image: url(images/layers-2x.png);
-	display: block;
+	background-size: 26px 26px;
-	position: relative;
+	}
-	}
+.leaflet-touch .leaflet-control-layers-toggle {
-.leaflet-control-layers-expanded {
+	width: 44px;
-	padding: 6px 10px 6px 6px;
+	height: 44px;
-	color: #333;
+	}
-	background: #fff;
+.leaflet-control-layers .leaflet-control-layers-list,
-	}
+.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
-.leaflet-control-layers-scrollbar {
+	display: none;
-	overflow-y: scroll;
+	}
-	padding-right: 5px;
+.leaflet-control-layers-expanded .leaflet-control-layers-list {
-	}
+	display: block;
-.leaflet-control-layers-selector {
+	position: relative;
-	margin-top: 2px;
+	}
-	position: relative;
+.leaflet-control-layers-expanded {
-	top: 1px;
+	padding: 6px 10px 6px 6px;
-	}
+	color: #333;
-.leaflet-control-layers label {
+	background: #fff;
-	display: block;
+	}
-	}
+.leaflet-control-layers-scrollbar {
-.leaflet-control-layers-separator {
+	overflow-y: scroll;
-	height: 0;
+	overflow-x: hidden;
-	border-top: 1px solid #ddd;
+	padding-right: 5px;
-	margin: 5px -10px 5px -6px;
+	}
-	}
+.leaflet-control-layers-selector {
-
+	margin-top: 2px;
-/* Default icon URLs */
+	position: relative;
-.leaflet-default-icon-path {
+	top: 1px;
-	background-image: url(images/marker-icon.png);
+	}
-	}
+.leaflet-control-layers label {
-
+	display: block;
-
+	}
-/* attribution and scale controls */
+.leaflet-control-layers-separator {
-
+	height: 0;
-.leaflet-container .leaflet-control-attribution {
+	border-top: 1px solid #ddd;
-	background: #fff;
+	margin: 5px -10px 5px -6px;
-	background: rgba(255, 255, 255, 0.7);
+	}
-	margin: 0;
+
-	}
+/* Default icon URLs */
-.leaflet-control-attribution,
+.leaflet-default-icon-path {
-.leaflet-control-scale-line {
+	background-image: url(images/marker-icon.png);
-	padding: 0 5px;
+	}
-	color: #333;
+
-	}
+
-.leaflet-control-attribution a {
+/* attribution and scale controls */
-	text-decoration: none;
+
-	}
+.leaflet-container .leaflet-control-attribution {
-.leaflet-control-attribution a:hover {
+	background: #fff;
-	text-decoration: underline;
+	background: rgba(255, 255, 255, 0.7);
-	}
+	margin: 0;
-.leaflet-container .leaflet-control-attribution,
+	}
-.leaflet-container .leaflet-control-scale {
+.leaflet-control-attribution,
-	font-size: 11px;
+.leaflet-control-scale-line {
-	}
+	padding: 0 5px;
-.leaflet-left .leaflet-control-scale {
+	color: #333;
-	margin-left: 5px;
+	}
-	}
+.leaflet-control-attribution a {
-.leaflet-bottom .leaflet-control-scale {
+	text-decoration: none;
-	margin-bottom: 5px;
+	}
-	}
+.leaflet-control-attribution a:hover {
-.leaflet-control-scale-line {
+	text-decoration: underline;
-	border: 2px solid #777;
+	}
-	border-top: none;
+.leaflet-container .leaflet-control-attribution,
-	line-height: 1.1;
+.leaflet-container .leaflet-control-scale {
-	padding: 2px 5px 1px;
+	font-size: 11px;
-	font-size: 11px;
+	}
-	white-space: nowrap;
+.leaflet-left .leaflet-control-scale {
-	overflow: hidden;
+	margin-left: 5px;
-	-moz-box-sizing: border-box;
+	}
-	     box-sizing: border-box;
+.leaflet-bottom .leaflet-control-scale {
-
+	margin-bottom: 5px;
-	background: #fff;
+	}
-	background: rgba(255, 255, 255, 0.5);
+.leaflet-control-scale-line {
-	}
+	border: 2px solid #777;
-.leaflet-control-scale-line:not(:first-child) {
+	border-top: none;
-	border-top: 2px solid #777;
+	line-height: 1.1;
-	border-bottom: none;
+	padding: 2px 5px 1px;
-	margin-top: -2px;
+	font-size: 11px;
-	}
+	white-space: nowrap;
-.leaflet-control-scale-line:not(:first-child):not(:last-child) {
+	overflow: hidden;
-	border-bottom: 2px solid #777;
+	-moz-box-sizing: border-box;
-	}
+	     box-sizing: border-box;
-
+
-.leaflet-touch .leaflet-control-attribution,
+	background: #fff;
-.leaflet-touch .leaflet-control-layers,
+	background: rgba(255, 255, 255, 0.5);
-.leaflet-touch .leaflet-bar {
+	}
-	box-shadow: none;
+.leaflet-control-scale-line:not(:first-child) {
-	}
+	border-top: 2px solid #777;
-.leaflet-touch .leaflet-control-layers,
+	border-bottom: none;
-.leaflet-touch .leaflet-bar {
+	margin-top: -2px;
-	border: 2px solid rgba(0,0,0,0.2);
+	}
-	background-clip: padding-box;
+.leaflet-control-scale-line:not(:first-child):not(:last-child) {
-	}
+	border-bottom: 2px solid #777;
-
+	}
-
+
-/* popup */
+.leaflet-touch .leaflet-control-attribution,
-
+.leaflet-touch .leaflet-control-layers,
-.leaflet-popup {
+.leaflet-touch .leaflet-bar {
-	position: absolute;
+	box-shadow: none;
-	text-align: center;
+	}
-	margin-bottom: 20px;
+.leaflet-touch .leaflet-control-layers,
-	}
+.leaflet-touch .leaflet-bar {
-.leaflet-popup-content-wrapper {
+	border: 2px solid rgba(0,0,0,0.2);
-	padding: 1px;
+	background-clip: padding-box;
-	text-align: left;
+	}
-	border-radius: 12px;
+
-	}
+
-.leaflet-popup-content {
+/* popup */
-	margin: 13px 19px;
+
-	line-height: 1.4;
+.leaflet-popup {
-	}
+	position: absolute;
-.leaflet-popup-content p {
+	text-align: center;
-	margin: 18px 0;
+	margin-bottom: 20px;
-	}
+	}
-.leaflet-popup-tip-container {
+.leaflet-popup-content-wrapper {
-	width: 40px;
+	padding: 1px;
-	height: 20px;
+	text-align: left;
-	position: absolute;
+	border-radius: 12px;
-	left: 50%;
+	}
-	margin-left: -20px;
+.leaflet-popup-content {
-	overflow: hidden;
+	margin: 13px 19px;
-	pointer-events: none;
+	line-height: 1.4;
-	}
+	}
-.leaflet-popup-tip {
+.leaflet-popup-content p {
-	width: 17px;
+	margin: 18px 0;
-	height: 17px;
+	}
-	padding: 1px;
+.leaflet-popup-tip-container {
-
+	width: 40px;
-	margin: -10px auto 0;
+	height: 20px;
-
+	position: absolute;
-	-webkit-transform: rotate(45deg);
+	left: 50%;
-	   -moz-transform: rotate(45deg);
+	margin-left: -20px;
-	    -ms-transform: rotate(45deg);
+	overflow: hidden;
-	     -o-transform: rotate(45deg);
+	pointer-events: none;
-	        transform: rotate(45deg);
+	}
-	}
+.leaflet-popup-tip {
-.leaflet-popup-content-wrapper,
+	width: 17px;
-.leaflet-popup-tip {
+	height: 17px;
-	background: white;
+	padding: 1px;
-	color: #333;
+
-	box-shadow: 0 3px 14px rgba(0,0,0,0.4);
+	margin: -10px auto 0;
-	}
+
-.leaflet-container a.leaflet-popup-close-button {
+	-webkit-transform: rotate(45deg);
-	position: absolute;
+	   -moz-transform: rotate(45deg);
-	top: 0;
+	    -ms-transform: rotate(45deg);
-	right: 0;
+	     -o-transform: rotate(45deg);
-	padding: 4px 4px 0 0;
+	        transform: rotate(45deg);
-	border: none;
+	}
-	text-align: center;
+.leaflet-popup-content-wrapper,
-	width: 18px;
+.leaflet-popup-tip {
-	height: 14px;
+	background: white;
-	font: 16px/14px Tahoma, Verdana, sans-serif;
+	color: #333;
-	color: #c3c3c3;
+	box-shadow: 0 3px 14px rgba(0,0,0,0.4);
-	text-decoration: none;
+	}
-	font-weight: bold;
+.leaflet-container a.leaflet-popup-close-button {
-	background: transparent;
+	position: absolute;
-	}
+	top: 0;
-.leaflet-container a.leaflet-popup-close-button:hover {
+	right: 0;
-	color: #999;
+	padding: 4px 4px 0 0;
-	}
+	border: none;
-.leaflet-popup-scrolled {
+	text-align: center;
-	overflow: auto;
+	width: 18px;
-	border-bottom: 1px solid #ddd;
+	height: 14px;
-	border-top: 1px solid #ddd;
+	font: 16px/14px Tahoma, Verdana, sans-serif;
-	}
+	color: #c3c3c3;
-
+	text-decoration: none;
-.leaflet-oldie .leaflet-popup-content-wrapper {
+	font-weight: bold;
-	zoom: 1;
+	background: transparent;
-	}
+	}
-.leaflet-oldie .leaflet-popup-tip {
+.leaflet-container a.leaflet-popup-close-button:hover {
-	width: 24px;
+	color: #999;
-	margin: 0 auto;
+	}
-
+.leaflet-popup-scrolled {
-	-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
+	overflow: auto;
-	filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
+	border-bottom: 1px solid #ddd;
-	}
+	border-top: 1px solid #ddd;
-.leaflet-oldie .leaflet-popup-tip-container {
+	}
-	margin-top: -1px;
+
-	}
+.leaflet-oldie .leaflet-popup-content-wrapper {
-
+	zoom: 1;
-.leaflet-oldie .leaflet-control-zoom,
+	}
-.leaflet-oldie .leaflet-control-layers,
+.leaflet-oldie .leaflet-popup-tip {
-.leaflet-oldie .leaflet-popup-content-wrapper,
+	width: 24px;
-.leaflet-oldie .leaflet-popup-tip {
+	margin: 0 auto;
-	border: 1px solid #999;
+
-	}
+	-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
-
+	filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
-
+	}
-/* div icon */
+.leaflet-oldie .leaflet-popup-tip-container {
-
+	margin-top: -1px;
-.leaflet-div-icon {
+	}
-	background: #fff;
+
-	border: 1px solid #666;
+.leaflet-oldie .leaflet-control-zoom,
-	}
+.leaflet-oldie .leaflet-control-layers,
-
+.leaflet-oldie .leaflet-popup-content-wrapper,
-
+.leaflet-oldie .leaflet-popup-tip {
-/* Tooltip */
+	border: 1px solid #999;
-/* Base styles for the element that has a tooltip */
+	}
-.leaflet-tooltip {
+
-	position: absolute;
+
-	padding: 6px;
+/* div icon */
-	background-color: #fff;
+
-	border: 1px solid #fff;
+.leaflet-div-icon {
-	border-radius: 3px;
+	background: #fff;
-	color: #222;
+	border: 1px solid #666;
-	white-space: nowrap;
+	}
-	-webkit-user-select: none;
+
-	-moz-user-select: none;
+
-	-ms-user-select: none;
+/* Tooltip */
-	user-select: none;
+/* Base styles for the element that has a tooltip */
-	pointer-events: none;
+.leaflet-tooltip {
-	box-shadow: 0 1px 3px rgba(0,0,0,0.4);
+	position: absolute;
-	}
+	padding: 6px;
-.leaflet-tooltip.leaflet-clickable {
+	background-color: #fff;
-	cursor: pointer;
+	border: 1px solid #fff;
-	pointer-events: auto;
+	border-radius: 3px;
-	}
+	color: #222;
-.leaflet-tooltip-top:before,
+	white-space: nowrap;
-.leaflet-tooltip-bottom:before,
+	-webkit-user-select: none;
-.leaflet-tooltip-left:before,
+	-moz-user-select: none;
-.leaflet-tooltip-right:before {
+	-ms-user-select: none;
-	position: absolute;
+	user-select: none;
-	pointer-events: none;
+	pointer-events: none;
-	border: 6px solid transparent;
+	box-shadow: 0 1px 3px rgba(0,0,0,0.4);
-	background: transparent;
+	}
-	content: "";
+.leaflet-tooltip.leaflet-clickable {
-	}
+	cursor: pointer;
-
+	pointer-events: auto;
-/* Directions */
+	}
-
+.leaflet-tooltip-top:before,
-.leaflet-tooltip-bottom {
+.leaflet-tooltip-bottom:before,
-	margin-top: 6px;
+.leaflet-tooltip-left:before,
-}
+.leaflet-tooltip-right:before {
-.leaflet-tooltip-top {
+	position: absolute;
-	margin-top: -6px;
+	pointer-events: none;
-}
+	border: 6px solid transparent;
-.leaflet-tooltip-bottom:before,
+	background: transparent;
-.leaflet-tooltip-top:before {
+	content: "";
-	left: 50%;
+	}
-	margin-left: -6px;
+
-	}
+/* Directions */
-.leaflet-tooltip-top:before {
+
-	bottom: 0;
+.leaflet-tooltip-bottom {
-	margin-bottom: -12px;
+	margin-top: 6px;
-	border-top-color: #fff;
+}
-	}
+.leaflet-tooltip-top {
-.leaflet-tooltip-bottom:before {
+	margin-top: -6px;
-	top: 0;
+}
-	margin-top: -12px;
+.leaflet-tooltip-bottom:before,
-	margin-left: -6px;
+.leaflet-tooltip-top:before {
-	border-bottom-color: #fff;
+	left: 50%;
-	}
+	margin-left: -6px;
-.leaflet-tooltip-left {
+	}
-	margin-left: -6px;
+.leaflet-tooltip-top:before {
-}
+	bottom: 0;
-.leaflet-tooltip-right {
+	margin-bottom: -12px;
-	margin-left: 6px;
+	border-top-color: #fff;
-}
+	}
-.leaflet-tooltip-left:before,
+.leaflet-tooltip-bottom:before {
-.leaflet-tooltip-right:before {
+	top: 0;
-	top: 50%;
+	margin-top: -12px;
-	margin-top: -6px;
+	margin-left: -6px;
-	}
+	border-bottom-color: #fff;
-.leaflet-tooltip-left:before {
+	}
-	right: 0;
+.leaflet-tooltip-left {
-	margin-right: -12px;
+	margin-left: -6px;
-	border-left-color: #fff;
+}
-	}
+.leaflet-tooltip-right {
-.leaflet-tooltip-right:before {
+	margin-left: 6px;
-	left: 0;
+}
-	margin-left: -12px;
+.leaflet-tooltip-left:before,
-	border-right-color: #fff;
+.leaflet-tooltip-right:before {
-	}
+	top: 50%;
+	margin-top: -6px;
+	}
+.leaflet-tooltip-left:before {
+	right: 0;
+	margin-right: -12px;
+	border-left-color: #fff;
+	}
+.leaflet-tooltip-right:before {
+	left: 0;
+	margin-left: -12px;
+	border-right-color: #fff;
+	}

File diff suppressed because it is too large
+ 0 - 4
searx/static/themes/simple/leaflet/leaflet.js


+ 0 - 0
searx/static/themes/simple/less/#toolkit_loader.less#


+ 1 - 0
searx/static/themes/simple/less/.#toolkit_loader.less

@@ -0,0 +1 @@
+alexandre@alf-laptop.2449:1533915028

+ 12 - 5
searx/static/themes/simple/less/ion.less

@@ -3,12 +3,12 @@
 
 
 @font-face {
 @font-face {
 	font-family:"ion";
 	font-family:"ion";
-	src:url("../fonts/ion.eot?492c5e946f5ae6f02467d64ca0f55cd1");
+	src:url("../fonts/ion.eot?ce7a0ead692560b4405a96d5b8471f51");
 	src:url("../fonts/ion.eot?#iefix") format("embedded-opentype"),
 	src:url("../fonts/ion.eot?#iefix") format("embedded-opentype"),
-		url("../fonts/ion.woff2?492c5e946f5ae6f02467d64ca0f55cd1") format("woff2"),
+		url("../fonts/ion.woff2?ce7a0ead692560b4405a96d5b8471f51") format("woff2"),
-		url("../fonts/ion.woff?492c5e946f5ae6f02467d64ca0f55cd1") format("woff"),
+		url("../fonts/ion.woff?ce7a0ead692560b4405a96d5b8471f51") format("woff"),
-		url("../fonts/ion.ttf?492c5e946f5ae6f02467d64ca0f55cd1") format("truetype"),
+		url("../fonts/ion.ttf?ce7a0ead692560b4405a96d5b8471f51") format("truetype"),
-		url("../fonts/ion.svg?492c5e946f5ae6f02467d64ca0f55cd1#ion") format("svg");
+		url("../fonts/ion.svg?ce7a0ead692560b4405a96d5b8471f51#ion") format("svg");
 	font-weight:normal;
 	font-weight:normal;
 	font-style:normal;
 	font-style:normal;
 }
 }
@@ -172,3 +172,10 @@
 	}
 	}
 }
 }
 
 
+
+.ion-close {
+	&:before {
+		content:"\f115";
+	}
+}
+

+ 1 - 1
searx/static/themes/simple/less/mixins.less

@@ -30,7 +30,7 @@
 .select-all-on-focus() {
 .select-all-on-focus() {
 	-webkit-user-select: all;
 	-webkit-user-select: all;
 	-moz-user-select: all;
 	-moz-user-select: all;
-	-ms-user-select: all;
+	-ms-user-select: element;
 	user-select: all;
 	user-select: all;
 }
 }
 
 

+ 23 - 129
searx/static/themes/simple/less/normalize.less

@@ -1,17 +1,15 @@
-/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */
+/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */
 
 
 /* Document
 /* Document
    ========================================================================== */
    ========================================================================== */
 
 
 /**
 /**
  * 1. Correct the line height in all browsers.
  * 1. Correct the line height in all browsers.
- * 2. Prevent adjustments of font size after orientation changes in
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
- *    IE on Windows Phone and in iOS.
  */
  */
 
 
 html {
 html {
   line-height: 1.15; /* 1 */
   line-height: 1.15; /* 1 */
-  -ms-text-size-adjust: 100%; /* 2 */
   -webkit-text-size-adjust: 100%; /* 2 */
   -webkit-text-size-adjust: 100%; /* 2 */
 }
 }
 
 
@@ -19,26 +17,13 @@ html {
    ========================================================================== */
    ========================================================================== */
 
 
 /**
 /**
- * Remove the margin in all browsers (opinionated).
+ * Remove the margin in all browsers.
  */
  */
 
 
 body {
 body {
   margin: 0;
   margin: 0;
 }
 }
 
 
-/**
- * Add the correct display in IE 9-.
- */
-
-article,
-aside,
-footer,
-header,
-nav,
-section {
-  display: block;
-}
-
 /**
 /**
  * Correct the font size and margin on `h1` elements within `section` and
  * Correct the font size and margin on `h1` elements within `section` and
  * `article` contexts in Chrome, Firefox, and Safari.
  * `article` contexts in Chrome, Firefox, and Safari.
@@ -52,25 +37,6 @@ h1 {
 /* Grouping content
 /* Grouping content
    ========================================================================== */
    ========================================================================== */
 
 
-/**
- * Add the correct display in IE 9-.
- * 1. Add the correct display in IE.
- */
-
-figcaption,
-figure,
-main { /* 1 */
-  display: block;
-}
-
-/**
- * Add the correct margin in IE 8.
- */
-
-figure {
-  margin: 1em 40px;
-}
-
 /**
 /**
  * 1. Add the correct box sizing in Firefox.
  * 1. Add the correct box sizing in Firefox.
  * 2. Show the overflow in Edge and IE.
  * 2. Show the overflow in Edge and IE.
@@ -96,17 +62,15 @@ pre {
    ========================================================================== */
    ========================================================================== */
 
 
 /**
 /**
- * 1. Remove the gray background on active links in IE 10.
+ * Remove the gray background on active links in IE 10.
- * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
  */
  */
 
 
 a {
 a {
-  background-color: transparent; /* 1 */
+  background-color: transparent;
-  -webkit-text-decoration-skip: objects; /* 2 */
 }
 }
 
 
 /**
 /**
- * 1. Remove the bottom border in Chrome 57- and Firefox 39-.
+ * 1. Remove the bottom border in Chrome 57-
  * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
  * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
  */
  */
 
 
@@ -116,15 +80,6 @@ abbr[title] {
   text-decoration: underline dotted; /* 2 */
   text-decoration: underline dotted; /* 2 */
 }
 }
 
 
-/**
- * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
- */
-
-b,
-strong {
-  font-weight: inherit;
-}
-
 /**
 /**
  * Add the correct font weight in Chrome, Edge, and Safari.
  * Add the correct font weight in Chrome, Edge, and Safari.
  */
  */
@@ -146,23 +101,6 @@ samp {
   font-size: 1em; /* 2 */
   font-size: 1em; /* 2 */
 }
 }
 
 
-/**
- * Add the correct font style in Android 4.3-.
- */
-
-dfn {
-  font-style: italic;
-}
-
-/**
- * Add the correct background and color in IE 9-.
- */
-
-mark {
-  background-color: #ff0;
-  color: #000;
-}
-
 /**
 /**
  * Add the correct font size in all browsers.
  * Add the correct font size in all browsers.
  */
  */
@@ -196,44 +134,18 @@ sup {
    ========================================================================== */
    ========================================================================== */
 
 
 /**
 /**
- * Add the correct display in IE 9-.
+ * Remove the border on images inside links in IE 10.
- */
-
-audio,
-video {
-  display: inline-block;
-}
-
-/**
- * Add the correct display in iOS 4-7.
- */
-
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-
-/**
- * Remove the border on images inside links in IE 10-.
  */
  */
 
 
 img {
 img {
   border-style: none;
   border-style: none;
 }
 }
 
 
-/**
- * Hide the overflow in IE.
- */
-
-svg:not(:root) {
-  overflow: hidden;
-}
-
 /* Forms
 /* Forms
    ========================================================================== */
    ========================================================================== */
 
 
 /**
 /**
- * 1. Change the font styles in all browsers (opinionated).
+ * 1. Change the font styles in all browsers.
  * 2. Remove the margin in Firefox and Safari.
  * 2. Remove the margin in Firefox and Safari.
  */
  */
 
 
@@ -242,7 +154,7 @@ input,
 optgroup,
 optgroup,
 select,
 select,
 textarea {
 textarea {
-  font-family: sans-serif; /* 1 */
+  font-family: inherit; /* 1 */
   font-size: 100%; /* 1 */
   font-size: 100%; /* 1 */
   line-height: 1.15; /* 1 */
   line-height: 1.15; /* 1 */
   margin: 0; /* 2 */
   margin: 0; /* 2 */
@@ -269,16 +181,14 @@ select { /* 1 */
 }
 }
 
 
 /**
 /**
- * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
+ * Correct the inability to style clickable types in iOS and Safari.
- *    controls in Android 4.
- * 2. Correct the inability to style clickable types in iOS and Safari.
  */
  */
 
 
 button,
 button,
-html [type="button"], /* 1 */
+[type="button"],
 [type="reset"],
 [type="reset"],
 [type="submit"] {
 [type="submit"] {
-  -webkit-appearance: button; /* 2 */
+  -webkit-appearance: button;
 }
 }
 
 
 /**
 /**
@@ -329,17 +239,15 @@ legend {
 }
 }
 
 
 /**
 /**
- * 1. Add the correct display in IE 9-.
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
- * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
  */
  */
 
 
 progress {
 progress {
-  display: inline-block; /* 1 */
+  vertical-align: baseline;
-  vertical-align: baseline; /* 2 */
 }
 }
 
 
 /**
 /**
- * Remove the default vertical scrollbar in IE.
+ * Remove the default vertical scrollbar in IE 10+.
  */
  */
 
 
 textarea {
 textarea {
@@ -347,8 +255,8 @@ textarea {
 }
 }
 
 
 /**
 /**
- * 1. Add the correct box sizing in IE 10-.
+ * 1. Add the correct box sizing in IE 10.
- * 2. Remove the padding in IE 10-.
+ * 2. Remove the padding in IE 10.
  */
  */
 
 
 [type="checkbox"],
 [type="checkbox"],
@@ -377,10 +285,9 @@ textarea {
 }
 }
 
 
 /**
 /**
- * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
+ * Remove the inner padding in Chrome and Safari on macOS.
  */
  */
 
 
-[type="search"]::-webkit-search-cancel-button,
 [type="search"]::-webkit-search-decoration {
 [type="search"]::-webkit-search-decoration {
   -webkit-appearance: none;
   -webkit-appearance: none;
 }
 }
@@ -399,12 +306,10 @@ textarea {
    ========================================================================== */
    ========================================================================== */
 
 
 /*
 /*
- * Add the correct display in IE 9-.
+ * Add the correct display in Edge, IE 10+, and Firefox.
- * 1. Add the correct display in Edge, IE, and Firefox.
  */
  */
 
 
-details, /* 1 */
+details {
-menu {
   display: block;
   display: block;
 }
 }
 
 
@@ -416,30 +321,19 @@ summary {
   display: list-item;
   display: list-item;
 }
 }
 
 
-/* Scripting
+/* Misc
    ========================================================================== */
    ========================================================================== */
 
 
 /**
 /**
- * Add the correct display in IE 9-.
+ * Add the correct display in IE 10+.
- */
-
-canvas {
-  display: inline-block;
-}
-
-/**
- * Add the correct display in IE.
  */
  */
 
 
 template {
 template {
   display: none;
   display: none;
 }
 }
 
 
-/* Hidden
-   ========================================================================== */
-
 /**
 /**
- * Add the correct display in IE 10-.
+ * Add the correct display in IE 10.
  */
  */
 
 
 [hidden] {
 [hidden] {

+ 25 - 0
searx/static/themes/simple/less/preferences.less

@@ -45,6 +45,24 @@
     text-align: center;
     text-align: center;
   }
   }
 
 
+  table.cookies {
+    width: auto;
+
+    th, td {
+      text-align: left;
+      padding: 0.25em;
+    }
+
+    th:first-child, td:first-child {
+      padding-right: 4em;
+    }
+
+    &>tbody>tr:nth-child(even)>th,
+    &>tbody>tr:nth-child(even)>td {
+      background-color: @color-settings-tr-hover;
+    }
+  }
+
   .name, .shortcut {
   .name, .shortcut {
     text-align: left;
     text-align: left;
   }
   }
@@ -69,6 +87,13 @@
     }
     }
   }
   }
 
 
+
+  div.selectable_url {
+    pre {
+      width: 100%;
+    }
+  }
+  
 }
 }
 
 
 @media screen and (max-width: 75em) {
 @media screen and (max-width: 75em) {

+ 33 - 1
searx/static/themes/simple/less/search.less

@@ -26,11 +26,43 @@
 */
 */
 }
 }
 
 
+#clear_search {
+  display: block;
+  border-collapse: separate;
+  box-sizing: border-box;
+  width: 1.8em;
+
+  margin: 0;
+  padding: 2px;
+  height: 2.2em;
+  background: none repeat scroll 0 0 @color-search-background;
+  border-top: 1px solid @color-search-border;
+  border-bottom: 1px solid @color-search-border;
+  border-right: none;
+  border-left: none;
+  border-radius: 0px;
+  outline: none;
+  color: @color-search-font;
+  font-size: 16px;
+  z-index: 10000;
+
+  &:hover {
+    color: @color-search-border;
+  }
+
+  &.empty * {
+    display: none;
+  }
+}
+
+#q::-ms-clear, #q::-webkit-search-cancel-button {
+  display: none;
+}
+
 #q, #send_search {
 #q, #send_search {
   display: block !important;
   display: block !important;
   border-collapse: separate;
   border-collapse: separate;
   box-sizing: border-box;
   box-sizing: border-box;
-  position: relative;
 
 
   margin: 0;
   margin: 0;
   padding: 2px;
   padding: 2px;

+ 29 - 17
searx/static/themes/simple/less/style.less

@@ -477,25 +477,9 @@ article.result-images[data-vim-selected]::before {
 #search_url {
 #search_url {
   margin-top: 8px;
   margin-top: 8px;
 
 
-  div {
+  div.selectable_url {
-    display: block;
-    border: 1px solid @color-result-search-url-border;
-    padding: 4px;
-    color: @color-result-search-url-font;
-    width: 100%;
-    display: block;
-    margin: 0.1em;
-    overflow: hidden;
-    height: 1.2em;
-    line-height: 1.2em;
-
     pre {
     pre {
-      display: block;
       width: 200em;
       width: 200em;
-      font-size: 0.8em;
-      word-break: break-all;
-      margin: 0.1em;
-      .select-all-on-focus();
     }
     }
   }
   }
 }
 }
@@ -648,6 +632,34 @@ article.result-images[data-vim-selected]::before {
 }
 }
 
 
 
 
+#main_results div#results.only_template_images {
+    flex-direction: column;
+    width: auto;
+    display: flex;
+
+    #sidebar {
+	position: relative;
+	top: auto;
+	order: 2;
+    }
+
+    #urls {
+	position: relative;
+	order: 1;
+    }
+
+    #backToTop {
+	right: 0.5em;
+	left: auto;
+    }
+
+    #pagination {
+	position: relative;
+	order: 3;
+    }
+}
+
+
 @media screen and (max-width: @results-width) {
 @media screen and (max-width: @results-width) {
 
 
   article[data-vim-selected]::before {
   article[data-vim-selected]::before {

+ 128 - 6
searx/static/themes/simple/less/toolkit.less

@@ -20,7 +20,16 @@ html.js .show_if_nojs {
 }
 }
 
 
 .invisible {
 .invisible {
-  display: none;
+  display: none !important;
+}
+
+.list-unstyled {
+  list-style-type: none;
+
+  li {
+    margin-top: 4px;
+    margin-bottom: 4px;
+  }
 }
 }
 
 
 .danger {
 .danger {
@@ -39,6 +48,15 @@ html.js .show_if_nojs {
   border-radius: 5px;
   border-radius: 5px;
 }
 }
 
 
+// kbd
+kbd {
+  padding: 2px 4px;
+  margin: 1px;
+  font-size: 90%;
+  color: white;
+  background: black;
+}
+
 // table
 // table
 table {
 table {
 
 
@@ -65,6 +83,32 @@ tr {
   }
   }
 }
 }
 
 
+// pre
+.pre() {
+  display: block;
+  font-size: 0.8em;
+  word-break: break-all;
+  margin: 0.1em;
+  .select-all-on-focus();  
+}
+
+div.selectable_url {
+  display: block;
+  border: 1px solid @color-result-search-url-border;
+  padding: 4px;
+  color: @color-result-search-url-font;
+  width: 100%;
+  display: block;
+  margin: 0.1em;
+  overflow: hidden;
+  height: 1.2em;
+  line-height: 1.2em;
+
+  pre {
+    .pre();
+  }
+}
+
 // dialog
 // dialog
 .dialog() {
 .dialog() {
   position: relative;
   position: relative;
@@ -95,6 +139,28 @@ tr {
     margin: 1px 0 0 0;
     margin: 1px 0 0 0;
   }
   }
 
 
+  table {
+    width: auto;
+  }
+
+  tr {
+    vertical-align: text-top;
+    
+    &:hover {
+      background: transparent;
+    }
+  }
+
+  td {
+    padding: 0 1em 0 0;
+  }
+
+
+  h4 {
+    margin-top: 0.3em;
+    margin-bottom: 0.3em;
+  }
+
 }
 }
 
 
 .dialog-error {
 .dialog-error {
@@ -113,6 +179,19 @@ tr {
   .ion-warning();
   .ion-warning();
 }
 }
 
 
+.dialog-modal {
+  .dialog();
+  background: white;
+  position: fixed;  
+  top: 50%;
+  left: 50%;
+  /* bring your own prefixes */
+  transform: translate(-50%, -50%);
+  z-index: 100000;
+  margin: 0 50% 0 0;
+  box-shadow: 0 0 1em;
+}
+
 // btn-collapse
 // btn-collapse
 .btn-collapse {
 .btn-collapse {
   cursor: pointer;
   cursor: pointer;
@@ -128,7 +207,7 @@ tr {
   border: none;
   border: none;
 }
 }
 
 
-// tabs
+/* -- tabs --*/
 .tabs .tabs > label {
 .tabs .tabs > label {
   font-size: 90%;
   font-size: 90%;
 }
 }
@@ -215,7 +294,7 @@ html body .tabs > input:checked {
   }
   }
 }
 }
 
 
-// select
+/* -- select -- */
 select {
 select {
   height: 28px;
   height: 28px;
   margin: 0 1em 0 0;
   margin: 0 1em 0 0;
@@ -251,7 +330,7 @@ select {
 
 
 }
 }
 
 
-// checkbox-onoff
+/* -- checkbox-onoff -- */
 @supports (border-radius: 50px) {
 @supports (border-radius: 50px) {
   .checkbox-onoff {
   .checkbox-onoff {
     display: inline-block;
     display: inline-block;
@@ -285,7 +364,7 @@ select {
   }
   }
 }
 }
 
 
-// checkbox
+/* -- checkbox --*/
 @supports (transform: rotate(-45deg)) {
 @supports (transform: rotate(-45deg)) {
   .checkbox {
   .checkbox {
     width: 20px;
     width: 20px;
@@ -325,7 +404,7 @@ select {
       }
       }
     }
     }
 
 
-    // disabled : can't be focused, show only the check mark
+    // disabled : can''t be focused, show only the check mark
     input[disabled] + label  {
     input[disabled] + label  {
       background-color: transparent !important;
       background-color: transparent !important;
       box-shadow: none !important;
       box-shadow: none !important;
@@ -344,3 +423,46 @@ select {
     width: 100%;
     width: 100%;
   }
   }
 }
 }
+
+/* -- loader -- */
+.loader,
+.loader:after {	
+    border-radius: 50%;
+    width: 2em;
+    height: 2em;
+}
+.loader {
+    margin: 1em auto;
+    font-size: 10px;
+    position: relative;
+    text-indent: -9999em;
+    border-top: 0.5em solid rgba(0, 0, 0, 0.2);
+    border-right: 0.5em solid rgba(0, 0, 0, 0.2);
+    border-bottom: 0.5em solid rgba(0, 0, 0, 0.2);
+    border-left: 0.5em solid rgba(255, 255, 255, 0);
+    -webkit-transform: translateZ(0);
+    -ms-transform: translateZ(0);
+    transform: translateZ(0);
+    -webkit-animation: load8 1.2s infinite linear;
+    animation: load8 1.2s infinite linear;
+}
+@-webkit-keyframes load8 {
+    0% {
+	-webkit-transform: rotate(0deg);
+	transform: rotate(0deg);
+    }
+    100% {
+	-webkit-transform: rotate(360deg);
+	transform: rotate(360deg);
+    }
+}
+@keyframes load8 {
+    0% {
+	-webkit-transform: rotate(0deg);
+	transform: rotate(0deg);
+    }
+    100% {
+	-webkit-transform: rotate(360deg);
+	transform: rotate(360deg);
+    }
+}

+ 41 - 0
searx/static/themes/simple/less/toolkit_loader.less

@@ -0,0 +1,41 @@
+.loader,
+.loader:after {	
+    border-radius: 50%;
+    width: 10em;
+    height: 10em;
+}
+.loader {
+    margin: 60px auto;
+    font-size: 10px;
+    position: relative;
+    text-indent: -9999em;
+    border-top: 1.1em solid rgba(255, 255, 255, 0.2);
+    border-right: 1.1em solid rgba(255, 255, 255, 0.2);
+    border-bottom: 1.1em solid rgba(255, 255, 255, 0.2);
+    border-left: 1.1em solid #ffffff;
+    -webkit-transform: translateZ(0);
+    -ms-transform: translateZ(0);
+    transform: translateZ(0);
+    -webkit-animation: load8 1.1s infinite linear;
+    animation: load8 1.1s infinite linear;
+}
+@-webkit-keyframes load8 {
+    0% {
+	-webkit-transform: rotate(0deg);
+	transform: rotate(0deg);
+    }
+    100% {
+	-webkit-transform: rotate(360deg);
+	transform: rotate(360deg);
+    }
+}
+@keyframes load8 {
+    0% {
+	-webkit-transform: rotate(0deg);
+	transform: rotate(0deg);
+    }
+    100% {
+	-webkit-transform: rotate(360deg);
+	transform: rotate(360deg);
+    }
+}

+ 5 - 5
searx/static/themes/simple/package.json

@@ -1,15 +1,15 @@
 {
 {
   "devDependencies": {
   "devDependencies": {
-    "grunt": "~1.0.1",
+    "grunt": "~1.0.3",
     "grunt-contrib-concat": "~1.0.1",
     "grunt-contrib-concat": "~1.0.1",
     "grunt-contrib-cssmin": "^2.2.1",
     "grunt-contrib-cssmin": "^2.2.1",
     "grunt-contrib-jshint": "~1.1.0",
     "grunt-contrib-jshint": "~1.1.0",
     "grunt-contrib-less": "^1.4.1",
     "grunt-contrib-less": "^1.4.1",
-    "grunt-contrib-uglify": "~3.0.1",
+    "grunt-contrib-uglify": "~3.4.0",
-    "grunt-contrib-watch": "~1.0.0",
+    "grunt-contrib-watch": "~1.1.0",
-    "grunt-webfont": "^1.6.0",
+    "grunt-webfont": "^1.7.1",
     "ionicons-npm": "^2.0.1",
     "ionicons-npm": "^2.0.1",
-    "jslint": "^0.10.3",
+    "jslint": "^0.12.0",
     "less-plugin-clean-css": "^1.5.1"
     "less-plugin-clean-css": "^1.5.1"
   },
   },
   "scripts": {
   "scripts": {

+ 2 - 2
searx/templates/oscar/preferences.html

@@ -187,7 +187,7 @@
                                     </td>
                                     </td>
                                     <th>{{ search_engine.name }}</th>
                                     <th>{{ search_engine.name }}</th>
 				    <td class="name">{{ shortcuts[search_engine.name] }}</td>
 				    <td class="name">{{ shortcuts[search_engine.name] }}</td>
-					<td>{{ support_toggle(current_language in search_engine.supported_languages or current_language.split('-')[0] in search_engine.supported_languages) }}</td>
+					<td>{{ support_toggle(stats[search_engine.name].supports_selected_language) }}</td>
 					<td>{{ support_toggle(search_engine.safesearch==True) }}</td>
 					<td>{{ support_toggle(search_engine.safesearch==True) }}</td>
 					<td>{{ support_toggle(search_engine.time_range_support==True) }}</td>
 					<td>{{ support_toggle(search_engine.time_range_support==True) }}</td>
 					<td class="{{ 'danger' if stats[search_engine.name]['warn_time'] else '' }}">{{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }}</td>
 					<td class="{{ 'danger' if stats[search_engine.name]['warn_time'] else '' }}">{{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }}</td>
@@ -197,7 +197,7 @@
 					<td class="{{ 'danger' if stats[search_engine.name]['warn_time'] else '' }}">{{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }}</td>
 					<td class="{{ 'danger' if stats[search_engine.name]['warn_time'] else '' }}">{{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }}</td>
 					<td>{{ support_toggle(search_engine.time_range_support==True) }}</td>
 					<td>{{ support_toggle(search_engine.time_range_support==True) }}</td>
 					<td>{{ support_toggle(search_engine.safesearch==True) }}</td>
 					<td>{{ support_toggle(search_engine.safesearch==True) }}</td>
-					<td>{{ support_toggle(current_language in search_engine.supported_languages or current_language.split('-')[0] in search_engine.supported_languages) }}</td>
+					<td>{{ support_toggle(stats[search_engine.name].supports_selected_language) }}</td>
 					<td>{{ shortcuts[search_engine.name] }}</td>
 					<td>{{ shortcuts[search_engine.name] }}</td>
                                     <th>{{ search_engine.name }}</th>
                                     <th>{{ search_engine.name }}</th>
                                     <td class="onoff-checkbox">
                                     <td class="onoff-checkbox">

+ 49 - 3
searx/templates/simple/preferences.html

@@ -52,9 +52,9 @@
     <p class="value">
     <p class="value">
       <select name="autocomplete">
       <select name="autocomplete">
         <option value=""> - </option>
         <option value=""> - </option>
-        {% for backend in autocomplete_backends %}
+        {%- for backend in autocomplete_backends -%}
         <option value="{{ backend }}" {% if backend == autocomplete %}selected="selected"{% endif %}>{{ backend }}</option>
         <option value="{{ backend }}" {% if backend == autocomplete %}selected="selected"{% endif %}>{{ backend }}</option>
-        {% endfor %}
+        {%- endfor -%}
       </select>
       </select>
     </p>
     </p>
     <div class="description">{{ _('Find stuff as you type') }}</div>
     <div class="description">{{ _('Find stuff as you type') }}</div>
@@ -71,6 +71,19 @@
     <div class="description">{{ _('Filter content') }}</p>
     <div class="description">{{ _('Filter content') }}</p>
   </fieldset>
   </fieldset>
   {{ plugin_preferences('general') }}
   {{ plugin_preferences('general') }}
+  <fieldset>
+    <legend>{{ _('Open Access DOI resolver') }}</legend>
+    <p class="value">
+      <select id='doi_resolver' name='doi_resolver'>
+      {%- for doi_resolver_name,doi_resolver_url in doi_resolvers.items() -%}
+         <option value="{{ doi_resolver_name }}" {% if doi_resolver_name == current_doi_resolver %}selected="selected"{% endif %}>
+         {{- doi_resolver_name }} - {{ doi_resolver_url -}}
+         </option>
+      {%- endfor -%}
+      </select>
+    </p>
+    <div class="description"><!-- {{ _('Redirect to open-access versions of publications when available (plugin required)') }} --></div>
+  </fieldset>
   {{ tab_footer() }}
   {{ tab_footer() }}
 
 
   {{ tab_header('maintab', 'engines', _('Engines')) }}
   {{ tab_header('maintab', 'engines', _('Engines')) }}
@@ -151,6 +164,38 @@
   {{ plugin_preferences('ui') }}
   {{ plugin_preferences('ui') }}
   {{ tab_footer() }}
   {{ tab_footer() }}
 
 
+  {{ tab_header('maintab', 'cookies', _('Cookies')) }}
+
+     <p class="text-muted" style="margin:20px 0;">
+        {{ _('This is the list of cookies and their values searx is storing on your computer.') }}<br />
+        {{ _('With that list, you can assess searx transparency.') }}<br />
+     </p>
+
+     {% if cookies %}     
+     <table class="cookies">
+       <tr>
+          <th>{{ _('Cookie name') }}</th>
+          <th>{{ _('Value') }}</th>
+       </tr>
+       {% for cookie in cookies %}
+       <tr>
+          <td>{{ cookie }}</td>
+          <td>{{ cookies[cookie] }}</td>
+       </tr>
+       {% endfor %}
+     </table>
+     {% else %}
+        {% include 'oscar/messages/no_cookies.html' %}
+     {% endif %}     
+
+     <h4>{{ _('Search URL of the currently saved preferences') }} :</h4>
+     <div class="selectable_url">
+       <pre>{{ url_for('index', _external=True) }}?preferences={{ preferences_url_params|e }}{% raw %}&amp;q=%s{% endraw %}</pre>
+     </div>
+     <p class="small_font">{{ _('Note: specifying custom settings in the search URL can reduce privacy by leaking data to the clicked result sites.') }}</p>
+     
+  {{ tab_footer() }}
+
   {{ tab_header('maintab', 'privacy', _('Privacy')) }}
   {{ tab_header('maintab', 'privacy', _('Privacy')) }}
   <fieldset>
   <fieldset>
     <legend>{{ _('Method') }}</legend>
     <legend>{{ _('Method') }}</legend>
@@ -173,6 +218,7 @@
     <div class="description">{{ _('Proxying image results through searx') }}</div>
     <div class="description">{{ _('Proxying image results through searx') }}</div>
   </fieldset>
   </fieldset>
   {{ plugin_preferences('privacy') }}
   {{ plugin_preferences('privacy') }}
+  
   {{ tab_footer() }}
   {{ tab_footer() }}
 
 
   {{ tabs_close() }}
   {{ tabs_close() }}
@@ -180,7 +226,7 @@
   <p class="small_font">{{ _('These settings are stored in your cookies, this allows us not to store this data about you.') }}
   <p class="small_font">{{ _('These settings are stored in your cookies, this allows us not to store this data about you.') }}
     <br />
     <br />
     {{ _("These cookies serve your sole convenience, we don't use these cookies to track you.") }}
     {{ _("These cookies serve your sole convenience, we don't use these cookies to track you.") }}
-  </p>
+  </p>  
 
 
   <input type="submit" value="{{ _('save') }}" />
   <input type="submit" value="{{ _('save') }}" />
   <div class="{% if rtl %}left{% else %}right{% endif %} preferences_back"><a href="{{ url_for('clear_cookies') }}">{{ _('Reset defaults') }}</a></div>
   <div class="{% if rtl %}left{% else %}right{% endif %} preferences_back"><a href="{{ url_for('clear_cookies') }}">{{ _('Reset defaults') }}</a></div>

+ 6 - 9
searx/templates/simple/result_templates/map.html

@@ -23,17 +23,17 @@
     {%- endif -%}
     {%- endif -%}
     {% if result.address.road -%}
     {% if result.address.road -%}
         <span itemprop="streetAddress">
         <span itemprop="streetAddress">
-            {% if result.address.house_number %}{{ result.address.house_number }}, {% endif %}
+            {%- if result.address.house_number -%}{{- result.address.house_number -}}, {% endif %}
-            {{ result.address.road }}
+            {{- result.address.road -}}
         </span><br/>
         </span><br/>
     {%- endif %}
     {%- endif %}
     {%- if result.address.locality -%}
     {%- if result.address.locality -%}
-        <span itemprop="addressLocality">{{ result.address.locality }}</span>
+        <span itemprop="addressLocality">{{- result.address.locality -}}</span>
-        {% if result.address.postcode %}, <span itemprop="postalCode">{{ result.address.postcode }}</span>{% endif %}
+        {%- if result.address.postcode -%}, <span itemprop="postalCode">{{- result.address.postcode -}}</span>{% endif %}
         <br/>
         <br/>
     {%- endif -%}
     {%- endif -%}
     {%- if result.address.country -%}
     {%- if result.address.country -%}
-        <span itemprop="addressCountry">{{ result.address.country }}</span>
+        <span itemprop="addressCountry">{{- result.address.country -}}</span>
     {%- endif -%}
     {%- endif -%}
 </p>
 </p>
 {%- endif -%}
 {%- endif -%}
@@ -44,11 +44,8 @@
 
 
 {% if result.osm and (result.osm.type and result.osm.id) -%}
 {% if result.osm and (result.osm.type and result.osm.id) -%}
     <div class="result-content invisible" id="result-overpass-{{ index }}"{% if rtl %} dir="ltr"{% endif %}>
     <div class="result-content invisible" id="result-overpass-{{ index }}"{% if rtl %} dir="ltr"{% endif %}>
-        <div id="result-overpass-table-loading-{{ index }}"><img src="{{ url_for('static', filename='img/loader.gif') }}" alt="Loading ..."/></div>
+        <div id="result-overpass-table-loading-{{ index }}"><div class="loader">{{ _('Loading...') }}</div></div>
         <table id="result-overpass-table-{{ index }}">
         <table id="result-overpass-table-{{ index }}">
-          <thead>
-            <tr><th>key</th><th>value</th></tr>
-          </thead>
           <tbody>
           <tbody>
           </tbody>
           </tbody>
         </table>
         </table>

+ 19 - 12
searx/templates/simple/results.html

@@ -1,18 +1,25 @@
 {% extends "simple/base.html" %}
 {% extends "simple/base.html" %}
 {% from 'simple/macros.html' import icon, icon_small %}
 {% from 'simple/macros.html' import icon, icon_small %}
-{% block title %}{{ q|e }} - {% endblock %}
+{% block title %}{% if method == 'GET' %}{{- q|e -}} -{% endif %}{% endblock %}
 {% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}&amp;pageno={{ pageno }}&amp;time_range={{ time_range }}&amp;language={{ current_language }}&amp;safesearch={{ safesearch }}&amp;format=rss">{% endblock %}
 {% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ url_for('index') }}?q={{ q|urlencode }}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}&amp;pageno={{ pageno }}&amp;time_range={{ time_range }}&amp;language={{ current_language }}&amp;safesearch={{ safesearch }}&amp;format=rss">{% endblock %}
 {% block content %}
 {% block content %}
 <nav id="linkto_preferences"><a href="{{ url_for('preferences') }}">{{ icon('navicon-round') }}</a></nav>
 <nav id="linkto_preferences"><a href="{{ url_for('preferences') }}">{{ icon('navicon-round') }}</a></nav>
 {% include 'simple/search.html' %}
 {% include 'simple/search.html' %}
-<div id="results">
+
-    {% if answers %}
+{% if results and results|map(attribute='template')|unique|list|count == 1 %}
+  {% set only_template = 'only_template_' + results[0]['template']|default('default')|replace('.html', '') %}
+{% else %}
+  {% set unique_template = '' %}
+{% endif %}
+
+<div id="results" class="{{ only_template }}">
+    {% if answers -%}
     <div id="answers"><h4 class="title">{{ _('Answers') }} : </h4>
     <div id="answers"><h4 class="title">{{ _('Answers') }} : </h4>
-        {% for answer in answers -%}
+        {%- for answer in answers -%}
-        <div class="answer">{{ answer }}</div>
+        <div class="answer">{{- answer -}}</div>
-        {%- endfor %}
+        {%- endfor -%}
     </div>
     </div>
-    {% endif %}
+    {%- endif %}
 
 
     <div id="sidebar">
     <div id="sidebar">
 
 
@@ -24,16 +31,16 @@
 	<div class="dialog-error" role="alert">
 	<div class="dialog-error" role="alert">
 	  <p><strong>{{ _('Error!') }}</strong> {{ _('Engines cannot retrieve results') }}:</p>
 	  <p><strong>{{ _('Error!') }}</strong> {{ _('Engines cannot retrieve results') }}:</p>
 	  <p>{% for engine_name, error_type in unresponsive_engines %}
 	  <p>{% for engine_name, error_type in unresponsive_engines %}
-	  {{ engine_name }} ({{ error_type }}){% if not loop.last %}, {% endif %}
+	  {{- engine_name }} ({{- error_type -}}){% if not loop.last %}, {% endif %}
 	  {% endfor %}</p>
 	  {% endfor %}</p>
 	</div>
 	</div>
 	{% endif %}
 	{% endif %}
 
 
         {% if infoboxes %}
         {% if infoboxes %}
         <div id="infoboxes">
         <div id="infoboxes">
-	         {% for infobox in infoboxes %}
+           {% for infobox in infoboxes -%}
-               {% include 'simple/infobox.html' %}
+             {% include 'simple/infobox.html' %}
-	         {% endfor %}
+           {%- endfor %}
         </div>
         </div>
         {% endif %}
         {% endif %}
 
 
@@ -56,7 +63,7 @@
 
 
         <div id="search_url">
         <div id="search_url">
             <h4 class="title">{{ _('Search URL') }} :</h4>
             <h4 class="title">{{ _('Search URL') }} :</h4>
-            <div><pre>{{ base_url }}?q={{ q|urlencode }}&amp;language={{ current_language }}&amp;time_range={{ time_range }}&amp;safesearch={{ safesearch }}{% if pageno > 1 %}&amp;pageno={{ pageno }}{% endif %}{% if selected_categories %}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}</pre></div>
+            <div class="selectable_url"><pre>{{ base_url }}?q={{ q|urlencode }}&amp;language={{ current_language }}&amp;time_range={{ time_range }}&amp;safesearch={{ safesearch }}{% if pageno > 1 %}&amp;pageno={{ pageno }}{% endif %}{% if selected_categories %}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}</pre></div>
         </div>
         </div>
         <div id="apis">
         <div id="apis">
           <h4 class="title">{{ _('Download results') }}</h4>
           <h4 class="title">{{ _('Download results') }}</h4>

+ 1 - 0
searx/templates/simple/search.html

@@ -2,6 +2,7 @@
   <div id="search_wrapper">
   <div id="search_wrapper">
     <div class="search_box">
     <div class="search_box">
       <input id="q" name="q" type="text" placeholder="{{ _('Search for...') }}" tabindex="1" autocomplete="off" spellcheck="false" dir="auto" {% if q %}value="{{ q }}"{% endif %} >
       <input id="q" name="q" type="text" placeholder="{{ _('Search for...') }}" tabindex="1" autocomplete="off" spellcheck="false" dir="auto" {% if q %}value="{{ q }}"{% endif %} >
+      <button id="clear_search" type="button" tabindex="-1"><span class="hide_if_nojs">{{ icon('close') }}</span><span class="show_if_nojs">{{ _('Clear search') }}</span></button>
       <button id="send_search" type="submit" tabindex="-1"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="show_if_nojs">{{ _('Start search') }}</span></button>
       <button id="send_search" type="submit" tabindex="-1"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="show_if_nojs">{{ _('Start search') }}</span></button>
     </div>
     </div>
     <div class="search_filters">
     <div class="search_filters">

BIN
searx/translations/ar/LC_MESSAGES/messages.mo


+ 2 - 2
searx/translations/ar/LC_MESSAGES/messages.po

@@ -3,14 +3,14 @@
 # This file is distributed under the same license as the PROJECT project.
 # This file is distributed under the same license as the PROJECT project.
 # 
 # 
 # Translators:
 # Translators:
-# ButterflyOfFire, 2017-2018
+# ButterflyOfFire <ButterflyOfFire@protonmail.com>, 2017-2018
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: searx\n"
 "Project-Id-Version: searx\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 "POT-Creation-Date: 2017-11-01 21:31+0100\n"
 "POT-Creation-Date: 2017-11-01 21:31+0100\n"
 "PO-Revision-Date: 2018-01-23 17:54+0000\n"
 "PO-Revision-Date: 2018-01-23 17:54+0000\n"
-"Last-Translator: ButterflyOfFire\n"
+"Last-Translator: ButterflyOfFire <ButterflyOfFire@protonmail.com>\n"
 "Language-Team: Arabic (http://www.transifex.com/asciimoo/searx/language/ar/)\n"
 "Language-Team: Arabic (http://www.transifex.com/asciimoo/searx/language/ar/)\n"
 "MIME-Version: 1.0\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Type: text/plain; charset=UTF-8\n"

BIN
searx/translations/da/LC_MESSAGES/messages.mo


+ 23 - 22
searx/translations/da/LC_MESSAGES/messages.po

@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PROJECT project.
 # This file is distributed under the same license as the PROJECT project.
 # 
 # 
 # Translators:
 # Translators:
+# Mikkel Kirkgaard Nielsen <memb_transifex@mikini.dk>, 2018
 # Morten Krogh Andersen <spam1@krogh.net>, 2017
 # Morten Krogh Andersen <spam1@krogh.net>, 2017
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: searx\n"
 "Project-Id-Version: searx\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 "POT-Creation-Date: 2017-11-01 21:31+0100\n"
 "POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2017-11-01 20:31+0000\n"
+"PO-Revision-Date: 2018-02-22 01:48+0000\n"
-"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
+"Last-Translator: Mikkel Kirkgaard Nielsen <memb_transifex@mikini.dk>\n"
 "Language-Team: Danish (http://www.transifex.com/asciimoo/searx/language/da/)\n"
 "Language-Team: Danish (http://www.transifex.com/asciimoo/searx/language/da/)\n"
 "MIME-Version: 1.0\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,15 +22,15 @@ msgstr ""
 
 
 #: searx/search.py:137 searx/search.py:182
 #: searx/search.py:137 searx/search.py:182
 msgid "timeout"
 msgid "timeout"
-msgstr ""
+msgstr "tidsudløb"
 
 
 #: searx/search.py:144
 #: searx/search.py:144
 msgid "request exception"
 msgid "request exception"
-msgstr ""
+msgstr "forespørgsels-undtagelse"
 
 
 #: searx/search.py:151
 #: searx/search.py:151
 msgid "unexpected crash"
 msgid "unexpected crash"
-msgstr ""
+msgstr "uventet nedlukning"
 
 
 #: searx/webapp.py:136
 #: searx/webapp.py:136
 msgid "files"
 msgid "files"
@@ -77,7 +78,7 @@ msgstr "Ugyldige indstillinger, redigér venligst dine valg"
 
 
 #: searx/webapp.py:415
 #: searx/webapp.py:415
 msgid "Invalid settings"
 msgid "Invalid settings"
-msgstr ""
+msgstr "Ugyldig indstilling"
 
 
 #: searx/webapp.py:449 searx/webapp.py:493
 #: searx/webapp.py:449 searx/webapp.py:493
 msgid "search error"
 msgid "search error"
@@ -143,7 +144,7 @@ msgstr "Denne værdi er blevet overskrevet af"
 
 
 #: searx/engines/pubmed.py:74
 #: searx/engines/pubmed.py:74
 msgid "No abstract is available for this publication."
 msgid "No abstract is available for this publication."
-msgstr ""
+msgstr "Intet sammendrag er tilgængelig for denne publikation."
 
 
 #: searx/plugins/https_rewrite.py:32
 #: searx/plugins/https_rewrite.py:32
 msgid "Rewrite HTTP links to HTTPS if possible"
 msgid "Rewrite HTTP links to HTTPS if possible"
@@ -159,7 +160,7 @@ msgstr "Indlæs automatisk næste side, når der scrolles til bunden af den nuv
 
 
 #: searx/plugins/oa_doi_rewrite.py:9
 #: searx/plugins/oa_doi_rewrite.py:9
 msgid "Open Access DOI rewrite"
 msgid "Open Access DOI rewrite"
-msgstr ""
+msgstr "Open Access DOI-omskrivning"
 
 
 #: searx/plugins/oa_doi_rewrite.py:10
 #: searx/plugins/oa_doi_rewrite.py:10
 msgid ""
 msgid ""
@@ -630,11 +631,11 @@ msgstr "viderestillet"
 
 
 #: searx/templates/oscar/macros.html:92
 #: searx/templates/oscar/macros.html:92
 msgid "supported"
 msgid "supported"
-msgstr ""
+msgstr "understøttet"
 
 
 #: searx/templates/oscar/macros.html:96
 #: searx/templates/oscar/macros.html:96
 msgid "not supported"
 msgid "not supported"
-msgstr ""
+msgstr "ikke-understøttet"
 
 
 #: searx/templates/oscar/preferences.html:13
 #: searx/templates/oscar/preferences.html:13
 #: searx/templates/oscar/preferences.html:22
 #: searx/templates/oscar/preferences.html:22
@@ -712,13 +713,13 @@ msgstr "Stil"
 
 
 #: searx/templates/oscar/preferences.html:122
 #: searx/templates/oscar/preferences.html:122
 msgid "Open Access DOI resolver"
 msgid "Open Access DOI resolver"
-msgstr ""
+msgstr "Open Access DOI-forløser"
 
 
 #: searx/templates/oscar/preferences.html:123
 #: searx/templates/oscar/preferences.html:123
 msgid ""
 msgid ""
 "Redirect to open-access versions of publications when available (plugin "
 "Redirect to open-access versions of publications when available (plugin "
 "required)"
 "required)"
-msgstr ""
+msgstr "Omdiriger til open-access-udgaver af publikationer hvis tilgængelig (plugin påkrævet)"
 
 
 #: searx/templates/oscar/preferences.html:163
 #: searx/templates/oscar/preferences.html:163
 #: searx/templates/oscar/preferences.html:175
 #: searx/templates/oscar/preferences.html:175
@@ -729,7 +730,7 @@ msgstr "Genvej"
 #: searx/templates/oscar/preferences.html:164
 #: searx/templates/oscar/preferences.html:164
 #: searx/templates/oscar/preferences.html:174
 #: searx/templates/oscar/preferences.html:174
 msgid "Selected language"
 msgid "Selected language"
-msgstr ""
+msgstr "Valgt sprog"
 
 
 #: searx/templates/oscar/preferences.html:166
 #: searx/templates/oscar/preferences.html:166
 #: searx/templates/oscar/preferences.html:172
 #: searx/templates/oscar/preferences.html:172
@@ -789,13 +790,13 @@ msgstr "Værdi"
 
 
 #: searx/templates/oscar/preferences.html:301
 #: searx/templates/oscar/preferences.html:301
 msgid "Search URL of the currently saved preferences"
 msgid "Search URL of the currently saved preferences"
-msgstr ""
+msgstr "Søge-URL for den nuværende gemte indstilling"
 
 
 #: searx/templates/oscar/preferences.html:301
 #: searx/templates/oscar/preferences.html:301
 msgid ""
 msgid ""
 "Note: specifying custom settings in the search URL can reduce privacy by "
 "Note: specifying custom settings in the search URL can reduce privacy by "
 "leaking data to the clicked result sites."
 "leaking data to the clicked result sites."
-msgstr ""
+msgstr "Bemærk: brugertilpassede indstillinger i søge-URL kan reducere niveauet af beskyttelse ved at lække data til de sider der klikkes på i resultatet."
 
 
 #: searx/templates/oscar/results.html:17
 #: searx/templates/oscar/results.html:17
 msgid "Search results"
 msgid "Search results"
@@ -804,12 +805,12 @@ msgstr "Søgereresultater"
 #: searx/templates/oscar/results.html:21
 #: searx/templates/oscar/results.html:21
 #: searx/templates/simple/results.html:84
 #: searx/templates/simple/results.html:84
 msgid "Try searching for:"
 msgid "Try searching for:"
-msgstr ""
+msgstr "Prøv at søge efter:"
 
 
 #: searx/templates/oscar/results.html:100
 #: searx/templates/oscar/results.html:100
 #: searx/templates/simple/results.html:25
 #: searx/templates/simple/results.html:25
 msgid "Engines cannot retrieve results"
 msgid "Engines cannot retrieve results"
-msgstr ""
+msgstr "Søgemotorer kan ikke hente resultater"
 
 
 #: searx/templates/oscar/results.html:131
 #: searx/templates/oscar/results.html:131
 msgid "Links"
 msgid "Links"
@@ -874,12 +875,12 @@ msgstr "Der er pt. ingen tilgængelige data"
 #: searx/templates/oscar/messages/no_results.html:4
 #: searx/templates/oscar/messages/no_results.html:4
 #: searx/templates/simple/messages/no_results.html:4
 #: searx/templates/simple/messages/no_results.html:4
 msgid "Engines cannot retrieve results."
 msgid "Engines cannot retrieve results."
-msgstr ""
+msgstr "Søgemotorer kan ikke hente resultater."
 
 
 #: searx/templates/oscar/messages/no_results.html:10
 #: searx/templates/oscar/messages/no_results.html:10
 #: searx/templates/simple/messages/no_results.html:10
 #: searx/templates/simple/messages/no_results.html:10
 msgid "Please, try again later or find another searx instance."
 msgid "Please, try again later or find another searx instance."
-msgstr ""
+msgstr "Vær venlig at prøve igen senere, eller find en anden searx-instans."
 
 
 #: searx/templates/oscar/messages/no_results.html:14
 #: searx/templates/oscar/messages/no_results.html:14
 #: searx/templates/simple/messages/no_results.html:14
 #: searx/templates/simple/messages/no_results.html:14
@@ -998,7 +999,7 @@ msgstr "Indlæs mere..."
 
 
 #: searx/templates/simple/base.html:31
 #: searx/templates/simple/base.html:31
 msgid "No item found"
 msgid "No item found"
-msgstr ""
+msgstr "Intet fundet"
 
 
 #: searx/templates/simple/preferences.html:89
 #: searx/templates/simple/preferences.html:89
 msgid "Supports selected language"
 msgid "Supports selected language"
@@ -1006,8 +1007,8 @@ msgstr "Undstøtter valgte sprog"
 
 
 #: searx/templates/simple/preferences.html:118
 #: searx/templates/simple/preferences.html:118
 msgid "User interface"
 msgid "User interface"
-msgstr ""
+msgstr "Brugerinterface"
 
 
 #: searx/templates/simple/preferences.html:154
 #: searx/templates/simple/preferences.html:154
 msgid "Privacy"
 msgid "Privacy"
-msgstr ""
+msgstr "Privatliv"

BIN
searx/translations/fil/LC_MESSAGES/messages.mo


+ 3 - 3
searx/translations/fil/LC_MESSAGES/messages.po

@@ -3,15 +3,15 @@
 # This file is distributed under the same license as the PROJECT project.
 # This file is distributed under the same license as the PROJECT project.
 # 
 # 
 # Translators:
 # Translators:
-# GR01D, 2018
+# gr01d, 2018
-# GR01D, 2018
+# gr01d, 2018
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: searx\n"
 "Project-Id-Version: searx\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 "POT-Creation-Date: 2017-11-01 21:31+0100\n"
 "POT-Creation-Date: 2017-11-01 21:31+0100\n"
 "PO-Revision-Date: 2018-02-18 04:45+0000\n"
 "PO-Revision-Date: 2018-02-18 04:45+0000\n"
-"Last-Translator: GR01D\n"
+"Last-Translator: gr01d\n"
 "Language-Team: Filipino (http://www.transifex.com/asciimoo/searx/language/fil/)\n"
 "Language-Team: Filipino (http://www.transifex.com/asciimoo/searx/language/fil/)\n"
 "MIME-Version: 1.0\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Type: text/plain; charset=UTF-8\n"

BIN
searx/translations/pl/LC_MESSAGES/messages.mo


+ 1014 - 0
searx/translations/pl/LC_MESSAGES/messages.po

@@ -0,0 +1,1014 @@
+# Translations template for PROJECT.
+# Copyright (C) 2017 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# 
+# Translators:
+# Artur <artur@komoter.pl>, 2017
+# Artur <artur@komoter.pl>, 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: searx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2017-11-01 21:31+0100\n"
+"PO-Revision-Date: 2017-11-20 13:39+0000\n"
+"Last-Translator: Artur <artur@komoter.pl>\n"
+"Language-Team: Polish (Poland) (http://www.transifex.com/asciimoo/searx/language/pl_PL/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.3.4\n"
+"Language: pl_PL\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+
+#: searx/search.py:137 searx/search.py:182
+msgid "timeout"
+msgstr "przekroczenie maksymalnego dozwolonego czasu"
+
+#: searx/search.py:144
+msgid "request exception"
+msgstr "wyjątek w żądaniu"
+
+#: searx/search.py:151
+msgid "unexpected crash"
+msgstr "niespodziewana awaria"
+
+#: searx/webapp.py:136
+msgid "files"
+msgstr "pliki"
+
+#: searx/webapp.py:137
+msgid "general"
+msgstr "ogólne"
+
+#: searx/webapp.py:138
+msgid "music"
+msgstr "muzyka"
+
+#: searx/webapp.py:139
+msgid "social media"
+msgstr "media społecznościowe"
+
+#: searx/webapp.py:140
+msgid "images"
+msgstr "zdjęcia"
+
+#: searx/webapp.py:141
+msgid "videos"
+msgstr "wideo"
+
+#: searx/webapp.py:142
+msgid "it"
+msgstr "informatyka"
+
+#: searx/webapp.py:143
+msgid "news"
+msgstr "wiadomości"
+
+#: searx/webapp.py:144
+msgid "map"
+msgstr "mapa"
+
+#: searx/webapp.py:145
+msgid "science"
+msgstr "nauka"
+
+#: searx/webapp.py:399 searx/webapp.py:658
+msgid "Invalid settings, please edit your preferences"
+msgstr "Nieprawidłowe ustawienia, proszę zmienić swoje preferencje"
+
+#: searx/webapp.py:415
+msgid "Invalid settings"
+msgstr "Nieprawidłowe ustawienia"
+
+#: searx/webapp.py:449 searx/webapp.py:493
+msgid "search error"
+msgstr "błąd wyszukiwania"
+
+#: searx/webapp.py:530
+msgid "{minutes} minute(s) ago"
+msgstr "{minutes} minut(y) temu"
+
+#: searx/webapp.py:532
+msgid "{hours} hour(s), {minutes} minute(s) ago"
+msgstr "{hours} godzin(y), {minutes} minut(y) temu"
+
+#: searx/answerers/random/answerer.py:53
+msgid "Random value generator"
+msgstr "Generator wartości losowych"
+
+#: searx/answerers/random/answerer.py:54
+msgid "Generate different random values"
+msgstr "Wygeneruj różne wartości losowe"
+
+#: searx/answerers/statistics/answerer.py:53
+msgid "Statistics functions"
+msgstr "Funkcje statystyczne"
+
+#: searx/answerers/statistics/answerer.py:54
+msgid "Compute {functions} of the arguments"
+msgstr "Oblicz {functions} argumentów"
+
+#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+msgid "Engine time (sec)"
+msgstr "Czas wyszukiwania (sek)"
+
+#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+msgid "Page loads (sec)"
+msgstr "Ładowanie strony (sek)"
+
+#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
+#: searx/templates/oscar/results.html:95
+#: searx/templates/simple/results.html:20
+msgid "Number of results"
+msgstr "Liczba wyników"
+
+#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+msgid "Scores"
+msgstr "Wyniki"
+
+#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+msgid "Scores per result"
+msgstr "Wyniki na rezultat"
+
+#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+msgid "Errors"
+msgstr "Błędy"
+
+#: searx/engines/pdbe.py:87
+msgid "{title}&nbsp;(OBSOLETE)"
+msgstr "{title}&nbsp;(PRZESTARZAŁE)"
+
+#: searx/engines/pdbe.py:91
+msgid "This entry has been superseded by"
+msgstr "Ten wpis został zastąpiony przez"
+
+#: searx/engines/pubmed.py:74
+msgid "No abstract is available for this publication."
+msgstr "Streszczenie nie jest dostępne dla tej publikacji."
+
+#: searx/plugins/https_rewrite.py:32
+msgid "Rewrite HTTP links to HTTPS if possible"
+msgstr "Nadpisuj hiperłącza HTTP na HTTPS, jeśli to możliwe"
+
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "Nieskończone przewijanie"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "Automatycznie ładuj następną stronę podczas przewijania do dolnej części bieżącej strony"
+
+#: searx/plugins/oa_doi_rewrite.py:9
+msgid "Open Access DOI rewrite"
+msgstr "Nadpisywanie DOI z otwartym dostępem"
+
+#: searx/plugins/oa_doi_rewrite.py:10
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Unikaj opłat za dostęp, przekierowując do otwartych wersji publikacji, gdy są dostępne"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/simple/preferences.html:149
+msgid "Open result links on new browser tabs"
+msgstr "Otwórz hiperłącza wyników w nowych kartach przeglądarki"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "Wyniki są domyślnie otwierane w tym samym oknie. Ta wtyczka zastępuje domyślne zachowanie w celu otwarcia hiperłączy w nowych kartach/oknach. (Wymagany Javascript)"
+
+#: searx/plugins/search_on_category_select.py:18
+msgid "Search on category select"
+msgstr "Szukaj po wybraniu kategorii"
+
+#: searx/plugins/search_on_category_select.py:19
+msgid ""
+"Perform search immediately if a category selected. Disable to select "
+"multiple categories. (JavaScript required)"
+msgstr "Wykonaj wyszukiwanie natychmiast po wybraniu kategorii. Wyłącz, aby wybrać wiele kategorii. (Wymagany Javascript)"
+
+#: searx/plugins/self_info.py:20
+msgid ""
+"Displays your IP if the query is \"ip\" and your user agent if the query "
+"contains \"user agent\"."
+msgstr "Wyświetla Twój adres IP, jeśli zapytanie to \"ip\", i Twojego agenta użytkownika, jeśli zapytanie zawiera \"user agent\"."
+
+#: searx/plugins/tracker_url_remover.py:26
+msgid "Tracker URL remover"
+msgstr "Usuwanie elementów śledzących z URL-ów"
+
+#: searx/plugins/tracker_url_remover.py:27
+msgid "Remove trackers arguments from the returned URL"
+msgstr "Usuń argumenty elementów śledzących ze zwróconego adresu URL"
+
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Skróty podobne do Vima"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Poruszaj się po wynikach wyszukiwania za pomocą skrótów podobnych do Vima (wymagany Javascript). Naciśnij klawisz \"h\" na stronie głównej lub stronie wyników, aby uzyskać pomoc."
+
+#: searx/templates/courgette/404.html:4 searx/templates/legacy/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+#: searx/templates/simple/404.html:4
+msgid "Page not found"
+msgstr "Strona nie znaleziona"
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "Przejdź do %(search_page)s."
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+msgid "search page"
+msgstr "strona wyszukiwania"
+
+#: searx/templates/courgette/index.html:9
+#: searx/templates/courgette/index.html:13
+#: searx/templates/courgette/results.html:5
+#: searx/templates/legacy/index.html:8 searx/templates/legacy/index.html:12
+#: searx/templates/oscar/navbar.html:7
+#: searx/templates/oscar/preferences.html:3
+#: searx/templates/pix-art/index.html:8
+msgid "preferences"
+msgstr "preferencje"
+
+#: searx/templates/courgette/index.html:11
+#: searx/templates/legacy/index.html:10 searx/templates/oscar/about.html:2
+#: searx/templates/oscar/navbar.html:6 searx/templates/pix-art/index.html:7
+msgid "about"
+msgstr "O searx"
+
+#: searx/templates/courgette/preferences.html:5
+#: searx/templates/legacy/preferences.html:5
+#: searx/templates/oscar/preferences.html:8
+#: searx/templates/pix-art/preferences.html:5
+#: searx/templates/simple/preferences.html:26
+msgid "Preferences"
+msgstr "Preferencje"
+
+#: searx/templates/courgette/preferences.html:9
+#: searx/templates/legacy/preferences.html:9
+#: searx/templates/oscar/preferences.html:33
+#: searx/templates/oscar/preferences.html:35
+#: searx/templates/simple/preferences.html:34
+msgid "Default categories"
+msgstr "Domyślne kategorie"
+
+#: searx/templates/courgette/preferences.html:13
+#: searx/templates/legacy/preferences.html:14
+#: searx/templates/oscar/preferences.html:41
+#: searx/templates/pix-art/preferences.html:9
+#: searx/templates/simple/preferences.html:39
+#: searx/templates/simple/preferences.html:163
+msgid "Search language"
+msgstr "Język wyszukiwania"
+
+#: searx/templates/courgette/preferences.html:16
+#: searx/templates/legacy/preferences.html:17
+#: searx/templates/oscar/languages.html:6
+#: searx/templates/pix-art/preferences.html:12
+#: searx/templates/simple/languages.html:2
+#: searx/templates/simple/preferences.html:42
+msgid "Default language"
+msgstr "Domyślny język"
+
+#: searx/templates/courgette/preferences.html:24
+#: searx/templates/legacy/preferences.html:25
+#: searx/templates/oscar/preferences.html:47
+#: searx/templates/pix-art/preferences.html:20
+#: searx/templates/simple/preferences.html:120
+msgid "Interface language"
+msgstr "Język interfejsu"
+
+#: searx/templates/courgette/preferences.html:34
+#: searx/templates/legacy/preferences.html:35
+#: searx/templates/oscar/preferences.html:57
+#: searx/templates/simple/preferences.html:51
+msgid "Autocomplete"
+msgstr "Autouzupełnienie"
+
+#: searx/templates/courgette/preferences.html:45
+#: searx/templates/legacy/preferences.html:46
+#: searx/templates/oscar/preferences.html:68
+#: searx/templates/simple/preferences.html:166
+msgid "Image proxy"
+msgstr "Proxy zdjęć"
+
+#: searx/templates/courgette/preferences.html:48
+#: searx/templates/legacy/preferences.html:49
+#: searx/templates/oscar/preferences.html:72
+#: searx/templates/simple/preferences.html:169
+msgid "Enabled"
+msgstr "Włączone"
+
+#: searx/templates/courgette/preferences.html:49
+#: searx/templates/legacy/preferences.html:50
+#: searx/templates/oscar/preferences.html:73
+#: searx/templates/simple/preferences.html:170
+msgid "Disabled"
+msgstr "Wyłączone"
+
+#: searx/templates/courgette/preferences.html:54
+#: searx/templates/legacy/preferences.html:55
+#: searx/templates/oscar/preferences.html:77
+#: searx/templates/pix-art/preferences.html:30
+#: searx/templates/simple/preferences.html:156
+msgid "Method"
+msgstr "Metoda"
+
+#: searx/templates/courgette/preferences.html:63
+#: searx/templates/legacy/preferences.html:64
+#: searx/templates/oscar/preferences.html:86
+#: searx/templates/oscar/preferences.html:165
+#: searx/templates/oscar/preferences.html:173
+#: searx/templates/simple/preferences.html:63
+#: searx/templates/simple/preferences.html:90
+msgid "SafeSearch"
+msgstr "Bezpieczne wyszukiwanie"
+
+#: searx/templates/courgette/preferences.html:66
+#: searx/templates/legacy/preferences.html:67
+#: searx/templates/oscar/preferences.html:90
+#: searx/templates/simple/preferences.html:66
+msgid "Strict"
+msgstr "Bezkompromisowe"
+
+#: searx/templates/courgette/preferences.html:67
+#: searx/templates/legacy/preferences.html:68
+#: searx/templates/oscar/preferences.html:91
+#: searx/templates/simple/preferences.html:67
+msgid "Moderate"
+msgstr "Umiarkowane"
+
+#: searx/templates/courgette/preferences.html:68
+#: searx/templates/legacy/preferences.html:69
+#: searx/templates/oscar/preferences.html:92
+#: searx/templates/simple/preferences.html:68
+msgid "None"
+msgstr "Wyłączone"
+
+#: searx/templates/courgette/preferences.html:73
+#: searx/templates/legacy/preferences.html:74
+#: searx/templates/oscar/preferences.html:96
+#: searx/templates/pix-art/preferences.html:39
+#: searx/templates/simple/preferences.html:131
+msgid "Themes"
+msgstr "Motywy"
+
+#: searx/templates/courgette/preferences.html:83
+msgid "Color"
+msgstr "Kolor"
+
+#: searx/templates/courgette/preferences.html:86
+msgid "Blue (default)"
+msgstr "Niebieski (domyślny)"
+
+#: searx/templates/courgette/preferences.html:87
+msgid "Violet"
+msgstr "Fioletowy"
+
+#: searx/templates/courgette/preferences.html:88
+msgid "Green"
+msgstr "Zielony"
+
+#: searx/templates/courgette/preferences.html:89
+msgid "Cyan"
+msgstr "Turkusowy"
+
+#: searx/templates/courgette/preferences.html:90
+msgid "Orange"
+msgstr "Pomarańczowy"
+
+#: searx/templates/courgette/preferences.html:91
+msgid "Red"
+msgstr "Czerwony"
+
+#: searx/templates/courgette/preferences.html:96
+#: searx/templates/legacy/preferences.html:93
+#: searx/templates/pix-art/preferences.html:49
+#: searx/templates/simple/preferences.html:77
+msgid "Currently used search engines"
+msgstr "Obecnie używane wyszukiwarki"
+
+#: searx/templates/courgette/preferences.html:100
+#: searx/templates/legacy/preferences.html:97
+#: searx/templates/oscar/preferences.html:162
+#: searx/templates/oscar/preferences.html:176
+#: searx/templates/pix-art/preferences.html:53
+#: searx/templates/simple/preferences.html:87
+msgid "Engine name"
+msgstr "Nazwa wyszukiwarki"
+
+#: searx/templates/courgette/preferences.html:101
+#: searx/templates/legacy/preferences.html:98
+msgid "Category"
+msgstr "Kategoria"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:113
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:110
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/oscar/preferences.html:177
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:64
+#: searx/templates/simple/preferences.html:86
+msgid "Allow"
+msgstr "Pozwól"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:114
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:111
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:65
+msgid "Block"
+msgstr "Blokuj"
+
+#: searx/templates/courgette/preferences.html:122
+#: searx/templates/legacy/preferences.html:119
+#: searx/templates/oscar/preferences.html:297
+#: searx/templates/pix-art/preferences.html:73
+#: searx/templates/simple/preferences.html:180
+msgid ""
+"These settings are stored in your cookies, this allows us not to store this "
+"data about you."
+msgstr "Ustawienia te są przechowywane w ciasteczkach, co pozwala nam nie przechowywać tych danych o Tobie."
+
+#: searx/templates/courgette/preferences.html:124
+#: searx/templates/legacy/preferences.html:121
+#: searx/templates/oscar/preferences.html:299
+#: searx/templates/pix-art/preferences.html:75
+#: searx/templates/simple/preferences.html:182
+msgid ""
+"These cookies serve your sole convenience, we don't use these cookies to "
+"track you."
+msgstr "Te ciasteczka służą wyłącznie Twojej wygodzie, nie używamy tych ciasteczek do śledzenia Ciebie."
+
+#: searx/templates/courgette/preferences.html:127
+#: searx/templates/legacy/preferences.html:124
+#: searx/templates/oscar/preferences.html:305
+#: searx/templates/pix-art/preferences.html:78
+#: searx/templates/simple/preferences.html:185
+msgid "save"
+msgstr "zapisz"
+
+#: searx/templates/courgette/preferences.html:128
+#: searx/templates/legacy/preferences.html:125
+#: searx/templates/oscar/preferences.html:307
+#: searx/templates/simple/preferences.html:186
+msgid "Reset defaults"
+msgstr "Przywróć domyślne"
+
+#: searx/templates/courgette/preferences.html:129
+#: searx/templates/legacy/preferences.html:126
+#: searx/templates/oscar/preferences.html:306
+#: searx/templates/pix-art/preferences.html:79
+#: searx/templates/simple/preferences.html:187
+msgid "back"
+msgstr "z powrotem"
+
+#: searx/templates/courgette/results.html:12
+#: searx/templates/legacy/results.html:13
+#: searx/templates/oscar/results.html:136
+#: searx/templates/simple/results.html:58
+msgid "Search URL"
+msgstr "URL wyszukiwania"
+
+#: searx/templates/courgette/results.html:16
+#: searx/templates/legacy/results.html:17
+#: searx/templates/oscar/results.html:141
+#: searx/templates/simple/results.html:62
+msgid "Download results"
+msgstr "Ściągnij wyniki"
+
+#: searx/templates/courgette/results.html:34
+#: searx/templates/legacy/results.html:35
+#: searx/templates/simple/results.html:10
+msgid "Answers"
+msgstr "Odpowiedzi"
+
+#: searx/templates/courgette/results.html:42
+#: searx/templates/legacy/results.html:43
+#: searx/templates/oscar/results.html:116
+#: searx/templates/simple/results.html:42
+msgid "Suggestions"
+msgstr "Propozycje"
+
+#: searx/templates/courgette/results.html:70
+#: searx/templates/legacy/results.html:81
+#: searx/templates/oscar/results.html:68 searx/templates/oscar/results.html:78
+#: searx/templates/simple/results.html:130
+msgid "previous page"
+msgstr "poprzednia strona"
+
+#: searx/templates/courgette/results.html:81
+#: searx/templates/legacy/results.html:92
+#: searx/templates/oscar/results.html:62 searx/templates/oscar/results.html:84
+#: searx/templates/simple/results.html:145
+msgid "next page"
+msgstr "następna strona"
+
+#: searx/templates/courgette/search.html:3
+#: searx/templates/legacy/search.html:3 searx/templates/oscar/search.html:6
+#: searx/templates/oscar/search_full.html:9
+#: searx/templates/pix-art/search.html:3 searx/templates/simple/search.html:4
+msgid "Search for..."
+msgstr "Wyszukaj..."
+
+#: searx/templates/courgette/stats.html:4 searx/templates/legacy/stats.html:4
+#: searx/templates/oscar/stats.html:5 searx/templates/pix-art/stats.html:4
+#: searx/templates/simple/stats.html:7
+msgid "Engine stats"
+msgstr "Statystyki wyszukiwarki"
+
+#: searx/templates/courgette/result_templates/images.html:4
+#: searx/templates/legacy/result_templates/images.html:4
+#: searx/templates/pix-art/result_templates/images.html:4
+msgid "original context"
+msgstr "oryginalny kontekst"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Seeder"
+msgstr "Udostępniający"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Leecher"
+msgstr "Pobierający"
+
+#: searx/templates/courgette/result_templates/torrent.html:9
+#: searx/templates/legacy/result_templates/torrent.html:9
+#: searx/templates/oscar/macros.html:23
+#: searx/templates/simple/result_templates/torrent.html:6
+msgid "magnet link"
+msgstr "hiperłącze magnetyczne"
+
+#: searx/templates/courgette/result_templates/torrent.html:10
+#: searx/templates/legacy/result_templates/torrent.html:10
+#: searx/templates/oscar/macros.html:24
+#: searx/templates/simple/result_templates/torrent.html:7
+msgid "torrent file"
+msgstr "plik torrent"
+
+#: searx/templates/legacy/categories.html:8
+#: searx/templates/simple/categories.html:6
+msgid "Click on the magnifier to perform search"
+msgstr "Kliknij na szkło powiększające, aby wykonać wyszukiwanie"
+
+#: searx/templates/legacy/preferences.html:84
+#: searx/templates/oscar/preferences.html:113
+#: searx/templates/simple/preferences.html:142
+msgid "Results on new tabs"
+msgstr "Wyniki w nowych kartach"
+
+#: searx/templates/legacy/preferences.html:87
+#: searx/templates/oscar/preferences.html:117
+#: searx/templates/simple/preferences.html:145
+msgid "On"
+msgstr "Włączone"
+
+#: searx/templates/legacy/preferences.html:88
+#: searx/templates/oscar/preferences.html:118
+#: searx/templates/simple/preferences.html:146
+msgid "Off"
+msgstr "Wyłączone"
+
+#: searx/templates/legacy/result_templates/code.html:3
+#: searx/templates/legacy/result_templates/default.html:3
+#: searx/templates/legacy/result_templates/map.html:9
+#: searx/templates/oscar/macros.html:34 searx/templates/oscar/macros.html:48
+#: searx/templates/simple/macros.html:43
+msgid "cached"
+msgstr "buforowane"
+
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "Zaawansowane ustawienia"
+
+#: searx/templates/oscar/base.html:62
+#: searx/templates/oscar/messages/first_time.html:4
+#: searx/templates/oscar/messages/save_settings_successfull.html:5
+#: searx/templates/oscar/messages/unknow_error.html:5
+msgid "Close"
+msgstr "Zamknij"
+
+#: searx/templates/oscar/base.html:64
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+#: searx/templates/simple/results.html:25
+msgid "Error!"
+msgstr "Błąd!"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "Powered by"
+msgstr "Obsługiwane przez"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "a privacy-respecting, hackable metasearch engine"
+msgstr "szanująca prywatność, hackowalna wyszukiwarka metasearch"
+
+#: searx/templates/oscar/macros.html:36 searx/templates/oscar/macros.html:50
+#: searx/templates/simple/macros.html:43
+msgid "proxied"
+msgstr "przesłane poprzez proxy"
+
+#: searx/templates/oscar/macros.html:92
+msgid "supported"
+msgstr "wspierane"
+
+#: searx/templates/oscar/macros.html:96
+msgid "not supported"
+msgstr "niewspierane"
+
+#: searx/templates/oscar/preferences.html:13
+#: searx/templates/oscar/preferences.html:22
+#: searx/templates/simple/preferences.html:32
+msgid "General"
+msgstr "Ogólne"
+
+#: searx/templates/oscar/preferences.html:14
+#: searx/templates/oscar/preferences.html:146
+#: searx/templates/simple/preferences.html:76
+msgid "Engines"
+msgstr "Wyszukiwarki"
+
+#: searx/templates/oscar/preferences.html:15
+#: searx/templates/oscar/preferences.html:219
+msgid "Plugins"
+msgstr "Wtyczki"
+
+#: searx/templates/oscar/preferences.html:16
+#: searx/templates/oscar/preferences.html:245
+msgid "Answerers"
+msgstr "Respondenci"
+
+#: searx/templates/oscar/preferences.html:17
+#: searx/templates/oscar/preferences.html:272
+msgid "Cookies"
+msgstr "Ciasteczka"
+
+#: searx/templates/oscar/preferences.html:42
+#: searx/templates/simple/preferences.html:48
+msgid "What language do you prefer for search?"
+msgstr "W jakim języku wolisz wyszukiwać?"
+
+#: searx/templates/oscar/preferences.html:48
+#: searx/templates/simple/preferences.html:128
+msgid "Change the language of the layout"
+msgstr "Zmień język układu"
+
+#: searx/templates/oscar/preferences.html:58
+#: searx/templates/simple/preferences.html:60
+msgid "Find stuff as you type"
+msgstr "Szukaj podczas pisania"
+
+#: searx/templates/oscar/preferences.html:69
+#: searx/templates/simple/preferences.html:173
+msgid "Proxying image results through searx"
+msgstr "Przesyłanie wyników obrazów poprzez proxy searx"
+
+#: searx/templates/oscar/preferences.html:78
+msgid ""
+"Change how forms are submited, <a "
+"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
+" rel=\"external\">learn more about request methods</a>"
+msgstr "Zmień sposób przesyłania formularzy, <a href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">dowiedz się więcej o metodach HTTP</a>"
+
+#: searx/templates/oscar/preferences.html:87
+#: searx/templates/simple/preferences.html:71
+msgid "Filter content"
+msgstr "Filtruj treści"
+
+#: searx/templates/oscar/preferences.html:97
+#: searx/templates/simple/preferences.html:139
+msgid "Change searx layout"
+msgstr "Zmień układ searx"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Choose style for this theme"
+msgstr "Wybierz styl dla tego motywu"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Style"
+msgstr "Styl"
+
+#: searx/templates/oscar/preferences.html:122
+msgid "Open Access DOI resolver"
+msgstr "Podsystem DOI z otwartym dostępem"
+
+#: searx/templates/oscar/preferences.html:123
+msgid ""
+"Redirect to open-access versions of publications when available (plugin "
+"required)"
+msgstr "Przekierowanie do otwartych wersji publikacji, gdy są dostępne (wymagana wtyczka)"
+
+#: searx/templates/oscar/preferences.html:163
+#: searx/templates/oscar/preferences.html:175
+#: searx/templates/simple/preferences.html:88
+msgid "Shortcut"
+msgstr "Skrót"
+
+#: searx/templates/oscar/preferences.html:164
+#: searx/templates/oscar/preferences.html:174
+msgid "Selected language"
+msgstr "Wybrany język"
+
+#: searx/templates/oscar/preferences.html:166
+#: searx/templates/oscar/preferences.html:172
+#: searx/templates/simple/preferences.html:91
+msgid "Time range"
+msgstr "Zakres czasu"
+
+#: searx/templates/oscar/preferences.html:167
+#: searx/templates/oscar/preferences.html:171
+#: searx/templates/simple/preferences.html:92
+msgid "Avg. time"
+msgstr "Śr. czas"
+
+#: searx/templates/oscar/preferences.html:168
+#: searx/templates/oscar/preferences.html:170
+#: searx/templates/simple/preferences.html:93
+msgid "Max time"
+msgstr "Maksymalny czas"
+
+#: searx/templates/oscar/preferences.html:248
+msgid "This is the list of searx's instant answering modules."
+msgstr "Oto lista modułów natychmiastowych odpowiedzi w searx."
+
+#: searx/templates/oscar/preferences.html:252
+msgid "Name"
+msgstr "Nazwa"
+
+#: searx/templates/oscar/preferences.html:253
+msgid "Keywords"
+msgstr "Słowa kluczowe"
+
+#: searx/templates/oscar/preferences.html:254
+msgid "Description"
+msgstr "Opis"
+
+#: searx/templates/oscar/preferences.html:255
+msgid "Examples"
+msgstr "Przykłady"
+
+#: searx/templates/oscar/preferences.html:275
+msgid ""
+"This is the list of cookies and their values searx is storing on your "
+"computer."
+msgstr "Oto lista ciasteczek i ich wartości, które searx zapisuje na Twoim komputerze."
+
+#: searx/templates/oscar/preferences.html:276
+msgid "With that list, you can assess searx transparency."
+msgstr "Za pomocą tej listy możesz ocenić przezroczystość searx."
+
+#: searx/templates/oscar/preferences.html:281
+msgid "Cookie name"
+msgstr "Nazwa ciasteczka"
+
+#: searx/templates/oscar/preferences.html:282
+msgid "Value"
+msgstr "Wartość"
+
+#: searx/templates/oscar/preferences.html:301
+msgid "Search URL of the currently saved preferences"
+msgstr "Wyszukaj adres URL aktualnie zapisanych preferencji"
+
+#: searx/templates/oscar/preferences.html:301
+msgid ""
+"Note: specifying custom settings in the search URL can reduce privacy by "
+"leaking data to the clicked result sites."
+msgstr "Uwaga: określanie ustawień niestandardowych w adresie URL wyszukiwania może zmniejszyć prywatność, przenosząc dane do klikniętych stron z wyników."
+
+#: searx/templates/oscar/results.html:17
+msgid "Search results"
+msgstr "Wyniki wyszukiwania"
+
+#: searx/templates/oscar/results.html:21
+#: searx/templates/simple/results.html:84
+msgid "Try searching for:"
+msgstr "Spróbuj wyszukać:"
+
+#: searx/templates/oscar/results.html:100
+#: searx/templates/simple/results.html:25
+msgid "Engines cannot retrieve results"
+msgstr "Wyszukiwarki nie mogą pobrać wyników"
+
+#: searx/templates/oscar/results.html:131
+msgid "Links"
+msgstr "Hiperłącza"
+
+#: searx/templates/oscar/search.html:8
+#: searx/templates/oscar/search_full.html:11
+#: searx/templates/simple/search.html:5
+msgid "Start search"
+msgstr "Rozpocznij wyszukiwanie"
+
+#: searx/templates/oscar/stats.html:2
+msgid "stats"
+msgstr "statystyki"
+
+#: searx/templates/oscar/time-range.html:3
+#: searx/templates/simple/time-range.html:3
+msgid "Anytime"
+msgstr "W każdej chwili"
+
+#: searx/templates/oscar/time-range.html:6
+#: searx/templates/simple/time-range.html:6
+msgid "Last day"
+msgstr "W ostatnim dniu"
+
+#: searx/templates/oscar/time-range.html:9
+#: searx/templates/simple/time-range.html:9
+msgid "Last week"
+msgstr "W ostatnim tygodniu"
+
+#: searx/templates/oscar/time-range.html:12
+#: searx/templates/simple/time-range.html:12
+msgid "Last month"
+msgstr "W ostatnim miesiącu"
+
+#: searx/templates/oscar/time-range.html:15
+#: searx/templates/simple/time-range.html:15
+msgid "Last year"
+msgstr "W ostatnim roku"
+
+#: searx/templates/oscar/messages/first_time.html:6
+#: searx/templates/oscar/messages/no_data_available.html:3
+msgid "Heads up!"
+msgstr "Moment!"
+
+#: searx/templates/oscar/messages/first_time.html:7
+msgid "It look like you are using searx first time."
+msgstr "Wygląda na to, że po raz pierwszy używasz searx."
+
+#: searx/templates/oscar/messages/no_cookies.html:3
+msgid "Information!"
+msgstr "Informacja!"
+
+#: searx/templates/oscar/messages/no_cookies.html:4
+msgid "currently, there are no cookies defined."
+msgstr "obecnie nie zdefiniowano żadnych ciasteczek."
+
+#: searx/templates/oscar/messages/no_data_available.html:4
+msgid "There is currently no data available. "
+msgstr "Obecnie nie ma dostępnych danych."
+
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+msgid "Engines cannot retrieve results."
+msgstr "Wyszukiwarki nie mogą pobrać wyników."
+
+#: searx/templates/oscar/messages/no_results.html:10
+#: searx/templates/simple/messages/no_results.html:10
+msgid "Please, try again later or find another searx instance."
+msgstr "Spróbuj ponownie później lub znajdź inną instancję searx."
+
+#: searx/templates/oscar/messages/no_results.html:14
+#: searx/templates/simple/messages/no_results.html:14
+msgid "Sorry!"
+msgstr "Przepraszamy!"
+
+#: searx/templates/oscar/messages/no_results.html:15
+#: searx/templates/simple/messages/no_results.html:15
+msgid ""
+"we didn't find any results. Please use another query or search in more "
+"categories."
+msgstr "nie znaleźliśmy żadnych wyników. Użyj innego zapytania lub wyszukaj więcej kategorii."
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:7
+msgid "Well done!"
+msgstr "Dobra robota!"
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:8
+msgid "Settings saved successfully."
+msgstr "Ustawienia zostały pomyślnie zapisane."
+
+#: searx/templates/oscar/messages/unknow_error.html:7
+msgid "Oh snap!"
+msgstr "O rany!"
+
+#: searx/templates/oscar/messages/unknow_error.html:8
+msgid "Something went wrong."
+msgstr "Coś poszło nie tak."
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "show media"
+msgstr "pokaż media"
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "hide media"
+msgstr "ukryj media"
+
+#: searx/templates/oscar/result_templates/images.html:30
+msgid "Get image"
+msgstr "Pobierz obraz"
+
+#: searx/templates/oscar/result_templates/images.html:33
+msgid "View source"
+msgstr "Pokaż źródło"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "show map"
+msgstr "pokaż mapę"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "hide map"
+msgstr "ukryj mapę"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "show details"
+msgstr "pokaż szczegóły"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "hide details"
+msgstr "ukryj szczegóły"
+
+#: searx/templates/oscar/result_templates/torrent.html:7
+#: searx/templates/simple/result_templates/torrent.html:11
+msgid "Filesize"
+msgstr "Rozmiar pliku"
+
+#: searx/templates/oscar/result_templates/torrent.html:9
+#: searx/templates/simple/result_templates/torrent.html:12
+msgid "Bytes"
+msgstr "Bajtów"
+
+#: searx/templates/oscar/result_templates/torrent.html:10
+#: searx/templates/simple/result_templates/torrent.html:13
+msgid "kiB"
+msgstr "KiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:11
+#: searx/templates/simple/result_templates/torrent.html:14
+msgid "MiB"
+msgstr "MiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:12
+#: searx/templates/simple/result_templates/torrent.html:15
+msgid "GiB"
+msgstr "GiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:13
+#: searx/templates/simple/result_templates/torrent.html:16
+msgid "TiB"
+msgstr "TiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:15
+#: searx/templates/simple/result_templates/torrent.html:20
+msgid "Number of Files"
+msgstr "Liczba plików"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "show video"
+msgstr "pokaż wideo"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "hide video"
+msgstr "ukryj wideo"
+
+#: searx/templates/pix-art/results.html:28
+msgid "Load more..."
+msgstr "Załaduj więcej..."
+
+#: searx/templates/simple/base.html:31
+msgid "No item found"
+msgstr "Nie znaleziono elementu"
+
+#: searx/templates/simple/preferences.html:89
+msgid "Supports selected language"
+msgstr "Obsługuje wybrany język"
+
+#: searx/templates/simple/preferences.html:118
+msgid "User interface"
+msgstr "Interfejs użytkownika"
+
+#: searx/templates/simple/preferences.html:154
+msgid "Privacy"
+msgstr "Prywatność"

BIN
searx/translations/pt_BR/LC_MESSAGES/messages.mo


+ 5 - 5
searx/translations/pt_BR/LC_MESSAGES/messages.po

@@ -8,14 +8,14 @@
 # Guimarães Mello <maeslor@cryptolab.net>, 2017
 # Guimarães Mello <maeslor@cryptolab.net>, 2017
 # Neton Brício <fervelinux@gmail.com>, 2015
 # Neton Brício <fervelinux@gmail.com>, 2015
 # pizzaiolo, 2016
 # pizzaiolo, 2016
-# Shizuka 静香 <deusadaji@gmail.com>, 2018
+# shizuka, 2018
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: searx\n"
 "Project-Id-Version: searx\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 "POT-Creation-Date: 2017-11-01 21:31+0100\n"
 "POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-02-04 10:39+0000\n"
+"PO-Revision-Date: 2018-03-03 12:33+0000\n"
-"Last-Translator: Shizuka 静香 <deusadaji@gmail.com>\n"
+"Last-Translator: shizuka\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.com/asciimoo/searx/language/pt_BR/)\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.com/asciimoo/searx/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -778,7 +778,7 @@ msgstr "Exemplos"
 msgid ""
 msgid ""
 "This is the list of cookies and their values searx is storing on your "
 "This is the list of cookies and their values searx is storing on your "
 "computer."
 "computer."
-msgstr "Esta é a lista de cookies que searx está armazenando em seu computador."
+msgstr "Esta é a lista de cookies que o searx está armazenando em seu computador."
 
 
 #: searx/templates/oscar/preferences.html:276
 #: searx/templates/oscar/preferences.html:276
 msgid "With that list, you can assess searx transparency."
 msgid "With that list, you can assess searx transparency."
@@ -999,7 +999,7 @@ msgstr "ocultar vídeo"
 
 
 #: searx/templates/pix-art/results.html:28
 #: searx/templates/pix-art/results.html:28
 msgid "Load more..."
 msgid "Load more..."
-msgstr "Mostrar mais ..."
+msgstr "Mostrar mais..."
 
 
 #: searx/templates/simple/base.html:31
 #: searx/templates/simple/base.html:31
 msgid "No item found"
 msgid "No item found"

BIN
searx/translations/ru/LC_MESSAGES/messages.mo


+ 7 - 6
searx/translations/ru/LC_MESSAGES/messages.po

@@ -7,14 +7,15 @@
 # dimqua <dimqua@riseup.net>, 2015
 # dimqua <dimqua@riseup.net>, 2015
 # dimqua <dimqua@riseup.net>, 2015
 # dimqua <dimqua@riseup.net>, 2015
 # dimqua <dimqua@riseup.net>, 2017
 # dimqua <dimqua@riseup.net>, 2017
+# John DOe <is-kir@ya.ru>, 2018
 # Дмитрий Михирев, 2016-2017
 # Дмитрий Михирев, 2016-2017
 msgid ""
 msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: searx\n"
 "Project-Id-Version: searx\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
 "POT-Creation-Date: 2017-11-01 21:31+0100\n"
 "POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2017-12-27 10:02+0000\n"
+"PO-Revision-Date: 2018-02-26 16:39+0000\n"
-"Last-Translator: Andrey\n"
+"Last-Translator: John DOe <is-kir@ya.ru>\n"
 "Language-Team: Russian (http://www.transifex.com/asciimoo/searx/language/ru/)\n"
 "Language-Team: Russian (http://www.transifex.com/asciimoo/searx/language/ru/)\n"
 "MIME-Version: 1.0\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -29,7 +30,7 @@ msgstr "таймаут"
 
 
 #: searx/search.py:144
 #: searx/search.py:144
 msgid "request exception"
 msgid "request exception"
-msgstr "запрос исключен"
+msgstr "ошибка выполнения запроса"
 
 
 #: searx/search.py:151
 #: searx/search.py:151
 msgid "unexpected crash"
 msgid "unexpected crash"
@@ -447,7 +448,7 @@ msgstr "Блокировать"
 msgid ""
 msgid ""
 "These settings are stored in your cookies, this allows us not to store this "
 "These settings are stored in your cookies, this allows us not to store this "
 "data about you."
 "data about you."
-msgstr "Настройки хранятся в ваших файлах cookie, что позволяет нам не сохранять эти сведения о вас."
+msgstr "Настройки сохраняются в ваших файлах cookie, что позволяет нам не хранить никаких сведений о вас."
 
 
 #: searx/templates/courgette/preferences.html:124
 #: searx/templates/courgette/preferences.html:124
 #: searx/templates/legacy/preferences.html:121
 #: searx/templates/legacy/preferences.html:121
@@ -457,7 +458,7 @@ msgstr "Настройки хранятся в ваших файлах cookie, 
 msgid ""
 msgid ""
 "These cookies serve your sole convenience, we don't use these cookies to "
 "These cookies serve your sole convenience, we don't use these cookies to "
 "track you."
 "track you."
-msgstr "Эти файлы cookie используются для вашего удобства, мы не используем их чтобы отслеживать вас."
+msgstr "Эти файлы используются исключительно для вашего удобства, мы не отслеживаем вашу активность."
 
 
 #: searx/templates/courgette/preferences.html:127
 #: searx/templates/courgette/preferences.html:127
 #: searx/templates/legacy/preferences.html:124
 #: searx/templates/legacy/preferences.html:124
@@ -685,7 +686,7 @@ msgstr "Поисковые предложения по мере ввода"
 #: searx/templates/oscar/preferences.html:69
 #: searx/templates/oscar/preferences.html:69
 #: searx/templates/simple/preferences.html:173
 #: searx/templates/simple/preferences.html:173
 msgid "Proxying image results through searx"
 msgid "Proxying image results through searx"
-msgstr "Проксировать найденные изображения с помощью searx"
+msgstr "Загружать найденные изображения через searx"
 
 
 #: searx/templates/oscar/preferences.html:78
 #: searx/templates/oscar/preferences.html:78
 msgid ""
 msgid ""

+ 70 - 19
searx/utils.py

@@ -4,14 +4,18 @@ import hmac
 import os
 import os
 import re
 import re
 
 
+from babel.core import get_global
 from babel.dates import format_date
 from babel.dates import format_date
 from codecs import getincrementalencoder
 from codecs import getincrementalencoder
 from imp import load_source
 from imp import load_source
 from numbers import Number
 from numbers import Number
 from os.path import splitext, join
 from os.path import splitext, join
+from io import open
 from random import choice
 from random import choice
 import sys
 import sys
+import json
 
 
+from searx import settings
 from searx.version import VERSION_STRING
 from searx.version import VERSION_STRING
 from searx.languages import language_codes
 from searx.languages import language_codes
 from searx import settings
 from searx import settings
@@ -31,33 +35,17 @@ if sys.version_info[0] == 3:
     unichr = chr
     unichr = chr
     unicode = str
     unicode = str
     IS_PY2 = False
     IS_PY2 = False
+    basestring = str
 else:
 else:
     IS_PY2 = True
     IS_PY2 = True
 
 
 logger = logger.getChild('utils')
 logger = logger.getChild('utils')
 
 
-ua_versions = ('40.0',
-               '41.0',
-               '42.0',
-               '43.0',
-               '44.0',
-               '45.0',
-               '46.0',
-               '47.0')
-
-ua_os = ('Windows NT 6.3; WOW64',
-         'X11; Linux x86_64',
-         'X11; Linux x86')
-
-ua = "Mozilla/5.0 ({os}; rv:{version}) Gecko/20100101 Firefox/{version}"
-
 blocked_tags = ('script',
 blocked_tags = ('script',
                 'style')
                 'style')
 
 
-
+useragents = json.loads(open(os.path.dirname(os.path.realpath(__file__))
-def gen_useragent():
+                             + "/data/useragents.json", 'r', encoding='utf-8').read())
-    # TODO
-    return ua.format(os=choice(ua_os), version=choice(ua_versions))
 
 
 
 
 def searx_useragent():
 def searx_useragent():
@@ -66,6 +54,10 @@ def searx_useragent():
            suffix=settings['outgoing'].get('useragent_suffix', ''))
            suffix=settings['outgoing'].get('useragent_suffix', ''))
 
 
 
 
+def gen_useragent(os=None):
+    return str(useragents['ua'].format(os=os or choice(useragents['os']), version=choice(useragents['versions'])))
+
+
 def highlight_content(content, query):
 def highlight_content(content, query):
 
 
     if not content:
     if not content:
@@ -322,6 +314,65 @@ def is_valid_lang(lang):
         return False
         return False
 
 
 
 
+# auxiliary function to match lang_code in lang_list
+def _match_language(lang_code, lang_list=[], custom_aliases={}):
+    # replace language code with a custom alias if necessary
+    if lang_code in custom_aliases:
+        lang_code = custom_aliases[lang_code]
+
+    if lang_code in lang_list:
+        return lang_code
+
+    # try to get the most likely country for this language
+    subtags = get_global('likely_subtags').get(lang_code)
+    if subtags:
+        subtag_parts = subtags.split('_')
+        new_code = subtag_parts[0] + '-' + subtag_parts[-1]
+        if new_code in custom_aliases:
+            new_code = custom_aliases[new_code]
+        if new_code in lang_list:
+            return new_code
+
+    # try to get the any supported country for this language
+    for lc in lang_list:
+        if lang_code == lc.split('-')[0]:
+            return lc
+
+    return None
+
+
+# get the language code from lang_list that best matches locale_code
+def match_language(locale_code, lang_list=[], custom_aliases={}, fallback='en-US'):
+    # try to get language from given locale_code
+    language = _match_language(locale_code, lang_list, custom_aliases)
+    if language:
+        return language
+
+    locale_parts = locale_code.split('-')
+    lang_code = locale_parts[0]
+
+    # try to get language using an equivalent country code
+    if len(locale_parts) > 1:
+        country_alias = get_global('territory_aliases').get(locale_parts[-1])
+        if country_alias:
+            language = _match_language(lang_code + '-' + country_alias[0], lang_list, custom_aliases)
+            if language:
+                return language
+
+    # try to get language using an equivalent language code
+    alias = get_global('language_aliases').get(lang_code)
+    if alias:
+        language = _match_language(alias, lang_list, custom_aliases)
+        if language:
+            return language
+
+    if lang_code != locale_code:
+        # try to get language from given language without giving the country
+        language = _match_language(lang_code, lang_list, custom_aliases)
+
+    return language or fallback
+
+
 def load_module(filename, module_dir):
 def load_module(filename, module_dir):
     modname = splitext(filename)[0]
     modname = splitext(filename)[0]
     if modname in sys.modules:
     if modname in sys.modules:

+ 16 - 8
searx/webapp.py

@@ -58,16 +58,16 @@ from searx.engines import (
 from searx.utils import (
 from searx.utils import (
     UnicodeWriter, highlight_content, html_to_text, get_resources_directory,
     UnicodeWriter, highlight_content, html_to_text, get_resources_directory,
     get_static_files, get_result_templates, get_themes, gen_useragent,
     get_static_files, get_result_templates, get_themes, gen_useragent,
-    dict_subset, prettify_url
+    dict_subset, prettify_url, match_language
 )
 )
 from searx.version import VERSION_STRING
 from searx.version import VERSION_STRING
-from searx.languages import language_codes
+from searx.languages import language_codes as languages
 from searx.search import SearchWithPlugins, get_search_query_from_webapp
 from searx.search import SearchWithPlugins, get_search_query_from_webapp
 from searx.query import RawTextQuery
 from searx.query import RawTextQuery
 from searx.autocomplete import searx_bang, backends as autocomplete_backends
 from searx.autocomplete import searx_bang, backends as autocomplete_backends
 from searx.plugins import plugins
 from searx.plugins import plugins
 from searx.plugins.oa_doi_rewrite import get_doi_resolver
 from searx.plugins.oa_doi_rewrite import get_doi_resolver
-from searx.preferences import Preferences, ValidationException
+from searx.preferences import Preferences, ValidationException, LANGUAGE_CODES
 from searx.answerers import answerers
 from searx.answerers import answerers
 from searx.url_utils import urlencode, urlparse, urljoin
 from searx.url_utils import urlencode, urlparse, urljoin
 from searx.utils import new_hmac
 from searx.utils import new_hmac
@@ -133,7 +133,7 @@ if not searx_debug \
 babel = Babel(app)
 babel = Babel(app)
 
 
 rtl_locales = ['ar', 'arc', 'bcc', 'bqi', 'ckb', 'dv', 'fa', 'glk', 'he',
 rtl_locales = ['ar', 'arc', 'bcc', 'bqi', 'ckb', 'dv', 'fa', 'glk', 'he',
-               'ku', 'mzn', 'pnb'', ''ps', 'sd', 'ug', 'ur', 'yi']
+               'ku', 'mzn', 'pnb', 'ps', 'sd', 'ug', 'ur', 'yi']
 
 
 # used when translating category names
 # used when translating category names
 _category_names = (gettext('files'),
 _category_names = (gettext('files'),
@@ -352,9 +352,11 @@ def render(template_name, override_theme=None, **kwargs):
 
 
     kwargs['safesearch'] = str(request.preferences.get_value('safesearch'))
     kwargs['safesearch'] = str(request.preferences.get_value('safesearch'))
 
 
-    kwargs['language_codes'] = language_codes
+    kwargs['language_codes'] = languages
     if 'current_language' not in kwargs:
     if 'current_language' not in kwargs:
-        kwargs['current_language'] = request.preferences.get_value('language')
+        kwargs['current_language'] = match_language(request.preferences.get_value('language'),
+                                                    LANGUAGE_CODES,
+                                                    fallback=settings['search']['language'])
 
 
     # override url_for function in templates
     # override url_for function in templates
     kwargs['url_for'] = url_for_theme
     kwargs['url_for'] = url_for_theme
@@ -590,7 +592,9 @@ def index():
         infoboxes=result_container.infoboxes,
         infoboxes=result_container.infoboxes,
         paging=result_container.paging,
         paging=result_container.paging,
         unresponsive_engines=result_container.unresponsive_engines,
         unresponsive_engines=result_container.unresponsive_engines,
-        current_language=search_query.lang,
+        current_language=match_language(search_query.lang,
+                                        LANGUAGE_CODES,
+                                        fallback=settings['search']['language']),
         base_url=get_base_url(),
         base_url=get_base_url(),
         theme=get_current_theme_name(),
         theme=get_current_theme_name(),
         favicons=global_favicons[themes.index(get_current_theme_name())]
         favicons=global_favicons[themes.index(get_current_theme_name())]
@@ -687,6 +691,10 @@ def preferences():
                              'warn_time': False}
                              'warn_time': False}
             if e.timeout > settings['outgoing']['request_timeout']:
             if e.timeout > settings['outgoing']['request_timeout']:
                 stats[e.name]['warn_timeout'] = True
                 stats[e.name]['warn_timeout'] = True
+            if match_language(request.preferences.get_value('language'),
+                              getattr(e, 'supported_languages', []),
+                              getattr(e, 'language_aliases', {}), None):
+                stats[e.name]['supports_selected_language'] = True
 
 
     # get first element [0], the engine time,
     # get first element [0], the engine time,
     # and then the second element [1] : the time (the first one is the label)
     # and then the second element [1] : the time (the first one is the label)
@@ -855,7 +863,7 @@ def config():
                     'safe_search': settings['search']['safe_search'],
                     'safe_search': settings['search']['safe_search'],
                     'default_theme': settings['ui']['default_theme'],
                     'default_theme': settings['ui']['default_theme'],
                     'version': VERSION_STRING,
                     'version': VERSION_STRING,
-                    'doi_resolvers': [r for r in search['doi_resolvers']],
+                    'doi_resolvers': [r for r in settings['doi_resolvers']],
                     'default_doi_resolver': settings['default_doi_resolver'],
                     'default_doi_resolver': settings['default_doi_resolver'],
                     })
                     })
 
 

Some files were not shown because too many files changed in this diff