diff options
author | Alexandre Flament <alex@al-f.net> | 2022-05-07 15:11:05 +0200 |
---|---|---|
committer | Alexandre Flament <alex@al-f.net> | 2022-05-07 19:40:48 +0200 |
commit | 9b3efa6d8ab46a3db62f42624d7e9f4b55fdd0ef (patch) | |
tree | 554ff67c6b84531b2a6f99505cc954395d730024 | |
parent | 6db568bf69b7145451ff90e14da0e49fb5b6269b (diff) | |
download | searxng-9b3efa6d8ab46a3db62f42624d7e9f4b55fdd0ef.tar.gz searxng-9b3efa6d8ab46a3db62f42624d7e9f4b55fdd0ef.zip |
theme: remove __common__
25 files changed, 141 insertions, 588 deletions
diff --git a/searx/plugins/search_on_category_select.py b/searx/plugins/search_on_category_select.py index 48d537cee..99066e23e 100644 --- a/searx/plugins/search_on_category_select.py +++ b/searx/plugins/search_on_category_select.py @@ -22,5 +22,3 @@ description = gettext( ) default_on = True preference_section = 'ui' - -js_dependencies = ('plugins/js/search_on_category_select.js',) diff --git a/searx/plugins/vim_hotkeys.py b/searx/plugins/vim_hotkeys.py index fb61d413b..3eeaf8c00 100644 --- a/searx/plugins/vim_hotkeys.py +++ b/searx/plugins/vim_hotkeys.py @@ -8,6 +8,3 @@ description = gettext( ) default_on = False preference_section = 'ui' - -js_dependencies = ('plugins/js/vim_hotkeys.js',) -css_dependencies = ('plugins/css/vim_hotkeys.css',) diff --git a/searx/static/plugins/css/vim_hotkeys.css b/searx/static/plugins/css/vim_hotkeys.css deleted file mode 100644 index 2ccfdc1af..000000000 --- a/searx/static/plugins/css/vim_hotkeys.css +++ /dev/null @@ -1,26 +0,0 @@ -.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/searx/static/plugins/js/search_on_category_select.js b/searx/static/plugins/js/search_on_category_select.js deleted file mode 100644 index d590ed127..000000000 --- a/searx/static/plugins/js/search_on_category_select.js +++ /dev/null @@ -1,42 +0,0 @@ -$(document).ready(function() { - if($('#q').length) { - $('#categories label').click(function(e) { - $('#categories input[type="checkbox"]').each(function(i, checkbox) { - $(checkbox).prop('checked', false); - }); - $(document.getElementById($(this).attr("for"))).prop('checked', true); - if($('#q').val()) { - if (getHttpRequest() == "GET") { - $('#search_form').attr('action', $('#search_form').serialize()); - } - $('#search_form').submit(); - } - return false; - }); - $('#time-range').change(function(e) { - if($('#q').val()) { - if (getHttpRequest() == "GET") { - $('#search_form').attr('action', $('#search_form').serialize()); - } - $('#search_form').submit(); - } - }); - $('#language').change(function(e) { - if($('#q').val()) { - if (getHttpRequest() == "GET") { - $('#search_form').attr('action', $('#search_form').serialize()); - } - $('#search_form').submit(); - } - }); - } -}); - -function getHttpRequest() { - httpRequest = "POST"; - urlParams = new URLSearchParams(window.location.search); - if (urlParams.has('method')) { - httpRequest = urlParams.get('method'); - } - return httpRequest; -} diff --git a/searx/static/plugins/js/vim_hotkeys.js b/searx/static/plugins/js/vim_hotkeys.js deleted file mode 100644 index b0f265cb5..000000000 --- a/searx/static/plugins/js/vim_hotkeys.js +++ /dev/null @@ -1,345 +0,0 @@ -$(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).keydown(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) { - e.preventDefault(); - vimKeys[e.keyCode].fun(); - } - } - } - }); - - function nextResult(current, direction) { - var next = current[direction](); - while (!next.is('.result') && next.length !== 0) { - next = next[direction](); - } - return next - } - - 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 = nextResult(current, 'next'); - if (next.length === 0) { - next = $('.result:first'); - } - break; - case 'up': - next = nextResult(current, 'prev'); - 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 = '<div id="vim-hotkeys-help" class="well vim-hotkeys-help">'; - html += '<div class="container-fluid">'; - - 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++) { - var cat = categories[sorted[i]]; - - var lastCategory = i === (sorted.length - 1); - var first = i % 2 === 0; - - if (first) { - html += '<div class="row dflex">'; - } - html += '<div class="col-sm-' + (first && lastCategory ? 12 : 6) + ' dflex">'; - - html += '<div class="panel panel-default iflex">'; - html += '<div class="panel-heading">' + cat[0].cat + '</div>'; - html += '<div class="panel-body">'; - html += '<ul class="list-unstyled">'; - - for (var cj in cat) { - html += '<li><kbd>' + cat[cj].key + '</kbd> ' + cat[cj].des + '</li>'; - } - - html += '</ul>'; - html += '</div>'; // panel-body - html += '</div>'; // panel - html += '</div>'; // col-sm-* - - if (!first || lastCategory) { - html += '</div>'; // row - } - } - - html += '</div>'; // container-fluid - html += '</div>'; // vim-hotkeys-help - - $('body').append(html); - } -}); diff --git a/searx/static/themes/__common__/less/new_issue.less b/searx/static/themes/__common__/less/new_issue.less deleted file mode 100644 index 175bd3cec..000000000 --- a/searx/static/themes/__common__/less/new_issue.less +++ /dev/null @@ -1,19 +0,0 @@ -.github-issue-button { - display: block; - padding: 8px 16px; - font-family: sans-serif; - font-size: 16px; - color: white; - background-color: #238636 !important; /* important is needed cause to an !important in logicodev-dark */ - border: #2ea043; - border-radius: 10px !important; - box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; -} - -.github-issue-button:hover { - background-color: #2ea043; -} - -.issue-hide { - display: none; -} diff --git a/searx/static/themes/__common__/less/result_templates.less b/searx/static/themes/__common__/less/result_templates.less deleted file mode 100644 index d67aecae4..000000000 --- a/searx/static/themes/__common__/less/result_templates.less +++ /dev/null @@ -1,5 +0,0 @@ -.osm-map-box { - height:300px; - width:100%; - margin: 10px 0; -} diff --git a/searx/static/themes/__common__/less/stats.less b/searx/static/themes/__common__/less/stats.less deleted file mode 100644 index 687d15906..000000000 --- a/searx/static/themes/__common__/less/stats.less +++ /dev/null @@ -1,83 +0,0 @@ -.engine-stats { - - .engine-name { - width: 20rem; - } - - .engine-score { - width: 7rem; - text-align: right; - } - - .result-count { - } - - .response-time { - } - - .engine-reliability { - text-align: right; - } - - table.engine-error { - max-width: 1280px; - margin: 1rem; - border: 1px solid gray; - } - - table.engine-error th.engine-error-type, - table.engine-error td.engine-error-type, - failed-test { - width: 10rem; - } - - table.engine-error span.log_parameters - { - border-right: 1px solid gray; - padding: 0 1rem 0 0; - margin: 0 0 0 0.5rem; - } -} - -.bar-chart-value { - width: 3em; - display: inline-block; - text-align: right; - padding-right: 0.5rem; -} - -.bar-chart-graph { - width: calc(100% - 5rem); - display: inline-block; -} - -.bar-chart-bar { - border: 3px solid #5bc0de; - margin: 1px 0; -} - -.bar-chart-serie1 { - border: 3px solid #5bc0de; - margin: 1px 0; - float: left; -} - -.bar-chart-serie2 { - border: 3px solid #deb15b; - margin: 1px 0; - float: left; -} - -.bar0{ - width: 0; - border: 0; -} - -.generate-bar(100); - -.generate-bar(@n, @i: 1) when (@i =< @n) { - .bar@{i} { - width: (@i * 100% / @n); - } - .generate-bar(@n, (@i + 1)); -} diff --git a/searx/static/themes/.gitattributes b/searx/static/themes/simple/.gitattributes index dc8d7a30e..dc8d7a30e 100644 --- a/searx/static/themes/.gitattributes +++ b/searx/static/themes/simple/.gitattributes diff --git a/searx/static/themes/simple/gruntfile.js b/searx/static/themes/simple/gruntfile.js index 25883e384..50ea3b1d4 100644 --- a/searx/static/themes/simple/gruntfile.js +++ b/searx/static/themes/simple/gruntfile.js @@ -44,7 +44,6 @@ module.exports = function (grunt) { 'svg4web.svgo.js', 'src/js/main/*.js', 'src/js/head/*.js', - '../__common__/js/*.js' ], }, stylelint: { @@ -146,7 +145,7 @@ module.exports = function (grunt) { svgo: ['--config', 'svg4web.svgo.js'] }, files: { - '<%= _templates %>/__common__/searxng-wordmark.min.svg': '<%= _brand %>/searxng-wordmark.svg', + '<%= _templates %>/simple/searxng-wordmark.min.svg': '<%= _brand %>/searxng-wordmark.svg', 'img/searxng.svg': '<%= _brand %>/searxng.svg', 'img/img_load_error.svg': '<%= _brand %>/img_load_error.svg' } diff --git a/searx/static/themes/simple/src/less/new_issue.less b/searx/static/themes/simple/src/less/new_issue.less new file mode 100644 index 000000000..83d53b5e3 --- /dev/null +++ b/searx/static/themes/simple/src/less/new_issue.less @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +.github-issue-button { + display: block; + padding: 8px 16px; + font-family: sans-serif; + font-size: 16px; + color: white; + background-color: #238636; + border: #2ea043; + border-radius: 10px !important; + box-shadow: rgba(0, 0, 0, 0) 0 0 0 0; +} + +.github-issue-button:hover { + background-color: #2ea043; +} + +.issue-hide { + display: none; +} diff --git a/searx/static/themes/simple/src/less/result_templates.less b/searx/static/themes/simple/src/less/result_templates.less new file mode 100644 index 000000000..afabdf322 --- /dev/null +++ b/searx/static/themes/simple/src/less/result_templates.less @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +.osm-map-box { + height: 300px; + width: 100%; + margin: 10px 0; +} diff --git a/searx/static/themes/simple/src/less/stats.less b/searx/static/themes/simple/src/less/stats.less new file mode 100644 index 000000000..0e54e270c --- /dev/null +++ b/searx/static/themes/simple/src/less/stats.less @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +.engine-stats { + .engine-name { + width: 20rem; + } + + .engine-score { + width: 7rem; + text-align: right; + } + + .engine-reliability { + text-align: right; + } + + table.engine-error { + max-width: 1280px; + margin: 1rem; + border: 1px solid gray; + } + + table.engine-error th.engine-error-type, + table.engine-error td.engine-error-type, + failed-test { + width: 10rem; + } + + table.engine-error span.log_parameters { + border-right: 1px solid gray; + padding: 0 1rem 0 0; + margin: 0 0 0 0.5rem; + } +} + +.bar-chart-value { + width: 3em; + display: inline-block; + text-align: right; + padding-right: 0.5rem; +} + +.bar-chart-graph { + width: calc(100% - 5rem); + display: inline-block; +} + +.bar-chart-bar { + border: 3px solid #5bc0de; + margin: 1px 0; +} + +.bar-chart-serie1 { + border: 3px solid #5bc0de; + margin: 1px 0; + float: left; +} + +.bar-chart-serie2 { + border: 3px solid #deb15b; + margin: 1px 0; + float: left; +} + +.bar0 { + width: 0; + border: 0; +} + +.generate-bar(100); + +.generate-bar(@n, @i: 1) when (@i =< @n) { + .bar@{i} { + width: (@i * 100% / @n); + } + .generate-bar(@n, (@i + 1)); +} diff --git a/searx/static/themes/simple/src/less/style-rtl.less b/searx/static/themes/simple/src/less/style-rtl.less index bbaa48748..cf105702b 100644 --- a/searx/static/themes/simple/src/less/style-rtl.less +++ b/searx/static/themes/simple/src/less/style-rtl.less @@ -124,7 +124,7 @@ background-position-x: 100%; } -// patch of searx/static/themes/__common__/less/stats.less +// patch of stats.less .bar-chart-serie1, .bar-chart-serie2 { float: right; diff --git a/searx/static/themes/simple/src/less/style.less b/searx/static/themes/simple/src/less/style.less index 258c222a2..38fdeaa14 100644 --- a/searx/static/themes/simple/src/less/style.less +++ b/searx/static/themes/simple/src/less/style.less @@ -6,9 +6,6 @@ // stylelint-disable no-descending-specificity -@import "../../__common__/less/new_issue.less"; -@import "../../__common__/less/stats.less"; -@import "../../__common__/less/result_templates.less"; @import (inline) "../../node_modules/normalize.css/normalize.css"; @import "definitions.less"; @import "mixins.less"; @@ -19,6 +16,9 @@ @import "animations.less"; @import "embedded.less"; @import "info.less"; +@import "new_issue.less"; +@import "stats.less"; +@import "result_templates.less"; // for index.html template @import "index.less"; diff --git a/searx/templates/__common__/new_issue.html b/searx/templates/simple/new_issue.html index 55dbefe60..55dbefe60 100644 --- a/searx/templates/__common__/new_issue.html +++ b/searx/templates/simple/new_issue.html diff --git a/searx/templates/__common__/opensearch.xml b/searx/templates/simple/opensearch.xml index 230f327a5..230f327a5 100644 --- a/searx/templates/__common__/opensearch.xml +++ b/searx/templates/simple/opensearch.xml diff --git a/searx/templates/__common__/opensearch_response_rss.xml b/searx/templates/simple/opensearch_response_rss.xml index 82d3f7c4e..82d3f7c4e 100644 --- a/searx/templates/__common__/opensearch_response_rss.xml +++ b/searx/templates/simple/opensearch_response_rss.xml diff --git a/searx/templates/simple/search.html b/searx/templates/simple/search.html index 90a296aeb..c5f7de09c 100644 --- a/searx/templates/simple/search.html +++ b/searx/templates/simple/search.html @@ -2,7 +2,7 @@ <div id="search_header"> <a id="search_logo" href="{{ url_for('index') }}" tabindex="0" title="{{ _('Display the front page') }}"> <span hidden>SearXNG</span> - {% include '__common__/searxng-wordmark.min.svg' without context %} + {% include 'simple/searxng-wordmark.min.svg' without context %} </a> <div id="search_view"> <div class="search_box"> diff --git a/searx/templates/__common__/searxng-wordmark.min.svg b/searx/templates/simple/searxng-wordmark.min.svg index 45cc2c05b..45cc2c05b 100644 --- a/searx/templates/__common__/searxng-wordmark.min.svg +++ b/searx/templates/simple/searxng-wordmark.min.svg diff --git a/searx/templates/simple/stats.html b/searx/templates/simple/stats.html index f45f5b260..9cc035cfd 100644 --- a/searx/templates/simple/stats.html +++ b/searx/templates/simple/stats.html @@ -1,5 +1,5 @@ {% from 'simple/icons.html' import icon_big %} -{% from '__common__/new_issue.html' import new_issue with context %} +{% from 'simple/new_issue.html' import new_issue with context %} {% extends "simple/page_with_header.html" %} diff --git a/searx/webapp.py b/searx/webapp.py index de01e2863..940496483 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -17,7 +17,7 @@ from timeit import default_timer from html import escape from io import StringIO import typing -from typing import List, Dict, Iterable, Optional +from typing import List, Dict, Iterable import urllib import urllib.parse @@ -140,12 +140,6 @@ default_theme = settings['ui']['default_theme'] templates_path = settings['ui']['templates_path'] themes = get_themes(templates_path) result_templates = get_result_templates(templates_path) -global_favicons = [] -for indice, theme in enumerate(themes): - global_favicons.append([]) - theme_img_path = os.path.join(settings['ui']['static_path'], 'themes', theme, 'img', 'icons') - for (dirpath, dirnames, filenames) in os.walk(theme_img_path): - global_favicons[indice].extend(filenames) STATS_SORT_PARAMETERS = { 'name': (False, 'name', ''), @@ -327,24 +321,6 @@ def code_highlighter(codelines, language=None): return html_code -def get_current_theme_name(override: Optional[str] = None) -> str: - """Returns theme name. - - Checks in this order: - 1. override - 2. cookies - 3. settings""" - - if override and (override in themes or override == '__common__'): - return override - theme_name = request.args.get('theme', request.preferences.get_value('theme')) - - if theme_name and theme_name in themes: - return theme_name - - return default_theme - - def get_result_template(theme_name: str, template_name: str): themed_path = theme_name + '/result_templates/' + template_name if themed_path in result_templates: @@ -352,13 +328,13 @@ def get_result_template(theme_name: str, template_name: str): return 'result_templates/' + template_name -def custom_url_for(endpoint: str, override_theme: Optional[str] = None, **values): +def custom_url_for(endpoint: str, **values): suffix = "" if endpoint == 'static' and values.get('filename'): file_hash = static_files.get(values['filename']) if not file_hash: # try file in the current theme - theme_name = get_current_theme_name(override=override_theme) + theme_name = request.preferences.get_value('theme') filename_with_theme = "themes/{}/{}".format(theme_name, values['filename']) file_hash = static_files.get(filename_with_theme) if file_hash: @@ -459,7 +435,7 @@ def get_client_settings(): } -def render(template_name: str, override_theme: str = None, **kwargs): +def render(template_name: str, **kwargs): kwargs['client_settings'] = str( base64.b64encode( @@ -471,12 +447,6 @@ def render(template_name: str, override_theme: str = None, **kwargs): encoding='utf-8', ) - # obsolete, only needed by oscar - kwargs['autocomplete'] = request.preferences.get_value('autocomplete') - kwargs['method'] = request.preferences.get_value('method') - kwargs['infinite_scroll'] = request.preferences.get_value('infinite_scroll') - kwargs['translations'] = json.dumps(get_translations(), separators=(',', ':')) - # values from the HTTP requests kwargs['endpoint'] = 'results' if 'q' in kwargs else request.endpoint kwargs['cookies'] = request.cookies @@ -488,7 +458,7 @@ def render(template_name: str, override_theme: str = None, **kwargs): kwargs['advanced_search'] = request.preferences.get_value('advanced_search') kwargs['query_in_title'] = request.preferences.get_value('query_in_title') kwargs['safesearch'] = str(request.preferences.get_value('safesearch')) - kwargs['theme'] = get_current_theme_name(override=override_theme) + kwargs['theme'] = request.preferences.get_value('theme') kwargs['categories_as_tabs'] = list(settings['categories_as_tabs'].keys()) kwargs['categories'] = _get_enable_categories(categories.keys()) kwargs['OTHER_CATEGORY'] = OTHER_CATEGORY @@ -521,7 +491,14 @@ def render(template_name: str, override_theme: str = None, **kwargs): kwargs['proxify_results'] = settings.get('result_proxy', {}).get('proxify_results', True) kwargs['get_result_template'] = get_result_template kwargs['opensearch_url'] = ( - url_for('opensearch') + '?' + urlencode({'method': kwargs['method'], 'autocomplete': kwargs['autocomplete']}) + url_for('opensearch') + + '?' + + urlencode( + { + 'method': request.preferences.get_value('method'), + 'autocomplete': request.preferences.get_value('autocomplete'), + } + ) ) # scripts from plugins @@ -648,7 +625,6 @@ def index_error(output_format: str, error_message: str): q=request.form['q'] if 'q' in request.form else '', number_of_results=0, error_message=error_message, - override_theme='__common__', ) return Response(response_rss, mimetype='text/xml') @@ -841,7 +817,6 @@ def search(): suggestions=result_container.suggestions, q=request.form['q'], number_of_results=number_of_results, - override_theme='__common__', ) return Response(response_rss, mimetype='text/xml') @@ -886,8 +861,6 @@ def search(): settings['search']['languages'], fallback=request.preferences.get_value("language") ), - theme = get_current_theme_name(), - favicons = global_favicons[themes.index(get_current_theme_name())], timeout_limit = request.form.get('timeout_limit', None) # fmt: on ) @@ -984,8 +957,7 @@ def autocompleter(): suggestions = json.dumps([sug_prefix, results]) mimetype = 'application/x-suggestions+json' - if get_current_theme_name() == 'simple': - suggestions = escape(suggestions, False) + suggestions = escape(suggestions, False) return Response(suggestions, mimetype=mimetype) @@ -1132,7 +1104,6 @@ def preferences(): doi_resolvers = settings['doi_resolvers'], current_doi_resolver = get_doi_resolver(request.preferences), allowed_plugins = allowed_plugins, - theme = get_current_theme_name(), preferences_url_params = request.preferences.get_as_url_params(), locked_preferences = settings['preferences']['lock'], preferences = True @@ -1334,7 +1305,9 @@ def opensearch(): if request.headers.get('User-Agent', '').lower().find('webkit') >= 0: method = 'get' - ret = render('opensearch.xml', opensearch_method=method, override_theme='__common__') + autocomplete = request.preferences.get_value('autocomplete') + + ret = render('opensearch.xml', opensearch_method=method, autocomplete=autocomplete) resp = Response(response=ret, status=200, mimetype="application/opensearchdescription+xml") return resp @@ -1342,8 +1315,9 @@ def opensearch(): @app.route('/favicon.ico') def favicon(): + theme = request.preferences.get_value("theme") return send_from_directory( - os.path.join(app.root_path, settings['ui']['static_path'], 'themes', get_current_theme_name(), 'img'), + os.path.join(app.root_path, settings['ui']['static_path'], 'themes', theme, 'img'), 'favicon.png', mimetype='image/vnd.microsoft.icon', ) diff --git a/searx/webutils.py b/searx/webutils.py index 5be721eec..b18fd5c6a 100644 --- a/searx/webutils.py +++ b/searx/webutils.py @@ -53,10 +53,7 @@ class UnicodeWriter: def get_themes(templates_path): """Returns available themes list.""" - themes = os.listdir(templates_path) - if '__common__' in themes: - themes.remove('__common__') - return themes + return os.listdir(templates_path) def get_hash_for_file(file: pathlib.Path) -> str: diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py index bb09e591e..558cc6bb3 100644 --- a/tests/unit/test_webapp.py +++ b/tests/unit/test_webapp.py @@ -7,6 +7,7 @@ from searx.results import Timing import searx.search.processors from searx.search import Search +from searx.preferences import Preferences from tests import SearxTestCase @@ -77,12 +78,14 @@ class ViewsTestCase(SearxTestCase): self.setattr4test(Search, 'search', search_mock) - def get_current_theme_name_mock(override=None): - if override: - return override - return 'simple' + original_preferences_get_value = Preferences.get_value - self.setattr4test(webapp, 'get_current_theme_name', get_current_theme_name_mock) + def preferences_get_value(preferences_self, user_setting_name: str): + if user_setting_name == 'theme': + return 'simple' + return original_preferences_get_value(preferences_self, user_setting_name) + + self.setattr4test(Preferences, 'get_value', preferences_get_value) self.maxDiff = None # to see full diffs diff --git a/utils/lib_static.sh b/utils/lib_static.sh index c8a379fb3..754531700 100755 --- a/utils/lib_static.sh +++ b/utils/lib_static.sh @@ -8,7 +8,7 @@ STATIC_BUILT_PATHS=( 'searx/static/themes/simple/js' 'searx/static/themes/simple/src/generated/pygments.less' 'searx/static/themes/simple/img' - 'searx/templates/__common__/searxng-wordmark.min.svg' + 'searx/templates/simple/searxng-wordmark.min.svg' 'searx/templates/simple/icons.html' ) |