mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-31 14:33:54 -04:00
Edit Book: Add check for spine items with incorrect media-type specified in the manifest
This commit is contained in:
parent
77edd3a7a9
commit
119108371c
@ -11,7 +11,7 @@ from lxml import etree
|
|||||||
from calibre import prepare_string_for_xml as xml
|
from calibre import prepare_string_for_xml as xml
|
||||||
from calibre.ebooks.oeb.polish.check.base import BaseError, WARN
|
from calibre.ebooks.oeb.polish.check.base import BaseError, WARN
|
||||||
from calibre.ebooks.oeb.polish.utils import guess_type
|
from calibre.ebooks.oeb.polish.utils import guess_type
|
||||||
from calibre.ebooks.oeb.base import OPF, OPF2_NS, DC, DC11_NS
|
from calibre.ebooks.oeb.base import OPF, OPF2_NS, DC, DC11_NS, XHTML_MIME
|
||||||
|
|
||||||
class MissingSection(BaseError):
|
class MissingSection(BaseError):
|
||||||
|
|
||||||
@ -169,6 +169,27 @@ class NoUID(BaseError):
|
|||||||
container.dirty(container.opf_name)
|
container.dirty(container.opf_name)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
class BadSpineMime(BaseError):
|
||||||
|
|
||||||
|
def __init__(self, name, iid, mt, lnum, opf_name):
|
||||||
|
BaseError.__init__(self, _('Incorrect media-type for spine item'), opf_name, lnum)
|
||||||
|
self.HELP = _(
|
||||||
|
'The item {0} present in the spine has the media-type {1}. '
|
||||||
|
' Most ebook software cannot handle non-HTML spine items. '
|
||||||
|
' If the item is actually HTML, you should change its media-type to {2}.'
|
||||||
|
' If it is not-HTML you should consider replacing it with an HTML item, as it'
|
||||||
|
' is unlikely to work in most readers.').format(name, mt, XHTML_MIME)
|
||||||
|
if iid is not None:
|
||||||
|
self.INDIVIDUAL_FIX = _('Change the media-type to %s') % XHTML_MIME
|
||||||
|
self.iid = iid
|
||||||
|
|
||||||
|
def __call__(self, container):
|
||||||
|
container.opf_xpath('/opf:package/opf:manifest/opf:item[@id=%r]' % self.iid)[0].set(
|
||||||
|
'media-type', XHTML_MIME)
|
||||||
|
container.dirty(container.opf_name)
|
||||||
|
container.refresh_mime_map()
|
||||||
|
return True
|
||||||
|
|
||||||
def check_opf(container):
|
def check_opf(container):
|
||||||
errors = []
|
errors = []
|
||||||
|
|
||||||
@ -246,4 +267,17 @@ def check_opf(container):
|
|||||||
if uid is None or not container.opf_xpath('/opf:package/opf:metadata/dc:identifier[@id=%r]' % uid):
|
if uid is None or not container.opf_xpath('/opf:package/opf:metadata/dc:identifier[@id=%r]' % uid):
|
||||||
errors.append(NoUID(container.opf_name))
|
errors.append(NoUID(container.opf_name))
|
||||||
|
|
||||||
|
for item, name, linear in container.spine_iter:
|
||||||
|
mt = container.mime_map[name]
|
||||||
|
if mt != XHTML_MIME:
|
||||||
|
iid = item.get('idref', None)
|
||||||
|
lnum = None
|
||||||
|
if iid:
|
||||||
|
mitem = container.opf_xpath('/opf:package/opf:manifest/opf:item[@id=%r]' % iid)
|
||||||
|
if mitem:
|
||||||
|
lnum = mitem[0].sourceline
|
||||||
|
else:
|
||||||
|
iid = None
|
||||||
|
errors.append(BadSpineMime(name, iid, mt, lnum, container.opf_name))
|
||||||
|
|
||||||
return errors
|
return errors
|
||||||
|
Loading…
x
Reference in New Issue
Block a user