diff --git a/src/calibre/devices/__init__.py b/src/calibre/devices/__init__.py index 83ad041ff6..3e6f59d6b6 100644 --- a/src/calibre/devices/__init__.py +++ b/src/calibre/devices/__init__.py @@ -8,7 +8,6 @@ Device drivers. import sys, time, pprint from functools import partial -from io import BytesIO DAY_MAP = dict(Sun=0, Mon=1, Tue=2, Wed=3, Thu=4, Fri=5, Sat=6) MONTH_MAP = dict(Jan=1, Feb=2, Mar=3, Apr=4, May=5, Jun=6, Jul=7, Aug=8, Sep=9, Oct=10, Nov=11, Dec=12) @@ -74,10 +73,11 @@ def debug(ioreg_to_tmp=False, buf=None, plugins=None, from calibre.devices.scanner import DeviceScanner from calibre.constants import iswindows, isosx from calibre import prints + from polyglot.io import PolyglotBytesIO oldo, olde = sys.stdout, sys.stderr if buf is None: - buf = BytesIO() + buf = PolyglotBytesIO() sys.stdout = sys.stderr = buf out = partial(prints, file=buf) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index c6cfbea7eb..f9a9d252ab 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -1264,8 +1264,9 @@ def form_to_compiled_form(form): def build_forms(srcdir, info=None, summary=False, check_for_migration=False): - import re, io + import re from PyQt5.uic import compileUi + from polyglot.io import PolyglotStringIO forms = find_forms(srcdir) if info is None: from calibre import prints @@ -1284,13 +1285,6 @@ def build_forms(srcdir, info=None, summary=False, check_for_migration=False): # the qt5 migration force_compile = check_for_migration and not gprefs.get('migrated_forms_to_qt5', False) - class PolyglotStringIO(io.StringIO): - - def write(self, x): - if isinstance(x, bytes): - x = x.decode('utf-8') - io.StringIO.write(self, x) - for form in forms: compiled_form = form_to_compiled_form(form) if force_compile or not os.path.exists(compiled_form) or os.stat(form).st_mtime > os.stat(compiled_form).st_mtime: diff --git a/src/polyglot/io.py b/src/polyglot/io.py new file mode 100644 index 0000000000..7eefb12135 --- /dev/null +++ b/src/polyglot/io.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python2 +# vim:fileencoding=utf-8 +# License: GPL v3 Copyright: 2019, Kovid Goyal + +from __future__ import absolute_import, division, print_function, unicode_literals + +from io import StringIO, BytesIO + + +class PolyglotStringIO(StringIO): + + def __init__(self, initial_data=None, encoding='utf-8'): + StringIO.__init__(self) + self._encoding_for_bytes = encoding + if initial_data is not None: + self.write(initial_data) + + def write(self, x): + if isinstance(x, bytes): + x = x.decode(self._encoding_for_bytes) + StringIO.write(self, x) + + +class PolyglotBytesIO(BytesIO): + + def __init__(self, initial_data=None, encoding='utf-8'): + BytesIO.__init__(self) + self._encoding_for_bytes = encoding + if initial_data is not None: + self.write(initial_data) + + def write(self, x): + if not isinstance(x, bytes): + x = x.encode(self._encoding_for_bytes) + BytesIO.write(self, x)