|  | @@ -17,7 +17,7 @@ from timeit import default_timer
 | 
											
												
													
														|  |  from html import escape
 |  |  from html import escape
 | 
											
												
													
														|  |  from io import StringIO
 |  |  from io import StringIO
 | 
											
												
													
														|  |  import typing
 |  |  import typing
 | 
											
												
													
														|  | -from typing import List, Dict, Iterable, Optional
 |  | 
 | 
											
												
													
														|  | 
 |  | +from typing import List, Dict, Iterable
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  import urllib
 |  |  import urllib
 | 
											
												
													
														|  |  import urllib.parse
 |  |  import urllib.parse
 | 
											
										
											
												
													
														|  | @@ -140,12 +140,6 @@ default_theme = settings['ui']['default_theme']
 | 
											
												
													
														|  |  templates_path = settings['ui']['templates_path']
 |  |  templates_path = settings['ui']['templates_path']
 | 
											
												
													
														|  |  themes = get_themes(templates_path)
 |  |  themes = get_themes(templates_path)
 | 
											
												
													
														|  |  result_templates = get_result_templates(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 = {
 |  |  STATS_SORT_PARAMETERS = {
 | 
											
												
													
														|  |      'name': (False, 'name', ''),
 |  |      'name': (False, 'name', ''),
 | 
											
										
											
												
													
														|  | @@ -327,24 +321,6 @@ def code_highlighter(codelines, language=None):
 | 
											
												
													
														|  |      return html_code
 |  |      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):
 |  |  def get_result_template(theme_name: str, template_name: str):
 | 
											
												
													
														|  |      themed_path = theme_name + '/result_templates/' + template_name
 |  |      themed_path = theme_name + '/result_templates/' + template_name
 | 
											
												
													
														|  |      if themed_path in result_templates:
 |  |      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
 |  |      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 = ""
 |  |      suffix = ""
 | 
											
												
													
														|  |      if endpoint == 'static' and values.get('filename'):
 |  |      if endpoint == 'static' and values.get('filename'):
 | 
											
												
													
														|  |          file_hash = static_files.get(values['filename'])
 |  |          file_hash = static_files.get(values['filename'])
 | 
											
												
													
														|  |          if not file_hash:
 |  |          if not file_hash:
 | 
											
												
													
														|  |              # try file in the current theme
 |  |              # 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'])
 |  |              filename_with_theme = "themes/{}/{}".format(theme_name, values['filename'])
 | 
											
												
													
														|  |              file_hash = static_files.get(filename_with_theme)
 |  |              file_hash = static_files.get(filename_with_theme)
 | 
											
												
													
														|  |              if file_hash:
 |  |              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(
 |  |      kwargs['client_settings'] = str(
 | 
											
												
													
														|  |          base64.b64encode(
 |  |          base64.b64encode(
 | 
											
										
											
												
													
														|  | @@ -471,12 +447,6 @@ def render(template_name: str, override_theme: str = None, **kwargs):
 | 
											
												
													
														|  |          encoding='utf-8',
 |  |          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
 |  |      # values from the HTTP requests
 | 
											
												
													
														|  |      kwargs['endpoint'] = 'results' if 'q' in kwargs else request.endpoint
 |  |      kwargs['endpoint'] = 'results' if 'q' in kwargs else request.endpoint
 | 
											
												
													
														|  |      kwargs['cookies'] = request.cookies
 |  |      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['advanced_search'] = request.preferences.get_value('advanced_search')
 | 
											
												
													
														|  |      kwargs['query_in_title'] = request.preferences.get_value('query_in_title')
 |  |      kwargs['query_in_title'] = request.preferences.get_value('query_in_title')
 | 
											
												
													
														|  |      kwargs['safesearch'] = str(request.preferences.get_value('safesearch'))
 |  |      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_as_tabs'] = list(settings['categories_as_tabs'].keys())
 | 
											
												
													
														|  |      kwargs['categories'] = _get_enable_categories(categories.keys())
 |  |      kwargs['categories'] = _get_enable_categories(categories.keys())
 | 
											
												
													
														|  |      kwargs['OTHER_CATEGORY'] = OTHER_CATEGORY
 |  |      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['proxify_results'] = settings.get('result_proxy', {}).get('proxify_results', True)
 | 
											
												
													
														|  |      kwargs['get_result_template'] = get_result_template
 |  |      kwargs['get_result_template'] = get_result_template
 | 
											
												
													
														|  |      kwargs['opensearch_url'] = (
 |  |      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
 |  |      # 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 '',
 |  |              q=request.form['q'] if 'q' in request.form else '',
 | 
											
												
													
														|  |              number_of_results=0,
 |  |              number_of_results=0,
 | 
											
												
													
														|  |              error_message=error_message,
 |  |              error_message=error_message,
 | 
											
												
													
														|  | -            override_theme='__common__',
 |  | 
 | 
											
												
													
														|  |          )
 |  |          )
 | 
											
												
													
														|  |          return Response(response_rss, mimetype='text/xml')
 |  |          return Response(response_rss, mimetype='text/xml')
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -841,7 +817,6 @@ def search():
 | 
											
												
													
														|  |              suggestions=result_container.suggestions,
 |  |              suggestions=result_container.suggestions,
 | 
											
												
													
														|  |              q=request.form['q'],
 |  |              q=request.form['q'],
 | 
											
												
													
														|  |              number_of_results=number_of_results,
 |  |              number_of_results=number_of_results,
 | 
											
												
													
														|  | -            override_theme='__common__',
 |  | 
 | 
											
												
													
														|  |          )
 |  |          )
 | 
											
												
													
														|  |          return Response(response_rss, mimetype='text/xml')
 |  |          return Response(response_rss, mimetype='text/xml')
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -886,8 +861,6 @@ def search():
 | 
											
												
													
														|  |              settings['search']['languages'],
 |  |              settings['search']['languages'],
 | 
											
												
													
														|  |              fallback=request.preferences.get_value("language")
 |  |              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)
 |  |          timeout_limit = request.form.get('timeout_limit', None)
 | 
											
												
													
														|  |          # fmt: on
 |  |          # fmt: on
 | 
											
												
													
														|  |      )
 |  |      )
 | 
											
										
											
												
													
														|  | @@ -984,8 +957,7 @@ def autocompleter():
 | 
											
												
													
														|  |          suggestions = json.dumps([sug_prefix, results])
 |  |          suggestions = json.dumps([sug_prefix, results])
 | 
											
												
													
														|  |          mimetype = 'application/x-suggestions+json'
 |  |          mimetype = 'application/x-suggestions+json'
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    if get_current_theme_name() == 'simple':
 |  | 
 | 
											
												
													
														|  | -        suggestions = escape(suggestions, False)
 |  | 
 | 
											
												
													
														|  | 
 |  | +    suggestions = escape(suggestions, False)
 | 
											
												
													
														|  |      return Response(suggestions, mimetype=mimetype)
 |  |      return Response(suggestions, mimetype=mimetype)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -1132,7 +1104,6 @@ def preferences():
 | 
											
												
													
														|  |          doi_resolvers = settings['doi_resolvers'],
 |  |          doi_resolvers = settings['doi_resolvers'],
 | 
											
												
													
														|  |          current_doi_resolver = get_doi_resolver(request.preferences),
 |  |          current_doi_resolver = get_doi_resolver(request.preferences),
 | 
											
												
													
														|  |          allowed_plugins = allowed_plugins,
 |  |          allowed_plugins = allowed_plugins,
 | 
											
												
													
														|  | -        theme = get_current_theme_name(),
 |  | 
 | 
											
												
													
														|  |          preferences_url_params = request.preferences.get_as_url_params(),
 |  |          preferences_url_params = request.preferences.get_as_url_params(),
 | 
											
												
													
														|  |          locked_preferences = settings['preferences']['lock'],
 |  |          locked_preferences = settings['preferences']['lock'],
 | 
											
												
													
														|  |          preferences = True
 |  |          preferences = True
 | 
											
										
											
												
													
														|  | @@ -1334,7 +1305,9 @@ def opensearch():
 | 
											
												
													
														|  |      if request.headers.get('User-Agent', '').lower().find('webkit') >= 0:
 |  |      if request.headers.get('User-Agent', '').lower().find('webkit') >= 0:
 | 
											
												
													
														|  |          method = 'get'
 |  |          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")
 |  |      resp = Response(response=ret, status=200, mimetype="application/opensearchdescription+xml")
 | 
											
												
													
														|  |      return resp
 |  |      return resp
 | 
											
										
											
												
													
														|  | @@ -1342,8 +1315,9 @@ def opensearch():
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  @app.route('/favicon.ico')
 |  |  @app.route('/favicon.ico')
 | 
											
												
													
														|  |  def favicon():
 |  |  def favicon():
 | 
											
												
													
														|  | 
 |  | +    theme = request.preferences.get_value("theme")
 | 
											
												
													
														|  |      return send_from_directory(
 |  |      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',
 |  |          'favicon.png',
 | 
											
												
													
														|  |          mimetype='image/vnd.microsoft.icon',
 |  |          mimetype='image/vnd.microsoft.icon',
 | 
											
												
													
														|  |      )
 |  |      )
 |