Implement the ability to specify font sizes relative to the rescaled base font size, via class attributes

This commit is contained in:
Kovid Goyal 2009-05-08 20:33:37 -07:00
parent 6fcfff5d68
commit 0ba01714d2
4 changed files with 96 additions and 68 deletions

View File

@ -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)

View File

@ -25,14 +25,16 @@ class Jacket(object):
<title>%(title)s</title>
</head>
<body>
<div style="text-align:center">
<h1>%(title)s</h1>
<h2>%(jacket)s</h2>
<div>%(series)s</div>
<div>%(tags)s</div>
</div>
<div style="margin-top:2em">
%(comments)s
<div class="calibre_rescale_100">
<div style="text-align:center">
<h1 class="calibre_rescale_180">%(title)s</h1>
<h2 class="calibre_rescale_140">%(jacket)s</h2>
<div class="calibre_rescale_100">%(series)s</div>
<div class="calibre_rescale_100">%(tags)s</div>
</div>
<div style="margin-top:2em" class="calibre_rescale_100">
%(comments)s
</div>
</div>
</body>
</html>

View File

@ -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;
}
'''

View File

@ -38,7 +38,7 @@ class NavBarTemplate(Template):
</style>
</head>
<body>
<div class="navbar" style="text-align:${'center' if center else 'left'};">
<div class="navbar calibre_rescale_70" style="text-align:${'center' if center else 'left'};">
<hr py:if="bottom" />
<p py:if="bottom" style="text-align:left">
This article was downloaded by <b>${__appname__}</b> from <a href="${url}">${url}</a>
@ -99,15 +99,17 @@ class IndexTemplate(Template):
</style>
</head>
<body>
<h1 class="calibre_recipe_title">${title}</h1>
<p style="text-align:right">${date}</p>
<ul class="calibre_feed_list">
<py:for each="i, feed in enumerate(feeds)">
<li py:if="feed" id="feed_${str(i)}">
<a class="feed" href="${'feed_%d/index.html'%i}">${feed.title}</a>
</li>
</py:for>
</ul>
<div class="calibre_rescale_100">
<h1 class="calibre_recipe_title calibre_rescale_180">${title}</h1>
<p style="text-align:right">${date}</p>
<ul class="calibre_feed_list">
<py:for each="i, feed in enumerate(feeds)">
<li py:if="feed" id="feed_${str(i)}">
<a class="feed calibre_rescale_120" href="${'feed_%d/index.html'%i}">${feed.title}</a>
</li>
</py:for>
</ul>
</div>
</body>
</html>
''')
@ -143,29 +145,32 @@ class FeedTemplate(Template):
</style>
</head>
<body style="page-break-before:always">
<h2 class="calibre_feed_title">${feed.title}</h2>
<div class="calibre_rescale_100">
<h2 class="calibre_feed_title calibre_rescale_160">${feed.title}</h2>
<py:if test="getattr(feed, 'image', None)">
<div class="calibre_feed_image">
<img alt="${feed.image_alt}" src="${feed.image_url}" />
</div>
</py:if>
<div class="calibre_feed_description" py:if="getattr(feed, 'description', None)">
<div class="calibre_feed_description calibre_rescale_80" py:if="getattr(feed, 'description', None)">
${feed.description}<br />
</div>
<ul class="calibre_article_list">
<py:for each="i, article in enumerate(feed.articles)">
<li id="${'article_%d'%i}" py:if="getattr(article, 'downloaded', False)" style="padding-bottom:0.5em">
<a class="article" href="${article.url}">${article.title}</a>
<li id="${'article_%d'%i}" py:if="getattr(article, 'downloaded',
False)" style="padding-bottom:0.5em" class="calibre_rescale_100">
<a class="article calibre_rescale_120" href="${article.url}">${article.title}</a>
<span class="article_date">${article.localtime.strftime(" [%a, %d %b %H:%M]")}</span>
<div class="article_decription" py:if="article.summary">
<div class="article_decription calibre_rescale_70" py:if="article.summary">
${Markup(cutoff(article.text_summary))}
</div>
</li>
</py:for>
</ul>
<div class="navbar" style="text-align:center; font-family:monospace; font-size:8pt">
<div class="navbar calibre_rescale_70">
| <a href="../index.html">Up one level</a> |
</div>
</div>
</body>
</html>
''')