diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py
index 6aad099979..e2ce8491d5 100644
--- a/src/calibre/ebooks/lrf/html/convert_from.py
+++ b/src/calibre/ebooks/lrf/html/convert_from.py
@@ -11,6 +11,8 @@ import os, re, sys, copy, glob, tempfile
from collections import deque
from math import ceil, floor
from functools import partial
+from polyglot.builtins import string_or_bytes, itervalues
+from itertools import chain
try:
from PIL import Image as PILImage
@@ -258,6 +260,8 @@ class HTMLConverter(object):
src = open(self._override_css, 'rb').read()
else:
src = self._override_css
+ if isinstance(src, bytes):
+ src = src.decode('utf-8', 'replace')
match = self.PAGE_BREAK_PAT.search(src)
if match and not re.match('avoid', match.group(1), re.IGNORECASE):
self.page_break_found = True
@@ -1112,6 +1116,8 @@ class HTMLConverter(object):
ans['sidemargin'] = int((factor*int(self.current_block.blockStyle.attrs['blockwidth']))/2.)
for prop in ('topskip', 'footskip', 'sidemargin'):
+ if isinstance(ans[prop], string_or_bytes):
+ ans[prop] = int(ans[prop])
if ans[prop] < 0:
ans[prop] = 0
@@ -1520,9 +1526,8 @@ class HTMLConverter(object):
elif (tag.has_attr('type') and tag['type'] in ("text/css", "text/x-oeb1-css") and tag.has_attr('href')):
path = munge_paths(self.target_prefix, tag['href'])[0]
try:
- f = open(path, 'rb')
- src = f.read()
- f.close()
+ with open(path, 'rb') as f:
+ src = f.read().decode('utf-8', 'replace')
match = self.PAGE_BREAK_PAT.search(src)
if match and not re.match('avoid', match.group(1), re.IGNORECASE):
self.page_break_found = True
@@ -1792,7 +1797,7 @@ class HTMLConverter(object):
self.book.renderLrs(path) if lrs else self.book.renderLrf(path)
def cleanup(self):
- for _file in self.scaled_images.values() + self.rotated_images.values():
+ for _file in chain(itervalues(self.scaled_images), itervalues(self.rotated_images)):
_file.__del__()
diff --git a/src/calibre/ebooks/lrf/pylrs/pylrf.py b/src/calibre/ebooks/lrf/pylrs/pylrf.py
index a1b4a51223..f99eea6be9 100644
--- a/src/calibre/ebooks/lrf/pylrs/pylrf.py
+++ b/src/calibre/ebooks/lrf/pylrs/pylrf.py
@@ -108,11 +108,11 @@ def writeQWord(f, qword):
def writeZeros(f, nZeros):
- f.write("\x00" * nZeros)
+ f.write(b"\0" * nZeros)
-def writeString(f, str):
- f.write(str)
+def writeString(f, s):
+ f.write(s)
def writeIdList(f, idList):
@@ -177,7 +177,7 @@ def writeRuledLine(f, lineInfo):
writeColor(f, lineColor)
-LRF_SIGNATURE = "L\x00R\x00F\x00\x00\x00"
+LRF_SIGNATURE = b"L\x00R\x00F\x00\x00\x00"
# XOR_KEY = 48
XOR_KEY = 65024 # that's what lrf2lrs says -- not used, anyway...
diff --git a/src/calibre/ebooks/lrf/pylrs/pylrs.py b/src/calibre/ebooks/lrf/pylrs/pylrs.py
index ebe3aa6e37..207de6e6b7 100644
--- a/src/calibre/ebooks/lrf/pylrs/pylrs.py
+++ b/src/calibre/ebooks/lrf/pylrs/pylrs.py
@@ -53,7 +53,7 @@ DEFAULT_GENREADING = "fs" # default is yes to both lrf and lrs
from calibre import __appname__, __version__
from calibre import entity_to_unicode
-from polyglot.builtins import string_or_bytes, unicode_type
+from polyglot.builtins import string_or_bytes, unicode_type, iteritems
class LrsError(Exception):
@@ -421,7 +421,7 @@ class Book(Delegator):
LrsObject.nextObjId += 1
styledefault = StyleDefault()
- if settings.has_key('setdefault'): # noqa
+ if 'setdefault' in settings:
styledefault = settings.pop('setdefault')
Delegator.__init__(self, [BookInformation(), Main(),
Template(), Style(styledefault), Solos(), Objects()])
@@ -569,12 +569,12 @@ class Book(Delegator):
text_blocks = list(main.get_all(lambda x: isinstance(x, TextBlock)))
for tb in text_blocks:
- if tb.textSettings.has_key('fontsize'): # noqa
+ if 'fontsize' in tb.textSettings:
tb.textSettings['fontsize'] = rescale(tb.textSettings['fontsize'])
for span in tb.get_all(lambda x: isinstance(x, Span)):
- if span.attrs.has_key('fontsize'): # noqa
+ if 'fontsize' in span.attrs:
span.attrs['fontsize'] = rescale(span.attrs['fontsize'])
- if span.attrs.has_key('baselineskip'): # noqa
+ if 'baselineskip' in span.attrs:
span.attrs['baselineskip'] = rescale(span.attrs['baselineskip'])
text_styles = set(tb.textStyle for tb in text_blocks)
@@ -1835,7 +1835,7 @@ class Span(LrsSimpleChar1, LrsContainer):
oldTextStyle = self.findCurrentTextStyle()
# set the attributes we want changed
- for (name, value) in self.attrs.items():
+ for (name, value) in tuple(iteritems(self.attrs)):
if name in oldTextStyle.attrs and oldTextStyle.attrs[name] == self.attrs[name]:
self.attrs.pop(name)
else: