diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py
index 4e78edb638..d1045b2e4e 100644
--- a/src/calibre/gui2/book_details.py
+++ b/src/calibre/gui2/book_details.py
@@ -110,6 +110,8 @@ def render_data(mi, use_roman_numbers=True, all_fields=False):
isdevice = not hasattr(mi, 'id')
fm = getattr(mi, 'field_metadata', field_metadata)
row = u'
%s | %s | '
+ p = prepare_string_for_xml
+ a = partial(prepare_string_for_xml, attribute=True)
for field, display in get_field_list(fm):
metadata = fm.get(field, None)
@@ -167,20 +169,19 @@ def render_data(mi, use_roman_numbers=True, all_fields=False):
elif field == 'formats':
if isdevice:
continue
- p = partial(prepare_string_for_xml, attribute=True)
path = ''
if mi.path:
h, t = os.path.split(mi.path)
path = '/'.join((os.path.basename(h), t))
data = ({
- 'fmt':x, 'path':p(path or ''), 'fname':p(mi.format_files.get(x, '')),
+ 'fmt':x, 'path':a(path or ''), 'fname':a(mi.format_files.get(x, '')),
'ext':x.lower(), 'id':mi.id
} for x in mi.formats)
fmts = [u'{fmt}'.format(**x) for x in data]
ans.append((field, row % (name, u', '.join(fmts))))
elif field == 'identifiers':
urls = urls_from_identifiers(mi.identifiers)
- links = [u'%s' % (url, id_typ, id_val, name)
+ links = [u'%s' % (a(url), a(id_typ), a(id_val), p(name))
for name, id_typ, id_val, url in urls]
links = u', '.join(links)
if links:
@@ -200,9 +201,9 @@ def render_data(mi, use_roman_numbers=True, all_fields=False):
vals['author_sort'] = aut.replace(' ', '+')
link = formatter.safe_format(
gprefs.get('default_author_link'), vals, '', vals)
+ aut = p(aut)
if link:
- link = prepare_string_for_xml(link)
- authors.append(u'%s'%(link, aut))
+ authors.append(u'%s'%(a(link), aut))
else:
authors.append(aut)
ans.append((field, row % (name, u' & '.join(authors))))
@@ -215,14 +216,14 @@ def render_data(mi, use_roman_numbers=True, all_fields=False):
val = mi.format_field(field)[-1]
if val is None:
continue
- val = prepare_string_for_xml(val)
+ val = p(val)
if metadata['datatype'] == 'series':
sidx = mi.get(field+'_index')
if sidx is None:
sidx = 1.0
val = _('Book %(sidx)s of %(series)s')%dict(
sidx=fmt_sidx(sidx, use_roman=use_roman_numbers),
- series=prepare_string_for_xml(getattr(mi, field)))
+ series=p(getattr(mi, field)))
elif metadata['datatype'] == 'datetime':
aval = getattr(mi, field)
if is_date_undefined(aval):