From c37c5436b0870d91a6df3358e30c9509a2e63726 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 19 Apr 2009 20:12:25 -0700 Subject: [PATCH] EPUB Input plugin now rasterizes cover and sets a type='titlepage' guide element to point to the HTML cover. The HTML cover is removed from the spine. --- src/calibre/ebooks/__init__.py | 5 ++++- src/calibre/ebooks/epub/input.py | 38 +++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/__init__.py b/src/calibre/ebooks/__init__.py index 26d2394818..79f4f7631e 100644 --- a/src/calibre/ebooks/__init__.py +++ b/src/calibre/ebooks/__init__.py @@ -59,7 +59,10 @@ class HTMLRenderer(object): def render_html(path_to_html, width=590, height=750): from PyQt4.QtWebKit import QWebPage - from PyQt4.Qt import QEventLoop, QPalette, Qt, SIGNAL, QUrl, QSize + from PyQt4.Qt import QEventLoop, QPalette, Qt, SIGNAL, QUrl, QSize, \ + QApplication + if QApplication.instance() is None: + QApplication([]) path_to_html = os.path.abspath(path_to_html) with CurrentDir(os.path.dirname(path_to_html)): page = QWebPage() diff --git a/src/calibre/ebooks/epub/input.py b/src/calibre/ebooks/epub/input.py index 10bb321a11..919416ffdc 100644 --- a/src/calibre/ebooks/epub/input.py +++ b/src/calibre/ebooks/epub/input.py @@ -51,6 +51,39 @@ class EPUBInput(InputFormatPlugin): traceback.print_exc() return False + @classmethod + def rationalize_cover(self, opf): + guide_cover, guide_elem = None, None + for guide_elem in opf.iterguide(): + if guide_elem.get('type', '').lower() == 'cover': + guide_cover = guide_elem.get('href', '') + break + if not guide_cover: + return + spine = list(opf.iterspine()) + if not spine: + return + idref = spine[0].get('idref', '') + manifest = list(opf.itermanifest()) + if not manifest: + return + if manifest[0].get('id', False) != idref: + return + spine[0].getparent().remove(spine[0]) + guide_elem.set('href', 'calibre_raster_cover.jpg') + for elem in list(opf.iterguide()): + if elem.get('type', '').lower() == 'titlepage': + elem.getparent().remove(elem) + from calibre.ebooks.oeb.base import OPF + t = etree.SubElement(guide_elem.getparent(), OPF('reference')) + t.set('type', 'titlepage') + t.set('href', guide_cover) + t.set('title', 'Title Page') + from calibre.ebooks import render_html + open('calibre_raster_cover.jpg', 'wb').write( + render_html(guide_cover).data) + + def convert(self, stream, options, file_ext, log, accelerators): from calibre.utils.zipfile import ZipFile from calibre import walk @@ -75,14 +108,17 @@ class EPUBInput(InputFormatPlugin): opf = os.path.relpath(opf, os.getcwdu()) parts = os.path.split(opf) + opf = OPF(opf, os.path.dirname(os.path.abspath(opf))) + if len(parts) > 1: delta = '/'.join(parts[:-1])+'/' - opf = OPF(opf, os.path.dirname(os.path.abspath(opf))) for elem in opf.itermanifest(): elem.set('href', delta+elem.get('href')) for elem in opf.iterguide(): elem.set('href', delta+elem.get('href')) + self.rationalize_cover(opf) + with open('content.opf', 'wb') as nopf: nopf.write(opf.render())