diff --git a/src/libprs500/ebooks/lrf/html/convert_from.py b/src/libprs500/ebooks/lrf/html/convert_from.py index fe675fd01e..1a6a03b48a 100644 --- a/src/libprs500/ebooks/lrf/html/convert_from.py +++ b/src/libprs500/ebooks/lrf/html/convert_from.py @@ -51,12 +51,12 @@ class Span(_Span): @staticmethod - def unit_convert(val, ref=80): + def unit_convert(val, dpi, ref=80): """ - Tries to convert html units stored in C{val} to pixels. C{ref} contains - the reference value for relative units. Returns the number of pixels - (an int) if successful. Otherwise, returns None. - Assumes: 1 pixel is 1/4 mm. One em is 10pts + Tries to convert html units stored in C{val} to pixels. + @param ref: reference size in pixels for % units. + @return: The number of pixels (an int) if successful. Otherwise, returns None. + Assumes: One em is 10pts """ result = None m = re.match("\s*(-*[0-9]*\.?[0-9]*)\s*(%|em|px|mm|cm|in|pt|pc)", val) @@ -67,21 +67,21 @@ class Span(_Span): elif m.group(2) == 'px': result = int(unit) elif m.group(2) == 'in': - result = int(unit * 25.4 * 4) + result = int(unit * dpi) elif m.group(2) == 'pt': - result = int(unit * 25.4 * 4 / 72) + result = int(unit * dpi/72.) elif m.group(2)== 'em': - result = int(unit * 25.4 * 4 / 72 * 10) + result = int(unit * (dpi/72.) * 10) elif m.group(2)== 'pc': - result = int(unit * 25.4 * 4 / 72 * 12) + result = int(unit * (dpi/72.) * 12) elif m.group(2)== 'mm': - result = int(unit * 4) + result = int(unit * 0.04 * (dpi/72.)) elif m.group(2)== 'cm': - result = int(unit * 10 * 4) + result = int(unit * 0.4 * (dpi/72.)) return result @staticmethod - def translate_attrs(d, font_delta=0, memory=None): + def translate_attrs(d, dpi, font_delta=0, memory=None): """ Receives a dictionary of html attributes and styles and returns approximate Xylog equivalents in a new dictionary @@ -106,10 +106,10 @@ class Span(_Span): def font_size(val): ans = None - unit = Span.unit_convert(val, 14) + unit = Span.unit_convert(val, dpi, 14) if unit: # Assume a 10 pt font (14 pixels) has fontsize 100 - ans = int (unit / 14.0 * 100) + ans = int(unit * (72./dpi) * 10) else: if "xx-small" in val: ans = 40 @@ -171,7 +171,7 @@ class Span(_Span): print >>sys.stderr, 'Unhandled/malformed CSS key:', key, d[key] return t - def __init__(self, ns, css, memory, font_delta=0): + def __init__(self, ns, css, memory, dpi, font_delta=0): src = ns.string if hasattr(ns, 'string') else ns src = re.sub(r'\s{2,}', ' ', src) # Remove multiple spaces for pat, repl in Span.rules: @@ -182,7 +182,7 @@ class Span(_Span): fs = css.pop('font-style') if fs.lower() == 'italic': src = Italic(src) - attrs = Span.translate_attrs(css, font_delta=font_delta, memory=memory) + attrs = Span.translate_attrs(css, dpi, font_delta=font_delta, memory=memory) if 'fontsize' in attrs.keys(): attrs['baselineskip'] = int(attrs['fontsize']) + 20 _Span.__init__(self, text=src, **attrs) @@ -685,7 +685,7 @@ class HTMLConverter(object): self.process_alignment(css) try: self.current_para.append(Span(src, self.sanctify_css(css), self.memory,\ - font_delta=self.font_delta)) + self.profile.dpi, font_delta=self.font_delta)) except ConversionError, err: if self.verbose: print >>sys.stderr, err @@ -941,7 +941,7 @@ class HTMLConverter(object): elif tagname == 'pre': self.end_current_para() self.current_block.append_to(self.current_page) - attrs = Span.translate_attrs(tag_css, self.font_delta, self.memory) + attrs = Span.translate_attrs(tag_css, self.profile.dpi, self.font_delta, self.memory) ts = self.book.create_text_style(**self.unindented_style.attrs) ts.attrs.update(attrs) self.current_block = self.book.create_text_block( @@ -951,7 +951,7 @@ class HTMLConverter(object): lines = src.split('\n') for line in lines: try: - self.current_para.append(Span(line, tag_css, self.memory)) + self.current_para.append(Span(line, tag_css, self.memory, self.profile.dpi)) self.current_para.CR() except ConversionError: pass @@ -1015,7 +1015,7 @@ class HTMLConverter(object): self.end_current_para() self.lstrip_toggle = True if tag_css.has_key('text-indent'): - indent = Span.unit_convert(tag_css['text-indent']) + indent = Span.unit_convert(tag_css['text-indent'], self.profile.dpi) if not indent: indent=0 else: