This commit is contained in:
Kovid Goyal 2019-08-21 14:03:23 +05:30
commit 7b936ee3ea
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
71 changed files with 323 additions and 339 deletions

View File

@ -1,56 +0,0 @@
from calibre.web.feeds.news import BasicNewsRecipe
class AdvancedUserRecipe1278347258(BasicNewsRecipe):
title = u'Salt Lake City Tribune'
__author__ = 'Charles Holbert'
oldest_article = 7
max_articles_per_feed = 100
description = '''Utah's independent news source since 1871'''
publisher = 'http://www.sltrib.com/'
category = 'news, Utah, SLC'
language = 'en'
encoding = 'utf-8'
#delay = 1
#simultaneous_downloads = 1
remove_javascript = True
use_embedded_content = False
no_stylesheets = True
#masthead_url = 'http://www.sltrib.com/csp/cms/sites/sltrib/assets/images/logo_main.png'
#cover_url = 'http://webmedia.newseum.org/newseum-multimedia/dfp/jpg9/lg/UT_SLT.jpg'
keep_only_tags = [dict(name='div',attrs={'id':'imageBox'})
,dict(name='div',attrs={'class':'headline'})
,dict(name='div',attrs={'class':'byline'})
,dict(name='p',attrs={'class':'TEXT_w_Indent'})]
feeds = [(u'SL Tribune Today', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rss.csp?cat=All'),
(u'Utah News', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rss.csp?cat=UtahNews'),
(u'Business News', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rss.csp?cat=Money'),
(u'Technology', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rss.csp?cat=Technology'),
(u'Most Popular', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rsspopular.csp'),
(u'Sports', u'http://www.sltrib.com/csp/cms/sites/sltrib/RSS/rss.csp?cat=Sports')]
extra_css = '''
.headline{font-family:Arial,Helvetica,sans-serif; font-size:xx-large; font-weight: bold; color:#0E5398;}
.byline{font-family:Arial,Helvetica,sans-serif; color:#333333; font-size:xx-small;}
.storytext{font-family:Arial,Helvetica,sans-serif; font-size:medium;}
'''
def print_version(self, url):
seg = url.split('/')
x = seg[5].split('-')
baseURL = 'http://www.sltrib.com/csp/cms/sites/sltrib/pages/printerfriendly.csp?id='
s = baseURL + x[0]
return s
def get_cover_url(self):
cover_url = None
href = 'http://www.newseum.org/todaysfrontpages/hr.asp?fpVname=UT_SLT&ref_pge=lst'
soup = self.index_to_soup(href)
div = soup.find('div',attrs={'class':'tfpLrgView_container'})
if div:
cover_url = div.img['src']
return cover_url

View File

@ -67,7 +67,7 @@ class HTMLRenderer(object):
buf = QBuffer(ba)
buf.open(QBuffer.WriteOnly)
image.save(buf, 'JPEG')
self.data = bytes(ba.data())
self.data = ba.data()
except Exception as e:
self.exception = e
self.traceback = traceback.format_exc()

View File

@ -464,7 +464,7 @@ class PDFStream(object):
ba = QByteArray()
buf = QBuffer(ba)
image.save(buf, 'jpeg', 94)
data = bytes(ba.data())
data = ba.data()
if has_alpha:
soft_mask = self.write_image(tmask, w, h, 8)

View File

@ -1,6 +1,10 @@
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
""" The GUI """
import glob
import os
import signal
@ -354,7 +358,7 @@ def is_widescreen():
global _is_widescreen
if _is_widescreen is None:
try:
_is_widescreen = float(available_width())/available_height() > 1.4
_is_widescreen = available_width()/available_height() > 1.4
except:
_is_widescreen = False
return _is_widescreen
@ -687,7 +691,7 @@ def pixmap_to_data(pixmap, format='JPEG', quality=None):
buf = QBuffer(ba)
buf.open(QBuffer.WriteOnly)
pixmap.save(buf, format, quality=quality)
return bytes(ba.data())
return ba.data()
def decouple(prefix):
@ -736,7 +740,7 @@ class Translator(QTranslator):
try:
src = unicode_type(args[1])
except:
return u''
return ''
t = _
return t(src)
@ -766,8 +770,8 @@ def load_builtin_fonts():
if fid > -1:
fam = QFontDatabase.applicationFontFamilies(fid)
fam = set(map(unicode_type, fam))
if u'calibre Symbols' in fam:
_rating_font = u'calibre Symbols'
if 'calibre Symbols' in fam:
_rating_font = 'calibre Symbols'
def setup_gui_option_parser(parser):
@ -881,7 +885,7 @@ class Application(QApplication):
self.line_height = max(12, QFontMetrics(self.font()).lineSpacing())
dl = QLocale(get_lang())
if unicode_type(dl.bcp47Name()) != u'C':
if unicode_type(dl.bcp47Name()) != 'C':
QLocale.setDefault(dl)
global gui_thread, qt_app
gui_thread = QThread.currentThread()
@ -903,7 +907,7 @@ class Application(QApplication):
'calibre versions newer than 2.0 do not run on Windows XP. This is'
' because the graphics toolkit calibre uses (Qt 5) crashes a lot'
' on Windows XP. We suggest you stay with <a href="%s">calibre 1.48</a>'
' which works well on Windows XP.') % 'http://download.calibre-ebook.com/1.48.0/', show=True)
' which works well on Windows XP.') % 'https://download.calibre-ebook.com/1.48.0/', show=True)
raise SystemExit(1)
if iswindows:
@ -978,22 +982,22 @@ class Application(QApplication):
icon_map = self.__icon_map_memory_ = {}
pcache = {}
for k, v in iteritems({
'DialogYesButton': u'ok.png',
'DialogNoButton': u'window-close.png',
'DialogCloseButton': u'window-close.png',
'DialogOkButton': u'ok.png',
'DialogCancelButton': u'window-close.png',
'DialogHelpButton': u'help.png',
'DialogOpenButton': u'document_open.png',
'DialogSaveButton': u'save.png',
'DialogApplyButton': u'ok.png',
'DialogDiscardButton': u'trash.png',
'MessageBoxInformation': u'dialog_information.png',
'MessageBoxWarning': u'dialog_warning.png',
'MessageBoxCritical': u'dialog_error.png',
'MessageBoxQuestion': u'dialog_question.png',
'BrowserReload': u'view-refresh.png',
'LineEditClearButton': u'clear_left.png',
'DialogYesButton': 'ok.png',
'DialogNoButton': 'window-close.png',
'DialogCloseButton': 'window-close.png',
'DialogOkButton': 'ok.png',
'DialogCancelButton': 'window-close.png',
'DialogHelpButton': 'help.png',
'DialogOpenButton': 'document_open.png',
'DialogSaveButton': 'save.png',
'DialogApplyButton': 'ok.png',
'DialogDiscardButton': 'trash.png',
'MessageBoxInformation': 'dialog_information.png',
'MessageBoxWarning': 'dialog_warning.png',
'MessageBoxCritical': 'dialog_error.png',
'MessageBoxQuestion': 'dialog_question.png',
'BrowserReload': 'view-refresh.png',
'LineEditClearButton': 'clear_left.png',
}):
if v not in pcache:
p = I(v)
@ -1242,7 +1246,7 @@ def elided_text(text, font=None, width=300, pos='middle'):
from PyQt5.Qt import QFontMetrics, QApplication
fm = QApplication.fontMetrics() if font is None else (font if isinstance(font, QFontMetrics) else QFontMetrics(font))
delta = 4
ellipsis = u'\u2026'
ellipsis = '\u2026'
def remove_middle(x):
mid = len(x) // 2
@ -1361,7 +1365,7 @@ def set_app_uid(val):
try:
AppUserModelID(unicode_type(val))
except Exception as err:
prints(u'Failed to set app uid with error:', as_unicode(err))
prints('Failed to set app uid with error:', as_unicode(err))
return False
return True

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -19,7 +20,7 @@ from polyglot.builtins import unicode_type, string_or_bytes
def menu_action_unique_name(plugin, unique_name):
return u'%s : menu action : %s'%(plugin.unique_name, unique_name)
return '%s : menu action : %s'%(plugin.unique_name, unique_name)
class InterfaceAction(QObject):
@ -151,7 +152,7 @@ class InterfaceAction(QObject):
bn = self.__class__.__name__
if getattr(self.interface_action_base_plugin, 'name'):
bn = self.interface_action_base_plugin.name
return u'Interface Action: %s (%s)'%(bn, self.name)
return 'Interface Action: %s (%s)'%(bn, self.name)
def create_action(self, spec=None, attr='qaction', shortcut_name=None):
if spec is None:

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -331,7 +332,8 @@ class AddAction(InterfaceAction):
create_book(mi, pt.name, fmt=empty_format)
fmts = [pt.name]
ids.append(db.import_book(mi, fmts))
tuple(map(os.remove, orig_fmts))
for path in orig_fmts:
os.remove(path)
self.refresh_gui(num)
if ids:
ids.reverse()

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -85,7 +86,7 @@ class GenerateCatalogAction(InterfaceAction):
id = self.gui.library_view.model().add_catalog(job.catalog_file_path, job.catalog_title)
self.gui.library_view.model().beginResetModel(), self.gui.library_view.model().endResetModel()
if job.catalog_sync:
sync = dynamic.get('catalogs_to_be_synced', set([]))
sync = dynamic.get('catalogs_to_be_synced', set())
sync.add(id)
dynamic.set('catalogs_to_be_synced', sync)
self.gui.status_bar.show_message(_('Catalog generated.'), 3000)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
from __future__ import print_function
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
@ -252,7 +252,7 @@ class ChooseLibraryAction(InterfaceAction):
for i in range(5):
ac = self.create_action(spec=('', None, None, None),
attr='switch_action%d'%i)
ac.setObjectName(str(i))
ac.setObjectName(unicode_type(i))
self.switch_actions.append(ac)
ac.setVisible(False)
connect_lambda(ac.triggered, self, lambda self:
@ -329,7 +329,7 @@ class ChooseLibraryAction(InterfaceAction):
self.prev_lname = self.last_lname
self.last_lname = lname
if len(lname) > 16:
lname = lname[:16] + u''
lname = lname[:16] + ''
a = self.qaction
a.setText(lname.replace('&', '&&&')) # I have no idea why this requires a triple ampersand
self.update_tooltip(db.count())

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -40,7 +41,7 @@ class ConvertAction(InterfaceAction):
def drop_event(self, event, mime_data):
mime = 'application/calibre+from_library'
if mime_data.hasFormat(mime):
self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split()))
self.dropped_ids = tuple(map(int, mime_data.data(mime).data().split()))
QTimer.singleShot(1, self.do_drop)
return True
return False

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -106,7 +107,7 @@ class DeleteAction(InterfaceAction):
def drop_event(self, event, mime_data):
mime = 'application/calibre+from_library'
if mime_data.hasFormat(mime):
self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split()))
self.dropped_ids = tuple(map(int, mime_data.data(mime).data().split()))
QTimer.singleShot(1, self.do_drop)
return True
return False
@ -165,7 +166,7 @@ class DeleteAction(InterfaceAction):
if not rows or len(rows) == 0:
d = error_dialog(self.gui, err_title, _('No book selected'))
d.exec_()
return set([])
return set()
return set(map(self.gui.library_view.model().id, rows))
def remove_format_by_id(self, book_id, fmt):

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -12,7 +13,7 @@ from calibre.gui2.actions import InterfaceAction
from calibre.gui2.dialogs.smartdevice import SmartdeviceDialog
from calibre.utils.icu import primary_sort_key
from calibre.utils.smtp import config as email_config
from polyglot.builtins import unicode_type, map
from polyglot.builtins import unicode_type
class ShareConnMenu(QMenu): # {{{
@ -111,7 +112,8 @@ class ShareConnMenu(QMenu): # {{{
(alias or account) + ' ' + _('(delete from library)'))
self.email_to_menu.addAction(action1)
self.email_to_and_delete_menu.addAction(action2)
tuple(map(self.memory.append, (action1, action2)))
self.memory.append(action1)
self.memory.append(action2)
if default:
ac = DeviceAction(dest, False, False,
I('mail.png'), _('Email to') + ' ' +(alias or
@ -127,12 +129,14 @@ class ShareConnMenu(QMenu): # {{{
_('Select recipients') + ' ' + _('(delete from library)'))
self.email_to_menu.addAction(action1)
self.email_to_and_delete_menu.addAction(action2)
tuple(map(self.memory.append, (action1, action2)))
self.memory.append(action1)
self.memory.append(action2)
tac1 = DeviceAction('choosemail:', False, False, I('mail.png'),
_('Email to selected recipients...'))
self.addAction(tac1)
tac1.a_s.connect(sync_menu.action_triggered)
self.memory.append(tac1), self.email_actions.append(tac1)
self.memory.append(tac1)
self.email_actions.append(tac1)
ac = self.addMenu(self.email_to_and_delete_menu)
self.email_actions.append(ac)
action1.a_s.connect(sync_menu.action_triggered)

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -51,7 +52,7 @@ class EditMetadataAction(InterfaceAction):
def drop_event(self, event, mime_data):
mime = 'application/calibre+from_library'
if mime_data.hasFormat(mime):
self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split()))
self.dropped_ids = tuple(map(int, mime_data.data(mime).data().split()))
QTimer.singleShot(1, self.do_drop)
return True
return False
@ -648,7 +649,7 @@ class EditMetadataAction(InterfaceAction):
if not dest_mi.comments:
dest_mi.comments = src_mi.comments
else:
dest_mi.comments = unicode_type(dest_mi.comments) + u'\n\n' + unicode_type(src_mi.comments)
dest_mi.comments = unicode_type(dest_mi.comments) + '\n\n' + unicode_type(src_mi.comments)
if src_mi.title and (not dest_mi.title or dest_mi.title == _('Unknown')):
dest_mi.title = src_mi.title
if (src_mi.authors and src_mi.authors[0] != _('Unknown')) and (not dest_mi.authors or dest_mi.authors[0] == _('Unknown')):
@ -701,7 +702,7 @@ class EditMetadataAction(InterfaceAction):
if not dest_value:
db.set_custom(dest_id, src_value, num=colnum)
else:
dest_value = unicode_type(dest_value) + u'\n\n' + unicode_type(src_value)
dest_value = unicode_type(dest_value) + '\n\n' + unicode_type(src_value)
db.set_custom(dest_id, dest_value, num=colnum)
if (dt in {'bool', 'int', 'float', 'rating', 'datetime'} and dest_value is None):
db.set_custom(dest_id, src_value, num=colnum)

