From 0ba01714d2deafc8fb6fb7548356bc7d16e9283b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 8 May 2009 20:33:37 -0700 Subject: [PATCH] Implement the ability to specify font sizes relative to the rescaled base font size, via class attributes --- src/calibre/ebooks/oeb/transforms/flatcss.py | 31 +++++- src/calibre/ebooks/oeb/transforms/jacket.py | 18 ++-- src/calibre/web/feeds/news.py | 10 +- src/calibre/web/feeds/templates.py | 105 ++++++++++--------- 4 files changed, 96 insertions(+), 68 deletions(-) diff --git a/src/calibre/ebooks/oeb/transforms/flatcss.py b/src/calibre/ebooks/oeb/transforms/flatcss.py index b2831bf448..bd76af811c 100644 --- a/src/calibre/ebooks/oeb/transforms/flatcss.py +++ b/src/calibre/ebooks/oeb/transforms/flatcss.py @@ -24,6 +24,19 @@ def asfloat(value, default): value = default return float(value) +def dynamic_rescale_factor(node): + classes = node.get('class', '').split(' ') + classes = [x.replace('calibre_rescale_', '') for x in classes if + x.startswith('calibre_rescale_')] + if not classes: return None + factor = 1.0 + for x in classes: + try: + factor *= float(x)/100. + except ValueError: + continue + return factor + class KeyMapper(object): def __init__(self, sbase, dbase, dkey): @@ -202,11 +215,19 @@ class CSSFlattener(object): if 'bgcolor' in node.attrib: cssdict['background-color'] = node.attrib['bgcolor'] del node.attrib['bgcolor'] - if not self.context.disable_font_rescaling and \ - 'font-size' in cssdict or tag == 'body': - fsize = self.fmap[style['font-size']] - cssdict['font-size'] = "%0.5fem" % (fsize / psize) - psize = fsize + if not self.context.disable_font_rescaling: + _sbase = self.sbase if self.sbase is not None else \ + self.context.source.fbase + dyn_rescale = dynamic_rescale_factor(node) + if dyn_rescale is not None: + fsize = self.fmap[_sbase] + fsize *= dyn_rescale + psize = fsize + cssdict['font-size'] = '%0.5fpt'%(fsize) + elif 'font-size' in cssdict or tag == 'body': + fsize = self.fmap[style['font-size']] + cssdict['font-size'] = "%0.5fem" % (fsize / psize) + psize = fsize if cssdict: if self.lineh and self.fbase and tag != 'body': self.clean_edges(cssdict, style, psize) diff --git a/src/calibre/ebooks/oeb/transforms/jacket.py b/src/calibre/ebooks/oeb/transforms/jacket.py index 8c995dadec..c0a656d64d 100644 --- a/src/calibre/ebooks/oeb/transforms/jacket.py +++ b/src/calibre/ebooks/oeb/transforms/jacket.py @@ -25,14 +25,16 @@ class Jacket(object): %(title)s -
-

%(title)s

-

%(jacket)s

-
%(series)s
-
%(tags)s
-
-
- %(comments)s +
+
+

%(title)s

+

%(jacket)s

+
%(series)s
+
%(tags)s
+
+
+ %(comments)s +
diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py index b7b0d688d6..36e5829fcd 100644 --- a/src/calibre/web/feeds/news.py +++ b/src/calibre/web/feeds/news.py @@ -231,23 +231,23 @@ class BasicNewsRecipe(Recipe): #: use :member:`extra_css` in your recipe to customize look and feel. template_css = u''' .article_date { - font-size: x-small; color: gray; font-family: monospace; + color: gray; font-family: monospace; } .article_description { - font-size: small; font-family: sans; text-indent: 0pt; + font-family: sans; text-indent: 0pt; } a.article { - font-weight: bold; font-size: large; + font-weight: bold; } a.feed { - font-weight: bold; font-size: large; + font-weight: bold; } .navbar { - font-family:monospace; font-size:8pt + font-family:monospace; } ''' diff --git a/src/calibre/web/feeds/templates.py b/src/calibre/web/feeds/templates.py index 1a6a574129..ede6ec821c 100644 --- a/src/calibre/web/feeds/templates.py +++ b/src/calibre/web/feeds/templates.py @@ -7,7 +7,7 @@ from calibre import preferred_encoding, strftime class Template(MarkupTemplate): - + def generate(self, *args, **kwargs): if not kwargs.has_key('style'): kwargs['style'] = '' @@ -17,20 +17,20 @@ class Template(MarkupTemplate): for arg in args: if isinstance(arg, basestring) and not isinstance(arg, unicode): arg = unicode(arg, 'utf-8', 'replace') - + return MarkupTemplate.generate(self, *args, **kwargs) - + class NavBarTemplate(Template): - + def __init__(self): Template.__init__(self, u'''\ - - -