EPUB3 metadata: Ensure updating metadata never produces empty dc:contributor elements. Fixes #1644702 [Calibre puts in <dc:contributor id="id-6"/>](https://bugs.launchpad.net/calibre/+bug/1644702)

This commit is contained in:
Kovid Goyal 2016-11-26 13:09:00 +05:30
parent 44345abdd9
commit dc6665c73e

View File

@ -145,6 +145,8 @@ def items_with_property(root, q, prefixes=None):
# Prefixes {{{ # Prefixes {{{
# http://www.idpf.org/epub/vocab/package/pfx/ # http://www.idpf.org/epub/vocab/package/pfx/
reserved_prefixes = { reserved_prefixes = {
'dcterms': 'http://purl.org/dc/terms/', 'dcterms': 'http://purl.org/dc/terms/',
'epubsc': 'http://idpf.org/epub/vocab/sc/#', 'epubsc': 'http://idpf.org/epub/vocab/sc/#',
@ -319,6 +321,8 @@ def identifier_writer(name):
p = package_identifier.getparent() p = package_identifier.getparent()
p.insert(p.index(package_identifier), ident) p.insert(p.index(package_identifier), ident)
return writer return writer
set_application_id = identifier_writer('calibre') set_application_id = identifier_writer('calibre')
set_uuid = identifier_writer('uuid') set_uuid = identifier_writer('uuid')
@ -411,6 +415,7 @@ def set_languages(root, prefixes, refines, languages):
# Creator/Contributor {{{ # Creator/Contributor {{{
Author = namedtuple('Author', 'name sort') Author = namedtuple('Author', 'name sort')
@ -500,13 +505,14 @@ def set_book_producers(root, prefixes, refines, producers):
remove_element(item, refines) remove_element(item, refines)
metadata = XPath('./opf:metadata')(root)[0] metadata = XPath('./opf:metadata')(root)[0]
for bkp in producers: for bkp in producers:
a = metadata.makeelement(DC('contributor')) if bkp:
aid = ensure_id(a) a = metadata.makeelement(DC('contributor'))
a.text = bkp aid = ensure_id(a)
metadata.append(a) a.text = bkp
m = metadata.makeelement(OPF('meta'), attrib={'refines':'#'+aid, 'property':'role', 'scheme':'marc:relators'}) metadata.append(a)
m.text = 'bkp' m = metadata.makeelement(OPF('meta'), attrib={'refines':'#'+aid, 'property':'role', 'scheme':'marc:relators'})
metadata.append(m) m.text = 'bkp'
metadata.append(m)
# }}} # }}}
# Dates {{{ # Dates {{{
@ -778,6 +784,7 @@ def dict_reader(name, load=json.loads, try2=True):
continue continue
return reader return reader
read_user_categories = dict_reader('user_categories') read_user_categories = dict_reader('user_categories')
read_author_link_map = dict_reader('author_link_map') read_author_link_map = dict_reader('author_link_map')
@ -801,6 +808,7 @@ def dict_writer(name, serialize=dump_dict, remove2=True):
m.append(d) m.append(d)
return writer return writer
set_user_categories = dict_writer('user_categories') set_user_categories = dict_writer('user_categories')
set_author_link_map = dict_writer('author_link_map') set_author_link_map = dict_writer('author_link_map')
@ -812,6 +820,8 @@ def deserialize_user_metadata(val):
decode_is_multiple(fm) decode_is_multiple(fm)
ans[name] = fm ans[name] = fm
return ans return ans
read_user_metadata3 = dict_reader('user_metadata', load=deserialize_user_metadata, try2=False) read_user_metadata3 = dict_reader('user_metadata', load=deserialize_user_metadata, try2=False)
@ -842,6 +852,7 @@ def read_user_metadata(root, prefixes, refines):
def serialize_user_metadata(val): def serialize_user_metadata(val):
return json.dumps(object_to_unicode(val), ensure_ascii=False, default=to_json, indent=2, sort_keys=True) return json.dumps(object_to_unicode(val), ensure_ascii=False, default=to_json, indent=2, sort_keys=True)
set_user_metadata3 = dict_writer('user_metadata', serialize=serialize_user_metadata, remove2=False) set_user_metadata3 = dict_writer('user_metadata', serialize=serialize_user_metadata, remove2=False)
@ -931,7 +942,8 @@ def read_metadata(root, ver=None, return_extra_data=False):
ans.author_sort = authors_to_string(aus) or ans.author_sort ans.author_sort = authors_to_string(aus) or ans.author_sort
bkp = read_book_producers(root, prefixes, refines) bkp = read_book_producers(root, prefixes, refines)
if bkp: if bkp:
ans.book_producer = bkp[0] if bkp[0]:
ans.book_producer = bkp[0]
pd = read_pubdate(root, prefixes, refines) pd = read_pubdate(root, prefixes, refines)
if not is_date_undefined(pd): if not is_date_undefined(pd):
ans.pubdate = pd ans.pubdate = pd