More tests for the insane EPUB cover semantics

This commit is contained in:
Kovid Goyal 2016-07-05 11:03:48 +05:30
parent 4ab707e60b
commit 2788b5e099
3 changed files with 33 additions and 2 deletions

View File

@ -641,6 +641,7 @@ class Container(ContainerBase): # {{{
identified by name. You can pass None as the name to remove the identified by name. You can pass None as the name to remove the
property from all items. ''' property from all items. '''
properties = frozenset(properties) properties = frozenset(properties)
removed_names, added_names = [], []
for p in properties: for p in properties:
if p.startswith('calibre:'): if p.startswith('calibre:'):
ensure_prefix(self.opf, None, 'calibre', CALIBRE_PREFIX) ensure_prefix(self.opf, None, 'calibre', CALIBRE_PREFIX)
@ -653,6 +654,7 @@ class Container(ContainerBase): # {{{
for prop in properties: for prop in properties:
if prop.lower() in lprops: if prop.lower() in lprops:
if name != iname: if name != iname:
removed_names.append(iname)
props = [p for p in props if p.lower() != prop] props = [p for p in props if p.lower() != prop]
if props: if props:
item.set('properties', ' '.join(props)) item.set('properties', ' '.join(props))
@ -660,9 +662,11 @@ class Container(ContainerBase): # {{{
del item.attrib['properties'] del item.attrib['properties']
else: else:
if name == iname: if name == iname:
added_names.append(iname)
props.append(prop) props.append(prop)
item.set('properties', ' '.join(props)) item.set('properties', ' '.join(props))
self.dirty(self.opf_name) self.dirty(self.opf_name)
return removed_names, added_names
@property @property
def guide_type_map(self): def guide_type_map(self):

View File

@ -285,7 +285,9 @@ def clean_opf(container):
name = gtm.get(typ, None) name = gtm.get(typ, None)
if name and name in container.name_path_map: if name and name in container.name_path_map:
yield name 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) container.dirty(container.opf_name)
def create_epub_cover(container, cover_path, existing_image, options=None): def create_epub_cover(container, cover_path, existing_image, options=None):

View File

@ -11,9 +11,12 @@ import os
from calibre.ebooks.oeb.polish.tests.base import BaseTest from calibre.ebooks.oeb.polish.tests.base import BaseTest
from calibre.ebooks.oeb.polish.container import get_container from calibre.ebooks.oeb.polish.container import get_container
from calibre.ebooks.oeb.polish.create import create_book 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.toc import get_toc
from calibre.ebooks.oeb.polish.utils import guess_type 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.book.base import Metadata
from calibre.ebooks.metadata.opf3 import CALIBRE_PREFIX from calibre.ebooks.metadata.opf3 import CALIBRE_PREFIX
@ -41,6 +44,8 @@ def create_epub(manifest, spine=(), guide=(), meta_cover=None, ver=3):
metadata = '' metadata = ''
if meta_cover: if meta_cover:
metadata = '<meta name="cover" content="%s"/>' % meta_cover metadata = '<meta name="cover" content="%s"/>' % meta_cover
if not spine:
spine = [x[0] for x in manifest if guess_type(x[0]) in OEB_DOCS]
spine = ''.join('<itemref idref="%s"/>' % name for name in spine) spine = ''.join('<itemref idref="%s"/>' % name for name in spine)
guide = ''.join('<reference href="%s" type="%s"/>' % (name, typ) for name, typ in guide) guide = ''.join('<reference href="%s" type="%s"/>' % (name, typ) for name, typ in guide)
opf = OPF_TEMPLATE.format(manifest=mo, ver='%d.0'%ver, metadata=metadata, spine=spine, guide=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') self.assertEqual(toc.as_dict['children'][0]['title'], 'EPUB 3 nav')
def test_epub3_covers(self): def test_epub3_covers(self):
# cover image
c = self.create_epub([cmi('c.jpg')]) c = self.create_epub([cmi('c.jpg')])
self.assertIsNone(find_cover_image(c)) self.assertIsNone(find_cover_image(c))
c = self.create_epub([cmi('c.jpg')], meta_cover='c.jpg') 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.assertEqual('d.jpg', find_cover_image(c))
self.assertFalse(c.opf_xpath('//*/@name')) 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)))