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

View File

@ -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):

View File

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