mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 02:34:06 -04:00
Check Book: When reporting unmanifested file warnings, allow auto fixing by adding the file to the manifest if it is referenced elsewhere or removing the file if it is not. Fixes #1323362 [Automatic fix does not work for "file is not listed in the book manifest."](https://bugs.launchpad.net/calibre/+bug/1323362)
This commit is contained in:
parent
20dc791686
commit
dac0ff6590
@ -95,10 +95,21 @@ class Unmanifested(BadLink):
|
|||||||
' it is good practice to list all files in the manifest. Either list this'
|
' it is good practice to list all files in the manifest. Either list this'
|
||||||
' file in the manifest or remove it from the book if it is an unnecessary file.')
|
' file in the manifest or remove it from the book if it is an unnecessary file.')
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name, unreferenced=None):
|
||||||
BadLink.__init__(self, _(
|
BadLink.__init__(self, _(
|
||||||
'The file %s is not listed in the manifest') % name, name)
|
'The file %s is not listed in the manifest') % name, name)
|
||||||
|
self.file_action = None
|
||||||
|
if unreferenced is not None:
|
||||||
|
self.INDIVIDUAL_FIX = _(
|
||||||
|
'Remove %s from the book') % name if unreferenced else _(
|
||||||
|
'Add %s to the manifest') % name
|
||||||
|
self.file_action = 'remove' if unreferenced else 'add'
|
||||||
|
|
||||||
|
def __call__(self, container):
|
||||||
|
if self.file_action == 'remove':
|
||||||
|
container.remove_item(self.name)
|
||||||
|
else:
|
||||||
|
container.add_name_to_manifest(self.name)
|
||||||
|
|
||||||
class Bookmarks(BadLink):
|
class Bookmarks(BadLink):
|
||||||
|
|
||||||
@ -251,7 +262,7 @@ def check_links(container):
|
|||||||
manifest_names = set(container.manifest_id_map.itervalues())
|
manifest_names = set(container.manifest_id_map.itervalues())
|
||||||
for name in container.mime_map:
|
for name in container.mime_map:
|
||||||
if name not in manifest_names and not container.ok_to_be_unmanifested(name):
|
if name not in manifest_names and not container.ok_to_be_unmanifested(name):
|
||||||
a(Unmanifested(name))
|
a(Unmanifested(name, unreferenced=name in unreferenced))
|
||||||
if name == 'META-INF/calibre_bookmarks.txt':
|
if name == 'META-INF/calibre_bookmarks.txt':
|
||||||
a(Bookmarks(name))
|
a(Bookmarks(name))
|
||||||
|
|
||||||
|
@ -171,6 +171,22 @@ class Container(object): # {{{
|
|||||||
ans = 'application/xhtml+xml'
|
ans = 'application/xhtml+xml'
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
def add_name_to_manifest(self, name):
|
||||||
|
all_ids = {x.get('id') for x in self.opf_xpath('//*[@id]')}
|
||||||
|
c = 0
|
||||||
|
item_id = 'id'
|
||||||
|
while item_id in all_ids:
|
||||||
|
c += 1
|
||||||
|
item_id = 'id' + '%d'%c
|
||||||
|
manifest = self.opf_xpath('//opf:manifest')[0]
|
||||||
|
href = self.name_to_href(name, self.opf_name)
|
||||||
|
item = manifest.makeelement(OPF('item'),
|
||||||
|
id=item_id, href=href)
|
||||||
|
item.set('media-type', self.mime_map[name])
|
||||||
|
self.insert_into_xml(manifest, item)
|
||||||
|
self.dirty(self.opf_name)
|
||||||
|
return item_id
|
||||||
|
|
||||||
def add_file(self, name, data, media_type=None, spine_index=None):
|
def add_file(self, name, data, media_type=None, spine_index=None):
|
||||||
''' Add a file to this container. Entries for the file are
|
''' Add a file to this container. Entries for the file are
|
||||||
automatically created in the OPF manifest and spine
|
automatically created in the OPF manifest and spine
|
||||||
@ -194,19 +210,9 @@ class Container(object): # {{{
|
|||||||
self.mime_map[name] = mt
|
self.mime_map[name] = mt
|
||||||
if self.ok_to_be_unmanifested(name):
|
if self.ok_to_be_unmanifested(name):
|
||||||
return
|
return
|
||||||
all_ids = {x.get('id') for x in self.opf_xpath('//*[@id]')}
|
item_id = self.add_name_to_manifest(name)
|
||||||
c = 0
|
|
||||||
item_id = 'id'
|
|
||||||
while item_id in all_ids:
|
|
||||||
c += 1
|
|
||||||
item_id = 'id' + '%d'%c
|
|
||||||
manifest = self.opf_xpath('//opf:manifest')[0]
|
|
||||||
item = manifest.makeelement(OPF('item'),
|
|
||||||
id=item_id, href=href)
|
|
||||||
item.set('media-type', mt)
|
|
||||||
self.insert_into_xml(manifest, item)
|
|
||||||
self.dirty(self.opf_name)
|
|
||||||
if mt in OEB_DOCS:
|
if mt in OEB_DOCS:
|
||||||
|
manifest = self.opf_xpath('//opf:manifest')[0]
|
||||||
spine = self.opf_xpath('//opf:spine')[0]
|
spine = self.opf_xpath('//opf:spine')[0]
|
||||||
si = manifest.makeelement(OPF('itemref'), idref=item_id)
|
si = manifest.makeelement(OPF('itemref'), idref=item_id)
|
||||||
self.insert_into_xml(spine, si, index=spine_index)
|
self.insert_into_xml(spine, si, index=spine_index)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user