View File

@ -37,7 +37,7 @@ class EmbedAction(InterfaceAction):
def drop_event(self, event, mime_data):
mime = 'application/calibre+from_library'
if mime_data.hasFormat(mime):
self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split()))
self.dropped_ids = tuple(map(int, mime_data.data(mime).data().split()))
QTimer.singleShot(1, self.do_drop)
return True
return False

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -22,6 +23,3 @@ class HelpAction(InterfaceAction):
def show_help(self, *args):
open_url(QUrl(localize_user_manual_link('https://manual.calibre-ebook.com')))

View File

@ -39,7 +39,7 @@ class MarkBooksAction(InterfaceAction):
def drop_event(self, event, mime_data):
mime = 'application/calibre+from_library'
if mime_data.hasFormat(mime):
self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split()))
self.dropped_ids = tuple(map(int, mime_data.data(mime).data().split()))
QTimer.singleShot(1, self.do_drop)
return True
return False

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -24,5 +25,3 @@ class OpenFolderAction(InterfaceAction):
enabled = loc == 'library'
self.qaction.setEnabled(enabled)
self.menuless_qaction.setEnabled(enabled)

View File

@ -420,7 +420,7 @@ class PolishAction(InterfaceAction):
def drop_event(self, event, mime_data):
mime = 'application/calibre+from_library'
if mime_data.hasFormat(mime):
self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split()))
self.dropped_ids = tuple(map(int, mime_data.data(mime).data().split()))
QTimer.singleShot(1, self.do_drop)
return True
return False

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -19,5 +20,3 @@ class RestartAction(InterfaceAction):
def restart(self, *args):
self.gui.quit(restart=True)

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -7,12 +8,11 @@ __docformat__ = 'restructuredtext en'
import os, numbers
from functools import partial
from polyglot.builtins import itervalues, map
from calibre.utils.config import prefs
from calibre.gui2 import error_dialog, Dispatcher, choose_dir
from calibre.gui2.actions import InterfaceAction
from polyglot.builtins import itervalues, map
class SaveToDiskAction(InterfaceAction):

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -87,7 +87,7 @@ class ToCEditAction(InterfaceAction):
def drop_event(self, event, mime_data):
mime = 'application/calibre+from_library'
if mime_data.hasFormat(mime):
self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split()))
self.dropped_ids = tuple(map(int, mime_data.data(mime).data().split()))
QTimer.singleShot(1, self.do_drop)
return True
return False

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -74,7 +75,7 @@ class TweakEpubAction(InterfaceAction):
def drop_event(self, event, mime_data):
mime = 'application/calibre+from_library'
if mime_data.hasFormat(mime):
self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split()))
self.dropped_ids = tuple(map(int, mime_data.data(mime).data().split()))
QTimer.singleShot(1, self.do_drop)
return True
return False

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -308,7 +309,7 @@ class UnpackBookAction(InterfaceAction):
def drop_event(self, event, mime_data):
mime = 'application/calibre+from_library'
if mime_data.hasFormat(mime):
self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split()))
self.dropped_ids = tuple(map(int, mime_data.data(mime).data().split()))
QTimer.singleShot(1, self.do_drop)
return True
return False

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -166,7 +167,7 @@ class ViewAction(InterfaceAction):
rows = [r.row() for r in rows]
book_ids = [db.id(r) for r in rows]
formats = [[x.upper() for x in db.new_api.formats(book_id)] for book_id in book_ids]
all_fmts = set([])
all_fmts = set()
for x in formats:
if x:
for f in x:

