EPUB Input: Handle the case of the metadata ToC containing a reference to the cover HTML file correctly. Fixes #993812 (Update cover page in toc.ncx when converting)

This commit is contained in:
Kovid Goyal 2012-05-03 18:45:29 +05:30
parent 21c84615de
commit 27d199a74b
3 changed files with 30 additions and 1 deletions

View File

@ -65,6 +65,7 @@ class EPUBInput(InputFormatPlugin):
return False return False
def rationalize_cover(self, opf, log): def rationalize_cover(self, opf, log):
removed = None
from lxml import etree from lxml import etree
guide_cover, guide_elem = None, None guide_cover, guide_elem = None, None
for guide_elem in opf.iterguide(): for guide_elem in opf.iterguide():
@ -91,6 +92,7 @@ class EPUBInput(InputFormatPlugin):
# specially # specially
if not self.for_viewer: if not self.for_viewer:
spine[0].getparent().remove(spine[0]) spine[0].getparent().remove(spine[0])
removed = guide_cover
guide_elem.set('href', 'calibre_raster_cover.jpg') guide_elem.set('href', 'calibre_raster_cover.jpg')
from calibre.ebooks.oeb.base import OPF from calibre.ebooks.oeb.base import OPF
t = etree.SubElement(elem[0].getparent(), OPF('item'), t = etree.SubElement(elem[0].getparent(), OPF('item'),
@ -109,6 +111,7 @@ class EPUBInput(InputFormatPlugin):
if renderer is not None: if renderer is not None:
open('calibre_raster_cover.jpg', 'wb').write( open('calibre_raster_cover.jpg', 'wb').write(
renderer) renderer)
return removed
def find_opf(self): def find_opf(self):
from lxml import etree from lxml import etree
@ -170,7 +173,7 @@ class EPUBInput(InputFormatPlugin):
for elem in opf.iterguide(): for elem in opf.iterguide():
elem.set('href', delta+elem.get('href')) elem.set('href', delta+elem.get('href'))
self.rationalize_cover(opf, log) self.removed_cover = self.rationalize_cover(opf, log)
self.optimize_opf_parsing = opf self.optimize_opf_parsing = opf
for x in opf.itermanifest(): for x in opf.itermanifest():
@ -198,3 +201,18 @@ class EPUBInput(InputFormatPlugin):
nopf.write(opf.render()) nopf.write(opf.render())
return os.path.abspath(u'content.opf') return os.path.abspath(u'content.opf')
def postprocess_book(self, oeb, opts, log):
rc = getattr(self, 'removed_cover', None)
if rc:
cover_toc_item = None
for item in oeb.toc.iterdescendants():
if item.href == rc:
cover_toc_item = item
break
spine = {x.href for x in oeb.spine}
if (cover_toc_item is not None and cover_toc_item.count() == 0 and
cover_toc_item not in spine):
oeb.toc.item_that_refers_to_cover = cover_toc_item

View File

@ -1011,6 +1011,13 @@ OptionRecommendation(name='search_replace',
pr(0.35) pr(0.35)
self.flush() self.flush()
if self.output_plugin.file_type != 'epub':
# Remove the toc reference to the html cover, if any, except for
# epub, as the epub output plugin will do the right thing with it.
item = getattr(self.oeb.toc, 'item_that_refers_to_cover', None)
if item is not None:
self.oeb.toc.remove(item)
from calibre.ebooks.oeb.transforms.flatcss import CSSFlattener from calibre.ebooks.oeb.transforms.flatcss import CSSFlattener
fbase = self.opts.base_font_size fbase = self.opts.base_font_size
if fbase < 1e-4: if fbase < 1e-4:

View File

@ -167,5 +167,9 @@ class CoverManager(object):
self.oeb.guide.refs['cover'].href = item.href self.oeb.guide.refs['cover'].href = item.href
if 'titlepage' in self.oeb.guide.refs: if 'titlepage' in self.oeb.guide.refs:
self.oeb.guide.refs['titlepage'].href = item.href self.oeb.guide.refs['titlepage'].href = item.href
titem = getattr(self.oeb.toc, 'item_that_refers_to_cover', None)
if titem is not None:
titem.href = item.href