mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix broken LIT Output. Fixes #769334 (Error converting from [any] to Lit)
This commit is contained in:
parent
267a02a49e
commit
ae85da399a
@ -1,75 +0,0 @@
|
|||||||
'''
|
|
||||||
Device profiles.
|
|
||||||
'''
|
|
||||||
|
|
||||||
__license__ = 'GPL v3'
|
|
||||||
__copyright__ = '2008, Marshall T. Vandegrift <llasram@gmail.com>'
|
|
||||||
|
|
||||||
from itertools import izip
|
|
||||||
|
|
||||||
FONT_SIZES = [('xx-small', 1),
|
|
||||||
('x-small', None),
|
|
||||||
('small', 2),
|
|
||||||
('medium', 3),
|
|
||||||
('large', 4),
|
|
||||||
('x-large', 5),
|
|
||||||
('xx-large', 6),
|
|
||||||
(None, 7)]
|
|
||||||
|
|
||||||
|
|
||||||
class Profile(object):
|
|
||||||
def __init__(self, width, height, dpi, fbase, fsizes):
|
|
||||||
self.width = (float(width) / dpi) * 72.
|
|
||||||
self.height = (float(height) / dpi) * 72.
|
|
||||||
self.dpi = float(dpi)
|
|
||||||
self.fbase = float(fbase)
|
|
||||||
self.fsizes = []
|
|
||||||
for (name, num), size in izip(FONT_SIZES, fsizes):
|
|
||||||
self.fsizes.append((name, num, float(size)))
|
|
||||||
self.fnames = dict((name, sz) for name, _, sz in self.fsizes if name)
|
|
||||||
self.fnums = dict((num, sz) for _, num, sz in self.fsizes if num)
|
|
||||||
|
|
||||||
|
|
||||||
PROFILES = {
|
|
||||||
'PRS505':
|
|
||||||
Profile(width=584, height=754, dpi=168.451, fbase=12,
|
|
||||||
fsizes=[7.5, 9, 10, 12, 15.5, 20, 22, 24]),
|
|
||||||
|
|
||||||
'MSReader':
|
|
||||||
Profile(width=480, height=652, dpi=96, fbase=13,
|
|
||||||
fsizes=[10, 11, 13, 16, 18, 20, 22, 26]),
|
|
||||||
|
|
||||||
# Not really, but let's pretend
|
|
||||||
'Mobipocket':
|
|
||||||
Profile(width=600, height=800, dpi=96, fbase=18,
|
|
||||||
fsizes=[14, 14, 16, 18, 20, 22, 24, 26]),
|
|
||||||
|
|
||||||
# No clue on usable screen size; DPI should be good
|
|
||||||
'HanlinV3':
|
|
||||||
Profile(width=584, height=754, dpi=168.451, fbase=16,
|
|
||||||
fsizes=[12, 12, 14, 16, 18, 20, 22, 24]),
|
|
||||||
|
|
||||||
'CybookG3':
|
|
||||||
Profile(width=600, height=800, dpi=168.451, fbase=16,
|
|
||||||
fsizes=[12, 12, 14, 16, 18, 20, 22, 24]),
|
|
||||||
|
|
||||||
'Kindle':
|
|
||||||
Profile(width=525, height=640, dpi=168.451, fbase=16,
|
|
||||||
fsizes=[12, 12, 14, 16, 18, 20, 22, 24]),
|
|
||||||
|
|
||||||
'Browser':
|
|
||||||
Profile(width=800, height=600, dpi=100.0, fbase=12,
|
|
||||||
fsizes=[5, 7, 9, 12, 13.5, 17, 20, 22, 24])
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class Context(object):
|
|
||||||
PROFILES = PROFILES
|
|
||||||
|
|
||||||
def __init__(self, source, dest):
|
|
||||||
if source in PROFILES:
|
|
||||||
source = PROFILES[source]
|
|
||||||
if dest in PROFILES:
|
|
||||||
dest = PROFILES[dest]
|
|
||||||
self.source = source
|
|
||||||
self.dest = dest
|
|
@ -21,7 +21,6 @@ from calibre import force_unicode
|
|||||||
from calibre.ebooks import unit_convert
|
from calibre.ebooks import unit_convert
|
||||||
from calibre.ebooks.oeb.base import XHTML, XHTML_NS, CSS_MIME, OEB_STYLES
|
from calibre.ebooks.oeb.base import XHTML, XHTML_NS, CSS_MIME, OEB_STYLES
|
||||||
from calibre.ebooks.oeb.base import XPNSMAP, xpath, urlnormalize
|
from calibre.ebooks.oeb.base import XPNSMAP, xpath, urlnormalize
|
||||||
from calibre.ebooks.oeb.profile import PROFILES
|
|
||||||
|
|
||||||
cssutils.log.setLevel(logging.WARN)
|
cssutils.log.setLevel(logging.WARN)
|
||||||
|
|
||||||
@ -123,10 +122,10 @@ class CSSSelector(etree.XPath):
|
|||||||
class Stylizer(object):
|
class Stylizer(object):
|
||||||
STYLESHEETS = WeakKeyDictionary()
|
STYLESHEETS = WeakKeyDictionary()
|
||||||
|
|
||||||
def __init__(self, tree, path, oeb, opts, profile=PROFILES['PRS505'],
|
def __init__(self, tree, path, oeb, opts, profile=None,
|
||||||
extra_css='', user_css=''):
|
extra_css='', user_css=''):
|
||||||
self.oeb, self.opts = oeb, opts
|
self.oeb, self.opts = oeb, opts
|
||||||
self.profile = profile
|
self.profile = opts.input_profile
|
||||||
self.logger = oeb.logger
|
self.logger = oeb.logger
|
||||||
item = oeb.manifest.hrefs[path]
|
item = oeb.manifest.hrefs[path]
|
||||||
basename = os.path.basename(path)
|
basename = os.path.basename(path)
|
||||||
|
@ -27,13 +27,13 @@ from calibre.gui2.store.web_store_dialog import WebStoreDialog
|
|||||||
from calibre.utils.icu import sort_key
|
from calibre.utils.icu import sort_key
|
||||||
|
|
||||||
class MobileReadStore(BasicStoreConfig, StorePlugin):
|
class MobileReadStore(BasicStoreConfig, StorePlugin):
|
||||||
|
|
||||||
def genesis(self):
|
def genesis(self):
|
||||||
self.rlock = RLock()
|
self.rlock = RLock()
|
||||||
|
|
||||||
def open(self, parent=None, detail_item=None, external=False):
|
def open(self, parent=None, detail_item=None, external=False):
|
||||||
url = 'http://www.mobileread.com/'
|
url = 'http://www.mobileread.com/'
|
||||||
|
|
||||||
if external or self.config.get('open_external', False):
|
if external or self.config.get('open_external', False):
|
||||||
open_url(QUrl(detail_item if detail_item else url))
|
open_url(QUrl(detail_item if detail_item else url))
|
||||||
else:
|
else:
|
||||||
@ -68,7 +68,7 @@ class MobileReadStore(BasicStoreConfig, StorePlugin):
|
|||||||
ratio += s.ratio()
|
ratio += s.ratio()
|
||||||
if ratio > 0:
|
if ratio > 0:
|
||||||
matches.append((ratio, x))
|
matches.append((ratio, x))
|
||||||
|
|
||||||
# Move the best scorers to head of list.
|
# Move the best scorers to head of list.
|
||||||
matches = heapq.nlargest(max_results, matches)
|
matches = heapq.nlargest(max_results, matches)
|
||||||
for score, book in matches:
|
for score, book in matches:
|
||||||
@ -79,21 +79,21 @@ class MobileReadStore(BasicStoreConfig, StorePlugin):
|
|||||||
def update_book_list(self, timeout=10):
|
def update_book_list(self, timeout=10):
|
||||||
with self.rlock:
|
with self.rlock:
|
||||||
url = 'http://www.mobileread.com/forums/ebooks.php?do=getlist&type=html'
|
url = 'http://www.mobileread.com/forums/ebooks.php?do=getlist&type=html'
|
||||||
|
|
||||||
last_download = self.config.get('last_download', None)
|
last_download = self.config.get('last_download', None)
|
||||||
# Don't update the book list if our cache is less than one week old.
|
# Don't update the book list if our cache is less than one week old.
|
||||||
if last_download and (time.time() - last_download) < 604800:
|
if last_download and (time.time() - last_download) < 604800:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Download the book list HTML file from MobileRead.
|
# Download the book list HTML file from MobileRead.
|
||||||
br = browser()
|
br = browser()
|
||||||
raw_data = None
|
raw_data = None
|
||||||
with closing(br.open(url, timeout=timeout)) as f:
|
with closing(br.open(url, timeout=timeout)) as f:
|
||||||
raw_data = f.read()
|
raw_data = f.read()
|
||||||
|
|
||||||
if not raw_data:
|
if not raw_data:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Turn books listed in the HTML file into SearchResults's.
|
# Turn books listed in the HTML file into SearchResults's.
|
||||||
books = []
|
books = []
|
||||||
try:
|
try:
|
||||||
@ -103,7 +103,7 @@ class MobileReadStore(BasicStoreConfig, StorePlugin):
|
|||||||
book.detail_item = ''.join(book_data.xpath('.//a/@href'))
|
book.detail_item = ''.join(book_data.xpath('.//a/@href'))
|
||||||
book.formats = ''.join(book_data.xpath('.//i/text()'))
|
book.formats = ''.join(book_data.xpath('.//i/text()'))
|
||||||
book.formats = book.formats.strip()
|
book.formats = book.formats.strip()
|
||||||
|
|
||||||
text = ''.join(book_data.xpath('.//a/text()'))
|
text = ''.join(book_data.xpath('.//a/text()'))
|
||||||
if ':' in text:
|
if ':' in text:
|
||||||
book.author, q, text = text.partition(':')
|
book.author, q, text = text.partition(':')
|
||||||
@ -112,7 +112,7 @@ class MobileReadStore(BasicStoreConfig, StorePlugin):
|
|||||||
books.append(book)
|
books.append(book)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Save the book list and it's create time.
|
# Save the book list and it's create time.
|
||||||
if books:
|
if books:
|
||||||
self.config['last_download'] = time.time()
|
self.config['last_download'] = time.time()
|
||||||
@ -121,7 +121,7 @@ class MobileReadStore(BasicStoreConfig, StorePlugin):
|
|||||||
def get_book_list(self, timeout=10):
|
def get_book_list(self, timeout=10):
|
||||||
self.update_book_list(timeout=timeout)
|
self.update_book_list(timeout=timeout)
|
||||||
return self.deseralize_books(self.config.get('book_list', []))
|
return self.deseralize_books(self.config.get('book_list', []))
|
||||||
|
|
||||||
def seralize_books(self, books):
|
def seralize_books(self, books):
|
||||||
sbooks = []
|
sbooks = []
|
||||||
for b in books:
|
for b in books:
|
||||||
@ -132,7 +132,7 @@ class MobileReadStore(BasicStoreConfig, StorePlugin):
|
|||||||
data['formats'] = b.formats
|
data['formats'] = b.formats
|
||||||
sbooks.append(data)
|
sbooks.append(data)
|
||||||
return sbooks
|
return sbooks
|
||||||
|
|
||||||
def deseralize_books(self, sbooks):
|
def deseralize_books(self, sbooks):
|
||||||
books = []
|
books = []
|
||||||
for s in sbooks:
|
for s in sbooks:
|
||||||
@ -146,13 +146,13 @@ class MobileReadStore(BasicStoreConfig, StorePlugin):
|
|||||||
|
|
||||||
|
|
||||||
class MobeReadStoreDialog(QDialog, Ui_Dialog):
|
class MobeReadStoreDialog(QDialog, Ui_Dialog):
|
||||||
|
|
||||||
def __init__(self, plugin, *args):
|
def __init__(self, plugin, *args):
|
||||||
QDialog.__init__(self, *args)
|
QDialog.__init__(self, *args)
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
|
|
||||||
self.plugin = plugin
|
self.plugin = plugin
|
||||||
|
|
||||||
self.model = BooksModel()
|
self.model = BooksModel()
|
||||||
self.results_view.setModel(self.model)
|
self.results_view.setModel(self.model)
|
||||||
self.results_view.model().set_books(self.plugin.get_book_list())
|
self.results_view.model().set_books(self.plugin.get_book_list())
|
||||||
@ -162,14 +162,14 @@ class MobeReadStoreDialog(QDialog, Ui_Dialog):
|
|||||||
self.search_query.textChanged.connect(self.model.set_filter)
|
self.search_query.textChanged.connect(self.model.set_filter)
|
||||||
self.results_view.model().total_changed.connect(self.total.setText)
|
self.results_view.model().total_changed.connect(self.total.setText)
|
||||||
self.finished.connect(self.dialog_closed)
|
self.finished.connect(self.dialog_closed)
|
||||||
|
|
||||||
self.restore_state()
|
self.restore_state()
|
||||||
|
|
||||||
def open_store(self, index):
|
def open_store(self, index):
|
||||||
result = self.results_view.model().get_book(index)
|
result = self.results_view.model().get_book(index)
|
||||||
if result:
|
if result:
|
||||||
self.plugin.open(self, result.detail_item)
|
self.plugin.open(self, result.detail_item)
|
||||||
|
|
||||||
def restore_state(self):
|
def restore_state(self):
|
||||||
geometry = self.plugin.config.get('dialog_geometry', None)
|
geometry = self.plugin.config.get('dialog_geometry', None)
|
||||||
if geometry:
|
if geometry:
|
||||||
@ -184,7 +184,7 @@ class MobeReadStoreDialog(QDialog, Ui_Dialog):
|
|||||||
else:
|
else:
|
||||||
for i in xrange(self.results_view.model().columnCount()):
|
for i in xrange(self.results_view.model().columnCount()):
|
||||||
self.results_view.resizeColumnToContents(i)
|
self.results_view.resizeColumnToContents(i)
|
||||||
|
|
||||||
self.results_view.model().sort_col = self.plugin.config.get('dialog_sort_col', 0)
|
self.results_view.model().sort_col = self.plugin.config.get('dialog_sort_col', 0)
|
||||||
self.results_view.model().sort_order = self.plugin.config.get('dialog_sort_order', Qt.AscendingOrder)
|
self.results_view.model().sort_order = self.plugin.config.get('dialog_sort_order', Qt.AscendingOrder)
|
||||||
self.results_view.model().sort(self.results_view.model().sort_col, self.results_view.model().sort_order)
|
self.results_view.model().sort(self.results_view.model().sort_col, self.results_view.model().sort_order)
|
||||||
@ -201,7 +201,7 @@ class MobeReadStoreDialog(QDialog, Ui_Dialog):
|
|||||||
|
|
||||||
|
|
||||||
class BooksModel(QAbstractItemModel):
|
class BooksModel(QAbstractItemModel):
|
||||||
|
|
||||||
total_changed = pyqtSignal(unicode)
|
total_changed = pyqtSignal(unicode)
|
||||||
|
|
||||||
HEADERS = [_('Title'), _('Author(s)'), _('Format')]
|
HEADERS = [_('Title'), _('Author(s)'), _('Format')]
|
||||||
@ -217,7 +217,7 @@ class BooksModel(QAbstractItemModel):
|
|||||||
def set_books(self, books):
|
def set_books(self, books):
|
||||||
self.books = books
|
self.books = books
|
||||||
self.all_books = books
|
self.all_books = books
|
||||||
|
|
||||||
self.sort(self.sort_col, self.sort_order)
|
self.sort(self.sort_col, self.sort_order)
|
||||||
|
|
||||||
def get_book(self, index):
|
def get_book(self, index):
|
||||||
@ -226,11 +226,11 @@ class BooksModel(QAbstractItemModel):
|
|||||||
return self.books[row]
|
return self.books[row]
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def set_filter(self, filter):
|
def set_filter(self, filter):
|
||||||
#self.layoutAboutToBeChanged.emit()
|
#self.layoutAboutToBeChanged.emit()
|
||||||
self.beginResetModel()
|
self.beginResetModel()
|
||||||
|
|
||||||
self.filter = unicode(filter)
|
self.filter = unicode(filter)
|
||||||
self.books = []
|
self.books = []
|
||||||
if self.filter:
|
if self.filter:
|
||||||
@ -253,7 +253,7 @@ class BooksModel(QAbstractItemModel):
|
|||||||
|
|
||||||
self.endResetModel()
|
self.endResetModel()
|
||||||
#self.layoutChanged.emit()
|
#self.layoutChanged.emit()
|
||||||
|
|
||||||
def index(self, row, column, parent=QModelIndex()):
|
def index(self, row, column, parent=QModelIndex()):
|
||||||
return self.createIndex(row, column)
|
return self.createIndex(row, column)
|
||||||
|
|
||||||
@ -267,7 +267,7 @@ class BooksModel(QAbstractItemModel):
|
|||||||
|
|
||||||
def columnCount(self, *args):
|
def columnCount(self, *args):
|
||||||
return len(self.HEADERS)
|
return len(self.HEADERS)
|
||||||
|
|
||||||
def headerData(self, section, orientation, role):
|
def headerData(self, section, orientation, role):
|
||||||
if role != Qt.DisplayRole:
|
if role != Qt.DisplayRole:
|
||||||
return NONE
|
return NONE
|
||||||
@ -307,7 +307,7 @@ class BooksModel(QAbstractItemModel):
|
|||||||
|
|
||||||
if not self.books:
|
if not self.books:
|
||||||
return
|
return
|
||||||
descending = order == Qt.DescendingOrder
|
descending = order == Qt.DescendingOrder
|
||||||
self.books.sort(None,
|
self.books.sort(None,
|
||||||
lambda x: sort_key(unicode(self.data_as_text(x, col))),
|
lambda x: sort_key(unicode(self.data_as_text(x, col))),
|
||||||
descending)
|
descending)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user