Add support for changing font sizes in generated EPUB files. Also make all font sizes relative, to work around Adobe DE refusing to resize text in a HTML file with absolute font sizes. Fixes #1095 (lit to epub not resizing)

This commit is contained in:
Kovid Goyal 2008-09-29 22:14:32 -07:00
parent ba99c66fcd
commit 4bb44bd1b6
4 changed files with 121 additions and 44 deletions

View File

@ -14,13 +14,15 @@ from calibre.ebooks.html import config as common_config, tostring
class DefaultProfile(object):
flow_size = sys.maxint
flow_size = sys.maxint
screen_size = None
dpi = 100
class PRS505(DefaultProfile):
flow_size = 300000
screen_size = (600, 775)
dpi = 166
PROFILES = {
@ -105,6 +107,8 @@ to auto-generate a Table of Contents.
help=_('Set the left margin in pts. Default is %default'))
layout('margin_right', ['--margin-right'], default=5.0,
help=_('Set the right margin in pts. Default is %default'))
layout('base_font_size', ['--base-font-size'], default=100.0,
help=_('The base font size as a percentage. Default is %default. Changing this should allow you to control overall base font sizes, except for input HTML files that use absolute font sizes for their text tags.'))
c.add_opt('show_opf', ['--show-opf'], default=False, group='debug',
help=_('Print generated OPF file to stdout'))

View File

@ -64,6 +64,7 @@ class HTMLProcessor(Processor):
self.extract_css()
self.relativize_font_sizes()
if opts.verbose > 2:
self.debug_tree('nocss')

View File

@ -623,9 +623,45 @@ class Processor(Parser):
self.css += '\n\n'+self.opts.override_css
self.do_layout()
# TODO: Figure out what to do about CSS imports from linked stylesheets
def relativize_font_sizes(self, dpi=100, base=16):
'''
Convert all absolute font sizes to percentages of ``base`` using ``dpi``
to convert from screen to paper units.
:param base: Base size in pixels. Adobe DE seems to need base size to be 16
irrespective of the unit of the length being converted
:param dpi: Dots per inch used to convert pixels to absolute lengths. Since
most HTML files are created on computers with monitors of DPI ~ 100, we use
100 by default.
'''
size_value_pat = re.compile(r'(?<!/)(?P<num>[0-9.]+)(?P<unit>cm|mm|in|pt|pc|px)', re.I)
# points per unit
ptu = { # Convert to pt
'px' : 72./dpi,
'pt' : 1.0,
'pc' : 1/12.,
'in' : 72.,
'cm' : 72/2.54,
'mm' : 72/25.4,
}
def relativize(match):
val = float(match.group('num'))
unit = match.group('unit').lower()
val *= ptu[unit]
return '%.1f%%'%((val/base) * 100)
def sub(match):
rule = match.group(1)
value = size_value_pat.sub(relativize, match.group(2))
return '%s : %s'%(rule, value)
self.css = re.compile(r'(font|font-size)\s*:\s*([^;]+)', re.I).sub(sub, self.css)
def do_layout(self):
self.css += '\nbody {margin-top: 0pt; margin-bottom: 0pt; margin-left: 0pt; margin-right: 0pt}\n'
self.css += '\nbody {margin-top: 0pt; margin-bottom: 0pt; margin-left: 0pt; margin-right: 0pt; font-size: %f%%}\n'%self.opts.base_font_size
self.css += '@page {margin-top: %fpt; margin-bottom: %fpt; margin-left: %fpt; margin-right: %fpt}\n'%(self.opts.margin_top, self.opts.margin_bottom, self.opts.margin_left, self.opts.margin_right)
def config(defaults=None, config_name='html',

View File

@ -77,7 +77,7 @@
<item>
<widget class="QStackedWidget" name="stack" >
<property name="currentIndex" >
<number>3</number>
<number>1</number>
</property>
<widget class="QWidget" name="metadata_page" >
<layout class="QGridLayout" name="gridLayout_4" >
@ -89,6 +89,36 @@
<string>Book Cover</string>
</property>
<layout class="QGridLayout" name="_2" >
<item row="0" column="0" >
<layout class="QHBoxLayout" name="_3" >
<item>
<widget class="ImageView" name="cover" >
<property name="text" >
<string/>
</property>
<property name="pixmap" >
<pixmap resource="../images.qrc" >:/images/book.svg</pixmap>
</property>
<property name="scaledContents" >
<bool>true</bool>
</property>
<property name="alignment" >
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0" >
<widget class="QCheckBox" name="opt_prefer_metadata_cover" >
<property name="text" >
<string>Use cover from &amp;source file</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" >
<layout class="QVBoxLayout" name="_4" >
<property name="spacing" >
@ -140,36 +170,6 @@
</item>
</layout>
</item>
<item row="2" column="0" >
<widget class="QCheckBox" name="opt_prefer_metadata_cover" >
<property name="text" >
<string>Use cover from &amp;source file</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0" >
<layout class="QHBoxLayout" name="_3" >
<item>
<widget class="ImageView" name="cover" >
<property name="text" >
<string/>
</property>
<property name="pixmap" >
<pixmap resource="../images.qrc" >:/images/book.svg</pixmap>
</property>
<property name="scaledContents" >
<bool>true</bool>
</property>
<property name="alignment" >
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
<zorder>opt_prefer_metadata_cover</zorder>
<zorder></zorder>
@ -396,17 +396,53 @@
<widget class="QWidget" name="lookandfeel_page" >
<layout class="QVBoxLayout" name="verticalLayout" >
<item>
<widget class="QLabel" name="label_26" >
<property name="text" >
<string>Source en&amp;coding:</string>
</property>
<property name="buddy" >
<cstring>opt_encoding</cstring>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="opt_encoding" />
<layout class="QGridLayout" name="gridLayout_6" >
<item row="0" column="0" >
<widget class="QLabel" name="label_26" >
<property name="text" >
<string>Source en&amp;coding:</string>
</property>
<property name="buddy" >
<cstring>opt_encoding</cstring>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2" >
<widget class="QLineEdit" name="opt_encoding" />
</item>
<item row="1" column="0" colspan="2" >
<widget class="QLabel" name="label_18" >
<property name="text" >
<string>Base &amp;font size:</string>
</property>
<property name="buddy" >
<cstring>opt_base_font_size</cstring>
</property>
</widget>
</item>
<item row="1" column="2" >
<widget class="QDoubleSpinBox" name="opt_base_font_size" >
<property name="suffix" >
<string> %</string>
</property>
<property name="decimals" >
<number>0</number>
</property>
<property name="minimum" >
<double>10.000000000000000</double>
</property>
<property name="maximum" >
<double>500.000000000000000</double>
</property>
<property name="singleStep" >
<double>5.000000000000000</double>
</property>
<property name="value" >
<double>100.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox" >