From 917c2ec205999477a717cbbdf260a28dbb89cc10 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 15 Jul 2011 20:51:48 -0600 Subject: [PATCH] ... --- session.vim | 2 +- setup/check.py | 3 --- src/calibre/db/cache.py | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/session.vim b/session.vim index e9c8185a4e..eb4697a317 100644 --- a/session.vim +++ b/session.vim @@ -15,7 +15,7 @@ vipy.session.initialize(project_name='calibre', src_dir=src_dir, project_dir=project_dir, base_dir=base_dir) def recipe_title_callback(raw): - return eval(raw.decode('utf-8')) + return eval(raw.decode('utf-8')).replace(' ', '_') vipy.session.add_content_browser('.r', ',r', 'Recipe', vipy.session.glob_based_iterator(os.path.join(project_dir, 'recipes', '*.recipe')), diff --git a/setup/check.py b/setup/check.py index 65202da712..6c0acd78ae 100644 --- a/setup/check.py +++ b/setup/check.py @@ -47,9 +47,6 @@ def check_for_python_errors(code_string, filename): # Okay, it's syntactically valid. Now check it. w = checker.Checker(tree, filename) w.messages.sort(lambda a, b: cmp(a.lineno, b.lineno)) - for warning in w.messages: - print warning - print (dir(warning)) return [Message(x.filename, x.lineno, x.message%x.message_args) for x in w.messages] diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 063a5b5511..3566463663 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -62,6 +62,10 @@ class Cache(object): lock = self.read_lock if ira else self.write_lock setattr(self, name, wrap_simple(lock, func)) + @property + def field_metadata(self): + return self.backend.field_metadata + def _format_abspath(self, book_id, fmt): ''' Return absolute path to the ebook file of format `format` @@ -335,6 +339,43 @@ class Cache(object): return self.backend.cover(path, as_file=as_file, as_image=as_image, as_path=as_path) + @api + def sanitize_sort_field_name(self, field): + field = self.field_metadata.search_term_to_field_key(field.lower().strip()) + # translate some fields to their hidden equivalent + field = {'title': 'sort', 'authors':'author_sort'}.get(field, field) + return field + + @read_api + def sort(self, field, ascending, subsort=False): + self._multisort([(field, ascending)]) + + @read_api + def multisort(self, fields=[], subsort=False): + fields = [(self.sanitize_sort_field_name(x), bool(y)) for x, y in fields] + keys = self.field_metadata.sortable_field_keys() + fields = [x for x in fields if x[0] in keys] + if subsort and 'sort' not in [x[0] for x in fields]: + fields += [('sort', True)] + if not fields: + fields = [('timestamp', False)] + + all_book_ids = frozenset(self._all_book_ids()) + get_metadata = partial(self._get_metadata, get_user_categories=False) + + book_lists = tuple(self.field[field].sort_books(get_metadata, all_book_ids, + ascending=ascending) for field, ascending in fields) + if len(book_lists) == 1: + return book_lists[0] + else: + book_maps = tuple({id_:idx for idx, id_ in enumerate(x)} for x in + book_lists) + + def sort_key(book_id): + return tuple(d.get(book_id, -1) for d in book_maps) + + return sorted(all_book_ids, key=sort_key) + # }}} # Testing {{{