diff --git a/src/calibre/ebooks/oeb/polish/container.py b/src/calibre/ebooks/oeb/polish/container.py index 1fcb4d70e5..9a577c2a7b 100644 --- a/src/calibre/ebooks/oeb/polish/container.py +++ b/src/calibre/ebooks/oeb/polish/container.py @@ -641,6 +641,7 @@ class Container(ContainerBase): # {{{ identified by name. You can pass None as the name to remove the property from all items. ''' properties = frozenset(properties) + removed_names, added_names = [], [] for p in properties: if p.startswith('calibre:'): ensure_prefix(self.opf, None, 'calibre', CALIBRE_PREFIX) @@ -653,6 +654,7 @@ class Container(ContainerBase): # {{{ for prop in properties: if prop.lower() in lprops: if name != iname: + removed_names.append(iname) props = [p for p in props if p.lower() != prop] if props: item.set('properties', ' '.join(props)) @@ -660,9 +662,11 @@ class Container(ContainerBase): # {{{ del item.attrib['properties'] else: if name == iname: + added_names.append(iname) props.append(prop) item.set('properties', ' '.join(props)) self.dirty(self.opf_name) + return removed_names, added_names @property def guide_type_map(self): diff --git a/src/calibre/ebooks/oeb/polish/cover.py b/src/calibre/ebooks/oeb/polish/cover.py index afdf1a92fa..ea2e5d6a52 100644 --- a/src/calibre/ebooks/oeb/polish/cover.py +++ b/src/calibre/ebooks/oeb/polish/cover.py @@ -285,7 +285,9 @@ def clean_opf(container): name = gtm.get(typ, None) if name and name in container.name_path_map: yield name - container.apply_unique_properties(None, 'cover-image', 'calibre:title-page') + removed_names = container.apply_unique_properties(None, 'cover-image', 'calibre:title-page')[0] + for name in removed_names: + yield name container.dirty(container.opf_name) def create_epub_cover(container, cover_path, existing_image, options=None): diff --git a/src/calibre/ebooks/oeb/polish/tests/structure.py b/src/calibre/ebooks/oeb/polish/tests/structure.py index df903c166c..f5ceb6d4d4 100644 --- a/src/calibre/ebooks/oeb/polish/tests/structure.py +++ b/src/calibre/ebooks/oeb/polish/tests/structure.py @@ -11,9 +11,12 @@ import os from calibre.ebooks.oeb.polish.tests.base import BaseTest from calibre.ebooks.oeb.polish.container import get_container from calibre.ebooks.oeb.polish.create import create_book -from calibre.ebooks.oeb.polish.cover import find_cover_image, mark_as_cover +from calibre.ebooks.oeb.polish.cover import ( + find_cover_image, mark_as_cover, find_cover_page, mark_as_titlepage, clean_opf +) from calibre.ebooks.oeb.polish.toc import get_toc from calibre.ebooks.oeb.polish.utils import guess_type +from calibre.ebooks.oeb.base import OEB_DOCS from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.opf3 import CALIBRE_PREFIX @@ -41,6 +44,8 @@ def create_epub(manifest, spine=(), guide=(), meta_cover=None, ver=3): metadata = '' if meta_cover: metadata = '' % meta_cover + if not spine: + spine = [x[0] for x in manifest if guess_type(x[0]) in OEB_DOCS] spine = ''.join('' % name for name in spine) guide = ''.join('' % (name, typ) for name, typ in guide) opf = OPF_TEMPLATE.format(manifest=mo, ver='%d.0'%ver, metadata=metadata, spine=spine, guide=guide) @@ -90,6 +95,7 @@ class Structure(BaseTest): self.assertEqual(toc.as_dict['children'][0]['title'], 'EPUB 3 nav') def test_epub3_covers(self): + # cover image c = self.create_epub([cmi('c.jpg')]) self.assertIsNone(find_cover_image(c)) c = self.create_epub([cmi('c.jpg')], meta_cover='c.jpg') @@ -100,3 +106,22 @@ class Structure(BaseTest): self.assertEqual('d.jpg', find_cover_image(c)) self.assertFalse(c.opf_xpath('//*/@name')) + # title page + c = self.create_epub([cmi('c.html'), cmi('a.html')]) + self.assertIsNone(find_cover_page(c)) + mark_as_titlepage(c, 'a.html', move_to_start=False) + self.assertEqual('a.html', find_cover_page(c)) + self.assertEqual('c.html', next(c.spine_names)[0]) + mark_as_titlepage(c, 'a.html', move_to_start=True) + self.assertEqual('a.html', find_cover_page(c)) + self.assertEqual('a.html', next(c.spine_names)[0]) + + # clean opf of all cover information + c = self.create_epub([cmi('c.jpg', b'z', 'cover-image'), cmi('c.html', b'', 'calibre:title-page'), cmi('d.html')], + meta_cover='c.jpg', guide=[('c.jpg', 'cover'), ('d.html', 'cover')]) + self.assertEqual(set(clean_opf(c)), {'c.jpg', 'c.html', 'd.html'}) + self.assertFalse(c.opf_xpath('//*/@name')) + self.assertFalse(c.opf_xpath('//*/@type')) + for prop in 'cover-image calibre:title-page'.split(): + self.assertEqual([], list(c.manifest_items_with_property(prop))) +