From 06b266840c8785aa93aa265c0c20308c1c7286f7 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 5 Sep 2010 12:35:35 +0100 Subject: [PATCH] Make gui version of content server able to show both abbreviated and full lists of tags. --- resources/content_server/gui.js | 34 ++++++++++++++++++++++++ src/calibre/ebooks/metadata/book/base.py | 7 ++--- src/calibre/library/server/utils.py | 9 ++++--- src/calibre/library/server/xml.py | 6 +++-- 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/resources/content_server/gui.js b/resources/content_server/gui.js index 8368866a5e..abbd409dc8 100644 --- a/resources/content_server/gui.js +++ b/resources/content_server/gui.js @@ -59,14 +59,44 @@ function render_book(book) { title = title.slice(0, title.length-2); title += ' ({0} MB) '.format(size); } + title += '' + if (tags) { + t = tags.split(':&:', 2); + m = parseInt(t[0]); + t = t[1].split(',', m); + if (t.length == m) t[m] = '...' + title += 'Tags=[{0}] '.format(t.join(',')); + } + custcols = book.attr("custcols").split(',') + for ( i = 0; i < custcols.length; i++) { + if (custcols[i].length > 0) { + vals = book.attr(custcols[i]).split(':#:', 2); + if (vals[0].indexOf('#T#') == 0) { //startswith + vals[0] = vals[0].substr(3, vals[0].length) + t = vals[1].split(':&:', 2); + m = parseInt(t[0]); + t = t[1].split(',', m); + if (t.length == m) t[m] = '...'; + vals[1] = t.join(','); + } + title += '{0}=[{1}] '.format(vals[0], vals[1]); + } + } + title += '' + title += '' title += ''.format(id); title += '
{0}
'.format(comments) // Render authors cell @@ -170,11 +200,15 @@ function fetch_library_books(start, num, timeout, sort, order, search) { var cover = row.find('img').attr('src'); var collapsed = row.find('.comments').css('display') == 'none'; $("#book_list tbody tr * .comments").css('display', 'none'); + $("#book_list tbody tr * .tagdata_short").css('display', 'inherit'); + $("#book_list tbody tr * .tagdata_long").css('display', 'none'); $('#cover_pane').css('visibility', 'hidden'); if (collapsed) { row.find('.comments').css('display', 'inherit'); $('#cover_pane img').attr('src', cover); $('#cover_pane').css('visibility', 'visible'); + row.find(".tagdata_short").css('display', 'none'); + row.find(".tagdata_long").css('display', 'inherit'); } }); diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index caaaccb3d0..2ff24b0ddc 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -262,10 +262,11 @@ class Metadata(object): if other_lang and other_lang.lower() != 'und': self.language = other_lang - def format_series_index(self): + def format_series_index(self, val=None): from calibre.ebooks.metadata import fmt_sidx + v = self.series_index if val is None else val try: - x = float(self.series_index) + x = float(v) except ValueError: x = 1 return fmt_sidx(x) @@ -296,7 +297,7 @@ class Metadata(object): if datatype == 'text' and cmeta['is_multiple']: res = u', '.join(res) elif datatype == 'series': - res = res + ' [%s]'%self.format_series_index(self.get_extra(key)) + res = res + ' [%s]'%self.format_series_index(val=self.get_extra(key)) elif datatype == 'datetime': res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) elif datatype == 'bool': diff --git a/src/calibre/library/server/utils.py b/src/calibre/library/server/utils.py index 23916aa75c..373653c15f 100644 --- a/src/calibre/library/server/utils.py +++ b/src/calibre/library/server/utils.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import time +import time, sys import cherrypy @@ -44,8 +44,8 @@ def strftime(fmt='%Y/%m/%d %H:%M:%S', dt=None): except: return _strftime(fmt, nowf().timetuple()) -def format_tag_string(tags, sep): - MAX = tweaks['max_content_server_tags_shown'] +def format_tag_string(tags, sep, ignore_max=False): + MAX = sys.maxint if ignore_max else tweaks['max_content_server_tags_shown'] if tags: tlist = [t.strip() for t in tags.split(sep)] else: @@ -53,5 +53,6 @@ def format_tag_string(tags, sep): tlist.sort(cmp=lambda x,y:cmp(x.lower(), y.lower())) if len(tlist) > MAX: tlist = tlist[:MAX]+['...'] - return u'%s'%(', '.join(tlist)) if tlist else '' + return u'%s:&:%s'%(tweaks['max_content_server_tags_shown'], + ', '.join(tlist)) if tlist else '' diff --git a/src/calibre/library/server/xml.py b/src/calibre/library/server/xml.py index 5bf2783f96..8715dda7d0 100644 --- a/src/calibre/library/server/xml.py +++ b/src/calibre/library/server/xml.py @@ -89,7 +89,7 @@ class XMLServer(object): 'comments'): y = record[FM[x]] if x == 'tags': - y = format_tag_string(y, ',') + y = format_tag_string(y, ',', ignore_max=True) kwargs[x] = serialize(y) if y else '' c = kwargs.pop('comments') @@ -111,7 +111,9 @@ class XMLServer(object): name = CFM[key]['name'] custcols.append(k) if datatype == 'text' and CFM[key]['is_multiple']: - kwargs[k] = concat(name, format_tag_string(val,'|')) + kwargs[k] = concat('#T#'+name, + format_tag_string(val,'|', + ignore_max=True)) elif datatype == 'series': kwargs[k] = concat(name, '%s [%s]'%(val, fmt_sidx(record[CFM.cc_series_index_column_for(key)])))