EPUB3 metadata: Fix handling of <dc:creator> elements with multiple roles. Fixes #1699918 [Author with multiple roles in metadata shown as "Unknown"](https://bugs.launchpad.net/calibre/+bug/1699918)

This commit is contained in:
Kovid Goyal 2017-06-23 13:08:45 +05:30
parent 321ebd2b24
commit 0ada3549c1
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 12 additions and 7 deletions

View File

@ -79,7 +79,7 @@ def properties_for_id(item_id, refines):
def properties_for_id_with_scheme(item_id, prefixes, refines): def properties_for_id_with_scheme(item_id, prefixes, refines):
ans = {} ans = defaultdict(list)
if item_id: if item_id:
for elem in refines[item_id]: for elem in refines[item_id]:
key = elem.get('property') key = elem.get('property')
@ -95,7 +95,7 @@ def properties_for_id_with_scheme(item_id, prefixes, refines):
if ns: if ns:
scheme_ns = ns scheme_ns = ns
scheme = r scheme = r
ans[key] = (scheme_ns, scheme, val) ans[key].append((scheme_ns, scheme, val))
return ans return ans
@ -420,10 +420,10 @@ Author = namedtuple('Author', 'name sort')
def is_relators_role(props, q): def is_relators_role(props, q):
role = props.get('role') for role in props.get('role'):
if role: if role:
scheme_ns, scheme, role = role scheme_ns, scheme, role = role
return role.lower() == q and (scheme_ns is None or (scheme_ns, scheme) == (reserved_prefixes['marc'], 'relators')) return role.lower() == q and (scheme_ns is None or (scheme_ns, scheme) == (reserved_prefixes['marc'], 'relators'))
return False return False
@ -434,7 +434,7 @@ def read_authors(root, prefixes, refines):
aus = None aus = None
file_as = props.get('file-as') file_as = props.get('file-as')
if file_as: if file_as:
aus = file_as[-1] aus = file_as[-1][-1]
else: else:
aus = item.get(OPF('file-as')) or None aus = item.get(OPF('file-as')) or None
return Author(normalize_whitespace(val), normalize_whitespace(aus)) return Author(normalize_whitespace(val), normalize_whitespace(aus))

View File

@ -149,6 +149,10 @@ class TestOPF3(unittest.TestCase):
root = self.get_opf('''<dc:creator>a b</dc:creator><dc:creator opf:role="aut">c d</dc:creator>''') root = self.get_opf('''<dc:creator>a b</dc:creator><dc:creator opf:role="aut">c d</dc:creator>''')
self.ae([Author('c d', None)], rl(root)) self.ae([Author('c d', None)], rl(root))
self.ae(authors, st(root, authors)) self.ae(authors, st(root, authors))
root = self.get_opf('''<dc:creator id="1">a b</dc:creator>'''
'''<meta refines="#1" property="role">aut</meta>'''
'''<meta refines="#1" property="role">cow</meta>''')
self.ae([Author('a b', None)], rl(root))
# }}} # }}}
def test_book_producer(self): # {{{ def test_book_producer(self): # {{{
@ -562,6 +566,7 @@ class TestRunner(unittest.main):
def run(verbosity=4): def run(verbosity=4):
TestRunner(verbosity=verbosity, exit=False) TestRunner(verbosity=verbosity, exit=False)
if __name__ == '__main__': if __name__ == '__main__':
run(verbosity=4) run(verbosity=4)
# }}} # }}}