mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-31 14:33:54 -04:00
More tests for the insane EPUB cover semantics
This commit is contained in:
parent
4ab707e60b
commit
2788b5e099
@ -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):
|
||||||
|
@ -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):
|
||||||
|
@ -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)))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user