diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 5415cfe8bb..5963b918d3 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -342,6 +342,7 @@ class BrowseServer(object): return category_meta[x]['name'].lower() displayed_custom_fields = custom_fields_to_display(self.db) + uc_displayed = set() for category in sorted(categories, key=lambda x: sort_key(getter(x))): if len(categories[category]) == 0: continue @@ -361,7 +362,19 @@ class BrowseServer(object): icon = category_icon_map['user:'] else: icon = 'blank.png' - cats.append((meta['name'], category, icon)) + + if meta['kind'] == 'user': + dot = category.find('.') + if dot > 0: + cat = category[:dot] + if cat not in uc_displayed: + cats.append((meta['name'][:dot-1], cat, icon)) + uc_displayed.add(cat) + else: + cats.append((meta['name'], category, icon)) + uc_displayed.add(category) + else: + cats.append((meta['name'], category, icon)) cats = [(u'
  •  ' u'{0}' @@ -394,12 +407,51 @@ class BrowseServer(object): category_name = category_meta[category]['name'] datatype = category_meta[category]['datatype'] + uc_displayed = set() + cats = [] + for ucat in sorted(categories.keys(), key=sort_key): + if len(categories[ucat]) == 0: + continue + if category == 'formats': + continue + meta = category_meta.get(ucat, None) + if meta is None: + continue + if meta['kind'] != 'user': + continue + cat_len = len(category) + if not (len(ucat) > cat_len and ucat.startswith(category+'.')): + continue + cat_len += 1 + icon = category_icon_map['user:'] + dot = ucat[cat_len:].find('.') + if dot > 0: + cat = ucat[cat_len:][:dot] + if cat not in uc_displayed: + cats.append((cat, ucat[:cat_len+dot], icon)) + uc_displayed.add(cat) + else: + cats.append((meta['name'], ucat, icon)) + uc_displayed.add(ucat) + + cats = u'\n\n'.join( + [(u'
  •  ' + u'{0}' + u'{0}' + u'
  • ') + .format(xml(x, True), xml(quote(y)), xml(_('Browse books by')), + self.opts.url_prefix, src='/browse/icon/'+z) + for x, y, z in cats]) + if cats: + cats = (u'\n
    \n' + '{0}
    ').format(cats) + script = 'toplevel();' + else: + script = 'true' items = categories[category] sort = self.browse_sort_categories(items, sort) - script = 'true' - if len(items) == 1: # Only one item in category, go directly to book list prefix = '' if self.is_wsgi else self.opts.url_prefix @@ -443,7 +495,10 @@ class BrowseServer(object): - script = 'category(%s);'%script + if cats: + script = 'toplevel();category(%s);'%script + else: + script = 'category(%s);'%script main = u'''
    @@ -453,7 +508,7 @@ class BrowseServer(object): {1}
    '''.format( - xml(_('Browsing by')+': ' + category_name), items, + xml(_('Browsing by')+': ' + category_name), cats + items, xml(_('Up'), True), self.opts.url_prefix) return self.browse_template(sort).format(title=category_name,