Implement parsing of margin property. Support % values in text-indent, margin and padding

This commit is contained in:
Kovid Goyal 2008-01-30 01:14:57 +00:00
parent 6deb890595
commit 761f00dddf
2 changed files with 43 additions and 23 deletions

View File

@ -999,28 +999,41 @@ class HTMLConverter(object):
return end_page return end_page
def block_properties(self, tag_css): def block_properties(self, tag_css):
ans = {}
for key in ('topskip', 'footskip', 'sidemargin'):
ans[key] = self.book.defaultBlockStyle.attrs[key]
src = [None for i in range(4)] def get(what):
if tag_css.has_key('padding'): src = [None for i in range(4)]
msrc = tag_css['padding'].split() if tag_css.has_key(what):
for i in range(len(msrc)): msrc = tag_css[what].split()
src[i] = msrc[i] for i in range(len(msrc)):
i = 0 src[i] = msrc[i]
for c in ('top', 'right', 'bottom', 'left'): i = 0
if tag_css.has_key('padding-'+c): for c in ('-top', '-right', '-bottom', '-left'):
src[i] = tag_css['padding-'+c] if tag_css.has_key(what+c):
i += 1 src[i] = tag_css[what+c]
i += 1
return src
s1, s2 = get('margin'), get('padding')
t = {} bl = str(self.current_block.blockStyle.attrs['blockwidth'])+'px'
t['topskip'], t['footskip'], t['sidemargin'] = src[0], src[2], src[3] def set(default, one, two):
for key in ('topskip', 'footskip', 'sidemargin'): fval = None
if t[key] is not None: if one is not None:
val = self.unit_convert(t[key]) val = self.unit_convert(one, base_length=bl)
if val is not None: if val is not None:
ans[key] = val fval = val
if two is not None:
val = self.unit_convert(two, base_length=bl)
if val is not None:
fval = val if fval is None else fval + val
if fval is None:
fval = default
return fval
ans = {}
ans['topskip'] = set(self.book.defaultBlockStyle.attrs['topskip'], s1[0], s2[0])
ans['footskip'] = set(self.book.defaultBlockStyle.attrs['footskip'], s1[2], s2[2])
ans['sidemargin'] = set(self.book.defaultBlockStyle.attrs['sidemargin'], s1[3], s2[3])
return ans return ans
@ -1197,12 +1210,14 @@ class HTMLConverter(object):
def text_properties(self, tag_css): def text_properties(self, tag_css):
indent = self.book.defaultTextStyle.attrs['parindent'] indent = self.book.defaultTextStyle.attrs['parindent']
if tag_css.has_key('text-indent'): if tag_css.has_key('text-indent'):
indent = self.unit_convert(str(tag_css['text-indent']), pts=True) bl = str(self.current_block.blockStyle.attrs['blockwidth'])+'px'
if not indent: indent = self.unit_convert(str(tag_css['text-indent']), pts=True, base_length=bl)
if not indent:
indent = 0 indent = 0
if indent > 0 and indent < 10 * self.minimum_indent: if indent > 0 and indent < 10 * self.minimum_indent:
indent = int(10 * self.minimum_indent) indent = int(10 * self.minimum_indent)
fp = self.font_properties(tag_css)[0] fp = self.font_properties(tag_css)[0]
fp['parindent'] = indent fp['parindent'] = indent
@ -1226,6 +1241,13 @@ class HTMLConverter(object):
''' Ensure padding and text-indent properties are respected ''' ''' Ensure padding and text-indent properties are respected '''
text_properties = self.text_properties(tag_css) text_properties = self.text_properties(tag_css)
block_properties = self.block_properties(tag_css) block_properties = self.block_properties(tag_css)
indent = (float(text_properties['parindent'])/10) * (self.profile.dpi/72.)
margin = float(block_properties['sidemargin'])
# Since we're flattening the block structure, we need to ensure that text
# doesn't go off the left edge of the screen
if indent < 0 and margin + indent < 0:
text_properties['parindent'] = int(-margin * (72./self.profile.dpi) * 10)
align = self.get_alignment(tag_css) align = self.get_alignment(tag_css)
def fill_out_properties(props, default): def fill_out_properties(props, default):

View File

@ -90,8 +90,6 @@ def process_file(path, options, logger=None):
ext = '.lrs' if options.lrs else '.lrf' ext = '.lrs' if options.lrs else '.lrf'
options.output = os.path.abspath(os.path.basename(os.path.splitext(path)[0]) + ext) options.output = os.path.abspath(os.path.basename(os.path.splitext(path)[0]) + ext)
options.output = os.path.abspath(os.path.expanduser(options.output)) options.output = os.path.abspath(os.path.expanduser(options.output))
if options.minimum_indent == 0:
options.minimum_indent = 10
options.use_spine = True options.use_spine = True
html_process_file(htmlfile, options, logger=logger) html_process_file(htmlfile, options, logger=logger)