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)))
+