mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Check for duplicate items in the manifest
This commit is contained in:
parent
0fb35bb7d0
commit
58ef982a02
@ -47,6 +47,27 @@ class NonLinearItems(BaseError):
|
|||||||
container.dirty(container.opf_name)
|
container.dirty(container.opf_name)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
class DuplicateHref(BaseError):
|
||||||
|
|
||||||
|
has_multiple_locations = True
|
||||||
|
|
||||||
|
INDIVIDUAL_FIX = _(
|
||||||
|
'Remove all but the first duplicate item')
|
||||||
|
|
||||||
|
def __init__(self, name, eid, locs):
|
||||||
|
BaseError.__init__(self, _('Duplicate item in manifest: %s') % eid, name)
|
||||||
|
self.HELP = _(
|
||||||
|
'The item {0} is present more than once in the manifest in {1}. This is'
|
||||||
|
' not allowed.').format(eid, name)
|
||||||
|
self.all_locations = [(name, lnum, None) for lnum in sorted(locs)]
|
||||||
|
self.duplicate_href = eid
|
||||||
|
|
||||||
|
def __call__(self, container):
|
||||||
|
items = [e for e in container.opf_xpath('/opf:package/opf:manifest/opf:item[@href]') if e.get('href') == self.duplicate_href]
|
||||||
|
[container.remove_from_xml(e) for e in items[1:]]
|
||||||
|
container.dirty(self.name)
|
||||||
|
return True
|
||||||
|
|
||||||
def check_opf(container):
|
def check_opf(container):
|
||||||
errors = []
|
errors = []
|
||||||
|
|
||||||
@ -69,9 +90,19 @@ def check_opf(container):
|
|||||||
if nl_items:
|
if nl_items:
|
||||||
errors.append(NonLinearItems(container.opf_name, nl_items))
|
errors.append(NonLinearItems(container.opf_name, nl_items))
|
||||||
|
|
||||||
# Check unique identifier, version, <meta> tag with name before content for
|
seen, dups = {}, {}
|
||||||
# cover and content pointing to proper manifest item. Duplicate items in
|
for item in container.opf_xpath('/opf:package/opf:manifest/opf:item[@href]'):
|
||||||
# spine. Duplicate hrefs in manifest. hrefs in manifest that point to
|
href = item.get('href')
|
||||||
# missing resources.
|
if href in seen:
|
||||||
|
if href not in dups:
|
||||||
|
dups[href] = [seen[href]]
|
||||||
|
dups[href].append(item.sourceline)
|
||||||
|
else:
|
||||||
|
seen[href] = item.sourceline
|
||||||
|
errors.extend(DuplicateHref(container.opf_name, eid, locs) for eid, locs in dups.iteritems())
|
||||||
|
|
||||||
|
# Check unique identifier, <meta> tag with name before content for
|
||||||
|
# cover and content pointing to proper manifest item. Duplicate items in
|
||||||
|
# spine. hrefs in manifest that point to
|
||||||
|
# missing resources.
|
||||||
return errors
|
return errors
|
||||||
|
Loading…
x
Reference in New Issue
Block a user