mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
The real work: interpreting the template and putting into links in book details. This code could use some refactoring and more testing.
This commit is contained in:
parent
cc93a1a8a5
commit
b48b5d34c8
@ -12,6 +12,7 @@ from calibre import force_unicode, prepare_string_for_xml
|
|||||||
from calibre.constants import filesystem_encoding
|
from calibre.constants import filesystem_encoding
|
||||||
from calibre.db.constants import DATA_DIR_NAME
|
from calibre.db.constants import DATA_DIR_NAME
|
||||||
from calibre.ebooks.metadata import fmt_sidx, rating_to_stars
|
from calibre.ebooks.metadata import fmt_sidx, rating_to_stars
|
||||||
|
from calibre.ebooks.metadata.book.formatter import SafeFormat
|
||||||
from calibre.ebooks.metadata.search_internet import DEFAULT_AUTHOR_SOURCE, name_for, qquote, url_for_author_search, url_for_book_search
|
from calibre.ebooks.metadata.search_internet import DEFAULT_AUTHOR_SOURCE, name_for, qquote, url_for_author_search, url_for_book_search
|
||||||
from calibre.ebooks.metadata.sources.identify import urls_from_identifiers
|
from calibre.ebooks.metadata.sources.identify import urls_from_identifiers
|
||||||
from calibre.library.comments import comments_to_html, markdown
|
from calibre.library.comments import comments_to_html, markdown
|
||||||
@ -66,6 +67,19 @@ def search_action_with_data(search_term, value, book_id, field=None, **k):
|
|||||||
return search_action(search_term, value, field=field, book_id=book_id, **k)
|
return search_action(search_term, value, field=field, book_id=book_id, **k)
|
||||||
|
|
||||||
|
|
||||||
|
def cc_search_action_with_data(search_term, value, book_id, fm, mi, field=None, **k):
|
||||||
|
if mi is not None and fm is not None:
|
||||||
|
template = fm.get('display', {}).get('web_search_template')
|
||||||
|
if template:
|
||||||
|
formatter = SafeFormat()
|
||||||
|
mi.set('item_value', value)
|
||||||
|
u = formatter.safe_format(template, mi, "BOOK DETAILS WEB LINK", mi)
|
||||||
|
if u:
|
||||||
|
v = prepare_string_for_xml(_('Click to browse to {0}').format(u), attribute=True)
|
||||||
|
return action('cc_url', url=u),v
|
||||||
|
t = _('Click to see books with {0}: {1}').format(mi.get('name', search_term), prepare_string_for_xml(value))
|
||||||
|
return search_action_with_data(search_term, value, book_id, **k), t
|
||||||
|
|
||||||
def notes_action(**keys):
|
def notes_action(**keys):
|
||||||
return 'notes:' + as_hex_unicode(json_dumps(keys))
|
return 'notes:' + as_hex_unicode(json_dumps(keys))
|
||||||
|
|
||||||
@ -211,16 +225,16 @@ def mi_to_html(
|
|||||||
ans.append((field, row % (name, comments_to_html(val))))
|
ans.append((field, row % (name, comments_to_html(val))))
|
||||||
else:
|
else:
|
||||||
if not metadata['is_multiple']:
|
if not metadata['is_multiple']:
|
||||||
val = '<a href="{}" title="{}">{}</a>'.format(
|
u,v = cc_search_action_with_data(field, val, book_id, metadata, mi, field)
|
||||||
search_action(field, val, book_id=book_id),
|
val = '<a href="{}" title="{}">{}</a>'.format(u, v, p(val))
|
||||||
_('Click to see books with {0}: {1}').format(metadata['name'], a(val)), p(val))
|
|
||||||
else:
|
else:
|
||||||
all_vals = [v.strip()
|
all_vals = [v.strip()
|
||||||
for v in val.split(metadata['is_multiple']['cache_to_list']) if v.strip()]
|
for v in val.split(metadata['is_multiple']['cache_to_list']) if v.strip()]
|
||||||
if show_links:
|
if show_links:
|
||||||
links = ['<a href="{}" title="{}">{}</a>'.format(
|
links = []
|
||||||
search_action(field, x, book_id=book_id), _('Click to see books with {0}: {1}').format(
|
for x in all_vals:
|
||||||
metadata['name'], a(x)), p(x)) for x in all_vals]
|
u,v = cc_search_action_with_data(field, x, book_id, metadata, mi, field)
|
||||||
|
links.append('<a href="{}" title="{}">{}</a>'.format(u, v, p(x)))
|
||||||
else:
|
else:
|
||||||
links = all_vals
|
links = all_vals
|
||||||
val = value_list(metadata['is_multiple']['list_to_ui'], links)
|
val = value_list(metadata['is_multiple']['list_to_ui'], links)
|
||||||
@ -349,12 +363,19 @@ def mi_to_html(
|
|||||||
except Exception:
|
except Exception:
|
||||||
st = field
|
st = field
|
||||||
series = getattr(mi, field)
|
series = getattr(mi, field)
|
||||||
val = _(
|
if metadata.get('display', {}).get('web_search_template'):
|
||||||
'%(sidx)s of <a href="%(href)s" title="%(tt)s">'
|
u,v = cc_search_action_with_data(st, series, book_id, metadata, mi, field)
|
||||||
'<span class="%(cls)s">%(series)s</span></a>') % dict(
|
val = _('%(sidx)s of <a href="%(href)s" title="%(tt)s">'
|
||||||
sidx=fmt_sidx(sidx, use_roman=use_roman_numbers), cls='series_name',
|
'<span class="%(cls)s">%(series)s</span></a>') % dict(
|
||||||
series=p(series), href=search_action_with_data(st, series, book_id, field),
|
sidx=fmt_sidx(sidx, use_roman=use_roman_numbers), cls='series_name',
|
||||||
tt=p(_('Click to see books in this series')))
|
series=p(series), href=u, tt=v)
|
||||||
|
else:
|
||||||
|
val = _(
|
||||||
|
'%(sidx)s of <a href="%(href)s" title="%(tt)s">'
|
||||||
|
'<span class="%(cls)s">%(series)s</span></a>') % dict(
|
||||||
|
sidx=fmt_sidx(sidx, use_roman=use_roman_numbers), cls='series_name',
|
||||||
|
series=p(series), href=search_action_with_data(st, series, book_id, field),
|
||||||
|
tt=p(_('Click to see books in this series')))
|
||||||
val += add_other_links(field, series)
|
val += add_other_links(field, series)
|
||||||
elif metadata['datatype'] == 'datetime':
|
elif metadata['datatype'] == 'datetime':
|
||||||
aval = getattr(mi, field)
|
aval = getattr(mi, field)
|
||||||
@ -371,32 +392,51 @@ def mi_to_html(
|
|||||||
search_action_with_data(key, str(aval), book_id, None, original_value=val), a(
|
search_action_with_data(key, str(aval), book_id, None, original_value=val), a(
|
||||||
_('Click to see books with {0}: {1} (derived from {2})').format(
|
_('Click to see books with {0}: {1} (derived from {2})').format(
|
||||||
metadata['name'] or field, aval, val)), val)
|
metadata['name'] or field, aval, val)), val)
|
||||||
elif metadata['datatype'] == 'text' and metadata['is_multiple']:
|
elif metadata['datatype'] == 'text':
|
||||||
try:
|
if metadata['is_multiple']:
|
||||||
st = metadata['search_terms'][0]
|
try:
|
||||||
except Exception:
|
st = metadata['search_terms'][0]
|
||||||
st = field
|
except Exception:
|
||||||
all_vals = mi.get(field)
|
st = field
|
||||||
if not metadata.get('display', {}).get('is_names', False):
|
all_vals = mi.get(field)
|
||||||
all_vals = sorted(all_vals, key=sort_key)
|
if not metadata.get('display', {}).get('is_names', False):
|
||||||
links = []
|
all_vals = sorted(all_vals, key=sort_key)
|
||||||
for x in all_vals:
|
links = []
|
||||||
v = '<a href="{}" title="{}">{}</a>'.format(
|
if show_links:
|
||||||
search_action_with_data(st, x, book_id, field), _('Click to see books with {0}: {1}').format(
|
for x in all_vals:
|
||||||
metadata['name'] or field, a(x)), p(x))
|
if metadata['is_custom']:
|
||||||
v += add_other_links(field, x)
|
u,v = cc_search_action_with_data(field, x, book_id, metadata, mi, field)
|
||||||
links.append(v)
|
v = '<a href="{}" title="{}">{}</a>'.format(u, v, p(x))
|
||||||
val = value_list(metadata['is_multiple']['list_to_ui'], links)
|
else:
|
||||||
elif metadata['datatype'] == 'text' or metadata['datatype'] == 'enumeration':
|
v = '<a href="{}" title="{}">{}</a>'.format(
|
||||||
# text/is_multiple handled above so no need to add the test to the if
|
search_action_with_data(st, x, book_id, field),
|
||||||
try:
|
_('Click to see books with {0}: {1}').format(
|
||||||
st = metadata['search_terms'][0]
|
metadata['name'] or field, a(x)), p(x))
|
||||||
except Exception:
|
v += add_other_links(field, x)
|
||||||
st = field
|
links.append(v)
|
||||||
v = '<a href="{}" title="{}">{}</a>'.format(
|
else:
|
||||||
search_action_with_data(st, unescaped_val, book_id, field), a(
|
links = all_vals
|
||||||
_('Click to see books with {0}: {1}').format(metadata['name'] or field, val)), val)
|
val = value_list(metadata['is_multiple']['list_to_ui'], links)
|
||||||
val = v + add_other_links(field, val)
|
else:
|
||||||
|
try:
|
||||||
|
st = metadata['search_terms'][0]
|
||||||
|
except Exception:
|
||||||
|
st = field
|
||||||
|
if show_links:
|
||||||
|
if metadata['is_custom']:
|
||||||
|
u,v = cc_search_action_with_data(st, x, book_id, metadata, mi, field)
|
||||||
|
v = '<a href="{}" title="{}">{}</a>'.format(u, v, p(x))
|
||||||
|
else:
|
||||||
|
v = '<a href="{}" title="{}">{}</a>'.format(
|
||||||
|
search_action_with_data(st, x, book_id, field),
|
||||||
|
_('Click to see books with {0}: {1}').format(
|
||||||
|
metadata['name'] or field, a(x)), p(x))
|
||||||
|
else:
|
||||||
|
v = val
|
||||||
|
val = v + add_other_links(field, val)
|
||||||
|
elif metadata['datatype'] == 'enumeration':
|
||||||
|
u,v = cc_search_action_with_data(field, x, book_id, metadata, mi, field)
|
||||||
|
val = '<a href="{}" title="{}">{}</a>'.format(u, v, p(x)) + add_other_links(field, val)
|
||||||
elif metadata['datatype'] == 'bool':
|
elif metadata['datatype'] == 'bool':
|
||||||
val = '<a href="{}" title="{}">{}</a>'.format(
|
val = '<a href="{}" title="{}">{}</a>'.format(
|
||||||
search_action_with_data(field, val, book_id, None), a(
|
search_action_with_data(field, val, book_id, None), a(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user