View File

@ -286,10 +286,10 @@ class ToolBar(QToolBar): # {{{
event.ignore()
def dropEvent(self, event):
data = event.mimeData()
md = event.mimeData()
mime = 'application/calibre+from_library'
if data.hasFormat(mime):
ids = list(map(int, str(data.data(mime)).split()))
if md.hasFormat(mime):
ids = list(map(int, md.data(mime).data().split()))
tgt = None
for ac in self.location_manager.available_actions:
w = self.widgetForAction(ac)
@ -303,8 +303,8 @@ class ToolBar(QToolBar): # {{{
return
mime = 'application/calibre+from_device'
if data.hasFormat(mime):
paths = [unicode_type(u.toLocalFile()) for u in data.urls()]
if md.hasFormat(mime):
paths = [unicode_type(u.toLocalFile()) for u in md.urls()]
if paths:
self.gui.iactions['Add Books'].add_books_from_device(
self.gui.current_view(), paths=paths)
@ -312,7 +312,7 @@ class ToolBar(QToolBar): # {{{
return
# Give added_actions an opportunity to process the drag&drop event
if self.check_iactions_for_drag(event, data, 'drop_event'):
if self.check_iactions_for_drag(event, md, 'drop_event'):
event.accept()
else:
event.ignore()

View File

@ -1,16 +1,17 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
from PyQt5.Qt import QWidget, QListWidgetItem
from calibre.gui2 import gprefs
from calibre.gui2.catalog.catalog_bibtex_ui import Ui_Form
from polyglot.builtins import unicode_type, range
from PyQt5.Qt import QWidget, QListWidgetItem
class PluginWidget(QWidget, Ui_Form):

View File

