[enh] introduce categories_as_tabs

Previously all categories were displayed as search engine tabs.
This commit changes that so that only the categories listed under
categories_as_tabs in settings.yml are displayed.

This lets us introduce more categories without cluttering up the UI.
Categories not displayed as tabs  can still be searched with !bangs.
This commit is contained in:
Martin Fischer 2021-12-22 15:51:26 +01:00
parent 02e9bdf755
commit 8e9ad1ccc2
12 changed files with 82 additions and 29 deletions

View file

@ -13,6 +13,7 @@ usage::
import sys
import copy
import itertools
from os.path import realpath, dirname
from babel.localedata import locale_identifiers
@ -260,3 +261,26 @@ 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']]
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,
)
]