mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
/browse: Implement Book details
This commit is contained in:
parent
cf644ac63e
commit
ff8f949f97
@ -384,3 +384,41 @@ h2.library_name {
|
|||||||
|
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
/* Details {{{ */
|
||||||
|
|
||||||
|
.details .left {
|
||||||
|
float: left;
|
||||||
|
max-width: 50%;
|
||||||
|
margin-right: 2em;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.details .right {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.details .formats {
|
||||||
|
margin-bottom: 2ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
#book_details_dialog .details a {
|
||||||
|
color: blue;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#book_details_dialog .details a:hover {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.details .field {
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.details .comment {
|
||||||
|
margin-left: 1em;
|
||||||
|
overflow: auto;
|
||||||
|
max-height: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
10
resources/content_server/browse/details.html
Normal file
10
resources/content_server/browse/details.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<div id="details_{id}" class="details">
|
||||||
|
<div class="left">
|
||||||
|
<img alt="Cover of {title}" src="/get/cover/{id}" />
|
||||||
|
</div>
|
||||||
|
<div class="right">
|
||||||
|
<div class="field formats">{formats}</div>
|
||||||
|
{fields}
|
||||||
|
{comments}
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -161,7 +161,7 @@ class FieldMetadata(dict):
|
|||||||
'datatype':'text',
|
'datatype':'text',
|
||||||
'is_multiple':None,
|
'is_multiple':None,
|
||||||
'kind':'field',
|
'kind':'field',
|
||||||
'name':None,
|
'name':_('Comments'),
|
||||||
'search_terms':['comments', 'comment'],
|
'search_terms':['comments', 'comment'],
|
||||||
'is_custom':False, 'is_category':False}),
|
'is_custom':False, 'is_category':False}),
|
||||||
('cover', {'table':None,
|
('cover', {'table':None,
|
||||||
|
@ -245,6 +245,14 @@ class BrowseServer(object):
|
|||||||
P('content_server/browse/summary.html', data=True).decode('utf-8')
|
P('content_server/browse/summary.html', data=True).decode('utf-8')
|
||||||
return self.__browse_summary_template__
|
return self.__browse_summary_template__
|
||||||
|
|
||||||
|
@property
|
||||||
|
def browse_details_template(self):
|
||||||
|
if not hasattr(self, '__browse_details_template__') or \
|
||||||
|
self.opts.develop:
|
||||||
|
self.__browse_details_template__ = \
|
||||||
|
P('content_server/browse/details.html', data=True).decode('utf-8')
|
||||||
|
return self.__browse_details_template__
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
# Catalogs {{{
|
# Catalogs {{{
|
||||||
@ -503,10 +511,10 @@ class BrowseServer(object):
|
|||||||
if mi.rating:
|
if mi.rating:
|
||||||
args['stars'] = render_rating(mi.rating/2.0, prefix=_('Rating'))[0]
|
args['stars'] = render_rating(mi.rating/2.0, prefix=_('Rating'))[0]
|
||||||
if args['tags']:
|
if args['tags']:
|
||||||
args['tags'] = u'<strong>%s: </strong>'%_('Tags') + \
|
args['tags'] = u'<strong>%s: </strong>'%xml(_('Tags')) + \
|
||||||
xml(args['tags'])
|
args['tags']
|
||||||
if args['series']:
|
if args['series']:
|
||||||
args['series'] = xml(args['series'])
|
args['series'] = args['series']
|
||||||
args['read_string'] = xml(_('Read'), True)
|
args['read_string'] = xml(_('Read'), True)
|
||||||
args['details'] = xml(_('Details'), True)
|
args['details'] = xml(_('Details'), True)
|
||||||
args['details_tt'] = xml(_('Show book details'), True)
|
args['details_tt'] = xml(_('Show book details'), True)
|
||||||
@ -535,9 +543,38 @@ class BrowseServer(object):
|
|||||||
.format(fmt, fname, id_, fmt.upper()) for fmt in
|
.format(fmt, fname, id_, fmt.upper()) for fmt in
|
||||||
fmts]
|
fmts]
|
||||||
ofmts = ', '.join(ofmts)
|
ofmts = ', '.join(ofmts)
|
||||||
args['formats'] = u'<strong>%s: </strong>' % \
|
args['formats'] = ofmts
|
||||||
_('Formats') + ofmts
|
fields, comments = [], []
|
||||||
|
for field, m in list(mi.get_all_standard_metadata(False).items()) + \
|
||||||
|
list(mi.get_all_user_metadata(False).items()):
|
||||||
|
if m['datatype'] == 'comments' or field == 'comments':
|
||||||
|
comments.append((m['name'], comments_to_html(mi.get(field,
|
||||||
|
''))))
|
||||||
|
continue
|
||||||
|
if field in ('title', 'formats') or not args.get(field, False) \
|
||||||
|
or not m['name']:
|
||||||
|
continue
|
||||||
|
if m['datatype'] == 'rating':
|
||||||
|
r = u'<strong>%s: </strong>'%xml(m['name']) + \
|
||||||
|
render_rating(mi.rating/2.0, prefix=m['name'])[0]
|
||||||
|
else:
|
||||||
|
r = u'<strong>%s: </strong>'%xml(m['name']) + \
|
||||||
|
args[field]
|
||||||
|
fields.append((m['name'], r))
|
||||||
|
|
||||||
|
fields.sort(key=lambda x: x[0].lower())
|
||||||
|
fields = [u'<div class="field">{0}</div>'.format(f[1]) for f in
|
||||||
|
fields]
|
||||||
|
fields = u'<div class="fields">%s</div>'%('\n\n'.join(fields))
|
||||||
|
|
||||||
|
comments.sort(key=lambda x: x[0].lower())
|
||||||
|
comments = [(u'<div class="field"><strong>%s: </strong>'
|
||||||
|
u'<div class="comment">%s</div></div>') % (xml(c[0]),
|
||||||
|
c[1]) for c in comments]
|
||||||
|
comments = u'<div class="comments">%s</div>'%('\n\n'.join(comments))
|
||||||
|
ans = self.browse_details_template.format(id=id_,
|
||||||
|
title=xml(mi.title, True), fields=fields,
|
||||||
|
formats=args['formats'], comments=comments)
|
||||||
|
|
||||||
return json.dumps(ans, ensure_ascii=False)
|
return json.dumps(ans, ensure_ascii=False)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user