@ -1,15 +1,16 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
from PyQt5.Qt import QWidget, QListWidgetItem, Qt, QVBoxLayout, QLabel, QListWidget
from calibre.gui2 import gprefs
from calibre.gui2.ui import get_gui
from polyglot.builtins import unicode_type, range
from PyQt5.Qt import QWidget, QListWidgetItem, Qt, QVBoxLayout, QLabel, QListWidget
def get_saved_field_data(name, all_fields):

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import print_function
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
@ -15,7 +15,7 @@ from calibre.gui2 import gprefs, open_url, question_dialog, error_dialog
from calibre.utils.config import JSONConfig
from calibre.utils.icu import sort_key
from calibre.utils.localization import localize_user_manual_link
from polyglot.builtins import unicode_type, zip, range
from polyglot.builtins import native_string_type, unicode_type, zip, range
from .catalog_epub_mobi_ui import Ui_Form
from PyQt5.Qt import (Qt, QAbstractItemView, QCheckBox, QComboBox,
@ -115,7 +115,7 @@ class PluginWidget(QWidget,Ui_Form):
'name':_('Wishlist item'),
'field':_('Tags'),
'pattern':'Wishlist',
'prefix':u'\u00d7'},],
'prefix':'\u00d7'},],
['table_widget','table_widget']))
self.OPTION_FIELDS = option_fields
@ -423,7 +423,7 @@ class PluginWidget(QWidget,Ui_Form):
# Hook Preset signals
self.preset_delete_pb.clicked.connect(self.preset_remove)
self.preset_save_pb.clicked.connect(self.preset_save)
self.preset_field.currentIndexChanged[str].connect(self.preset_change)
self.preset_field.currentIndexChanged[native_string_type].connect(self.preset_change)
self.blocking_all_signals = False
@ -615,7 +615,7 @@ class PluginWidget(QWidget,Ui_Form):
# Populate the Presets combo box
self.presets = JSONConfig("catalog_presets")
self.preset_field.addItem("")
self.preset_field_values = sorted([p for p in self.presets], key=sort_key)
self.preset_field_values = sorted(self.presets, key=sort_key)
self.preset_field.addItems(self.preset_field_values)
def preset_change(self, item_name):
@ -1338,127 +1338,127 @@ class PrefixRules(GenericRulesTable):
# Create a list of prefixes for user selection
raw_prefix_list = [
('Ampersand',u'&'),
('Angle left double',u'\u00ab'),
('Angle left',u'\u2039'),
('Angle right double',u'\u00bb'),
('Angle right',u'\u203a'),
('Arrow carriage return',u'\u21b5'),
('Arrow double',u'\u2194'),
('Arrow down',u'\u2193'),
('Arrow left',u'\u2190'),
('Arrow right',u'\u2192'),
('Arrow up',u'\u2191'),
('Asterisk',u'*'),
('At sign',u'@'),
('Bullet smallest',u'\u22c5'),
('Bullet small',u'\u00b7'),
('Bullet',u'\u2022'),
('Cards clubs',u'\u2663'),
('Cards diamonds',u'\u2666'),
('Cards hearts',u'\u2665'),
('Cards spades',u'\u2660'),
('Caret',u'^'),
('Checkmark',u'\u2713'),
('Copyright circle c',u'\u00a9'),
('Copyright circle r',u'\u00ae'),
('Copyright trademark',u'\u2122'),
('Currency cent',u'\u00a2'),
('Currency dollar',u'$'),
('Currency euro',u'\u20ac'),
('Currency pound',u'\u00a3'),
('Currency yen',u'\u00a5'),
('Dagger double',u'\u2021'),
('Dagger',u'\u2020'),
('Degree',u'\u00b0'),
('Dots3',u'\u2234'),
('Hash',u'#'),
('Infinity',u'\u221e'),
('Lozenge',u'\u25ca'),
('Math divide',u'\u00f7'),
('Math empty',u'\u2205'),
('Math equals',u'='),
('Math minus',u'\u2212'),
('Math plus circled',u'\u2295'),
('Math times circled',u'\u2297'),
('Math times',u'\u00d7'),
('Paragraph',u'\u00b6'),
('Percent',u'%'),
('Plus-or-minus',u'\u00b1'),
('Plus',u'+'),
('Punctuation colon',u':'),
('Punctuation colon-semi',u';'),
('Punctuation exclamation',u'!'),
('Punctuation question',u'?'),
('Punctuation period',u'.'),
('Punctuation slash back',u'\\'),
('Punctuation slash forward',u'/'),
('Section',u'\u00a7'),
('Tilde',u'~'),
('Vertical bar',u'|'),
('Vertical bar broken',u'\u00a6'),
('_0',u'0'),
('_1',u'1'),
('_2',u'2'),
('_3',u'3'),
('_4',u'4'),
('_5',u'5'),
('_6',u'6'),
('_7',u'7'),
('_8',u'8'),
('_9',u'9'),
('_A',u'A'),
('_B',u'B'),
('_C',u'C'),
('_D',u'D'),
('_E',u'E'),
('_F',u'F'),
('_G',u'G'),
('_H',u'H'),
('_I',u'I'),
('_J',u'J'),
('_K',u'K'),
('_L',u'L'),
('_M',u'M'),
('_N',u'N'),
('_O',u'O'),
('_P',u'P'),
('_Q',u'Q'),
('_R',u'R'),
('_S',u'S'),
('_T',u'T'),
('_U',u'U'),
('_V',u'V'),
('_W',u'W'),
('_X',u'X'),
('_Y',u'Y'),
('_Z',u'Z'),
('_a',u'a'),
('_b',u'b'),
('_c',u'c'),
('_d',u'd'),
('_e',u'e'),
('_f',u'f'),
('_g',u'g'),
('_h',u'h'),
('_i',u'i'),
('_j',u'j'),
('_k',u'k'),
('_l',u'l'),
('_m',u'm'),
('_n',u'n'),
('_o',u'o'),
('_p',u'p'),
('_q',u'q'),
('_r',u'r'),
('_s',u's'),
('_t',u't'),
('_u',u'u'),
('_v',u'v'),
('_w',u'w'),
('_x',u'x'),
('_y',u'y'),
('_z',u'z'),
('Ampersand', '&'),
('Angle left double', '\u00ab'),
('Angle left', '\u2039'),
('Angle right double', '\u00bb'),
('Angle right', '\u203a'),
('Arrow carriage return', '\u21b5'),
('Arrow double', '\u2194'),
('Arrow down', '\u2193'),
('Arrow left', '\u2190'),
('Arrow right', '\u2192'),
('Arrow up', '\u2191'),
('Asterisk', '*'),
('At sign', '@'),
('Bullet smallest', '\u22c5'),
('Bullet small', '\u00b7'),
('Bullet', '\u2022'),
('Cards clubs', '\u2663'),
('Cards diamonds', '\u2666'),
('Cards hearts', '\u2665'),
('Cards spades', '\u2660'),
('Caret', '^'),
('Checkmark', '\u2713'),
('Copyright circle c', '\u00a9'),
('Copyright circle r', '\u00ae'),
('Copyright trademark', '\u2122'),
('Currency cent', '\u00a2'),
('Currency dollar', '$'),
('Currency euro', '\u20ac'),
('Currency pound', '\u00a3'),
('Currency yen', '\u00a5'),
('Dagger double', '\u2021'),
('Dagger', '\u2020'),
('Degree', '\u00b0'),
('Dots3', '\u2234'),
('Hash', '#'),
('Infinity', '\u221e'),
('Lozenge', '\u25ca'),
('Math divide', '\u00f7'),
('Math empty', '\u2205'),
('Math equals', '='),
('Math minus', '\u2212'),
('Math plus circled', '\u2295'),
('Math times circled', '\u2297'),
('Math times', '\u00d7'),
('Paragraph', '\u00b6'),
('Percent', '%'),
('Plus-or-minus', '\u00b1'),
('Plus', '+'),
('Punctuation colon', ':'),
('Punctuation colon-semi', ';'),
('Punctuation exclamation', '!'),
('Punctuation question', '?'),
('Punctuation period', '.'),
('Punctuation slash back', '\\'),
('Punctuation slash forward', '/'),
('Section', '\u00a7'),
('Tilde', '~'),
('Vertical bar', '|'),
('Vertical bar broken', '\u00a6'),
('_0', '0'),
('_1', '1'),
('_2', '2'),
('_3', '3'),
('_4', '4'),
('_5', '5'),
('_6', '6'),
('_7', '7'),
('_8', '8'),
('_9', '9'),
('_A', 'A'),
('_B', 'B'),
('_C', 'C'),
('_D', 'D'),
('_E', 'E'),
('_F', 'F'),
('_G', 'G'),
('_H', 'H'),
('_I', 'I'),
('_J', 'J'),
('_K', 'K'),
('_L', 'L'),
('_M', 'M'),
('_N', 'N'),
('_O', 'O'),
('_P', 'P'),
('_Q', 'Q'),
('_R', 'R'),
('_S', 'S'),
('_T', 'T'),
('_U', 'U'),
('_V', 'V'),
('_W', 'W'),
('_X', 'X'),
('_Y', 'Y'),
('_Z', 'Z'),
('_a', 'a'),
('_b', 'b'),
('_c', 'c'),
('_d', 'd'),
('_e', 'e'),
('_f', 'f'),
('_g', 'g'),
('_h', 'h'),
('_i', 'i'),
('_j', 'j'),
('_k', 'k'),
('_l', 'l'),
('_m', 'm'),
('_n', 'n'),
('_o', 'o'),
('_p', 'p'),
('_q', 'q'),
('_r', 'r'),
('_s', 's'),
('_t', 't'),
('_u', 'u'),
('_v', 'v'),
('_w', 'w'),
('_x', 'x'),
('_y', 'y'),
('_z', 'z'),
]
raw_prefix_list = sorted(raw_prefix_list, key=prefix_sorter)
self.prefix_list = [x[1] for x in raw_prefix_list]

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
@ -338,7 +339,7 @@ class EditorWidget(QWebView, LineEditECM): # {{{
@property
def html(self):
ans = u''
ans = ''
try:
if not self.page().mainFrame().documentElement().findFirst('meta[name="calibre-dont-sanitize"]').isNull():
# Bypass cleanup if special meta tag exists
@ -364,9 +365,9 @@ class EditorWidget(QWebView, LineEditECM): # {{{
x.tag not in ('script', 'style')]
if len(elems) > 1:
ans = u'<div>%s</div>'%(u''.join(elems))
ans = '<div>%s</div>'%(''.join(elems))
else:
ans = u''.join(elems)
ans = ''.join(elems)
if not ans.startswith('<'):
ans = '<p>%s</p>'%ans
ans = xml_replace_entities(ans)
@ -482,7 +483,7 @@ class Highlighter(QSyntaxHighlighter):
if state == State_Comment:
start = pos
while pos < len_:
if text[pos:pos+3] == u"-->":
if text[pos:pos+3] == "-->":
pos += 3
state = State_Text
break
@ -495,7 +496,7 @@ class Highlighter(QSyntaxHighlighter):
while pos < len_:
ch = text[pos]
pos += 1
if ch == u'>':
if ch == '>':
state = State_Text
break
self.setFormat(start, pos - start, self.colors['doctype'])
@ -506,7 +507,7 @@ class Highlighter(QSyntaxHighlighter):
while pos < len_:
ch = text[pos]
pos += 1
if ch == u'>':
if ch == '>':
state = State_Text
break
if not ch.isspace():
@ -524,7 +525,7 @@ class Highlighter(QSyntaxHighlighter):
pos -= 1
state = State_InsideTag
break
if ch == u'>':
if ch == '>':
state = State_Text
break
self.setFormat(start, pos - start, self.colors['tag'])
@ -537,10 +538,10 @@ class Highlighter(QSyntaxHighlighter):
ch = text[pos]
pos += 1
if ch == u'/':
if ch == '/':
continue
if ch == u'>':
if ch == '>':
state = State_Text
break
@ -557,11 +558,11 @@ class Highlighter(QSyntaxHighlighter):
ch = text[pos]
pos += 1
if ch == u'=':
if ch == '=':
state = State_AttributeValue
break
if ch in (u'>', u'/'):
if ch in ('>', '/'):
state = State_InsideTag
break
@ -577,12 +578,12 @@ class Highlighter(QSyntaxHighlighter):
pos += 1
# handle opening single quote
if ch == u"'":
if ch == "'":
state = State_SingleQuote
break
# handle opening double quote
if ch == u'"':
if ch == '"':
state = State_DoubleQuote
break
@ -597,7 +598,7 @@ class Highlighter(QSyntaxHighlighter):
ch = text[pos]
if ch.isspace():
break
if ch in (u'>', u'/'):
if ch in ('>', '/'):
break
pos += 1
state = State_InsideTag
@ -610,7 +611,7 @@ class Highlighter(QSyntaxHighlighter):
while pos < len_:
ch = text[pos]
pos += 1
if ch == u"'":
if ch == "'":
break
state = State_InsideTag
@ -624,7 +625,7 @@ class Highlighter(QSyntaxHighlighter):
while pos < len_:
ch = text[pos]
pos += 1
if ch == u'"':
if ch == '"':
break
state = State_InsideTag
@ -635,18 +636,18 @@ class Highlighter(QSyntaxHighlighter):
# State_Text and default
while pos < len_:
ch = text[pos]
if ch == u'<':
if text[pos:pos+4] == u"<!--":
if ch == '<':
if text[pos:pos+4] == "<!--":
state = State_Comment
else:
if text[pos:pos+9].upper() == u"<!DOCTYPE":
if text[pos:pos+9].upper() == "<!DOCTYPE":
state = State_DocType
else:
state = State_TagStart
break
elif ch == u'&':
elif ch == '&':
start = pos
while pos < len_ and text[pos] != u';':
while pos < len_ and text[pos] != ';':
self.setFormat(start, pos - start,
self.colors['entity'])
pos += 1

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL 3'
__copyright__ = '2009, John Schember <john@nachtimwald.com>'

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL 3'
__copyright__ = '2009, John Schember <john@nachtimwald.com>'

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL 3'
__copyright__ = '2009, John Schember <john@nachtimwald.com>'

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL 3'
__copyright__ = '2009, John Schember <john@nachtimwald.com>'

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL 3'
__copyright__ = '2009, John Schember <john@nachtimwald.com>'

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL 3'
__copyright__ = '2011, John Schember <john@nachtimwald.com>'

