Example #1
0
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'')
Example #2
0
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('')
Example #3
0
    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"))
Example #4
0
    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))
Example #5
0
    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
Example #6
0
 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)
Example #7
0
 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)
Example #8
0
 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)
Example #9
0
    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))
Example #10
0
    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'))
Example #11
0
    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'))
Example #12
0
    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))
Example #14
0
 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))
Example #15
0
 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
Example #16
0
 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
Example #17
0
 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()
Example #18
0
 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()
Example #19
0
 def sk(account):
     return primary_sort_key(opts.aliases.get(account) or account)
Example #20
0
 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(''))
Example #21
0
 def sk(account):
     return primary_sort_key(opts.aliases.get(account) or account)
Example #22
0
 def key(x):
     return primary_sort_key(unicode_type(author_text[x]))
Example #23
0
 def key(x):
     return primary_sort_key(str(author_text[x]))
Example #24
0
 def sk(ac):
     try:
         return primary_sort_key(ac.action_spec[0])
     except Exception:
         pass
Example #25
0
 def sk(ac):
     try:
         return primary_sort_key(ac.action_spec[0])
     except Exception:
         pass
Example #26
0
 def url_key(x):
     return primary_sort_key(str(x[0]))