mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
MOBI Output: Fix using percentage units for margins resulting in too large margins when using the tablet output profile. Fixes #1932392 ["margin-top" property is converted into <number>em when converting into MOBI breaking iOS rendering](https://bugs.launchpad.net/calibre/+bug/1932392)
This commit is contained in:
parent
298ede817b
commit
2a057203e2
@ -51,6 +51,16 @@ def asfloat(value):
|
|||||||
return float(value)
|
return float(value)
|
||||||
|
|
||||||
|
|
||||||
|
def convert_margin(style, which):
|
||||||
|
# percentage values come out too large when the user uses a non kindle
|
||||||
|
# output profile like the tablet profile
|
||||||
|
ans = asfloat(style[which])
|
||||||
|
raw = style._get(which)
|
||||||
|
if isinstance(raw, str) and '%' in raw:
|
||||||
|
ans = min(style._unit_convert(raw, base=600), ans)
|
||||||
|
return ans
|
||||||
|
|
||||||
|
|
||||||
def isspace(text):
|
def isspace(text):
|
||||||
if not text:
|
if not text:
|
||||||
return True
|
return True
|
||||||
@ -372,12 +382,12 @@ class MobiMLizer(object):
|
|||||||
if style['margin-left'] == 'auto' \
|
if style['margin-left'] == 'auto' \
|
||||||
and style['margin-right'] == 'auto':
|
and style['margin-right'] == 'auto':
|
||||||
istate.halign = 'center'
|
istate.halign = 'center'
|
||||||
margin = asfloat(style['margin-left'])
|
margin = convert_margin(style, 'margin-left')
|
||||||
padding = asfloat(style['padding-left'])
|
padding = asfloat(style['padding-left'])
|
||||||
if tag != 'body':
|
if tag != 'body':
|
||||||
left = margin + padding
|
left = margin + padding
|
||||||
istate.left += left
|
istate.left += left
|
||||||
vmargin = asfloat(style['margin-top'])
|
vmargin = convert_margin(style, 'margin-top')
|
||||||
bstate.vmargin = max((bstate.vmargin, vmargin))
|
bstate.vmargin = max((bstate.vmargin, vmargin))
|
||||||
vpadding = asfloat(style['padding-top'])
|
vpadding = asfloat(style['padding-top'])
|
||||||
if vpadding > 0:
|
if vpadding > 0:
|
||||||
@ -385,13 +395,13 @@ class MobiMLizer(object):
|
|||||||
bstate.vmargin = 0
|
bstate.vmargin = 0
|
||||||
bstate.vpadding += vpadding
|
bstate.vpadding += vpadding
|
||||||
elif not istate.href:
|
elif not istate.href:
|
||||||
margin = asfloat(style['margin-left'])
|
margin = convert_margin(style, 'margin-left')
|
||||||
padding = asfloat(style['padding-left'])
|
padding = asfloat(style['padding-left'])
|
||||||
lspace = margin + padding
|
lspace = margin + padding
|
||||||
if lspace > 0:
|
if lspace > 0:
|
||||||
spaces = int(round((lspace * 3) / style['font-size']))
|
spaces = int(round((lspace * 3) / style['font-size']))
|
||||||
elem.text = ('\xa0' * spaces) + (elem.text or '')
|
elem.text = ('\xa0' * spaces) + (elem.text or '')
|
||||||
margin = asfloat(style['margin-right'])
|
margin = convert_margin(style, 'margin-right')
|
||||||
padding = asfloat(style['padding-right'])
|
padding = asfloat(style['padding-right'])
|
||||||
rspace = margin + padding
|
rspace = margin + padding
|
||||||
if rspace > 0:
|
if rspace > 0:
|
||||||
@ -610,7 +620,7 @@ class MobiMLizer(object):
|
|||||||
para.getparent().remove(para)
|
para.getparent().remove(para)
|
||||||
bstate.para = None
|
bstate.para = None
|
||||||
bstate.istate = None
|
bstate.istate = None
|
||||||
vmargin = asfloat(style['margin-bottom'])
|
vmargin = convert_margin(style, 'margin-bottom')
|
||||||
bstate.vmargin = max((bstate.vmargin, vmargin))
|
bstate.vmargin = max((bstate.vmargin, vmargin))
|
||||||
vpadding = asfloat(style['padding-bottom'])
|
vpadding = asfloat(style['padding-bottom'])
|
||||||
if vpadding > 0:
|
if vpadding > 0:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user