View File

@ -128,7 +128,7 @@ def icon_to_dbus_menu_icon(icon, size=32):
buf = QBuffer(ba)
buf.open(QBuffer.WriteOnly)
icon.pixmap(32).save(buf, 'PNG')
return dbus.ByteArray(bytes((ba.data())))
return dbus.ByteArray(ba)
def setup_for_cli_run():

View File

@ -1,4 +1,5 @@
from __future__ import with_statement
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
@ -34,7 +35,7 @@ from calibre.utils.config import tweaks, device_prefs
from calibre.utils.img import scale_image
from calibre.library.save_to_disk import find_plugboard
from calibre.ptempfile import PersistentTemporaryFile, force_unicode as filename_to_unicode
from polyglot.builtins import unicode_type, string_or_bytes
from polyglot.builtins import unicode_type, string_or_unicode
from polyglot import queue
# }}}
@ -209,7 +210,7 @@ class DeviceManager(Thread): # {{{
tb = traceback.format_exc()
if DEBUG or tb not in self.reported_errors:
self.reported_errors.add(tb)
prints('Unable to open device', str(dev))
prints('Unable to open device', unicode_type(dev))
prints(tb)
continue
self.after_device_connect(dev, device_kind)
@ -472,7 +473,7 @@ class DeviceManager(Thread): # {{{
info = self.device.get_device_information(end_session=False)
if len(info) < 5:
info = tuple(list(info) + [{}])
info = [i.replace('\x00', '').replace('\x01', '') if isinstance(i, string_or_bytes) else i
info = [i.replace('\x00', '').replace('\x01', '') if isinstance(i, string_or_unicode) else i
for i in info]
cp = self.device.card_prefix(end_session=False)
fs = self.device.free_space()
@ -604,7 +605,7 @@ class DeviceManager(Thread): # {{{
metadata=None, plugboards=None, add_as_step_to_job=None):
desc = ngettext('Upload one book to the device', 'Upload {} books to the device', len(names)).format(len(names))
if titles:
desc += u': ' + u', '.join(titles)
desc += ': ' + ', '.join(titles)
return self.create_job_step(self._upload_books, done, to_job=add_as_step_to_job,
args=[files, names],
kwargs={'on_card':on_card,'metadata':metadata,'plugboards':plugboards}, description=desc)
@ -930,7 +931,7 @@ class DeviceMixin(object): # {{{
d.show()
def auto_convert_question(self, msg, autos):
autos = u'\n'.join(map(unicode_type, map(force_unicode, autos)))
autos = '\n'.join(map(unicode_type, map(force_unicode, autos)))
return self.ask_a_yes_no_question(
_('No suitable formats'), msg,
ans_when_user_unavailable=True,
@ -1343,7 +1344,7 @@ class DeviceMixin(object): # {{{
self.iactions['Convert Books'].auto_convert_catalogs(auto, format)
files = [f for f in files if f is not None]
if not files:
dynamic.set('catalogs_to_be_synced', set([]))
dynamic.set('catalogs_to_be_synced', set())
return
metadata = self.library_view.model().metadata_for(ids)
names = []
@ -1355,7 +1356,7 @@ class DeviceMixin(object): # {{{
names.append('%s_%d%s'%(prefix, id,
os.path.splitext(files[-1])[1]))
self.update_thumbnail(mi)
dynamic.set('catalogs_to_be_synced', set([]))
dynamic.set('catalogs_to_be_synced', set())
if files:
remove = []
space = {self.location_manager.free[0] : None,
@ -1627,7 +1628,7 @@ class DeviceMixin(object): # {{{
if job.exception is not None:
if isinstance(job.exception, FreeSpaceError):
where = 'in main memory.' if 'memory' in str(job.exception) \
where = 'in main memory.' if 'memory' in unicode_type(job.exception) \
else 'on the storage card.'
titles = '\n'.join(['<li>'+mi.title+'</li>'
for mi in metadata])

View File

@ -156,7 +156,7 @@ class ConfigWidget(QWidget, Ui_ConfigWidget):
formats = set(self.format_map())
extra = formats - set(self.calibre_known_formats)
if extra:
fmts = sorted([x.upper() for x in extra])
fmts = sorted((x.upper() for x in extra))
if not question_dialog(self, _('Unknown formats'),
_('You have enabled the <b>{0}</b> formats for'
' your {1}. The {1} may not support them.'

View File

@ -96,7 +96,7 @@ class Catalog(QDialog, Ui_Dialog):
self.widgets = sorted(self.widgets, key=lambda x: x.TITLE)
# Generate a sorted list of installed catalog formats/sync_enabled pairs
fmts = sorted([x[0] for x in self.fmts])
fmts = sorted((x[0] for x in self.fmts))
self.sync_enabled_formats = []
for fmt in self.fmts:

View File

@ -743,7 +743,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
self.queries = JSONConfig("search_replace_queries")
self.saved_search_name = ''
self.query_field.addItem("")
self.query_field_values = sorted([q for q in self.queries], key=sort_key)
self.query_field_values = sorted(self.queries, key=sort_key)
self.query_field.addItems(self.query_field_values)
self.query_field.currentIndexChanged[str].connect(self.s_r_query_change)
self.query_field.setCurrentIndex(0)
@ -1323,7 +1323,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
self.query_field.blockSignals(True)
self.query_field.clear()
self.query_field.addItem('')
self.query_field_values = sorted([q for q in self.queries], key=sort_key)
self.query_field_values = sorted(self.queries, key=sort_key)
self.query_field.addItems(self.query_field_values)
self.query_field.blockSignals(False)
self.query_field.setCurrentIndex(self.query_field.findText(name))

View File

@ -76,7 +76,7 @@ def image_to_data(image): # {{{
buf.open(QBuffer.WriteOnly)
if not image.save(buf, CACHE_FORMAT):
raise EncodeError('Failed to encode thumbnail')
ret = bytes(ba.data())
ret = ba.data()
buf.close()
return ret
# }}}

View File

@ -136,7 +136,7 @@ def get_default_library_path():
fname.encode(filesystem_encoding)
except Exception:
fname = 'Calibre Library'
x = os.path.expanduser('~'+os.sep+fname)
x = os.path.expanduser(os.path.join('~', fname))
if not os.path.exists(x):
try:
os.makedirs(x)

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
@ -44,7 +44,7 @@ class DBUSNotifier(Notifier):
self._notify = dbus.Interface(session_bus.get_object(server, path), interface)
except Exception as err:
self.ok = False
self.err = str(err)
self.err = unicode_type(err)
if DEBUG:
prints(server, 'found' if self.ok else 'not found', 'in', '%.1f' % (time.time() - start), 'seconds')

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
@ -20,7 +20,7 @@ from calibre.gui2.dialogs.confirm_delete import confirm
from calibre.gui2.dialogs.saved_search_editor import SavedSearchEditor
from calibre.gui2.dialogs.search import SearchDialog
from calibre.utils.icu import primary_sort_key
from polyglot.builtins import unicode_type, string_or_bytes, map, range
from polyglot.builtins import native_string_type, unicode_type, string_or_bytes, map, range
QT_HIDDEN_CLEAR_ACTION = '_q_qlineeditclearaction'
@ -119,11 +119,11 @@ class SearchBox2(QComboBox): # {{{
c = self.line_edit.completer()
c.setCompletionMode(c.PopupCompletion)
c.highlighted[str].connect(self.completer_used)
c.highlighted[native_string_type].connect(self.completer_used)
self.line_edit.key_pressed.connect(self.key_pressed, type=Qt.DirectConnection)
# QueuedConnection as workaround for https://bugreports.qt-project.org/browse/QTBUG-40807
self.activated[str].connect(self.history_selected, type=Qt.QueuedConnection)
self.activated[native_string_type].connect(self.history_selected, type=Qt.QueuedConnection)
self.setEditable(True)
self.as_you_type = True
self.timer = QTimer()
@ -272,7 +272,7 @@ class SearchBox2(QComboBox): # {{{
def set_search_string(self, txt, store_in_history=False, emit_changed=True):
if not store_in_history:
self.activated[str].disconnect()
self.activated[native_string_type].disconnect()
try:
self.setFocus(Qt.OtherFocusReason)
if not txt:

View File

@ -28,7 +28,7 @@ from calibre.gui2.store.web_store_dialog import WebStoreDialog
class WHSmithUKStore(BasicStoreConfig, StorePlugin):
def open(self, parent=None, detail_item=None, external=False):
url = 'http://www.whsmith.co.uk/'
url = 'https://www.whsmith.co.uk/'
url_details = ''
if external or self.config.get('open_external', False):
@ -45,7 +45,7 @@ class WHSmithUKStore(BasicStoreConfig, StorePlugin):
d.exec_()
def search(self, query, max_results=10, timeout=60):
url = ('http://www.whsmith.co.uk/search?keywordCategoryId=wc_dept_ebooks&results=60'
url = ('https://www.whsmith.co.uk/search?keywordCategoryId=wc_dept_ebooks&results=60'
'&page=1&keywords=' + quote(query))
br = browser()
@ -59,7 +59,7 @@ class WHSmithUKStore(BasicStoreConfig, StorePlugin):
id_ = ''.join(data.xpath('./a[@class="product_image_wrap"]/@href'))
if not id_:
continue
id_ = 'http://www.whsmith.co.uk' + id_
id_ = 'https://www.whsmith.co.uk' + id_
cover_url = ''.join(data.xpath('.//img[@class="product_image"]/@src'))
title = ''.join(data.xpath('.//h4[@class="product_title"]/text()'))
author = ', '.join(data.xpath('.//span[@class="product_second"]/text()'))

View File

@ -36,7 +36,7 @@ def as_base64(data):
def search(query, max_results=10, timeout=60):
url = 'http://woblink.com/publication/ajax?mode=none&query=' + quote_plus(query)
url = 'https://woblink.com/publication/ajax?mode=none&query=' + quote_plus(query)
if max_results > 10:
if max_results > 20:
url += '&limit=30'
@ -47,7 +47,7 @@ def search(query, max_results=10, timeout=60):
rq = Request(url, headers={
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Referrer':'http://woblink.com/ebooki-kategorie',
'Referrer':'https://woblink.com/ebooki-kategorie',
'Cache-Control':'max-age=0',
}, data=urlencode({
'nw_filtry_filtr_zakrescen_formularz[min]':'0',
@ -89,13 +89,13 @@ class WoblinkStore(BasicStoreConfig, StorePlugin):
def open(self, parent=None, detail_item=None, external=False):
aff_root = 'https://www.a4b-tracking.com/pl/stat-click-text-link/16/58/'
url = 'http://woblink.com/publication'
url = 'https://woblink.com/publication'
aff_url = aff_root + as_base64(url)
detail_url = None
if detail_item:
detail_url = aff_root + as_base64('http://woblink.com' + detail_item)
detail_url = aff_root + as_base64('https://woblink.com' + detail_item)
if external or self.config.get('open_external', False):
open_url(QUrl(url_slash_cleaner(detail_url if detail_url else aff_url)))

View File

@ -29,7 +29,7 @@ class WolneLekturyStore(BasicStoreConfig, StorePlugin):
def open(self, parent=None, detail_item=None, external=False):
url = 'http://wolnelektury.pl'
url = 'https://wolnelektury.pl'
detail_url = None
if detail_item:
@ -44,7 +44,7 @@ class WolneLekturyStore(BasicStoreConfig, StorePlugin):
d.exec_()
def search(self, query, max_results=10, timeout=60):
url = 'http://wolnelektury.pl/szukaj?q=' + quote_plus(query)
url = 'https://wolnelektury.pl/szukaj?q=' + quote_plus(query)
br = browser()
@ -69,13 +69,13 @@ class WolneLekturyStore(BasicStoreConfig, StorePlugin):
s = SearchResult()
for link in data.xpath('.//div[@class="book-box-formats"]/span/a'):
ext = ''.join(link.xpath('./text()'))
href = 'http://wolnelektury.pl' + link.get('href')
href = 'https://wolnelektury.pl' + link.get('href')
s.downloads[ext] = href
s.cover_url = 'http://wolnelektury.pl' + cover_url.strip()
s.cover_url = 'https://wolnelektury.pl' + cover_url.strip()
s.title = title.strip()
s.author = author
s.price = price
s.detail_item = 'http://wolnelektury.pl' + id
s.detail_item = 'https://wolnelektury.pl' + id
s.formats = ', '.join(s.downloads.keys())
s.drm = SearchResult.DRM_UNLOCKED

View File

@ -23,10 +23,10 @@ from calibre.gui2.store.search_result import SearchResult
class XinXiiStore(BasicStoreConfig, OpenSearchOPDSStore):
open_search_url = 'http://www.xinxii.com/catalog-search/'
web_url = 'http://xinxii.com/'
open_search_url = 'https://www.xinxii.com/catalog-search/'
web_url = 'https://xinxii.com/'
# http://www.xinxii.com/catalog/
# https://www.xinxii.com/catalog/
def search(self, query, max_results=10, timeout=60):
'''
@ -42,7 +42,7 @@ class XinXiiStore(BasicStoreConfig, OpenSearchOPDSStore):
function so this one is modified to remove parts that are used.
'''
url = 'http://www.xinxii.com/catalog-search/query/?keywords=' + quote_plus(query)
url = 'https://www.xinxii.com/catalog-search/query/?keywords=' + quote_plus(query)
counter = max_results
br = browser()

View File

@ -857,7 +857,7 @@ class TagsModel(QAbstractItemModel): # {{{
fm['datatype'] == 'composite' and
fm['display'].get('make_category', False)))):
mime = 'application/calibre+from_library'
ids = list(map(int, str(md.data(mime)).split()))
ids = list(map(int, md.data(mime).data().split()))
self.handle_drop(node, ids)
return True
elif node.type == TagTreeItem.CATEGORY:
@ -871,7 +871,7 @@ class TagsModel(QAbstractItemModel): # {{{
(fm_src['datatype'] == 'composite' and
fm_src['display'].get('make_category', False))):
mime = 'application/calibre+from_library'
ids = list(map(int, str(md.data(mime)).split()))
ids = list(map(int, md.data(mime).data().split()))
self.handle_user_category_drop(node, ids, md.column_name)
return True
return False

View File

@ -1,4 +1,6 @@
#!/usr/bin/env python2
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

View File

@ -67,7 +67,7 @@ class AddDictionary(QDialog): # {{{
download more dictionaries from <a href="{1}">the LibreOffice extensions repository</a>.
The dictionary will download as an .oxt file. Simply specify the path to the
downloaded .oxt file here to add the dictionary to {0}.''').format(
__appname__, 'http://extensions.libreoffice.org/extension-center?getCategories=Dictionary&getCompatibility=any&sort_on=positive_ratings')+'<p>') # noqa
__appname__, 'https://extensions.libreoffice.org/extension-center?getCategories=Dictionary&getCompatibility=any&sort_on=positive_ratings')+'<p>') # noqa
la.setWordWrap(True)
la.setOpenExternalLinks(True)
la.setMinimumWidth(450)

View File

@ -1,4 +1,5 @@
from __future__ import print_function
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
'''
@ -23,7 +24,7 @@ from calibre.gui2.progress_indicator import ProgressIndicator as _ProgressIndica
from calibre.gui2.dnd import (dnd_has_image, dnd_get_image, dnd_get_files,
image_extensions, dnd_has_extension, DownloadDialog)
from calibre.utils.localization import localize_user_manual_link
from polyglot.builtins import unicode_type, range
from polyglot.builtins import native_string_type, unicode_type, range
history = XMLConfig('history')
@ -45,11 +46,11 @@ class ProgressIndicator(QWidget): # {{{
pwidth, pheight = view.size().width(), view.size().height()
self.resize(pwidth, min(pheight, 250))
if self.pos is None:
self.move(0, (pheight-self.size().height())/2.)
self.move(0, (pheight-self.size().height())/2)
else:
self.move(self.pos[0], self.pos[1])
self.pi.resize(self.pi.sizeHint())
self.pi.move(int((self.size().width()-self.pi.size().width())/2.), 0)
self.pi.move(int((self.size().width()-self.pi.size().width())//2), 0)
self.status.resize(self.size().width(), self.size().height()-self.pi.size().height()-10)
self.status.move(0, self.pi.size().height()+10)
self.status.setText('<h1>'+msg+'</h1>')
@ -137,7 +138,7 @@ class FilenamePattern(QWidget, Ui_Form): # {{{
self.series.setText(_('No match'))
if mi.series_index is not None:
self.series_index.setText(str(mi.series_index))
self.series_index.setText(unicode_type(mi.series_index))
else:
self.series_index.setText(_('No match'))
@ -151,7 +152,7 @@ class FilenamePattern(QWidget, Ui_Form): # {{{
else:
self.pubdate.setText(_('No match'))
self.isbn.setText(_('No match') if mi.isbn is None else str(mi.isbn))
self.isbn.setText(_('No match') if mi.isbn is None else unicode_type(mi.isbn))
self.comments.setText(mi.comments if mi.comments else _('No match'))
def pattern(self):
@ -304,7 +305,7 @@ def draw_size(p, rect, w, h):
f = p.font()
f.setBold(True)
p.setFont(f)
sz = u'\u00a0%d x %d\u00a0'%(w, h)
sz = '\u00a0%d x %d\u00a0'%(w, h)
flags = Qt.AlignBottom|Qt.AlignRight|Qt.TextSingleLine
szrect = p.boundingRect(rect, flags, sz)
p.fillRect(szrect.adjusted(0, 0, 0, 4), QColor(0, 0, 0, 200))
@ -369,8 +370,8 @@ class ImageView(QWidget, ImageDropMixin):
pmap = pmap.scaled(int(nw*pmap.devicePixelRatio()), int(nh*pmap.devicePixelRatio()), Qt.IgnoreAspectRatio,
Qt.SmoothTransformation)
w, h = int(pmap.width()/pmap.devicePixelRatio()), int(pmap.height()/pmap.devicePixelRatio())
x = int(abs(cw - w)/2.)
y = int(abs(ch - h)/2.)
x = int(abs(cw - w)//2)
y = int(abs(ch - h)//2)
target = QRect(x, y, w, h)
p = QPainter(self)
p.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)
@ -570,7 +571,7 @@ class CompleteLineEdit(EnLineEdit): # {{{
self.completer = ItemsCompleter(self, complete_items)
self.completer.setCaseSensitivity(Qt.CaseInsensitive)
self.completer.activated[str].connect(self.complete_text)
self.completer.activated[native_string_type].connect(self.complete_text)
self.completer.setWidget(self)
@ -888,13 +889,13 @@ class PythonHighlighter(QSyntaxHighlighter): # {{{
self.setFormat(0, textLength,
PythonHighlighter.Formats["normal"])
if text.startswith(u"Traceback") or text.startswith(u"Error: "):
if text.startswith("Traceback") or text.startswith("Error: "):
self.setCurrentBlockState(ERROR)
self.setFormat(0, textLength,
PythonHighlighter.Formats["error"])
return
if prevState == ERROR and \
not (text.startswith(u'>>>') or text.startswith(u"#")):
not (text.startswith('>>>') or text.startswith("#")):
self.setCurrentBlockState(ERROR)
self.setFormat(0, textLength,
PythonHighlighter.Formats["error"])
@ -913,18 +914,18 @@ class PythonHighlighter(QSyntaxHighlighter): # {{{
# PythonHighlighter.Rules.append((QRegExp(r"#.*"), "comment"))
if not text:
pass
elif text[0] == u"#":
elif text[0] == "#":
self.setFormat(0, len(text),
PythonHighlighter.Formats["comment"])
else:
stack = []
for i, c in enumerate(text):
if c in (u'"', u"'"):
if c in ('"', "'"):
if stack and stack[-1] == c:
stack.pop()
else:
stack.append(c)
elif c == u"#" and len(stack) == 0:
elif c == "#" and len(stack) == 0:
self.setFormat(i, len(text),
PythonHighlighter.Formats["comment"])
break

View File

@ -23,7 +23,7 @@ if iswindows:
except:
raise RuntimeError('NUL file missing in windows. This indicates a'
' corrupted windows. You should contact Microsoft'
' for assistance and/or follow the steps described here: http://bytes.com/topic/net/answers/264804-compile-error-null-device-missing')
' for assistance and/or follow the steps described here: https://bytes.com/topic/net/answers/264804-compile-error-null-device-missing')
def renice(niceness):

View File

@ -90,10 +90,10 @@ def extract_member(
def extract_first_alphabetically(stream):
from calibre.libunzip import sort_key
names_ = sorted([
names_ = sorted((
x for x in names(stream)
if os.path.splitext(x)[1][1:].lower() in {
'png', 'jpg', 'jpeg', 'gif', 'webp'}],
'png', 'jpg', 'jpeg', 'gif', 'webp'}),
key=sort_key)
return extract_member(stream, name=names_[0], match=None)

View File

@ -68,4 +68,4 @@ def to_png(bmp):
buf = QBuffer(ba)
buf.open(QBuffer.WriteOnly)
i.save(buf, 'png')
return bytes(ba.data())
return ba.data()

View File

@ -72,6 +72,7 @@ if is_py3:
codepoint_to_chr = chr
unicode_type = str
string_or_bytes = str, bytes
string_or_unicode = str
long_type = int
raw_input = input
getcwd = os.getcwd
@ -126,6 +127,7 @@ else:
codepoint_to_chr = unichr
unicode_type = unicode
string_or_bytes = unicode, bytes
string_or_unicode = str, unicode
long_type = long
exec_path = execfile
raw_input = builtins.raw_input