diff --git a/docs/conf.py b/docs/conf.py index da989e62e..62b541f2f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -39,6 +39,7 @@ exclude_patterns = ['build-templates/*.rst'] import searx.engines import searx.plugins +import searx.webutils searx.engines.load_engines(searx.settings['engines']) jinja_contexts = { @@ -54,7 +55,7 @@ jinja_contexts = { }, } jinja_filters = { - 'group_engines_in_tab': searx.engines.group_engines_in_tab, + 'group_engines_in_tab': searx.webutils.group_engines_in_tab, } # Let the Jinja template in configured_engines.rst access documented_modules diff --git a/searx/engines/__init__.py b/searx/engines/__init__.py index 9472186bf..70f6281a6 100644 --- a/searx/engines/__init__.py +++ b/searx/engines/__init__.py @@ -13,7 +13,6 @@ usage:: import sys import copy -import itertools from os.path import realpath, dirname from babel.localedata import locale_identifiers @@ -267,26 +266,3 @@ def load_engines(engine_list): if engine: register_engine(engine) return engines - - -DEFAULT_GROUP_NAME = 'others' - - -def group_engines_in_tab(engines): # pylint: disable=redefined-outer-name - def engine_sort_key(engine): - return (engine.about.get('language', ''), engine.name) - - def group_sort_key(group): - return (group[0] == DEFAULT_GROUP_NAME, group[0].lower()) - - def get_group(eng): - non_tab_engines = [c for c in eng.categories if c not in settings['categories_as_tabs'] + [OTHER_CATEGORY]] - return non_tab_engines[0] if len(non_tab_engines) > 0 else DEFAULT_GROUP_NAME - - return [ - (groupname, sorted(engines, key=engine_sort_key)) - for groupname, engines in sorted( - ((name, list(engines)) for name, engines in itertools.groupby(sorted(engines, key=get_group), get_group)), - key=group_sort_key, - ) - ] diff --git a/searx/webapp.py b/searx/webapp.py index c0467932e..b40aa912e 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -60,11 +60,9 @@ from searx.settings_loader import get_default_settings_path from searx.exceptions import SearxParameterException from searx.engines import ( OTHER_CATEGORY, - DEFAULT_GROUP_NAME, categories, engines, engine_shortcuts, - group_engines_in_tab, ) from searx.webutils import ( UnicodeWriter, @@ -76,6 +74,8 @@ from searx.webutils import ( new_hmac, is_hmac_of, is_flask_run_cmdline, + DEFAULT_GROUP_NAME, + group_engines_in_tab, ) from searx.webadapter import ( get_search_query_from_webapp, diff --git a/searx/webutils.py b/searx/webutils.py index 068582858..4b4b0a965 100644 --- a/searx/webutils.py +++ b/searx/webutils.py @@ -5,11 +5,13 @@ import hashlib import hmac import re import inspect +import itertools from io import StringIO from codecs import getincrementalencoder -from searx import logger +from searx import logger, settings +from searx.engines import OTHER_CATEGORY VALID_LANGUAGE_CODE = re.compile(r'^[a-z]{2,3}(-[a-zA-Z]{2})?$') @@ -134,3 +136,26 @@ def is_flask_run_cmdline(): if len(frames) < 2: return False return frames[-2].filename.endswith('flask/cli.py') + + +DEFAULT_GROUP_NAME = 'others' + + +def group_engines_in_tab(engines): + def engine_sort_key(engine): + return (engine.about.get('language', ''), engine.name) + + def group_sort_key(group): + return (group[0] == DEFAULT_GROUP_NAME, group[0].lower()) + + def get_group(eng): + non_tab_engines = [c for c in eng.categories if c not in settings['categories_as_tabs'] + [OTHER_CATEGORY]] + return non_tab_engines[0] if len(non_tab_engines) > 0 else DEFAULT_GROUP_NAME + + return [ + (groupname, sorted(engines, key=engine_sort_key)) + for groupname, engines in sorted( + ((name, list(engines)) for name, engines in itertools.groupby(sorted(engines, key=get_group), get_group)), + key=group_sort_key, + ) + ]