From 9c7a55e0c023dc9ce9708a06322668a494db0058 Mon Sep 17 00:00:00 2001 From: opi Date: Mon, 4 Jul 2016 21:16:20 +0200 Subject: [PATCH 1/9] Update upstream sources to 0.9 --- sources/.coveragerc | 20 ++ sources/.gitignore | 17 + sources/.landscape.yaml | 3 + sources/.travis.yml | 32 ++ sources/AUTHORS.rst | 7 + sources/CHANGELOG.rst | 38 ++ sources/README.rst | 2 +- sources/searx/engines/bing.py | 10 +- sources/searx/engines/currency_convert.py | 4 +- sources/searx/engines/gigablast.py | 7 +- sources/searx/engines/yahoo.py | 7 + sources/searx/plugins/__init__.py | 4 +- sources/searx/plugins/vim_hotkeys.py | 10 + sources/searx/poolrequests.py | 12 +- sources/searx/preferences.py | 7 +- sources/searx/results.py | 4 + sources/searx/settings.yml | 17 +- .../searx/static/plugins/css/vim_hotkeys.css | 26 ++ .../searx/static/plugins/js/vim_hotkeys.js | 336 ++++++++++++++++++ .../static/themes/oscar/css/logicodev.min.css | 1 + .../static/themes/oscar/css/oscar.min.css | 88 ----- .../static/themes/oscar/css/pointhi.min.css | 1 + .../searx/static/themes/oscar/gruntfile.js | 12 +- .../static/themes/oscar/img/logo_searx_a.png | Bin 0 -> 33423 bytes .../themes/oscar/img/logo_searx_a_n.png | Bin 0 -> 33065 bytes .../less/{oscar => logicodev}/checkbox.less | 0 .../themes/oscar/less/logicodev/code.less | 103 ++++++ .../less/{oscar => logicodev}/cursor.less | 0 .../themes/oscar/less/logicodev/footer.less | 30 ++ .../themes/oscar/less/logicodev/infobox.less | 37 ++ .../themes/oscar/less/logicodev/navbar.less | 54 +++ .../themes/oscar/less/logicodev/oscar.less | 17 + .../themes/oscar/less/logicodev/results.less | 150 ++++++++ .../themes/oscar/less/logicodev/search.less | 59 +++ .../oscar/less/logicodev/variables.less | 10 + .../themes/oscar/less/pointhi/checkbox.less | 9 + .../oscar/less/{oscar => pointhi}/code.less | 0 .../themes/oscar/less/pointhi/cursor.less | 8 + .../oscar/less/{oscar => pointhi}/footer.less | 0 .../less/{oscar => pointhi}/infobox.less | 0 .../oscar/less/{oscar => pointhi}/oscar.less | 0 .../less/{oscar => pointhi}/results.less | 0 .../oscar/less/{oscar => pointhi}/search.less | 0 sources/searx/templates/oscar/base.html | 10 +- sources/searx/templates/oscar/index.html | 9 +- sources/searx/templates/oscar/macros.html | 11 +- .../searx/templates/oscar/preferences.html | 7 + sources/searx/templates/oscar/results.html | 10 + sources/searx/version.py | 4 +- sources/searx/webapp.py | 27 +- sources/setup.py | 2 + .../unit/engines/test_currency_convert.py | 17 +- 52 files changed, 1104 insertions(+), 135 deletions(-) create mode 100644 sources/.coveragerc create mode 100644 sources/.gitignore create mode 100644 sources/.landscape.yaml create mode 100644 sources/.travis.yml create mode 100644 sources/searx/plugins/vim_hotkeys.py create mode 100644 sources/searx/static/plugins/css/vim_hotkeys.css create mode 100644 sources/searx/static/plugins/js/vim_hotkeys.js create mode 100644 sources/searx/static/themes/oscar/css/logicodev.min.css delete mode 100644 sources/searx/static/themes/oscar/css/oscar.min.css create mode 100644 sources/searx/static/themes/oscar/css/pointhi.min.css create mode 100644 sources/searx/static/themes/oscar/img/logo_searx_a.png create mode 100644 sources/searx/static/themes/oscar/img/logo_searx_a_n.png rename sources/searx/static/themes/oscar/less/{oscar => logicodev}/checkbox.less (100%) create mode 100644 sources/searx/static/themes/oscar/less/logicodev/code.less rename sources/searx/static/themes/oscar/less/{oscar => logicodev}/cursor.less (100%) create mode 100644 sources/searx/static/themes/oscar/less/logicodev/footer.less create mode 100644 sources/searx/static/themes/oscar/less/logicodev/infobox.less create mode 100644 sources/searx/static/themes/oscar/less/logicodev/navbar.less create mode 100644 sources/searx/static/themes/oscar/less/logicodev/oscar.less create mode 100644 sources/searx/static/themes/oscar/less/logicodev/results.less create mode 100644 sources/searx/static/themes/oscar/less/logicodev/search.less create mode 100644 sources/searx/static/themes/oscar/less/logicodev/variables.less create mode 100644 sources/searx/static/themes/oscar/less/pointhi/checkbox.less rename sources/searx/static/themes/oscar/less/{oscar => pointhi}/code.less (100%) create mode 100644 sources/searx/static/themes/oscar/less/pointhi/cursor.less rename sources/searx/static/themes/oscar/less/{oscar => pointhi}/footer.less (100%) rename sources/searx/static/themes/oscar/less/{oscar => pointhi}/infobox.less (100%) rename sources/searx/static/themes/oscar/less/{oscar => pointhi}/oscar.less (100%) rename sources/searx/static/themes/oscar/less/{oscar => pointhi}/results.less (100%) rename sources/searx/static/themes/oscar/less/{oscar => pointhi}/search.less (100%) diff --git a/sources/.coveragerc b/sources/.coveragerc new file mode 100644 index 0000000..4f50efc --- /dev/null +++ b/sources/.coveragerc @@ -0,0 +1,20 @@ +[run] +branch = True +source = + searx/engines + searx/__init__.py + searx/autocomplete.py + searx/https_rewrite.py + searx/languages.py + searx/search.py + searx/testing.py + searx/utils.py + searx/webapp.py + +[report] +show_missing = True +exclude_lines = + if __name__ == .__main__.: + +[html] +directory = coverage diff --git a/sources/.gitignore b/sources/.gitignore new file mode 100644 index 0000000..105f019 --- /dev/null +++ b/sources/.gitignore @@ -0,0 +1,17 @@ +.coverage +.installed.cfg +engines.cfg +env +robot_log.html +robot_output.xml +robot_report.html +test_basic/ +setup.cfg + +*.pyc +*/*.pyc +*~ + +node_modules/ + +.tx/ diff --git a/sources/.landscape.yaml b/sources/.landscape.yaml new file mode 100644 index 0000000..1bb3977 --- /dev/null +++ b/sources/.landscape.yaml @@ -0,0 +1,3 @@ +strictness: high +ignore-paths: + - bootstrap.py diff --git a/sources/.travis.yml b/sources/.travis.yml new file mode 100644 index 0000000..3bef5e5 --- /dev/null +++ b/sources/.travis.yml @@ -0,0 +1,32 @@ +sudo: false +cache: + - pip + - npm + - directories: + - $HOME/.cache/pip +language: python +python: + - "2.7" +before_install: + - "export DISPLAY=:99.0" + - "sh -e /etc/init.d/xvfb start" + - npm install less grunt-cli + - ( cd searx/static/themes/oscar;npm install; cd - ) +install: + - ./manage.sh update_dev_packages + - pip install coveralls +script: + - ./manage.sh pep8_check + - ./manage.sh styles + - ./manage.sh grunt_build + - ./manage.sh py_test_coverage + - ./manage.sh robot_tests +after_success: + coveralls +notifications: + irc: + channels: + - "irc.freenode.org#searx" + template: + - "%{repository}/#%{build_number}/%{branch} (%{author}): %{message} %{build_url}" + on_success: change diff --git a/sources/AUTHORS.rst b/sources/AUTHORS.rst index 3605332..5bc6807 100644 --- a/sources/AUTHORS.rst +++ b/sources/AUTHORS.rst @@ -44,3 +44,10 @@ generally made searx better: - Kirill Isakov - Guilhem Bonnefille - Marc Abonce Seguin + +- @jibe-b +- Christian Pietsch @pietsch +- @Maxqia +- Ashutosh Das @pyprism +- YuLun Shih @imZack +- Dmitry Mikhirev @mikhirev diff --git a/sources/CHANGELOG.rst b/sources/CHANGELOG.rst index 2e333f0..8907ab4 100644 --- a/sources/CHANGELOG.rst +++ b/sources/CHANGELOG.rst @@ -1,3 +1,41 @@ +0.9.0 2016.05.24 +================ + +- New search category: science +- New engines + + - Wolframalpha (science) + - Frinkiac (images) + - Arch Linux (it) + - BASE - Bielefeld Academic Search Engine (science) + - Dokuwiki (general) + - Nyaa.se (files, images, music, video) + - Reddit (general, images, news, social media) + - Torrentz.eu (files, music, video) + - Tokyo Toshokan (files, music, video) + - F-Droid (files) + - Erowid (general) + - Bitbucket (it) + - GitLab (it) + - Geektimes (it) + - Habrahabr (it) +- New plugins + + - Open links in new tab + - Vim hotkeys for better navigation +- Wikipedia/Mediawiki engine improvements +- Configurable instance name +- Configurable connection pool size +- Fixed broken google engine +- Better docker image +- Images in standard results +- Fixed and refactored user settings (Warning: backward incompatibility - you have to reset your custom engine preferences) +- Suspending engines on errors +- Simplified development/deployment tooling +- Translation updates +- Multilingual autocompleter +- Qwant autocompleter backend + 0.8.1 2015.12.22 ================ diff --git a/sources/README.rst b/sources/README.rst index c099315..6563fe8 100644 --- a/sources/README.rst +++ b/sources/README.rst @@ -18,7 +18,7 @@ Installation ``git clone git@github.com:asciimoo/searx.git && cd searx`` - install dependencies: ``./manage.sh update_packages`` - edit your - `settings.yml `__ + `settings.yml `__ (set your ``secret_key``!) - run ``python searx/webapp.py`` to start the application diff --git a/sources/searx/engines/bing.py b/sources/searx/engines/bing.py index 171606c..6bdfd37 100644 --- a/sources/searx/engines/bing.py +++ b/sources/searx/engines/bing.py @@ -54,6 +54,12 @@ def response(resp): dom = html.fromstring(resp.text) + try: + results.append({'number_of_results': int(dom.xpath('//span[@class="sb_count"]/text()')[0] + .split()[0].replace(',', ''))}) + except: + pass + # parse results for result in dom.xpath('//div[@class="sa_cc"]'): link = result.xpath('.//h3/a')[0] @@ -66,10 +72,6 @@ def response(resp): 'title': title, 'content': content}) - # return results if something is found - if results: - return results - # parse results again if nothing is found yet for result in dom.xpath('//li[@class="b_algo"]'): link = result.xpath('.//h2/a')[0] diff --git a/sources/searx/engines/currency_convert.py b/sources/searx/engines/currency_convert.py index 26830a1..b0ffb49 100644 --- a/sources/searx/engines/currency_convert.py +++ b/sources/searx/engines/currency_convert.py @@ -9,13 +9,13 @@ categories = [] url = 'https://download.finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s={query}=X' weight = 100 -parser_re = re.compile(u'^\W*(\d+(?:\.\d+)?)\W*([^.0-9].+)\W+in?\W+([^\.]+)\W*$', re.I) # noqa +parser_re = re.compile(u'.*?(\d+(?:\.\d+)?) ([^.0-9]+) (?:in|to) ([^.0-9]+)', re.I) # noqa db = 1 def normalize_name(name): - name = name.lower().replace('-', ' ') + name = name.lower().replace('-', ' ').rstrip('s') name = re.sub(' +', ' ', name) return unicodedata.normalize('NFKD', name).lower() diff --git a/sources/searx/engines/gigablast.py b/sources/searx/engines/gigablast.py index 1cc2431..6e4e24b 100644 --- a/sources/searx/engines/gigablast.py +++ b/sources/searx/engines/gigablast.py @@ -31,9 +31,9 @@ search_string = 'search?{query}'\ '&s={offset}'\ '&format=json'\ '&qh=0'\ - '&rxiwd={rxiwd}'\ '&qlang={lang}'\ - '&ff={safesearch}' + '&ff={safesearch}'\ + '&rxikd={rxikd}' # random number - 9 digits # specific xpath variables results_xpath = '//response//result' @@ -59,8 +59,7 @@ def request(query, params): search_path = search_string.format(query=urlencode({'q': query}), offset=offset, number_of_results=number_of_results, - rxiwd=1, - # rand=int(time()), + rxikd=str(time())[:9], lang=language, safesearch=safesearch) diff --git a/sources/searx/engines/yahoo.py b/sources/searx/engines/yahoo.py index 769e7e4..b8b40e4 100644 --- a/sources/searx/engines/yahoo.py +++ b/sources/searx/engines/yahoo.py @@ -77,6 +77,13 @@ def response(resp): dom = html.fromstring(resp.text) + try: + results_num = int(dom.xpath('//div[@class="compPagination"]/span[last()]/text()')[0] + .split()[0].replace(',', '')) + results.append({'number_of_results': results_num}) + except: + pass + # parse results for result in dom.xpath(results_xpath): try: diff --git a/sources/searx/plugins/__init__.py b/sources/searx/plugins/__init__.py index 87cc013..efb9b06 100644 --- a/sources/searx/plugins/__init__.py +++ b/sources/searx/plugins/__init__.py @@ -23,7 +23,8 @@ from searx.plugins import (https_rewrite, open_results_on_new_tab, self_info, search_on_category_select, - tracker_url_remover) + tracker_url_remover, + vim_hotkeys) required_attrs = (('name', str), ('description', str), @@ -77,3 +78,4 @@ plugins.register(open_results_on_new_tab) plugins.register(self_info) plugins.register(search_on_category_select) plugins.register(tracker_url_remover) +plugins.register(vim_hotkeys) diff --git a/sources/searx/plugins/vim_hotkeys.py b/sources/searx/plugins/vim_hotkeys.py new file mode 100644 index 0000000..e537a3a --- /dev/null +++ b/sources/searx/plugins/vim_hotkeys.py @@ -0,0 +1,10 @@ +from flask.ext.babel import gettext + +name = gettext('Vim-like hotkeys') +description = gettext('Navigate search results with Vim-like hotkeys ' + '(JavaScript required). ' + 'Press "h" key on main or result page to get help.') +default_on = False + +js_dependencies = ('plugins/js/vim_hotkeys.js',) +css_dependencies = ('plugins/css/vim_hotkeys.css',) diff --git a/sources/searx/poolrequests.py b/sources/searx/poolrequests.py index 13c6a90..f268df2 100644 --- a/sources/searx/poolrequests.py +++ b/sources/searx/poolrequests.py @@ -41,14 +41,18 @@ class HTTPAdapterWithConnParams(requests.adapters.HTTPAdapter): block=self._pool_block, **self._conn_params) +connect = settings['outgoing'].get('pool_connections', 100) # Magic number kept from previous code +maxsize = settings['outgoing'].get('pool_maxsize', requests.adapters.DEFAULT_POOLSIZE) # Picked from constructor if settings['outgoing'].get('source_ips'): - http_adapters = cycle(HTTPAdapterWithConnParams(pool_connections=100, source_address=(source_ip, 0)) + http_adapters = cycle(HTTPAdapterWithConnParams(pool_connections=connect, pool_maxsize=maxsize, + source_address=(source_ip, 0)) for source_ip in settings['outgoing']['source_ips']) - https_adapters = cycle(HTTPAdapterWithConnParams(pool_connections=100, source_address=(source_ip, 0)) + https_adapters = cycle(HTTPAdapterWithConnParams(pool_connections=connect, pool_maxsize=maxsize, + source_address=(source_ip, 0)) for source_ip in settings['outgoing']['source_ips']) else: - http_adapters = cycle((HTTPAdapterWithConnParams(pool_connections=100), )) - https_adapters = cycle((HTTPAdapterWithConnParams(pool_connections=100), )) + http_adapters = cycle((HTTPAdapterWithConnParams(pool_connections=connect, pool_maxsize=maxsize), )) + https_adapters = cycle((HTTPAdapterWithConnParams(pool_connections=connect, pool_maxsize=maxsize), )) class SessionSinglePool(requests.Session): diff --git a/sources/searx/preferences.py b/sources/searx/preferences.py index ad9e673..dd9133d 100644 --- a/sources/searx/preferences.py +++ b/sources/searx/preferences.py @@ -181,7 +181,7 @@ class EnginesSetting(SwitchableSetting): return [item[len('engine_'):].replace('_', ' ').replace(' ', '__') for item in items] def transform_values(self, values): - if len(values) == 1 and values[0] == '': + if len(values) == 1 and next(iter(values)) == '': return list() transformed_values = [] for value in values: @@ -229,6 +229,7 @@ class Preferences(object): self.engines = EnginesSetting('engines', choices=engines) self.plugins = PluginsSetting('plugins', choices=plugins) + self.unknown_params = {} def parse_cookies(self, input_data): for user_setting_name, user_setting in input_data.iteritems(): @@ -254,6 +255,8 @@ class Preferences(object): enabled_categories.append(user_setting_name[len('category_'):]) elif user_setting_name.startswith('plugin_'): disabled_plugins.append(user_setting_name) + else: + self.unknown_params[user_setting_name] = user_setting self.key_value_settings['categories'].parse_form(enabled_categories) self.engines.parse_form(disabled_engines) self.plugins.parse_form(disabled_plugins) @@ -268,4 +271,6 @@ class Preferences(object): user_setting.save(user_setting_name, resp) self.engines.save(resp) self.plugins.save(resp) + for k, v in self.unknown_params.items(): + resp.set_cookie(k, v, max_age=COOKIE_MAX_AGE) return resp diff --git a/sources/searx/results.py b/sources/searx/results.py index c3040b3..dcd966e 100644 --- a/sources/searx/results.py +++ b/sources/searx/results.py @@ -99,6 +99,7 @@ class ResultContainer(object): self._infobox_ids = {} self.suggestions = set() self.answers = set() + self.number_of_results = 0 def extend(self, engine_name, results): for result in list(results): @@ -111,6 +112,9 @@ class ResultContainer(object): elif 'infobox' in result: self._merge_infobox(result) results.remove(result) + elif 'number_of_results' in result: + self.number_of_results = max(self.number_of_results, result['number_of_results']) + results.remove(result) with RLock(): engines[engine_name].stats['search_count'] += 1 diff --git a/sources/searx/settings.yml b/sources/searx/settings.yml index ff85684..9308756 100644 --- a/sources/searx/settings.yml +++ b/sources/searx/settings.yml @@ -21,6 +21,8 @@ ui: outgoing: # communication with search engines request_timeout : 2.0 # seconds useragent_suffix : "" # suffix of searx_useragent, could contain informations like an email address to the administrator + pool_connections : 100 # Number of different hosts + pool_maxsize : 10 # Number of simultaneous requests by host # uncomment below section if you want to use a proxy # see http://docs.python-requests.org/en/latest/user/advanced/#proxies # SOCKS proxies are not supported : see https://github.com/kennethreitz/requests/pull/478 @@ -38,6 +40,17 @@ engines: engine : archlinux shortcut : al + - name : archive is + engine : xpath + search_url : https://archive.is/{query} + url_xpath : (//div[@class="TEXT-BLOCK"]/a)/@href + title_xpath : (//div[@class="TEXT-BLOCK"]/a) + content_xpath : //div[@class="TEXT-BLOCK"]/ul/li + categories : general + timeout : 7.0 + disabled : True + shortcut : ai + - name : base engine : base shortcut : bs @@ -221,8 +234,8 @@ engines: engine : xpath paging : True search_url : https://geektimes.ru/search/page{pageno}/?q={query} - url_xpath : //div[@class="search_results"]//a[@class="post_title"]/@href - title_xpath : //div[@class="search_results"]//a[@class="post_title"] + url_xpath : //div[@class="search_results"]//a[@class="post__title_link"]/@href + title_xpath : //div[@class="search_results"]//a[@class="post__title_link"] content_xpath : //div[@class="search_results"]//div[contains(@class, "content")] categories : it timeout : 4.0 diff --git a/sources/searx/static/plugins/css/vim_hotkeys.css b/sources/searx/static/plugins/css/vim_hotkeys.css new file mode 100644 index 0000000..2ccfdc1 --- /dev/null +++ b/sources/searx/static/plugins/css/vim_hotkeys.css @@ -0,0 +1,26 @@ +.vim-hotkeys-help { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 9999999; + overflow-y: auto; + max-height: 80%; + box-shadow: 0 0 1em; +} + +.dflex { + display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */ + display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */ + display: -ms-flexbox; /* TWEENER - IE 10 */ + display: -webkit-flex; /* NEW - Chrome */ + display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */ +} + +.iflex { + -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */ + -moz-box-flex: 1; /* OLD - Firefox 19- */ + -webkit-flex: 1; /* Chrome */ + -ms-flex: 1; /* IE 10 */ + flex: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */ +} diff --git a/sources/searx/static/plugins/js/vim_hotkeys.js b/sources/searx/static/plugins/js/vim_hotkeys.js new file mode 100644 index 0000000..61500d8 --- /dev/null +++ b/sources/searx/static/plugins/js/vim_hotkeys.js @@ -0,0 +1,336 @@ +$(document).ready(function() { + highlightResult('top')(); + + $('.result').on('click', function() { + highlightResult($(this))(); + }); + + var vimKeys = { + 27: { + key: 'Escape', + fun: removeFocus, + des: 'remove focus from the focused input', + cat: 'Control' + }, + 73: { + key: 'i', + fun: searchInputFocus, + des: 'focus on the search input', + cat: 'Control' + }, + 66: { + key: 'b', + fun: scrollPage(-window.innerHeight), + des: 'scroll one page up', + cat: 'Navigation' + }, + 70: { + key: 'f', + fun: scrollPage(window.innerHeight), + des: 'scroll one page down', + cat: 'Navigation' + }, + 85: { + key: 'u', + fun: scrollPage(-window.innerHeight / 2), + des: 'scroll half a page up', + cat: 'Navigation' + }, + 68: { + key: 'd', + fun: scrollPage(window.innerHeight / 2), + des: 'scroll half a page down', + cat: 'Navigation' + }, + 71: { + key: 'g', + fun: scrollPageTo(-document.body.scrollHeight, 'top'), + des: 'scroll to the top of the page', + cat: 'Navigation' + }, + 86: { + key: 'v', + fun: scrollPageTo(document.body.scrollHeight, 'bottom'), + des: 'scroll to the bottom of the page', + cat: 'Navigation' + }, + 75: { + key: 'k', + fun: highlightResult('up'), + des: 'select previous search result', + cat: 'Results' + }, + 74: { + key: 'j', + fun: highlightResult('down'), + des: 'select next search result', + cat: 'Results' + }, + 80: { + key: 'p', + fun: pageButtonClick(0), + des: 'go to previous page', + cat: 'Results' + }, + 78: { + key: 'n', + fun: pageButtonClick(1), + des: 'go to next page', + cat: 'Results' + }, + 79: { + key: 'o', + fun: openResult(false), + des: 'open search result', + cat: 'Results' + }, + 84: { + key: 't', + fun: openResult(true), + des: 'open the result in a new tab', + cat: 'Results' + }, + 82: { + key: 'r', + fun: reloadPage, + des: 'reload page from the server', + cat: 'Control' + }, + 72: { + key: 'h', + fun: toggleHelp, + des: 'toggle help window', + cat: 'Other' + } + }; + + $(document).keyup(function(e) { + // 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 (e.keyCode === 27) { + if (e.target.tagName.toLowerCase() === 'input') { + vimKeys[e.keyCode].fun(); + } + } else { + if (e.target === document.body) { + vimKeys[e.keyCode].fun(); + } + } + } + }); + + function highlightResult(which) { + return function() { + var current = $('.result[data-vim-selected]'); + if (current.length === 0) { + current = $('.result:first'); + if (current.length === 0) { + return; + } + } + + var next; + + if (typeof which !== 'string') { + next = which; + } else { + switch (which) { + case 'visible': + var top = $(window).scrollTop(); + var bot = top + $(window).height(); + var results = $('.result'); + + for (var i = 0; i < results.length; i++) { + next = $(results[i]); + var etop = next.offset().top; + var ebot = etop + next.height(); + + if ((ebot <= bot) && (etop > top)) { + break; + } + } + break; + case 'down': + next = current.next('.result'); + if (next.length === 0) { + next = $('.result:first'); + } + break; + case 'up': + next = current.prev('.result'); + if (next.length === 0) { + next = $('.result:last'); + } + break; + case 'bottom': + next = $('.result:last'); + break; + case 'top': + default: + next = $('.result:first'); + } + } + + if (next) { + current.removeAttr('data-vim-selected').removeClass('well well-sm'); + next.attr('data-vim-selected', 'true').addClass('well well-sm'); + scrollPageToSelected(); + } + } + } + + function reloadPage() { + document.location.reload(false); + } + + function removeFocus() { + if (document.activeElement) { + document.activeElement.blur(); + } + } + + function pageButtonClick(num) { + return function() { + var buttons = $('div#pagination button[type="submit"]'); + if (buttons.length !== 2) { + console.log('page navigation with this theme is not supported'); + return; + } + if (num >= 0 && num < buttons.length) { + buttons[num].click(); + } else { + console.log('pageButtonClick(): invalid argument'); + } + } + } + + function scrollPageToSelected() { + var sel = $('.result[data-vim-selected]'); + if (sel.length !== 1) { + return; + } + + var wnd = $(window); + + var wtop = wnd.scrollTop(); + var etop = sel.offset().top; + + var offset = 30; + + if (wtop > etop) { + wnd.scrollTop(etop - offset); + } else { + var ebot = etop + sel.height(); + var wbot = wtop + wnd.height(); + + if (wbot < ebot) { + wnd.scrollTop(ebot - wnd.height() + offset); + } + } + } + + function scrollPage(amount) { + return function() { + window.scrollBy(0, amount); + highlightResult('visible')(); + } + } + + function scrollPageTo(position, nav) { + return function() { + window.scrollTo(0, position); + highlightResult(nav)(); + } + } + + function searchInputFocus() { + $('input#q').focus(); + } + + function openResult(newTab) { + return function() { + var link = $('.result[data-vim-selected] .result_header a'); + if (link.length) { + var url = link.attr('href'); + if (newTab) { + window.open(url); + } else { + window.location.href = url; + } + } + }; + } + + function toggleHelp() { + var helpPanel = $('#vim-hotkeys-help'); + if (helpPanel.length) { + helpPanel.toggleClass('hidden'); + return; + } + + var categories = {}; + + for (var k in vimKeys) { + var key = vimKeys[k]; + categories[key.cat] = categories[key.cat] || []; + categories[key.cat].push(key); + } + + var sorted = Object.keys(categories).sort(function(a, b) { + return categories[b].length - categories[a].length; + }); + + if (sorted.length === 0) { + return; + } + + var html = '
'; + html += '
'; + + html += '
'; + html += '
'; + html += '

How to navigate searx with Vim-like hotkeys

'; + html += '
'; // col-sm-12 + html += '
'; // row + + for (var i = 0; i < sorted.length; i++) { + var cat = categories[sorted[i]]; + + var lastCategory = i === (sorted.length - 1); + var first = i % 2 === 0; + + if (first) { + html += '
'; + } + html += '
'; + + html += '
'; + html += '
' + cat[0].cat + '
'; + html += '
'; + html += '
    '; + + for (var cj in cat) { + html += '
  • ' + cat[cj].key + ' ' + cat[cj].des + '
  • '; + } + + html += '
'; + html += '
'; // panel-body + html += '
'; // panel + html += '
'; // col-sm-* + + if (!first || lastCategory) { + html += '
'; // row + } + } + + html += '
'; // container-fluid + html += '
'; // vim-hotkeys-help + + $('body').append(html); + } +}); diff --git a/sources/searx/static/themes/oscar/css/logicodev.min.css b/sources/searx/static/themes/oscar/css/logicodev.min.css new file mode 100644 index 0000000..4f9fffb --- /dev/null +++ b/sources/searx/static/themes/oscar/css/logicodev.min.css @@ -0,0 +1 @@ +.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{background:#29314d;color:#01d7d4}.navbar>li>a{padding:0;margin:0}.navbar-nav>li>a{background:#29314d;padding:0 8px;margin:0;line-height:30px}.navbar,.navbar-default{background-color:#29314d;border:none;border-top:4px solid #01d7d4;padding-top:5px;color:#f6f9fa!important;font-weight:700;font-size:1.1em;text-transform:lowercase;margin-bottom:24px;height:30px;line-height:30px;z-index:1}.navbar .navbar-nav>li>a,.navbar-default .navbar-nav>li>a{color:#f6f9fa}.navbar .navbar-brand,.navbar-default .navbar-brand{font-weight:700;color:#01d7d4;line-height:30px;padding:0 30px;margin:0}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#01d7d4;background:#29314d}.navbar-toggle{margin-top:0}*{border-radius:0!important}html{position:relative;min-height:100%;color:#29314d}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin-bottom:80px;background-color:#fff}body a{color:#08c}.footer{position:absolute;bottom:0;width:100%;height:60px;text-align:center;color:#999}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.result_header{margin-top:6px;margin-bottom:4px;font-size:16px}.result_header .favicon{margin-bottom:-3px}.result_header a{color:#29314d;text-decoration:none}.result_header a:hover{color:#08c}.result_header a:visited{color:#684898}.result_header a .highlight{background-color:#f6f9fa}.result-content{margin-top:2px;margin-bottom:0;word-wrap:break-word;color:#666;font-size:13px}.result-content .highlight{font-weight:700}.external-link,.external-link a{color:#2ecc71}.external-link a,.external-link a a{margin-right:3px}.result-default,.result-code,.result-torrent,.result-videos,.result-map{clear:both;padding:2px 4px}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#f6f9fa}.result-images{float:left!important;width:24%;margin:.5%}.result-images a{display:block;width:100%;height:170px;background-size:cover}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-videos hr{margin:5px 0 15px 0}.result-videos .collapse{width:100%}.result-videos .in{margin-bottom:8px}.result-torrent{clear:both}.result-torrent b{margin-right:5px;margin-left:5px}.result-torrent .seeders{color:#2ecc71}.result-torrent .leechers{color:#f35e77}.result-map{clear:both}.result-code{clear:both}.result-code .code-fork,.result-code .code-fork a{color:#666}.suggestion_item{margin:2px 5px}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:60px}.label-default{color:#a4a4a4;background:0 0}.infobox .panel-heading{background-color:#f6f9fa}.infobox .panel-heading .panel-title{font-weight:700}.infobox p{font-family:"DejaVu Serif",Georgia,Cambria,"Times New Roman",Times,serif!important;font-style:italic}.infobox .btn{background-color:#2ecc71;border:none}.infobox .btn a{color:#fff;margin:5px}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{margin:10px 0 4px 0;text-transform:capitalize}.search_categories label,#categories label{border:none;box-shadow:none;font-size:13px;padding-bottom:2px;color:#a4a4a4;margin-bottom:5px}.search_categories label:hover,#categories label:hover{color:#29314d;background-color:transparent}.search_categories label:active,#categories label:active{box-shadow:none}.search_categories .active,#categories .active,.search_categories .btn-primary,#categories .btn-primary{color:#29314d;font-weight:700;border-bottom:5px solid #01d7d4;background-color:transparent}#categories{margin:0}#main-logo{margin-top:10vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}#q{box-shadow:none;border-right:none;border-color:#a4a4a4}#search_form .input-group-btn .btn{border-color:#a4a4a4}#search_form .input-group-btn .btn:hover{background-color:#2ecc71;color:#fff}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}pre,code{font-family:'Ubuntu Mono','Courier New','Lucida Console',monospace!important}.lineno{margin-right:5px}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#556366;font-style:italic}.highlight .err{border:1px solid #ffa92f}.highlight .k{color:#BE74D5;font-weight:700}.highlight .o{color:#d19a66}.highlight .cm{color:#556366;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#556366;font-style:italic}.highlight .cs{color:#556366;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:#BE74D5;font-weight:700}.highlight .kd{color:#BE74D5;font-weight:700}.highlight .kn{color:#BE74D5;font-weight:700}.highlight .kp{color:#be74d5}.highlight .kr{color:#BE74D5;font-weight:700}.highlight .kt{color:#d46c72}.highlight .m{color:#d19a66}.highlight .s{color:#86c372}.highlight .na{color:#7d9029}.highlight .nb{color:#be74d5}.highlight .nc{color:#61AFEF;font-weight:700}.highlight .no{color:#d19a66}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#61afef}.highlight .nl{color:#a0a000}.highlight .nn{color:#61AFEF;font-weight:700}.highlight .nt{color:#BE74D5;font-weight:700}.highlight .nv{color:#dfc06f}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#d7dae0}.highlight .mf{color:#d19a66}.highlight .mh{color:#d19a66}.highlight .mi{color:#d19a66}.highlight .mo{color:#d19a66}.highlight .sb{color:#86c372}.highlight .sc{color:#86c372}.highlight .sd{color:#86C372;font-style:italic}.highlight .s2{color:#86c372}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#86c372}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:#be74d5}.highlight .sr{color:#b68}.highlight .s1{color:#86c372}.highlight .ss{color:#dfc06f}.highlight .bp{color:#be74d5}.highlight .vc{color:#dfc06f}.highlight .vg{color:#dfc06f}.highlight .vi{color:#dfc06f}.highlight .il{color:#d19a66}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:#556366}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.highlight pre{background-color:#282C34;color:#D7DAE0;border:none;margin-bottom:25px;font-size:15px;padding:20px 10px}.highlight{font-weight:700} \ No newline at end of file diff --git a/sources/searx/static/themes/oscar/css/oscar.min.css b/sources/searx/static/themes/oscar/css/oscar.min.css deleted file mode 100644 index 60b5c37..0000000 --- a/sources/searx/static/themes/oscar/css/oscar.min.css +++ /dev/null @@ -1,88 +0,0 @@ -html{position:relative;min-height:100%} -body{margin-bottom:80px} -.footer{position:absolute;bottom:0;width:100%;height:60px} -input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none} -input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none} -.result_header{margin-bottom:5px;margin-top:20px}.result_header .favicon{margin-bottom:-3px} -.result_header a{vertical-align:bottom}.result_header a .highlight{font-weight:bold} -.result-content{margin-top:5px;word-wrap:break-word}.result-content .highlight{font-weight:bold} -.result-default{clear:both} -.result-images{float:left !important} -.img-thumbnail{margin:5px;max-height:128px;min-height:128px} -.result-videos{clear:both} -.result-torrents{clear:both} -.result-map{clear:both} -.result-code{clear:both} -.suggestion_item{margin:2px 5px} -.result_download{margin-right:5px} -#pagination{margin-top:30px;padding-bottom:50px} -.label-default{color:#aaa;background:#fff} -.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed} -.infobox .infobox_part:last-child{margin-bottom:0} -.search_categories{margin:10px 0;text-transform:capitalize} -.cursor-text{cursor:text !important} -.cursor-pointer{cursor:pointer !important} -.highlight .hll{background-color:#ffc} -.highlight{background:#f8f8f8} -.highlight .c{color:#408080;font-style:italic} -.highlight .err{border:1px solid #f00} -.highlight .k{color:#008000;font-weight:bold} -.highlight .o{color:#666} -.highlight .cm{color:#408080;font-style:italic} -.highlight .cp{color:#bc7a00} -.highlight .c1{color:#408080;font-style:italic} -.highlight .cs{color:#408080;font-style:italic} -.highlight .gd{color:#a00000} -.highlight .ge{font-style:italic} -.highlight .gr{color:#f00} -.highlight .gh{color:#000080;font-weight:bold} -.highlight .gi{color:#00a000} -.highlight .go{color:#888} -.highlight .gp{color:#000080;font-weight:bold} -.highlight .gs{font-weight:bold} -.highlight .gu{color:#800080;font-weight:bold} -.highlight .gt{color:#04d} -.highlight .kc{color:#008000;font-weight:bold} -.highlight .kd{color:#008000;font-weight:bold} -.highlight .kn{color:#008000;font-weight:bold} -.highlight .kp{color:#008000} -.highlight .kr{color:#008000;font-weight:bold} -.highlight .kt{color:#b00040} -.highlight .m{color:#666} -.highlight .s{color:#ba2121} -.highlight .na{color:#7d9029} -.highlight .nb{color:#008000} -.highlight .nc{color:#00f;font-weight:bold} -.highlight .no{color:#800} -.highlight .nd{color:#a2f} -.highlight .ni{color:#999;font-weight:bold} -.highlight .ne{color:#d2413a;font-weight:bold} -.highlight .nf{color:#00f} -.highlight .nl{color:#a0a000} -.highlight .nn{color:#00f;font-weight:bold} -.highlight .nt{color:#008000;font-weight:bold} -.highlight .nv{color:#19177c} -.highlight .ow{color:#a2f;font-weight:bold} -.highlight .w{color:#bbb} -.highlight .mf{color:#666} -.highlight .mh{color:#666} -.highlight .mi{color:#666} -.highlight .mo{color:#666} -.highlight .sb{color:#ba2121} -.highlight .sc{color:#ba2121} -.highlight .sd{color:#ba2121;font-style:italic} -.highlight .s2{color:#ba2121} -.highlight .se{color:#b62;font-weight:bold} -.highlight .sh{color:#ba2121} -.highlight .si{color:#b68;font-weight:bold} -.highlight .sx{color:#008000} -.highlight .sr{color:#b68} -.highlight .s1{color:#ba2121} -.highlight .ss{color:#19177c} -.highlight .bp{color:#008000} -.highlight .vc{color:#19177c} -.highlight .vg{color:#19177c} -.highlight .vi{color:#19177c} -.highlight .il{color:#666} -.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.highlight .lineno::selection{background:transparent;} -.highlight .lineno::-moz-selection{background:transparent;} diff --git a/sources/searx/static/themes/oscar/css/pointhi.min.css b/sources/searx/static/themes/oscar/css/pointhi.min.css new file mode 100644 index 0000000..29f7497 --- /dev/null +++ b/sources/searx/static/themes/oscar/css/pointhi.min.css @@ -0,0 +1 @@ +html{position:relative;min-height:100%}body{margin-bottom:80px}.footer{position:absolute;bottom:0;width:100%;height:60px}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.result_header{margin-bottom:5px;margin-top:20px}.result_header .favicon{margin-bottom:-3px}.result_header a{vertical-align:bottom}.result_header a .highlight{font-weight:700}.result-content{margin-top:5px;word-wrap:break-word}.result-content .highlight{font-weight:700}.result-default{clear:both}.result-images{float:left!important}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-torrents{clear:both}.result-map{clear:both}.result-code{clear:both}.suggestion_item{margin:2px 5px}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:50px}.label-default{color:#AAA;background:#FFF}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories{margin:10px 0;text-transform:capitalize}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#408080;font-style:italic}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#408080;font-style:italic}.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:green;font-weight:700}.highlight .kd{color:green;font-weight:700}.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#b00040}.highlight .m{color:#666}.highlight .s{color:#ba2121}.highlight .na{color:#7d9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00f}.highlight .nl{color:#a0a000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177c}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf{color:#666}.highlight .mh{color:#666}.highlight .mi{color:#666}.highlight .mo{color:#666}.highlight .sb{color:#ba2121}.highlight .sc{color:#ba2121}.highlight .sd{color:#BA2121;font-style:italic}.highlight .s2{color:#ba2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#ba2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#b68}.highlight .s1{color:#ba2121}.highlight .ss{color:#19177c}.highlight .bp{color:green}.highlight .vc{color:#19177c}.highlight .vg{color:#19177c}.highlight .vi{color:#19177c}.highlight .il{color:#666}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0} \ No newline at end of file diff --git a/sources/searx/static/themes/oscar/gruntfile.js b/sources/searx/static/themes/oscar/gruntfile.js index c591e85..59d1b6d 100644 --- a/sources/searx/static/themes/oscar/gruntfile.js +++ b/sources/searx/static/themes/oscar/gruntfile.js @@ -36,18 +36,20 @@ module.exports = function(grunt) { less: { development: { options: { - paths: ["less/oscar"] + paths: ["less/pointhi", "less/logicodev"] //banner: '/*! less/oscar/oscar.css | <%= grunt.template.today("dd-mm-yyyy") %> | https://github.com/asciimoo/searx */\n' }, - files: {"css/oscar.css": "less/oscar/oscar.less"} + files: {"css/pointhi.css": "less/pointhi/oscar.less", + "css/logicodev.css": "less/logicodev/oscar.less"} }, production: { options: { - paths: ["less/oscar"], + paths: ["less/pointhi", "less/logicodev"], //banner: '/*! less/oscar/oscar.css | <%= grunt.template.today("dd-mm-yyyy") %> | https://github.com/asciimoo/searx */\n', cleancss: true }, - files: {"css/oscar.min.css": "less/oscar/oscar.less"} + files: {"css/pointhi.min.css": "less/pointhi/oscar.less", + "css/logicodev.min.css": "less/logicodev/oscar.less"} }, bootstrap: { options: { @@ -63,7 +65,7 @@ module.exports = function(grunt) { tasks: ['jshint', 'concat', 'uglify'] }, oscar_styles: { - files: ['less/oscar/**/*.less'], + files: ['less/pointhi/**/*.less'], tasks: ['less:development', 'less:production'] }, bootstrap_styles: { diff --git a/sources/searx/static/themes/oscar/img/logo_searx_a.png b/sources/searx/static/themes/oscar/img/logo_searx_a.png new file mode 100644 index 0000000000000000000000000000000000000000..fe8b94fff3fb63d718e9b90f9ba639610ed94a96 GIT binary patch literal 33423 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 Iag)&h0n-b}qW}N^ literal 0 HcmV?d00001 diff --git a/sources/searx/static/themes/oscar/img/logo_searx_a_n.png b/sources/searx/static/themes/oscar/img/logo_searx_a_n.png new file mode 100644 index 0000000000000000000000000000000000000000..96e97cbdc41839e125b0f6ad66d0572d0787584f GIT binary patch literal 33065 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 literal 0 HcmV?d00001 diff --git a/sources/searx/static/themes/oscar/less/oscar/checkbox.less b/sources/searx/static/themes/oscar/less/logicodev/checkbox.less similarity index 100% rename from sources/searx/static/themes/oscar/less/oscar/checkbox.less rename to sources/searx/static/themes/oscar/less/logicodev/checkbox.less diff --git a/sources/searx/static/themes/oscar/less/logicodev/code.less b/sources/searx/static/themes/oscar/less/logicodev/code.less new file mode 100644 index 0000000..96486f5 --- /dev/null +++ b/sources/searx/static/themes/oscar/less/logicodev/code.less @@ -0,0 +1,103 @@ +pre, code{ + font-family: 'Ubuntu Mono', 'Courier New', 'Lucida Console', monospace !important; +} + +.lineno{ + margin-right: 5px; +} + +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #556366; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid @orange } /* Error */ +.highlight .k { color: #BE74D5; font-weight: bold } /* Keyword */ +.highlight .o { color: #D19A66 } /* Operator */ +.highlight .cm { color: #556366; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #BC7A00 } /* Comment.Preproc */ +.highlight .c1 { color: #556366; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #556366; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #BE74D5; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #BE74D5; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #BE74D5; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #BE74D5 } /* Keyword.Pseudo */ +.highlight .kr { color: #BE74D5; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #D46C72 } /* Keyword.Type */ +.highlight .m { color: #D19A66 } /* Literal.Number */ +.highlight .s { color: #86C372 } /* Literal.String */ +.highlight .na { color: #7D9029 } /* Name.Attribute */ +.highlight .nb { color: #BE74D5 } /* Name.Builtin */ +.highlight .nc { color: #61AFEF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #D19A66 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #61AFEF } /* Name.Function */ +.highlight .nl { color: #A0A000 } /* Name.Label */ +.highlight .nn { color: #61AFEF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #BE74D5; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #DFC06F } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #D7DAE0 } /* Text.Whitespace */ +.highlight .mf { color: #D19A66 } /* Literal.Number.Float */ +.highlight .mh { color: #D19A66 } /* Literal.Number.Hex */ +.highlight .mi { color: #D19A66 } /* Literal.Number.Integer */ +.highlight .mo { color: #D19A66 } /* Literal.Number.Oct */ +.highlight .sb { color: #86C372 } /* Literal.String.Backtick */ +.highlight .sc { color: #86C372 } /* Literal.String.Char */ +.highlight .sd { color: #86C372; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #86C372 } /* Literal.String.Double */ +.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #86C372 } /* Literal.String.Heredoc */ +.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #BE74D5 } /* Literal.String.Other */ +.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ +.highlight .s1 { color: #86C372 } /* Literal.String.Single */ +.highlight .ss { color: #DFC06F } /* Literal.String.Symbol */ +.highlight .bp { color: #BE74D5 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #DFC06F } /* Name.Variable.Class */ +.highlight .vg { color: #DFC06F } /* Name.Variable.Global */ +.highlight .vi { color: #DFC06F } /* Name.Variable.Instance */ +.highlight .il { color: #D19A66 } /* Literal.Number.Integer.Long */ + +.highlight .lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: default; + color: #556366; + + &::selection { + background: transparent; /* WebKit/Blink Browsers */ + } + &::-moz-selection { + background: transparent; /* Gecko Browsers */ + } +} + +.highlight pre { + background-color: #282C34; + color: #D7DAE0; + border: none; + margin-bottom: 25px; + font-size: 15px; + padding: 20px 10px; +} + +.highlight { + font-weight: 700; +} + + diff --git a/sources/searx/static/themes/oscar/less/oscar/cursor.less b/sources/searx/static/themes/oscar/less/logicodev/cursor.less similarity index 100% rename from sources/searx/static/themes/oscar/less/oscar/cursor.less rename to sources/searx/static/themes/oscar/less/logicodev/cursor.less diff --git a/sources/searx/static/themes/oscar/less/logicodev/footer.less b/sources/searx/static/themes/oscar/less/logicodev/footer.less new file mode 100644 index 0000000..d23a0cc --- /dev/null +++ b/sources/searx/static/themes/oscar/less/logicodev/footer.less @@ -0,0 +1,30 @@ +// Sticky footer styles +*{ + border-radius: 0 !important; +} +html { + position: relative; + min-height: 100%; + color: @black; +} + +body { + /* Margin bottom by footer height */ + font-family: 'Roboto', Helvetica, Arial, sans-serif; + margin-bottom: 80px; + background-color: white; + + a{ + color: @blue; + } +} + +.footer { + position: absolute; + bottom: 0; + width: 100%; + /* Set the fixed height of the footer here */ + height: 60px; + text-align: center; + color: #999; +} diff --git a/sources/searx/static/themes/oscar/less/logicodev/infobox.less b/sources/searx/static/themes/oscar/less/logicodev/infobox.less new file mode 100644 index 0000000..0d488d7 --- /dev/null +++ b/sources/searx/static/themes/oscar/less/logicodev/infobox.less @@ -0,0 +1,37 @@ +.infobox { + + .panel-heading{ + background-color: @dim-gray; + + .panel-title{ + font-weight: 700; + } + } + + + p{ + font-family: "DejaVu Serif", Georgia, Cambria, "Times New Roman", Times, serif !important; + font-style: italic; + } + + .btn{ + background-color: @green; + border: none; + + a{ + color: white; + margin: 5px; + } + } + + .infobox_part { + margin-bottom: 20px; + word-wrap: break-word; + table-layout: fixed; + + } + + .infobox_part:last-child { + margin-bottom: 0; + } +} diff --git a/sources/searx/static/themes/oscar/less/logicodev/navbar.less b/sources/searx/static/themes/oscar/less/logicodev/navbar.less new file mode 100644 index 0000000..493c9dc --- /dev/null +++ b/sources/searx/static/themes/oscar/less/logicodev/navbar.less @@ -0,0 +1,54 @@ +.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus{ + background: @black; + color: @light-green; +} + +.navbar > li > a { + padding: 0; + margin: 0; +} + +.navbar-nav > li > a { + background: @black; + padding: 0 8px; + margin: 0; + line-height: 30px; +} + +.navbar, .navbar-default{ + background-color: @black; + border: none; + border-top: 4px solid @light-green; + padding-top: 5px; + color: @dim-gray !important; + font-weight: 700; + font-size: 1.1em; + text-transform: lowercase; + margin-bottom: 24px; + height: 30px; + line-height: 30px; + + .navbar-nav > li > a{ + color: @dim-gray; + } + + .navbar-brand{ + font-weight: 700; + color: @light-green; + line-height: 30px; + padding: 0 30px; + margin: 0; + } + z-index: 1; +} + +// Hover color +// http://stackoverflow.com/users/114029/leniel-macaferi +.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { + color: @light-green; + background: @black; +} + +.navbar-toggle { + margin-top: 0; +} diff --git a/sources/searx/static/themes/oscar/less/logicodev/oscar.less b/sources/searx/static/themes/oscar/less/logicodev/oscar.less new file mode 100644 index 0000000..fba596c --- /dev/null +++ b/sources/searx/static/themes/oscar/less/logicodev/oscar.less @@ -0,0 +1,17 @@ +@import "variables.less"; + +@import "navbar.less"; + +@import "footer.less"; + +@import "checkbox.less"; + +@import "results.less"; + +@import "infobox.less"; + +@import "search.less"; + +@import "cursor.less"; + +@import "code.less"; diff --git a/sources/searx/static/themes/oscar/less/logicodev/results.less b/sources/searx/static/themes/oscar/less/logicodev/results.less new file mode 100644 index 0000000..37a5a76 --- /dev/null +++ b/sources/searx/static/themes/oscar/less/logicodev/results.less @@ -0,0 +1,150 @@ +.result_header { + margin-top: 6px; + margin-bottom: 4px; + font-size: 16px; + + .favicon { + margin-bottom:-3px; + } + + a { + color: @black; + text-decoration: none; + + &:hover{ + color: @blue; + } + + &:visited{ + color: @violet; + } + + .highlight { + background-color: @dim-gray; + // Chrome hack: bold is different size than normal + // https://stackoverflow.com/questions/20713988/weird-text-alignment-issue-in-css-when-bolded-lucida-sans + } + } +} + +.result-content { + margin-top: 2px; + margin-bottom: 0; + word-wrap: break-word; + color: @dark-gray; + font-size: 13px; + + + .highlight { + font-weight:bold; + } + +} + +.external-link, .external-link a{ + color: @green; + + a{ + margin-right: 3px; + } +} + +// default formating of results +.result-default, .result-code, .result-torrent, .result-videos, .result-map { + clear: both; + padding: 2px 4px; + &:hover{ + background-color: @dim-gray; + } +} + + +// image formating of results +.result-images { + float: left !important; + width: 24%; + margin: .5%; + a{ + display: block; + width: 100%; + height: 170px; + background-size: cover; + } +} + +.img-thumbnail { + margin: 5px; + max-height: 128px; + min-height: 128px; +} + +// video formating of results +.result-videos { + clear: both; + + hr{ + margin: 5px 0 15px 0; + } + + .collapse{ + width: 100%; + } + + .in{ + margin-bottom: 8px; + } +} + +// torrent formating of results +.result-torrent { + clear: both; + + b{ + margin-right: 5px; + margin-left: 5px; + } + + .seeders{ + color: @green; + } + + .leechers{ + color: @red; + } +} + +// map formating of results +.result-map { + clear: both; +} + +// code formating of results +.result-code { + clear: both; + + .code-fork, .code-fork a{ + color: @dark-gray; + } + +} + +// suggestion +.suggestion_item { + margin: 2px 5px; +} + +// download result +.result_download { + margin-right: 5px; +} + +// page forward, backward +#pagination { + margin-top: 30px; + padding-bottom: 60px; +} + +.label-default { + color: @gray; + background: transparent; +} diff --git a/sources/searx/static/themes/oscar/less/logicodev/search.less b/sources/searx/static/themes/oscar/less/logicodev/search.less new file mode 100644 index 0000000..1bb71a7 --- /dev/null +++ b/sources/searx/static/themes/oscar/less/logicodev/search.less @@ -0,0 +1,59 @@ +.search_categories, #categories { + margin: 10px 0 4px 0; + text-transform: capitalize; + + label{ + border: none; + box-shadow: none; + font-size: 13px; + padding-bottom: 2px; + color: @gray; + margin-bottom: 5px; + + &:hover{ + color: @black; + background-color: transparent; + } + + &:active{ + box-shadow: none; + } + } + + .active, .btn-primary{ + color: @black; + font-weight: 700; + border-bottom: 5px solid @light-green; + background-color: transparent; + } + +} + +#categories{ + margin: 0; +} + +#main-logo{ + margin-top: 10vh; + margin-bottom: 25px; +} + +#main-logo > img { + max-width: 350px; + width: 80%; +} + +#q{ + box-shadow: none; + border-right: none; + border-color: @gray; +} + + #search_form .input-group-btn .btn{ + border-color: @gray; + } + + #search_form .input-group-btn .btn:hover{ + background-color: @green; + color: white; + } diff --git a/sources/searx/static/themes/oscar/less/logicodev/variables.less b/sources/searx/static/themes/oscar/less/logicodev/variables.less new file mode 100644 index 0000000..3ca05e7 --- /dev/null +++ b/sources/searx/static/themes/oscar/less/logicodev/variables.less @@ -0,0 +1,10 @@ +@black: #29314D; +@gray: #A4A4A4; +@dim-gray: #F6F9FA; +@dark-gray: #666; +@blue: #0088CC; +@red: #F35E77; +@violet: #684898; +@green: #2ecc71; +@light-green: #01D7D4; +@orange: #FFA92F; diff --git a/sources/searx/static/themes/oscar/less/pointhi/checkbox.less b/sources/searx/static/themes/oscar/less/pointhi/checkbox.less new file mode 100644 index 0000000..6428b36 --- /dev/null +++ b/sources/searx/static/themes/oscar/less/pointhi/checkbox.less @@ -0,0 +1,9 @@ +// Hide element if checkbox is checked +input[type=checkbox]:checked + .label_hide_if_checked, input[type=checkbox]:checked + .label_hide_if_not_checked + .label_hide_if_checked { + display:none; +} + +// Hide element if checkbox is not checked +input[type=checkbox]:not(:checked) + .label_hide_if_not_checked, input[type=checkbox]:not(:checked) + .label_hide_if_checked + .label_hide_if_not_checked { + display:none; +} diff --git a/sources/searx/static/themes/oscar/less/oscar/code.less b/sources/searx/static/themes/oscar/less/pointhi/code.less similarity index 100% rename from sources/searx/static/themes/oscar/less/oscar/code.less rename to sources/searx/static/themes/oscar/less/pointhi/code.less diff --git a/sources/searx/static/themes/oscar/less/pointhi/cursor.less b/sources/searx/static/themes/oscar/less/pointhi/cursor.less new file mode 100644 index 0000000..cbc1ea6 --- /dev/null +++ b/sources/searx/static/themes/oscar/less/pointhi/cursor.less @@ -0,0 +1,8 @@ +// display cursor +.cursor-text { + cursor: text !important; +} + +.cursor-pointer { + cursor: pointer !important; +} diff --git a/sources/searx/static/themes/oscar/less/oscar/footer.less b/sources/searx/static/themes/oscar/less/pointhi/footer.less similarity index 100% rename from sources/searx/static/themes/oscar/less/oscar/footer.less rename to sources/searx/static/themes/oscar/less/pointhi/footer.less diff --git a/sources/searx/static/themes/oscar/less/oscar/infobox.less b/sources/searx/static/themes/oscar/less/pointhi/infobox.less similarity index 100% rename from sources/searx/static/themes/oscar/less/oscar/infobox.less rename to sources/searx/static/themes/oscar/less/pointhi/infobox.less diff --git a/sources/searx/static/themes/oscar/less/oscar/oscar.less b/sources/searx/static/themes/oscar/less/pointhi/oscar.less similarity index 100% rename from sources/searx/static/themes/oscar/less/oscar/oscar.less rename to sources/searx/static/themes/oscar/less/pointhi/oscar.less diff --git a/sources/searx/static/themes/oscar/less/oscar/results.less b/sources/searx/static/themes/oscar/less/pointhi/results.less similarity index 100% rename from sources/searx/static/themes/oscar/less/oscar/results.less rename to sources/searx/static/themes/oscar/less/pointhi/results.less diff --git a/sources/searx/static/themes/oscar/less/oscar/search.less b/sources/searx/static/themes/oscar/less/pointhi/search.less similarity index 100% rename from sources/searx/static/themes/oscar/less/oscar/search.less rename to sources/searx/static/themes/oscar/less/pointhi/search.less diff --git a/sources/searx/templates/oscar/base.html b/sources/searx/templates/oscar/base.html index f63025e..649d91f 100644 --- a/sources/searx/templates/oscar/base.html +++ b/sources/searx/templates/oscar/base.html @@ -12,7 +12,11 @@ {% block title %}{% endblock %}{{ instance_name }} - + {% if cookies['oscar-style'] %} + + {% else %} + + {% endif %} {% for css in styles %} @@ -48,8 +52,8 @@ -

{% include 'oscar/navbar.html' %} +
{% block site_alert_error %} {% endblock %} @@ -75,7 +79,7 @@
{% block footer %} {% endblock %} -

{{ _('Powered by') }} searx - {{ searx_version }} - {{ _('a privacy-respecting, hackable metasearch engine') }}

+

{{ _('Powered by') }} searx - {{ searx_version }} - {{ _('a privacy-respecting, hackable metasearch engine') }}

diff --git a/sources/searx/templates/oscar/index.html b/sources/searx/templates/oscar/index.html index e58aa07..b941f5f 100644 --- a/sources/searx/templates/oscar/index.html +++ b/sources/searx/templates/oscar/index.html @@ -3,7 +3,14 @@
-

searx logosearx

+ {% if cookies['oscar-style'] == 'pointhi' %} +

searx logosearx

+ {% else %} +

+ searx logo + searx +

+ {% endif %}
diff --git a/sources/searx/templates/oscar/macros.html b/sources/searx/templates/oscar/macros.html index cf49ce8..a826b0e 100644 --- a/sources/searx/templates/oscar/macros.html +++ b/sources/searx/templates/oscar/macros.html @@ -17,7 +17,6 @@ {% macro result_sub_header(result) -%} {% if result.publishedDate %}{% endif %} - {{ icon('link') }} {{ _('cached') }} {% if result.magnetlink %}{{ icon('magnet') }} {{ _('magnet link') }}{% endif %} {% if result.torrentfile %}{{ icon('download-alt') }} {{ _('torrent file') }}{% endif %} {%- endmacro %} @@ -29,15 +28,19 @@ {% for engine in result.engines %} {{ engine }} {% endfor %} + {{ icon('link') }} {{ _('cached') }}
-

{{ result.pretty_url }}

+
{{ result.pretty_url }}
{%- endmacro %} {% macro result_footer_rtl(result) -%}
- {{ result.engine }} -

{{ result.pretty_url }}‎

+ {% for engine in result.engines %} + {{ engine }} + {% endfor %} + {{ icon('link') }} {{ _('cached') }} +
{{ result.pretty_url }}
{%- endmacro %} {% macro preferences_item_header(info, label, rtl) -%} diff --git a/sources/searx/templates/oscar/preferences.html b/sources/searx/templates/oscar/preferences.html index a2c493a..18308bd 100644 --- a/sources/searx/templates/oscar/preferences.html +++ b/sources/searx/templates/oscar/preferences.html @@ -110,6 +110,13 @@ {% endfor %} {{ preferences_item_footer(theme_info, theme_label, rtl) }} + + {{ preferences_item_header(_('Choose style for this theme'), _('Style'), rtl) }} + + {{ preferences_item_footer(_('Choose style for this theme'), _('Style'), rtl) }}
diff --git a/sources/searx/templates/oscar/results.html b/sources/searx/templates/oscar/results.html index 9f9bdf1..39cdff4 100644 --- a/sources/searx/templates/oscar/results.html +++ b/sources/searx/templates/oscar/results.html @@ -78,6 +78,16 @@