def sort_key_for_action(ac): q = getattr(ac, 'action_spec', None) try: q = ac.name if q is None else q[0] return primary_sort_key(force_unicode(q)) except Exception: return primary_sort_key(u'')
def sort_key_for_action(ac): q = getattr(ac, 'action_spec', None) try: q = ac.name if q is None else q[0] return primary_sort_key(force_unicode(q)) except Exception: return primary_sort_key('')
def test_sorting(self): " Test the various sorting APIs " german = """Sonntag Montag Dienstag Januar Februar März Fuße Fluße Flusse flusse fluße flüße flüsse""".split() german_good = ( """Dienstag Februar flusse Flusse fluße Fluße flüsse flüße Fuße Januar März Montag Sonntag""".split() ) french = """dimanche lundi mardi janvier février mars déjà Meme deja même dejà bpef bœg Boef Mémé bœf boef bnef pêche pèché pêché pêche pêché""".split() french_good = """bnef boef Boef bœf bœg bpef deja dejà déjà dimanche février janvier lundi mardi mars Meme Mémé même pèché pêche pêche pêché pêché""".split() # noqa # Test corner cases sort_key = icu.sort_key s = "\U0001f431" self.ae( sort_key(s), sort_key(s.encode(sys.getdefaultencoding())), "UTF-8 encoded object not correctly decoded to generate sort key", ) self.ae(s.encode("utf-16"), s.encode("utf-16"), "Undecodable bytestring not returned as itself") self.ae(b"", sort_key(None)) self.ae(0, icu.strcmp(None, b"")) self.ae(0, icu.strcmp(s, s.encode(sys.getdefaultencoding()))) # Test locales with make_collation_func("dsk", "de", func="sort_key") as dsk: self.ae(german_good, sorted(german, key=dsk)) with make_collation_func("dcmp", "de", template="_strcmp_template") as dcmp: for x in german: for y in german: self.ae(cmp(dsk(x), dsk(y)), dcmp(x, y)) with make_collation_func("fsk", "fr", func="sort_key") as fsk: self.ae(french_good, sorted(french, key=fsk)) with make_collation_func("fcmp", "fr", template="_strcmp_template") as fcmp: for x in french: for y in french: self.ae(cmp(fsk(x), fsk(y)), fcmp(x, y)) with make_collation_func("ssk", "es", func="sort_key") as ssk: self.assertNotEqual(ssk("peña"), ssk("pena")) with make_collation_func("scmp", "es", template="_strcmp_template") as scmp: self.assertNotEqual(0, scmp("pena", "peña")) for k, v in {"pèché": "peche", "flüße": "Flusse", "Štepánek": "ŠtepaneK"}.iteritems(): self.ae(0, icu.primary_strcmp(k, v)) # Test different types of collation self.ae(icu.primary_sort_key("Aä"), icu.primary_sort_key("aa")) self.assertLess(icu.numeric_sort_key("something 2"), icu.numeric_sort_key("something 11")) self.assertLess(icu.case_sensitive_sort_key("A"), icu.case_sensitive_sort_key("a")) self.ae(0, icu.strcmp("a", "A")) self.ae(cmp("a", "A"), icu.case_sensitive_strcmp("a", "A")) self.ae(0, icu.primary_strcmp("ä", "A"))
def __call__(self, query, limit=None): query = normalize('NFC', str(query)) with wlock: for i, scorer in enumerate(self.scorers): workers[0].requests.put((i, scorer, query)) if self.sort_keys is None: self.sort_keys = { i: primary_sort_key(x) for i, x in enumerate(self.items) } num = len(self.task_maps) scores, positions = {}, {} error = None while num > 0: ok, x = workers[0].results.get() num -= 1 if ok: task_num, vals = x task_map = self.task_maps[task_num] for i, (score, pos) in enumerate(vals): item = task_map[i] scores[item] = score positions[item] = pos else: error = x if error is not None: raise Exception('Failed to score items: %s' % error) items = sorted(((-scores[i], item, positions[i]) for i, item in enumerate(self.items)), key=itemgetter(0)) if limit is not None: del items[limit:] return OrderedDict(x[1:] for x in filter(itemgetter(0), items))
def set_bookmarks(self, bookmarks=()): csb = self.current_sort_by if csb in ('name', 'title'): sk = lambda x: primary_sort_key(x['title']) elif csb == 'timestamp': sk = itemgetter('timestamp') else: from calibre.ebooks.epub.cfi.parse import cfi_sort_key defval = cfi_sort_key('/99999999') def pos_key(b): if b.get('pos_type') == 'epubcfi': return cfi_sort_key(b['pos'], only_path=False) return defval sk = pos_key bookmarks = sorted(bookmarks, key=sk) current_bookmark_id = self.current_bookmark_id self.bookmarks_list.clear() for bm in bookmarks: i = QListWidgetItem(bm['title']) i.setData(Qt.ItemDataRole.ToolTipRole, bm['title']) i.setData(Qt.ItemDataRole.UserRole, self.bm_to_item(bm)) i.setFlags(i.flags() | Qt.ItemFlag.ItemIsEditable) self.bookmarks_list.addItem(i) if bm.get('removed'): i.setHidden(True) for i in range(self.bookmarks_list.count()): item = self.bookmarks_list.item(i) if not item.isHidden(): self.bookmarks_list.setCurrentItem(item, QItemSelectionModel.SelectionFlag.ClearAndSelect) break if current_bookmark_id is not None: self.current_bookmark_id = current_bookmark_id
def items(self, val): self.clear() checked_libraries = frozenset(val) library_paths = load_gui_libraries(gprefs) gui_libraries = {os.path.basename(l):l for l in library_paths} lchecked_libraries = {l.lower() for l in checked_libraries} seen = set() items = [] for x in checked_libraries | set(gui_libraries): xl = x.lower() if xl not in seen: seen.add(xl) items.append((x, xl in lchecked_libraries)) items.sort(key=lambda x: primary_sort_key(x[0])) enable_on_checked = self.atype.currentIndex() == 1 for i, (l, checked) in enumerate(items): l = Library( l, checked, path=gui_libraries.get(l, ''), restriction=self.library_restrictions.get(l.lower(), ''), parent=self.libraries, is_first=i == 0, enable_on_checked=enable_on_checked ) l.restriction_changed.connect(self.restriction_changed) self.libraries.l.addWidget(l) self._items.append(l)
def populate_layout_menu(self): m = self.layout_button.menu() m.clear() buttons = sorted(self.layout_buttons, key=lambda b: primary_sort_key(b.label)) for b in buttons: m.addAction(b.icon(), b.text(), b.click)
def __call__(self, query, limit=None): query = normalize('NFC', unicode_type(query)) with wlock: for i, scorer in enumerate(self.scorers): workers[0].requests.put((i, scorer, query)) if self.sort_keys is None: self.sort_keys = { i: primary_sort_key(x) for i, x in enumerate(self.items) } num = len(self.task_maps) scores, positions = {}, {} error = None while num > 0: ok, x = workers[0].results.get() num -= 1 if ok: task_num, vals = x task_map = self.task_maps[task_num] for i, (score, pos) in enumerate(vals): item = task_map[i] scores[item] = score positions[item] = pos else: error = x if error is not None: raise Exception('Failed to score items: %s' % error) items = sorted(((-scores[i], item, positions[i]) for i, item in enumerate(self.items)), key=itemgetter(0)) if limit is not None: del items[limit:] return OrderedDict(x[1:] for x in filter(itemgetter(0), items))
def test_sorting(self): ' Test the various sorting APIs ' german = '''Sonntag Montag Dienstag Januar Februar März Fuße Fluße Flusse flusse fluße flüße flüsse'''.split() german_good = '''Dienstag Februar flusse Flusse fluße Fluße flüsse flüße Fuße Januar März Montag Sonntag'''.split() french = '''dimanche lundi mardi janvier février mars déjà Meme deja même dejà bpef bœg Boef Mémé bœf boef bnef pêche pèché pêché pêche pêché'''.split() french_good = '''bnef boef Boef bœf bœg bpef deja dejà déjà dimanche février janvier lundi mardi mars Meme Mémé même pèché pêche pêche pêché pêché'''.split() # noqa # Test corner cases sort_key = icu.sort_key s = '\U0001f431' self.ae(sort_key(s), sort_key(s.encode(sys.getdefaultencoding())), 'UTF-8 encoded object not correctly decoded to generate sort key') self.ae(s.encode('utf-16'), s.encode('utf-16'), 'Undecodable bytestring not returned as itself') self.ae(b'', sort_key(None)) self.ae(0, icu.strcmp(None, b'')) self.ae(0, icu.strcmp(s, s.encode(sys.getdefaultencoding()))) # Test locales with make_collation_func('dsk', 'de', func='sort_key') as dsk: self.ae(german_good, sorted(german, key=dsk)) with make_collation_func('dcmp', 'de', template='_strcmp_template') as dcmp: for x in german: for y in german: self.ae(cmp(dsk(x), dsk(y)), dcmp(x, y)) with make_collation_func('fsk', 'fr', func='sort_key') as fsk: self.ae(french_good, sorted(french, key=fsk)) with make_collation_func('fcmp', 'fr', template='_strcmp_template') as fcmp: for x in french: for y in french: self.ae(cmp(fsk(x), fsk(y)), fcmp(x, y)) with make_collation_func('ssk', 'es', func='sort_key') as ssk: self.assertNotEqual(ssk('peña'), ssk('pena')) with make_collation_func('scmp', 'es', template='_strcmp_template') as scmp: self.assertNotEqual(0, scmp('pena', 'peña')) for k, v in iteritems({u'pèché': u'peche', u'flüße':u'Flusse', u'Štepánek':u'ŠtepaneK'}): self.ae(0, icu.primary_strcmp(k, v)) # Test different types of collation self.ae(icu.primary_sort_key('Aä'), icu.primary_sort_key('aa')) self.assertLess(icu.numeric_sort_key('something 2'), icu.numeric_sort_key('something 11')) self.assertLess(icu.case_sensitive_sort_key('A'), icu.case_sensitive_sort_key('a')) self.ae(0, icu.strcmp('a', 'A')) self.ae(cmp('a', 'A'), icu.case_sensitive_strcmp('a', 'A')) self.ae(0, icu.primary_strcmp('ä', 'A'))
def test_sorting(self): ' Test the various sorting APIs ' german = '''Sonntag Montag Dienstag Januar Februar März Fuße Fluße Flusse flusse fluße flüße flüsse'''.split() german_good = '''Dienstag Februar flusse Flusse fluße Fluße flüsse flüße Fuße Januar März Montag Sonntag'''.split() french = '''dimanche lundi mardi janvier février mars déjà Meme deja même dejà bpef bœg Boef Mémé bœf boef bnef pêche pèché pêché pêche pêché'''.split() french_good = '''bnef boef Boef bœf bœg bpef deja dejà déjà dimanche février janvier lundi mardi mars Meme Mémé même pèché pêche pêche pêché pêché'''.split() # noqa # Test corner cases sort_key = icu.sort_key s = '\U0001f431' self.ae(sort_key(s), sort_key(s.encode(sys.getdefaultencoding())), 'UTF-8 encoded object not correctly decoded to generate sort key') self.ae(s.encode('utf-16'), s.encode('utf-16'), 'Undecodable bytestring not returned as itself') self.ae(b'', sort_key(None)) self.ae(0, icu.strcmp(None, b'')) self.ae(0, icu.strcmp(s, s.encode(sys.getdefaultencoding()))) # Test locales with make_collation_func('dsk', 'de', func='sort_key') as dsk: self.ae(german_good, sorted(german, key=dsk)) with make_collation_func('dcmp', 'de', template='_strcmp_template') as dcmp: for x in german: for y in german: self.ae(cmp(dsk(x), dsk(y)), dcmp(x, y)) with make_collation_func('fsk', 'fr', func='sort_key') as fsk: self.ae(french_good, sorted(french, key=fsk)) with make_collation_func('fcmp', 'fr', template='_strcmp_template') as fcmp: for x in french: for y in french: self.ae(cmp(fsk(x), fsk(y)), fcmp(x, y)) with make_collation_func('ssk', 'es', func='sort_key') as ssk: self.assertNotEqual(ssk('peña'), ssk('pena')) with make_collation_func('scmp', 'es', template='_strcmp_template') as scmp: self.assertNotEqual(0, scmp('pena', 'peña')) for k, v in {u'pèché': u'peche', u'flüße':u'Flusse', u'Štepánek':u'ŠtepaneK'}.iteritems(): self.ae(0, icu.primary_strcmp(k, v)) # Test different types of collation self.ae(icu.primary_sort_key('Aä'), icu.primary_sort_key('aa')) self.assertLess(icu.numeric_sort_key('something 2'), icu.numeric_sort_key('something 11')) self.assertLess(icu.case_sensitive_sort_key('A'), icu.case_sensitive_sort_key('a')) self.ae(0, icu.strcmp('a', 'A')) self.ae(cmp('a', 'A'), icu.case_sensitive_strcmp('a', 'A')) self.ae(0, icu.primary_strcmp('ä', 'A'))
def populate_color_scheme_menu(self): m = self.color_scheme_menu m.clear() ccs = get_session_pref('current_color_scheme', group=None) or '' ucs = get_session_pref('user_color_schemes', group=None) or {} def add_action(key, defns): a = m.addAction(defns[key]['name']) a.setCheckable(True) a.setObjectName('color-switch-action:{}'.format(key)) a.triggered.connect(self.color_switch_triggerred) if key == ccs: a.setChecked(True) for key in sorted(ucs, key=lambda x: primary_sort_key(ucs[x]['name'])): add_action(key, ucs) m.addSeparator() for key in sorted(self.default_color_schemes, key=lambda x: primary_sort_key(self.default_color_schemes[x]['name'])): add_action(key, self.default_color_schemes)
def populate_add_saved_search_menu(self): m = self.add_saved_search_button.menu() m.clear() m.addAction(QIcon(I('plus.png')), _('Add Saved search'), self.add_saved_search) m.addAction(QIcon(I("search_copy_saved.png")), _('Get Saved search expression'), self.get_saved_search_text) m.addActions(list(self.save_search_button.menu().actions())[-1:]) m.addSeparator() db = self.current_db for name in sorted(db.saved_search_names(), key=lambda x: primary_sort_key(x.strip())): m.addAction(name.strip(), partial(self.saved_search.saved_search_selected, name))
def __init__(self, urn, title, default_icon, custom_icon, favicons, zf, builtin, custom, scheduler_config, parent): NewsTreeItem.__init__(self, builtin, custom, scheduler_config, parent) self.urn, self.title = urn, title if isinstance(self.title, bytes): self.title = force_unicode(self.title) self.sortq = primary_sort_key(self.title) self.icon = self.default_icon = None self.default_icon = default_icon self.favicons, self.zf = favicons, zf if 'custom:' in self.urn: self.icon = custom_icon
def populate_anchors(self, name): if name not in self.anchor_cache: from calibre.ebooks.oeb.base import XHTML_NS root = self.container.parsed(name) ac = self.anchor_cache[name] = [] for item in set(root.xpath('//*[@id]')) | set(root.xpath('//h:a[@name]', namespaces={'h':XHTML_NS})): frag = item.get('id', None) or item.get('name') text = lead_text(item, num_words=4) ac.append((text, frag)) ac.sort(key=lambda text_frag: primary_sort_key(text_frag[0])) self.anchor_names.model().set_names(self.anchor_cache[name]) self.update_target()
def sk(account): return primary_sort_key(opts.aliases.get(account) or account)
def sort_actions_alphabetically(self, actions): aa = all_actions() return sorted( actions, key=lambda name: primary_sort_key(getattr(aa, name).text) if name else primary_sort_key(''))
def key(x): return primary_sort_key(unicode_type(author_text[x]))
def key(x): return primary_sort_key(str(author_text[x]))
def sk(ac): try: return primary_sort_key(ac.action_spec[0]) except Exception: pass
def url_key(x): return primary_sort_key(str(x[0]))