From c9cb61a40e015059716478255ad67aa30716ea6f Mon Sep 17 00:00:00 2001 From: GRiker Date: Fri, 10 Sep 2010 13:46:01 -0700 Subject: [PATCH] GwR jacket work --- src/calibre/ebooks/oeb/transforms/jacket.py | 72 ++++++++++++++------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/src/calibre/ebooks/oeb/transforms/jacket.py b/src/calibre/ebooks/oeb/transforms/jacket.py index fec4d230c3..030067850c 100644 --- a/src/calibre/ebooks/oeb/transforms/jacket.py +++ b/src/calibre/ebooks/oeb/transforms/jacket.py @@ -6,14 +6,14 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import textwrap +import os, textwrap from xml.sax.saxutils import escape from itertools import repeat from lxml import etree +from calibre import guess_type, strftime from calibre.ebooks.oeb.base import XPath, XPNSMAP -from calibre import guess_type from calibre.library.comments import comments_to_html class Jacket(object): ''' @@ -24,22 +24,18 @@ class Jacket(object): JACKET_TEMPLATE = textwrap.dedent(u'''\ - %(title)s + %(title_str)s + -
-
-

%(title)s

-

%(jacket)s

-
%(series)s
-
%(rating)s
-
%(tags)s
-
-
- %(comments)s -
+ +
%(comments)s
''') @@ -71,11 +67,18 @@ class Jacket(object): return ans id, href = self.oeb.manifest.generate('star', 'star.png') self.oeb.manifest.add(id, href, 'image/png', data=I('star.png', data=True)) - ans = 'Rating: ' + ''.join(repeat('star'%href, num)) + ans = 'Rating: ' + ''.join(repeat('star'%href, num)) return ans def insert_metadata(self, mi): self.log('Inserting metadata into book...') + jacket_resources = P("jacket") + + if os.path.isdir(jacket_resources): + stylesheet = os.path.join(jacket_resources, 'stylesheet.css') + with open(stylesheet) as f: + css_data = f.read() + comments = mi.comments if not comments: try: @@ -87,11 +90,13 @@ class Jacket(object): orig_comments = comments if comments: comments = comments_to_html(comments) - series = 'Series: ' + escape(mi.series if mi.series else '') + + series = 'Series: %s' % escape(mi.series if mi.series else '') if mi.series and mi.series_index is not None: - series += escape(' [%s]'%mi.format_series_index()) + series += '%s' % escape(' [%s]'%mi.format_series_index()) if not mi.series: series = '' + tags = mi.tags if not tags: try: @@ -99,23 +104,30 @@ class Jacket(object): except: tags = [] if tags: - tags = 'Tags: ' + self.opts.dest.tags_to_string(tags) + tags = 'Tags:%s' % self.opts.dest.tags_to_string(tags) else: tags = '' + try: - title = mi.title if mi.title else unicode(self.oeb.metadata.title[0]) + title_str = mi.title if mi.title else unicode(self.oeb.metadata.title[0]) except: - title = _('Unknown') + title_str = _('Unknown') + title = '%s (%s)' % (escape(title_str), strftime(u'%Y', mi.pubdate.timetuple())) + def generate_html(comments): return self.JACKET_TEMPLATE%dict(xmlns=XPNSMAP['h'], - title=escape(title), comments=comments, - jacket=escape(_('Book Jacket')), series=series, - tags=tags, rating=self.get_rating(mi.rating)) + title=title, comments=comments, + series=series, + tags=tags, rating=self.get_rating(mi.rating), + css=css_data, title_str=title_str) + id, href = self.oeb.manifest.generate('jacket', 'jacket.xhtml') from calibre.ebooks.oeb.base import RECOVER_PARSER, XPath try: root = etree.fromstring(generate_html(comments), parser=RECOVER_PARSER) +# print "root: %s" % etree.tostring(root, encoding='utf-8', +# xml_declaration=True, pretty_print=True) except: root = etree.fromstring(generate_html(escape(orig_comments)), parser=RECOVER_PARSER) @@ -137,8 +149,22 @@ class Jacket(object): def __call__(self, oeb, opts, metadata): + ''' + Add metadata in jacket.xhtml if specifed in opts + If not specified, remove previous jacket instance + ''' self.oeb, self.opts, self.log = oeb, opts, oeb.log if opts.remove_first_image: self.remove_first_image() if opts.insert_metadata: self.insert_metadata(metadata) + else: + jacket = XPath('//h:meta[@name="calibre-content" and @content="jacket"]') + for item in list(self.oeb.spine)[:4]: + if jacket(item.data): + try: + self.log.info("Removing previous jacket instance") + self.oeb.manifest.remove(item) + break + except: + continue