diff --git a/src/calibre/db/categories.py b/src/calibre/db/categories.py index 67fb18b841..deac2094cc 100644 --- a/src/calibre/db/categories.py +++ b/src/calibre/db/categories.py @@ -118,12 +118,14 @@ def clean_user_categories(dbcache): numeric_collation = prefs['numeric_collation'] -def first_digit(x): - c = icu_upper(x.sort or x.name or ' ')[0] +def sort_key_for_name_and_first_letter(x): + v1 = icu_upper(x.sort or x.name) + v2 = v1 or ' ' # The idea is that '9999999999' is larger than any digit so all digits # will sort in front. Non-digits will sort according to their ICU first letter - return c if numeric_collation and c.isdigit() else '9999999999' - + c = v2[0] + return (c if numeric_collation and c.isdigit() else '9999999999', + collation_order(v2), sort_key(v1)) category_sort_keys = {True:{}, False: {}} category_sort_keys[True]['popularity'] = category_sort_keys[False]['popularity'] = \ @@ -131,7 +133,7 @@ category_sort_keys[True]['popularity'] = category_sort_keys[False]['popularity'] category_sort_keys[True]['rating'] = category_sort_keys[False]['rating'] = \ lambda x:(-getattr(x, 'avg_rating', 0.0), sort_key(x.sort or x.name)) category_sort_keys[True]['name'] = \ - lambda x:(first_digit(x), collation_order(icu_upper(x.sort or x.name or ' ')), sort_key(x.sort or x.name)) + sort_key_for_name_and_first_letter category_sort_keys[False]['name'] = \ lambda x:sort_key(x.sort or x.name)