mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Add tests for invalid pointer to toc in <spine>
This commit is contained in:
parent
54f03fc314
commit
648ae5c414
@ -8,6 +8,7 @@ __copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
|
|||||||
|
|
||||||
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.base import OPF, OPF2_NS
|
from calibre.ebooks.oeb.base import OPF, OPF2_NS
|
||||||
|
|
||||||
class MissingSection(BaseError):
|
class MissingSection(BaseError):
|
||||||
@ -24,6 +25,17 @@ class IncorrectIdref(BaseError):
|
|||||||
self.HELP = xml(_(
|
self.HELP = xml(_(
|
||||||
'The idref="%s" points to an id that does not exist in the OPF') % idref)
|
'The idref="%s" points to an id that does not exist in the OPF') % idref)
|
||||||
|
|
||||||
|
class IncorrectToc(BaseError):
|
||||||
|
|
||||||
|
def __init__(self, name, lnum, bad_idref=None, bad_mimetype=None):
|
||||||
|
if bad_idref is not None:
|
||||||
|
msg = _('The item identified as the Table of Contents (%s) does not exist') % bad_idref
|
||||||
|
self.HELP = _('There is no item with id="%s" in the manifest.') % bad_idref
|
||||||
|
else:
|
||||||
|
msg = _('The item identified as the Table of Contents has an incorrect media-type (%s)') % bad_mimetype
|
||||||
|
self.HELP = _('The media type for the table of contents must be %s') % guess_type('a.ncx')
|
||||||
|
BaseError.__init__(self, msg, name, lnum)
|
||||||
|
|
||||||
class MissingHref(BaseError):
|
class MissingHref(BaseError):
|
||||||
|
|
||||||
HELP = _('A file listed in the manifest is missing, you should either remove'
|
HELP = _('A file listed in the manifest is missing, you should either remove'
|
||||||
@ -133,6 +145,17 @@ def check_opf(container):
|
|||||||
seen[ref] = item.sourceline
|
seen[ref] = item.sourceline
|
||||||
errors.extend(DuplicateHref(container.opf_name, eid, locs, for_spine=True) for eid, locs in dups.iteritems())
|
errors.extend(DuplicateHref(container.opf_name, eid, locs, for_spine=True) for eid, locs in dups.iteritems())
|
||||||
|
|
||||||
|
spine = container.opf_xpath('/opf:package/opf:spine[@toc]')
|
||||||
|
if spine:
|
||||||
|
spine = spine[0]
|
||||||
|
mitems = [x for x in container.opf_xpath('/opf:package/opf:manifest/opf:item[@id]') if x.get('id') == spine.get('toc')]
|
||||||
|
if mitems:
|
||||||
|
mitem = mitems[0]
|
||||||
|
if mitem.get('media-type', '') != guess_type('a.ncx'):
|
||||||
|
errors.append(IncorrectToc(container.opf_name, mitem.sourceline, bad_mimetype=mitem.get('media-type')))
|
||||||
|
else:
|
||||||
|
errors.append(IncorrectToc(container.opf_name, spine.sourceline, bad_idref=spine.get('toc')))
|
||||||
|
|
||||||
# Check unique identifier, <meta> tag with name before content for
|
# Check unique identifier, <meta> tag with name before content for
|
||||||
# cover and content pointing to proper manifest item.
|
# cover and content pointing to proper manifest item.
|
||||||
return errors
|
return errors
|
||||||
|
Loading…
x
Reference in New Issue
Block a user