From 67cbdb9ad1c8d43fb3cbe87c9c9076e17ad8161d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 23 Feb 2013 17:03:27 +0530 Subject: [PATCH] Replace use of strcmp() for sorting with sort_key() --- src/calibre/db/backend.py | 6 ++++-- src/calibre/devices/kobo/books.py | 7 +++---- src/calibre/devices/usbms/books.py | 7 +++---- src/calibre/library/sqlite.py | 5 +++-- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index c70c656f78..61ee2e3a18 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -20,7 +20,7 @@ from calibre.ptempfile import PersistentTemporaryFile from calibre.db.schema_upgrades import SchemaUpgrade from calibre.library.field_metadata import FieldMetadata from calibre.ebooks.metadata import title_sort, author_to_author_sort -from calibre.utils.icu import strcmp +from calibre.utils.icu import sort_key from calibre.utils.config import to_json, from_json, prefs, tweaks from calibre.utils.date import utcfromtimestamp, parse_date from calibre.utils.filenames import (is_case_sensitive, samefile, hardlink_file) @@ -172,7 +172,9 @@ def _author_to_author_sort(x): return author_to_author_sort(x.replace('|', ',')) def icu_collator(s1, s2): - return strcmp(force_unicode(s1, 'utf-8'), force_unicode(s2, 'utf-8')) + return cmp(sort_key(force_unicode(s1, 'utf-8')), + sort_key(force_unicode(s2, 'utf-8'))) + # }}} # Unused aggregators {{{ diff --git a/src/calibre/devices/kobo/books.py b/src/calibre/devices/kobo/books.py index fc18a61fc8..fb502bccac 100644 --- a/src/calibre/devices/kobo/books.py +++ b/src/calibre/devices/kobo/books.py @@ -6,7 +6,7 @@ import os, time, sys from calibre.constants import preferred_encoding, DEBUG from calibre import isbytestring, force_unicode -from calibre.utils.icu import strcmp +from calibre.utils.icu import sort_key from calibre.devices.usbms.books import Book as Book_ from calibre.devices.usbms.books import CollectionsBookList @@ -239,9 +239,8 @@ class KTCollectionsBookList(CollectionsBookList): if y is None: return -1 if isinstance(x, basestring) and isinstance(y, basestring): - c = strcmp(force_unicode(x), force_unicode(y)) - else: - c = cmp(x, y) + x, y = sort_key(force_unicode(x)), sort_key(force_unicode(y)) + c = cmp(x, y) if c != 0: return c # same as above -- no sort_key needed here diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 7d6377ca96..97527a92ed 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -13,7 +13,7 @@ from calibre.devices.interface import BookList as _BookList from calibre.constants import preferred_encoding from calibre import isbytestring, force_unicode from calibre.utils.config import device_prefs, tweaks -from calibre.utils.icu import strcmp +from calibre.utils.icu import sort_key from calibre.utils.formatter import EvalFormatter class Book(Metadata): @@ -281,9 +281,8 @@ class CollectionsBookList(BookList): if y is None: return -1 if isinstance(x, basestring) and isinstance(y, basestring): - c = strcmp(force_unicode(x), force_unicode(y)) - else: - c = cmp(x, y) + x, y = sort_key(force_unicode(x)), sort_key(force_unicode(y)) + c = cmp(x, y) if c != 0: return c # same as above -- no sort_key needed here diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index 90d293ba64..2e438ceb55 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -20,7 +20,7 @@ from calibre.ebooks.metadata import title_sort, author_to_author_sort from calibre.utils.date import parse_date, isoformat, local_tz, UNDEFINED_DATE from calibre import isbytestring, force_unicode from calibre.constants import iswindows, DEBUG, plugins -from calibre.utils.icu import strcmp +from calibre.utils.icu import sort_key from calibre import prints from dateutil.tz import tzoffset @@ -189,7 +189,8 @@ def pynocase(one, two, encoding='utf-8'): return cmp(one.lower(), two.lower()) def icu_collator(s1, s2): - return strcmp(force_unicode(s1, 'utf-8'), force_unicode(s2, 'utf-8')) + return cmp(sort_key(force_unicode(s1, 'utf-8')), + sort_key(force_unicode(s2, 'utf-8'))) def load_c_extensions(conn, debug=DEBUG): try: