From 0246093293b681069a48f0c3b87890edc0337673 Mon Sep 17 00:00:00 2001 From: GRiker Date: Fri, 12 Nov 2010 08:34:32 -0700 Subject: [PATCH] GwR patches for support of empty formats in catalog generation --- resources/catalog/stylesheet.css | 8 + src/calibre/customize/profiles.py | 20 ++- src/calibre/gui2/tools.py | 2 +- src/calibre/library/catalog.py | 245 ++++++++++++++++++------------ 4 files changed, 178 insertions(+), 97 deletions(-) diff --git a/resources/catalog/stylesheet.css b/resources/catalog/stylesheet.css index 4c5045d378..c1f1a1c55d 100644 --- a/resources/catalog/stylesheet.css +++ b/resources/catalog/stylesheet.css @@ -81,6 +81,14 @@ p.unread_book { text-indent:-2em; } +p.missing_book { + text-align:left; + margin-top:0px; + margin-bottom:0px; + margin-left:2em; + text-indent:-2em; + } + p.date_read { text-align:left; margin-top:0px; diff --git a/src/calibre/customize/profiles.py b/src/calibre/customize/profiles.py index 38f6d401f6..10f4ad2902 100644 --- a/src/calibre/customize/profiles.py +++ b/src/calibre/customize/profiles.py @@ -250,8 +250,11 @@ class OutputProfile(Plugin): #: If True, the date is appended to the title of downloaded news periodical_date_in_title = True - #: The character used to represent a star in ratings + #: Characters used in jackets and catalogs + missing_char = u'x' ratings_char = u'*' + empty_ratings_char = u' ' + read_char = u'+' #: Unsupported unicode characters to be replaced during preprocessing unsupported_unicode_chars = [] @@ -287,7 +290,12 @@ class iPadOutput(OutputProfile): 'macros': {'border-width': '{length}|medium|thick|thin'} } ] - ratings_char = u'\u2605' + + missing_char = u'\u2715\u200a' # stylized 'x' plus hair space + ratings_char = u'\u2605' # filled star + empty_ratings_char = u'\u2606' # hollow star + read_char = u'\u2713' # check mark + touchscreen = True # touchscreen_news_css {{{ touchscreen_news_css = u''' @@ -498,7 +506,6 @@ class SonyReaderLandscapeOutput(SonyReaderOutput): screen_size = (784, 1012) comic_screen_size = (784, 1012) - class MSReaderOutput(OutputProfile): name = 'Microsoft Reader' @@ -582,7 +589,12 @@ class KindleOutput(OutputProfile): fsizes = [12, 12, 14, 16, 18, 20, 22, 24] supports_mobi_indexing = True periodical_date_in_title = False + + missing_char = u'x\u2009' + empty_ratings_char = u'\u2606' ratings_char = u'\u2605' + read_char = u'\u2713' + mobi_ems_per_blockquote = 2.0 @classmethod @@ -603,6 +615,8 @@ class KindleDXOutput(OutputProfile): #comic_screen_size = (741, 1022) supports_mobi_indexing = True periodical_date_in_title = False + ratings_char = u'\u2605' + read_char = u'\2713' mobi_ems_per_blockquote = 2.0 @classmethod diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index c068168247..2919493d12 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -299,7 +299,7 @@ def generate_catalog(parent, dbspec, ids, device_manager): ] out.close() - # This returns to gui2.ui:generate_catalog() + # This returns to gui2.actions.catalog:generate_catalog() # Which then calls gui2.convert.gui_conversion:gui_catalog() with the args inline return 'gui_catalog', args, _('Generate catalog'), out.name, d.catalog_sync, \ d.catalog_title diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index e14d092727..aa6cc1537d 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -827,6 +827,9 @@ class EPUB_MOBI(CatalogPlugin): '[] : Source of content (e.g., Amazon, Project Gutenberg). Do not create genre - Program flow + gui2.actions.catalog:generate_catalog() + gui2.tools:generate_catalog() or library.cli:command_catalog() + called from gui2.convert.gui_conversion:gui_catalog() catalog = Catalog(notification=Reporter()) catalog.createDirectoryStructure() catalog.copyResources() @@ -878,6 +881,7 @@ class EPUB_MOBI(CatalogPlugin): self.__htmlFileList = [] self.__markerTags = self.getMarkerTags() self.__ncxSoup = None + self.__output_profile = None self.__playOrder = 1 self.__plugin = plugin self.__progressInt = 0.0 @@ -892,6 +896,12 @@ class EPUB_MOBI(CatalogPlugin): self.__useSeriesPrefixInTitlesSection = False self.__verbose = opts.verbose + from calibre.customize.ui import output_profiles + for profile in output_profiles(): + if profile.short_name == self.opts.output_profile: + self.__output_profile = profile + break + # Tweak build steps based on optional sections: 1 call for HTML, 1 for NCX if self.opts.generate_titles: self.__totalSteps += 2 @@ -1163,10 +1173,15 @@ class EPUB_MOBI(CatalogPlugin): return property(fget=fget, fset=fset) @dynamic_property + def MISSING_SYMBOL(self): + def fget(self): + #return '%s' % self.__output_profile.missing_char + return self.__output_profile.missing_char + return property(fget=fget) + @dynamic_property def NOT_READ_SYMBOL(self): def fget(self): - return '' if self.generateForKindle else \ - '%s' % self.opts.read_tag + return '%s' % self.__output_profile.read_char return property(fget=fget) @dynamic_property def READING_SYMBOL(self): @@ -1177,18 +1192,18 @@ class EPUB_MOBI(CatalogPlugin): @dynamic_property def READ_SYMBOL(self): def fget(self): - return '' if self.generateForKindle else \ - '%s' % self.opts.read_tag + #return '%s' % self.__output_profile.read_char + return self.__output_profile.read_char return property(fget=fget) @dynamic_property def FULL_RATING_SYMBOL(self): def fget(self): - return "★" if self.generateForKindle else "*" + return self.__output_profile.ratings_char return property(fget=fget) @dynamic_property def EMPTY_RATING_SYMBOL(self): def fget(self): - return "☆" if self.generateForKindle else ' ' + return self.__output_profile.empty_ratings_char return property(fget=fget) @dynamic_property def READ_PROGRESS_SYMBOL(self): @@ -1621,13 +1636,16 @@ class EPUB_MOBI(CatalogPlugin): self.generateAuthorAnchor(title['author'])) aTag.insert(0, title['author']) - # Prefix author with read/reading/none symbol - if title['read']: - authorTag.insert(0, NavigableString(self.READ_SYMBOL + "by ")) - elif self.opts.connected_kindle and title['id'] in self.bookmarked_books: - authorTag.insert(0, NavigableString(self.READING_SYMBOL + " by ")) + # Prefix author with read|reading|none symbol or missing symbol + if 'formats' in title and title['formats']: + if title['read']: + authorTag.insert(0, NavigableString(self.READ_SYMBOL + " by ")) + elif self.opts.connected_kindle and title['id'] in self.bookmarked_books: + authorTag.insert(0, NavigableString(self.READING_SYMBOL + " by ")) + else: + authorTag.insert(0, NavigableString(self.NOT_READ_SYMBOL + " by ")) else: - authorTag.insert(0, NavigableString(self.NOT_READ_SYMBOL + "by ")) + authorTag.insert(0, NavigableString(self.MISSING_SYMBOL + " by ")) authorTag.insert(1, aTag) ''' @@ -1661,7 +1679,7 @@ class EPUB_MOBI(CatalogPlugin): fontTag['style'] = 'color:white;font-size:large' if self.opts.fmt == 'epub': fontTag['style'] += ';opacity: 0.0' - fontTag.insert(0, NavigableString("by ")) + fontTag.insert(0, NavigableString(" by ")) tagsTag.insert(ttc, fontTag) ttc += 1 @@ -1814,21 +1832,27 @@ class EPUB_MOBI(CatalogPlugin): pBookTag = Tag(soup, "p") ptc = 0 - # book with read/reading/unread symbol - if book['read']: - # check mark - pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 - elif book['id'] in self.bookmarked_books: - pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 + # book with read|reading|unread symbol or missing symbol + if 'formats' in book and book['formats']: + if book['read']: + # check mark + pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + elif book['id'] in self.bookmarked_books: + pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + else: + # hidden check mark + pBookTag['class'] = "unread_book" + pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + ptc += 1 else: - # hidden check mark - pBookTag['class'] = "unread_book" - pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) - ptc += 1 + # missing formats + pBookTag['class'] = "missing_book" + pBookTag.insert(ptc,NavigableString(self.MISSING_SYMBOL)) + ptc += 1 # Link to book aTag = Tag(soup, "a") @@ -1983,20 +2007,26 @@ class EPUB_MOBI(CatalogPlugin): pBookTag = Tag(soup, "p") ptc = 0 - # book with read/reading/unread symbol - if book['read']: - # check mark - pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 - elif book['id'] in self.bookmarked_books: - pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 + # book with read|reading|unread symbol or missing symbol + if 'formats' in book and book['formats']: + if book['read']: + # check mark + pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + elif book['id'] in self.bookmarked_books: + pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + else: + # hidden check mark + pBookTag['class'] = "unread_book" + pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + ptc += 1 else: - # hidden check mark - pBookTag['class'] = "unread_book" - pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + # missing book + pBookTag['class'] = "missing_book" + pBookTag.insert(ptc,NavigableString(self.MISSING_SYMBOL)) ptc += 1 aTag = Tag(soup, "a") @@ -2111,20 +2141,26 @@ class EPUB_MOBI(CatalogPlugin): pBookTag = Tag(soup, "p") ptc = 0 - # book with read/reading/unread symbol - if new_entry['read']: - # check mark - pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 - elif new_entry['id'] in self.bookmarked_books: - pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 + # book with read|reading|unread symbol or missing symbol + if 'formats' in new_entry and new_entry['formats']: + if new_entry['read']: + # check mark + pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + elif new_entry['id'] in self.bookmarked_books: + pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + else: + # hidden check mark + pBookTag['class'] = "unread_book" + pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + ptc += 1 else: - # hidden check mark - pBookTag['class'] = "unread_book" - pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + # missing book + pBookTag['class'] = "missing_book" + pBookTag.insert(ptc,NavigableString(self.MISSING_SYMBOL)) ptc += 1 aTag = Tag(soup, "a") @@ -2157,20 +2193,26 @@ class EPUB_MOBI(CatalogPlugin): pBookTag = Tag(soup, "p") ptc = 0 - # book with read/reading/unread symbol - if new_entry['read']: - # check mark - pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 - elif new_entry['id'] in self.bookmarked_books: - pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 + # book with read|reading|unread symbol or missing symbol + if 'formats' in new_entry and new_entry['formats']: + if new_entry['read']: + # check mark + pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + elif new_entry['id'] in self.bookmarked_books: + pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + else: + # hidden check mark + pBookTag['class'] = "unread_book" + pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + ptc += 1 else: - # hidden check mark - pBookTag['class'] = "unread_book" - pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + # missing book + pBookTag['class'] = "missing_book" + pBookTag.insert(ptc,NavigableString(self.MISSING_SYMBOL)) ptc += 1 aTag = Tag(soup, "a") @@ -2606,19 +2648,26 @@ class EPUB_MOBI(CatalogPlugin): else: book['read'] = False - if book['read']: - # check mark - pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 - elif book['id'] in self.bookmarked_books: - pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 + # book with read|reading|unread symbol or missing symbol + if 'formats' in book and book['formats']: + if book['read']: + # check mark + pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + elif book['id'] in self.bookmarked_books: + pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + else: + # hidden check mark + pBookTag['class'] = "unread_book" + pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + ptc += 1 else: - # hidden check mark - pBookTag['class'] = "unread_book" - pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + # missing book + pBookTag['class'] = "missing_book" + pBookTag.insert(ptc,NavigableString(self.MISSING_SYMBOL)) ptc += 1 aTag = Tag(soup, "a") @@ -2697,6 +2746,8 @@ class EPUB_MOBI(CatalogPlugin): this_book['title'] = book['title'] this_book['author_sort'] = book['author_sort'].capitalize() this_book['read'] = book['read'] + if 'formats' in book: + this_book['formats'] = book['formats'] this_book['id'] = book['id'] this_book['series'] = book['series'] normalized_tag = self.genre_tags_dict[friendly_tag] @@ -4098,20 +4149,26 @@ class EPUB_MOBI(CatalogPlugin): pBookTag = Tag(soup, "p") ptc = 0 - # book with read/reading/unread symbol - if book['read']: - # check mark - pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 - elif book['id'] in self.bookmarked_books: - pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) - pBookTag['class'] = "read_book" - ptc += 1 + # book with read|reading|unread symbol or missing symbol + if 'formats' in book and book['formats']: + if book['read']: + # check mark + pBookTag.insert(ptc,NavigableString(self.READ_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + elif book['id'] in self.bookmarked_books: + pBookTag.insert(ptc,NavigableString(self.READING_SYMBOL)) + pBookTag['class'] = "read_book" + ptc += 1 + else: + # hidden check mark + pBookTag['class'] = "unread_book" + pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + ptc += 1 else: - # hidden check mark - pBookTag['class'] = "unread_book" - pBookTag.insert(ptc,NavigableString(self.NOT_READ_SYMBOL)) + # missing book + pBookTag['class'] = "missing_book" + pBookTag.insert(ptc,NavigableString(self.MISSING_SYMBOL)) ptc += 1 # Add the book title @@ -4570,7 +4627,8 @@ class EPUB_MOBI(CatalogPlugin): if opts.connected_device['name'] and 'kindle' in opts.connected_device['name'].lower(): opts.connected_kindle = True - if opts.connected_device['serial'] and opts.connected_device['serial'][:4] in ['B004','B005']: + if opts.connected_device['serial'] and \ + opts.connected_device['serial'][:4] in ['B004','B005']: op = "kindle_dx" else: op = "kindle" @@ -4633,7 +4691,8 @@ class EPUB_MOBI(CatalogPlugin): build_log.append(" opts:") for key in keys: if key in ['catalog_title','authorClip','connected_kindle','descriptionClip', - 'exclude_genre','exclude_tags','note_tag','numbers_as_text','read_tag', + 'exclude_genre','exclude_tags','note_tag','numbers_as_text', + 'output_profile','read_tag', 'search_text','sort_by','sort_descriptions_by_author','sync']: build_log.append(" %s: %s" % (key, opts_dict[key]))