From 79a6ab5d944ee408af15859cf1ed6b1f3eed024f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 24 Oct 2021 15:46:31 +0530 Subject: [PATCH] Add a function to generation collation order for partitioning --- src/calibre/utils/icu.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 1a52db161a..b3e2cba5b3 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -13,7 +13,7 @@ from calibre.utils.config_base import tweaks from calibre_extensions import icu as _icu from polyglot.builtins import cmp -_locale = _collator = _primary_collator = _sort_collator = _numeric_collator = _case_sensitive_collator = None +_locale = _collator = _primary_collator = _sort_collator = _non_numeric_sort_collator = _numeric_collator = _case_sensitive_collator = None cmp _none = '' @@ -67,8 +67,8 @@ def collator(): def change_locale(locale=None): - global _locale, _collator, _primary_collator, _sort_collator, _numeric_collator, _case_sensitive_collator - _collator = _primary_collator = _sort_collator = _numeric_collator = _case_sensitive_collator = None + global _locale, _collator, _primary_collator, _sort_collator, _numeric_collator, _case_sensitive_collator, _non_numeric_sort_collator + _collator = _primary_collator = _sort_collator = _numeric_collator = _case_sensitive_collator = _non_numeric_sort_collator = None _locale = locale @@ -91,6 +91,16 @@ def sort_collator(): return _sort_collator +def non_numeric_sort_collator(): + 'Ignores case differences only' + global _non_numeric_sort_collator + if _non_numeric_sort_collator is None: + _non_numeric_sort_collator = collator().clone() + _non_numeric_sort_collator.strength = _icu.UCOL_SECONDARY + _sort_collator.numeric = False + return _sort_collator + + def numeric_collator(): 'Uses natural sorting for numbers inside strings so something2 will sort before something10' global _numeric_collator @@ -191,6 +201,7 @@ numeric_sort_key = make_sort_key_func(numeric_collator) primary_sort_key = make_sort_key_func(primary_collator) case_sensitive_sort_key = make_sort_key_func(case_sensitive_collator) collation_order = make_sort_key_func(sort_collator, 'collation_order') +collation_order_for_partitioning = make_sort_key_func(non_numeric_sort_collator, 'collation_order') strcmp = make_two_arg_func(sort_collator) case_sensitive_strcmp = make_two_arg_func(case_sensitive_collator)