From 1e195f5b95d4c59105249d66f5d170d40139a461 Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Mon, 3 Jan 2022 07:24:20 +0100 Subject: [mod] move group_engines_in_tab to searx.webutils --- searx/webutils.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'searx/webutils.py') 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, + ) + ] -- cgit v1.2.3 From 6f07d51b62ebb39616ab3cf9bc2dede26229b300 Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Mon, 3 Jan 2022 07:27:57 +0100 Subject: [mod] improve variable name --- searx/webutils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'searx/webutils.py') diff --git a/searx/webutils.py b/searx/webutils.py index 4b4b0a965..b99307600 100644 --- a/searx/webutils.py +++ b/searx/webutils.py @@ -149,8 +149,8 @@ def group_engines_in_tab(engines): 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 + non_tab_categories = [c for c in eng.categories if c not in settings['categories_as_tabs'] + [OTHER_CATEGORY]] + return non_tab_categories[0] if len(non_tab_categories) > 0 else DEFAULT_GROUP_NAME return [ (groupname, sorted(engines, key=engine_sort_key)) -- cgit v1.2.3 From 3dd534e5c0017670a1e8ed12acfdfead4f2bcd0f Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Tue, 4 Jan 2022 13:39:06 +0100 Subject: [refactor] make group_engines_in_tab more readable --- searx/webutils.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) (limited to 'searx/webutils.py') diff --git a/searx/webutils.py b/searx/webutils.py index b99307600..4c3073aac 100644 --- a/searx/webutils.py +++ b/searx/webutils.py @@ -6,12 +6,13 @@ import hmac import re import inspect import itertools +from typing import Iterable, List, Tuple from io import StringIO from codecs import getincrementalencoder from searx import logger, settings -from searx.engines import OTHER_CATEGORY +from searx.engines import Engine, OTHER_CATEGORY VALID_LANGUAGE_CODE = re.compile(r'^[a-z]{2,3}(-[a-zA-Z]{2})?$') @@ -141,21 +142,21 @@ def is_flask_run_cmdline(): 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 group_engines_in_tab(engines: Iterable[Engine]) -> List[Tuple[str, Iterable[Engine]]]: + """Groups an Iterable of engines by their first non tab category""" def get_group(eng): non_tab_categories = [c for c in eng.categories if c not in settings['categories_as_tabs'] + [OTHER_CATEGORY]] return non_tab_categories[0] if len(non_tab_categories) > 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, - ) - ] + groups = itertools.groupby(sorted(engines, key=get_group), get_group) + + def group_sort_key(group): + return (group[0] == DEFAULT_GROUP_NAME, group[0].lower()) + + sorted_groups = sorted(((name, list(engines)) for name, engines in groups), key=group_sort_key) + + def engine_sort_key(engine): + return (engine.about.get('language', ''), engine.name) + + return [(groupname, sorted(engines, key=engine_sort_key)) for groupname, engines in sorted_groups] -- cgit v1.2.3 From a4c2cfb837a3f92e2c0f0b8a0bac7a6e03499640 Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Tue, 4 Jan 2022 18:00:45 +0100 Subject: [enh] change categories_as_tabs from a list to a dict The tab icon names are currently hard coded in the templates. This commit lets us introduce an icon property in the future, e.g: categories_as_tabs: general: icon: search-outline --- searx/webutils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'searx/webutils.py') diff --git a/searx/webutils.py b/searx/webutils.py index 4c3073aac..0c0854dfc 100644 --- a/searx/webutils.py +++ b/searx/webutils.py @@ -146,7 +146,9 @@ def group_engines_in_tab(engines: Iterable[Engine]) -> List[Tuple[str, Iterable[ """Groups an Iterable of engines by their first non tab category""" def get_group(eng): - non_tab_categories = [c for c in eng.categories if c not in settings['categories_as_tabs'] + [OTHER_CATEGORY]] + non_tab_categories = [ + c for c in eng.categories if c not in list(settings['categories_as_tabs'].keys()) + [OTHER_CATEGORY] + ] return non_tab_categories[0] if len(non_tab_categories) > 0 else DEFAULT_GROUP_NAME groups = itertools.groupby(sorted(engines, key=get_group), get_group) -- cgit v1.2.3