diff --git a/src/calibre/customize/zipplugin.py b/src/calibre/customize/zipplugin.py index 821046b169..95c18da1b2 100644 --- a/src/calibre/customize/zipplugin.py +++ b/src/calibre/customize/zipplugin.py @@ -15,6 +15,7 @@ from functools import partial from calibre import as_unicode from calibre.customize import (Plugin, numeric_version, platform, InvalidPlugin, PluginNotFound) +from polyglot.builtins import string_or_bytes # PEP 302 based plugin loading mechanism, works around the bug in zipimport in # python 2.x that prevents importing from zip files in locations whose paths @@ -34,7 +35,7 @@ def get_resources(zfp, name_or_list_of_names): be just the bytes of the resource or None if it wasn't found. ''' names = name_or_list_of_names - if isinstance(names, basestring): + if isinstance(names, string_or_bytes): names = [names] ans = {} with zipfile.ZipFile(zfp) as zf: @@ -65,11 +66,11 @@ def get_icons(zfp, name_or_list_of_names): from PyQt5.Qt import QIcon, QPixmap names = name_or_list_of_names ans = get_resources(zfp, names) - if isinstance(names, basestring): + if isinstance(names, string_or_bytes): names = [names] if ans is None: ans = {} - if isinstance(ans, basestring): + if isinstance(ans, string_or_bytes): ans = dict([(names[0], ans)]) ians = {} diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index 146bb8eba4..e7b5b55ac4 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -12,7 +12,7 @@ import os, shutil, uuid, json, glob, time, hashlib, errno, sys from functools import partial import apsw -from polyglot.builtins import unicode_type, reraise +from polyglot.builtins import unicode_type, reraise, string_or_bytes from calibre import isbytestring, force_unicode, prints, as_unicode from calibre.constants import (iswindows, filesystem_encoding, @@ -1348,7 +1348,7 @@ class DB(object): def copy_cover_to(self, path, dest, windows_atomic_move=None, use_hardlink=False, report_file_size=None): path = os.path.abspath(os.path.join(self.library_path, path, 'cover.jpg')) if windows_atomic_move is not None: - if not isinstance(dest, basestring): + if not isinstance(dest, string_or_bytes): raise Exception("Error, you must pass the dest as a path when" " using windows_atomic_move") if os.access(path, os.R_OK) and dest and not samefile(dest, path): @@ -1438,7 +1438,7 @@ class DB(object): if path is None: return False if windows_atomic_move is not None: - if not isinstance(dest, basestring): + if not isinstance(dest, string_or_bytes): raise Exception("Error, you must pass the dest as a path when" " using windows_atomic_move") if dest: diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index b1cd08af24..e7f1f14aa6 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -11,7 +11,7 @@ import os, traceback, random, shutil, operator from io import BytesIO from collections import defaultdict, Set, MutableSet from functools import wraps, partial -from polyglot.builtins import unicode_type, zip +from polyglot.builtins import unicode_type, zip, string_or_bytes from time import time from calibre import isbytestring, as_unicode @@ -1076,7 +1076,7 @@ class Cache(object): bimap, simap = {}, {} sfield = self.fields[name + '_index'] for k, v in book_id_to_val_map.iteritems(): - if isinstance(v, basestring): + if isinstance(v, string_or_bytes): v, sid = get_series_values(v) else: v = sid = None @@ -1298,7 +1298,7 @@ class Cache(object): # force_changes has no effect on cover manipulation try: cdata = mi.cover_data[1] - if cdata is None and isinstance(mi.cover, basestring) and mi.cover and os.access(mi.cover, os.R_OK): + if cdata is None and isinstance(mi.cover, string_or_bytes) and mi.cover and os.access(mi.cover, os.R_OK): with lopen(mi.cover, 'rb') as f: cdata = f.read() or None if cdata is not None: diff --git a/src/calibre/db/search.py b/src/calibre/db/search.py index da021d0e36..cc70ec4a39 100644 --- a/src/calibre/db/search.py +++ b/src/calibre/db/search.py @@ -19,7 +19,7 @@ from calibre.utils.date import parse_date, UNDEFINED_DATE, now, dt_as_local from calibre.utils.icu import primary_contains, sort_key from calibre.utils.localization import lang_map, canonicalize_lang from calibre.utils.search_query_parser import SearchQueryParser, ParseException -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes CONTAINS_MATCH = 0 EQUALS_MATCH = 1 @@ -706,7 +706,7 @@ class Parser(SearchQueryParser): # {{{ if location in text_fields: for val, book_ids in self.field_iter(location, current_candidates): if val is not None: - if isinstance(val, basestring): + if isinstance(val, string_or_bytes): val = (val,) if _match(q, val, matchkind, use_primary_find_in_search=upf, case_sensitive=case_sensitive): matches |= book_ids diff --git a/src/calibre/db/utils.py b/src/calibre/db/utils.py index 65d3e678d2..62970d6fcf 100644 --- a/src/calibre/db/utils.py +++ b/src/calibre/db/utils.py @@ -9,7 +9,7 @@ __copyright__ = '2013, Kovid Goyal ' import os, errno, cPickle, sys, re from locale import localeconv from collections import OrderedDict, namedtuple -from polyglot.builtins import map, unicode_type +from polyglot.builtins import map, unicode_type, string_or_bytes from threading import Lock from calibre import as_unicode, prints @@ -45,7 +45,7 @@ def fuzzy_title_patterns(): if _fuzzy_title_patterns is None: from calibre.ebooks.metadata import get_title_sort_pat _fuzzy_title_patterns = tuple((re.compile(pat, re.IGNORECASE) if - isinstance(pat, basestring) else pat, repl) for pat, repl in + isinstance(pat, string_or_bytes) else pat, repl) for pat, repl in [ (r'[\[\](){}<>\'";,:#]', ''), (get_title_sort_pat(), ''), diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index cb2dc14cb8..fac9b100e0 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -10,6 +10,7 @@ import cStringIO from calibre import fsync from calibre.devices.usbms.driver import USBMS +from polyglot.builtins import string_or_bytes HTC_BCDS = [0x100, 0x0222, 0x0224, 0x0226, 0x227, 0x228, 0x229, 0x0231, 0x9999] @@ -286,7 +287,7 @@ class ANDROID(USBMS): opts = [self.EBOOK_DIR_MAIN, ''] def strtolist(x): - if isinstance(x, basestring): + if isinstance(x, string_or_bytes): x = [y.strip() for y in x.split(',')] return x or [] diff --git a/src/calibre/devices/kobo/books.py b/src/calibre/devices/kobo/books.py index 91d50c115d..47082a29ed 100644 --- a/src/calibre/devices/kobo/books.py +++ b/src/calibre/devices/kobo/books.py @@ -14,7 +14,7 @@ from calibre.devices.usbms.books import CollectionsBookList from calibre.utils.config_base import prefs from calibre.devices.usbms.driver import debug_print from calibre.ebooks.metadata import author_to_author_sort -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class Book(Book_): @@ -297,7 +297,7 @@ class KTCollectionsBookList(CollectionsBookList): return 1 if y is None: return -1 - if isinstance(x, basestring) and isinstance(y, basestring): + if isinstance(x, string_or_bytes) and isinstance(y, string_or_bytes): x, y = sort_key(force_unicode(x)), sort_key(force_unicode(y)) c = cmp(x, y) if c != 0: diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 7586f5c73a..e570573f50 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -32,7 +32,7 @@ from calibre import prints, fsync from calibre.ptempfile import PersistentTemporaryFile from calibre.constants import DEBUG from calibre.utils.config_base import prefs -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes EPUB_EXT = '.epub' KEPUB_EXT = '.kepub' @@ -3543,14 +3543,14 @@ class KOBOTOUCH(KOBO): # a string, so looking for that. start_subclass_extra_options = OPT_MODIFY_CSS debugging_title = '' - if isinstance(settings.extra_customization[OPT_MODIFY_CSS], basestring): + if isinstance(settings.extra_customization[OPT_MODIFY_CSS], string_or_bytes): debug_print("KoboTouch::migrate_old_settings - Don't have update_series option") settings.update_series = config.get_option('update_series').default settings.modify_css = config.get_option('modify_css').default settings.support_newer_firmware = settings.extra_customization[OPT_UPDATE_SERIES_DETAILS] debugging_title = settings.extra_customization[OPT_MODIFY_CSS] start_subclass_extra_options = OPT_MODIFY_CSS + 1 - elif isinstance(settings.extra_customization[OPT_SUPPORT_NEWER_FIRMWARE], basestring): + elif isinstance(settings.extra_customization[OPT_SUPPORT_NEWER_FIRMWARE], string_or_bytes): debug_print("KoboTouch::migrate_old_settings - Don't have modify_css option") settings.update_series = settings.extra_customization[OPT_UPDATE_SERIES_DETAILS] settings.modify_css = config.get_option('modify_css').default @@ -3565,7 +3565,7 @@ class KOBOTOUCH(KOBO): debugging_title = settings.extra_customization[OPT_DEBUGGING_TITLE] start_subclass_extra_options = OPT_DEBUGGING_TITLE + 1 - settings.debugging_title = debugging_title if isinstance(debugging_title, basestring) else '' + settings.debugging_title = debugging_title if isinstance(debugging_title, string_or_bytes) else '' settings.update_device_metadata = settings.update_series settings.extra_customization = settings.extra_customization[start_subclass_extra_options:] diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 63179faa62..6d65e13c9c 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -14,6 +14,7 @@ from calibre.constants import preferred_encoding from calibre import isbytestring, force_unicode from calibre.utils.config_base import tweaks from calibre.utils.icu import sort_key +from polyglot.builtins import string_or_bytes class Book(Metadata): @@ -291,7 +292,7 @@ class CollectionsBookList(BookList): return 1 if y is None: return -1 - if isinstance(x, basestring) and isinstance(y, basestring): + if isinstance(x, string_or_bytes) and isinstance(y, string_or_bytes): x, y = sort_key(force_unicode(x)), sort_key(force_unicode(y)) try: c = cmp(x, y) diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index b73138f4d2..401728928e 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -23,6 +23,7 @@ from calibre.devices.errors import DeviceError from calibre.devices.usbms.deviceconfig import DeviceConfig from calibre.constants import iswindows, islinux, isosx, isfreebsd, plugins from calibre.utils.filenames import ascii_filename as sanitize +from polyglot.builtins import string_or_bytes if isosx: usbobserver, usbobserver_err = plugins['usbobserver'] @@ -938,7 +939,7 @@ class Device(DeviceConfig, DevicePlugin): sanity_check(on_card, files, self.card_prefix(), self.free_space()) def get_dest_dir(prefix, candidates): - if isinstance(candidates, basestring): + if isinstance(candidates, string_or_bytes): candidates = [candidates] if not candidates: candidates = [''] diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index ee5ec6452e..1c8e657b7d 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -20,7 +20,7 @@ from calibre.devices.usbms.cli import CLI from calibre.devices.usbms.device import Device from calibre.devices.usbms.books import BookList, Book from calibre.ebooks.metadata.book.json_codec import JsonCodec -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes BASE_TIME = None @@ -243,7 +243,7 @@ class USBMS(CLI, Device): import traceback traceback.print_exc() return changed - if isinstance(ebook_dirs, basestring): + if isinstance(ebook_dirs, string_or_bytes): ebook_dirs = [ebook_dirs] for ebook_dir in ebook_dirs: ebook_dir = self.path_to_unicode(ebook_dir) diff --git a/src/calibre/ebooks/BeautifulSoup.py b/src/calibre/ebooks/BeautifulSoup.py index d78376fb48..a6a4e0220c 100644 --- a/src/calibre/ebooks/BeautifulSoup.py +++ b/src/calibre/ebooks/BeautifulSoup.py @@ -89,7 +89,7 @@ import types import re import calibre.ebooks.sgmllib as sgmllib from htmlentitydefs import name2codepoint -from polyglot.builtins import codepoint_to_chr, unicode_type +from polyglot.builtins import codepoint_to_chr, unicode_type, string_or_bytes #This hack makes Beautiful Soup able to parse XML with namespaces sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') @@ -177,7 +177,7 @@ class PageElement: return lastChild def insert(self, position, newChild): - if (isinstance(newChild, basestring) + if (isinstance(newChild, string_or_bytes) or isinstance(newChild, unicode_type)) \ and not isinstance(newChild, NavigableString): newChild = NavigableString(newChild) @@ -937,7 +937,7 @@ def isString(s): """Convenience method that works with all 2.x versions of Python to determine whether or not something is stringlike.""" try: - return isinstance(s, unicode_type) or isinstance(s, basestring) + return isinstance(s, unicode_type) or isinstance(s, string_or_bytes) except NameError: return isinstance(s, str) diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py index e3cf965787..3bfe919ea7 100644 --- a/src/calibre/ebooks/conversion/plumber.py +++ b/src/calibre/ebooks/conversion/plumber.py @@ -18,7 +18,7 @@ from calibre.utils.zipfile import ZipFile from calibre import (extract, walk, isbytestring, filesystem_encoding, get_types_map) from calibre.constants import __version__ -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes DEBUG_README=u''' This debug directory contains snapshots of the e-book as it passes through the @@ -1022,7 +1022,7 @@ OptionRecommendation(name='search_replace', def dump_input(self, ret, output_dir): out_dir = os.path.join(self.opts.debug_pipeline, 'input') - if isinstance(ret, basestring): + if isinstance(ret, string_or_bytes): shutil.copytree(output_dir, out_dir) else: if not os.path.exists(out_dir): @@ -1214,7 +1214,7 @@ OptionRecommendation(name='search_replace', transform_css_rules = () if self.opts.transform_css_rules: transform_css_rules = self.opts.transform_css_rules - if isinstance(transform_css_rules, basestring): + if isinstance(transform_css_rules, string_or_bytes): transform_css_rules = json.loads(transform_css_rules) flattener = CSSFlattener(fbase=fbase, fkey=fkey, lineh=line_height, diff --git a/src/calibre/ebooks/covers.py b/src/calibre/ebooks/covers.py index c3619487d4..4362983afd 100644 --- a/src/calibre/ebooks/covers.py +++ b/src/calibre/ebooks/covers.py @@ -10,7 +10,7 @@ import re, random, unicodedata from collections import namedtuple from contextlib import contextmanager from math import ceil, sqrt, cos, sin, atan2 -from polyglot.builtins import map, zip +from polyglot.builtins import map, zip, string_or_bytes from itertools import chain from PyQt5.Qt import ( @@ -275,7 +275,7 @@ def format_fields(mi, prefs): @contextmanager def preserve_fields(obj, fields): - if isinstance(fields, basestring): + if isinstance(fields, string_or_bytes): fields = fields.split() null = object() mem = {f:getattr(obj, f, null) for f in fields} diff --git a/src/calibre/ebooks/docx/writer/from_html.py b/src/calibre/ebooks/docx/writer/from_html.py index fb2997b672..4fe74cc998 100644 --- a/src/calibre/ebooks/docx/writer/from_html.py +++ b/src/calibre/ebooks/docx/writer/from_html.py @@ -19,7 +19,7 @@ from calibre.ebooks.docx.writer.lists import ListsManager from calibre.ebooks.oeb.stylizer import Stylizer as Sz, Style as St from calibre.ebooks.oeb.base import XPath, barename from calibre.utils.localization import lang_as_iso639_1 -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes def lang_for_tag(tag): @@ -528,7 +528,7 @@ class Convert(object): self.add_block_tag(tagname, html_tag, tag_style, stylizer, float_spec=float_spec) for child in html_tag.iterchildren(): - if isinstance(getattr(child, 'tag', None), basestring): + if isinstance(getattr(child, 'tag', None), string_or_bytes): self.process_tag(child, stylizer, float_spec=float_spec) else: # Comment/PI/etc. tail = getattr(child, 'tail', None) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 6fac9fdd84..0f2225e665 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -19,7 +19,7 @@ from calibre.constants import __appname__, __version__ from calibre.utils.localization import lang_as_iso639_1 from calibre.utils.img import save_cover_data_to from calibre.ebooks.oeb.base import urlnormalize -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class FB2MLizer(object): @@ -396,9 +396,9 @@ class FB2MLizer(object): elem = elem_tree # Ensure what we are converting is not a string and that the fist tag is part of the XHTML namespace. - if not isinstance(elem_tree.tag, basestring) or namespace(elem_tree.tag) != XHTML_NS: + if not isinstance(elem_tree.tag, string_or_bytes) or namespace(elem_tree.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return [elem.tail] return [] diff --git a/src/calibre/ebooks/htmlz/oeb2html.py b/src/calibre/ebooks/htmlz/oeb2html.py index 7a77f4c64e..f27a7308d5 100644 --- a/src/calibre/ebooks/htmlz/oeb2html.py +++ b/src/calibre/ebooks/htmlz/oeb2html.py @@ -22,7 +22,7 @@ from calibre.ebooks.oeb.base import ( XHTML, XHTML_NS, barename, namespace, OEB_IMAGES, XLINK, rewrite_links, urlnormalize) from calibre.ebooks.oeb.stylizer import Stylizer from calibre.utils.logging import default_log -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes SELF_CLOSING_TAGS = {'area', 'base', 'basefont', 'br', 'hr', 'input', 'img', 'link', 'meta'} @@ -98,7 +98,7 @@ class OEB2HTML(object): for el in root.iter(): attribs = el.attrib try: - if not isinstance(el.tag, basestring): + if not isinstance(el.tag, string_or_bytes): continue except: continue @@ -159,10 +159,10 @@ class OEB2HTMLNoCSSizer(OEB2HTML): ''' # We can only processes tags. If there isn't a tag return any text. - if not isinstance(elem.tag, basestring) \ + if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return [elem.tail] return [''] @@ -248,10 +248,10 @@ class OEB2HTMLInlineCSSizer(OEB2HTML): ''' # We can only processes tags. If there isn't a tag return any text. - if not isinstance(elem.tag, basestring) \ + if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return [elem.tail] return [''] @@ -351,10 +351,10 @@ class OEB2HTMLClassCSSizer(OEB2HTML): ''' # We can only processes tags. If there isn't a tag return any text. - if not isinstance(elem.tag, basestring) \ + if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return [elem.tail] return [''] diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index 276b97c9ff..e733581117 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -22,7 +22,7 @@ from calibre.ebooks.oeb.base import urlnormalize, xpath from calibre.ebooks.oeb.reader import OEBReader from calibre.ebooks import DRMError from calibre import plugins -from polyglot.builtins import codepoint_to_chr, unicode_type +from polyglot.builtins import codepoint_to_chr, unicode_type, string_or_bytes lzx, lxzerror = plugins['lzx'] msdes, msdeserror = plugins['msdes'] @@ -281,7 +281,7 @@ class UnBinary(object): attr = current_map[oc] elif oc in self.attr_map: attr = self.attr_map[oc] - if not attr or not isinstance(attr, basestring): + if not attr or not isinstance(attr, string_or_bytes): raise LitError( 'Unknown attribute %d in tag %s' % (oc, tag_name)) if attr.startswith('%'): diff --git a/src/calibre/ebooks/lit/writer.py b/src/calibre/ebooks/lit/writer.py index 64db77db9f..ce1c3acdcc 100644 --- a/src/calibre/ebooks/lit/writer.py +++ b/src/calibre/ebooks/lit/writer.py @@ -31,7 +31,7 @@ import calibre from calibre import plugins msdes, msdeserror = plugins['msdes'] import calibre.ebooks.lit.mssha1 as mssha1 -from polyglot.builtins import codepoint_to_chr, unicode_type +from polyglot.builtins import codepoint_to_chr, unicode_type, string_or_bytes __all__ = ['LitWriter'] @@ -175,7 +175,7 @@ class ReBinary(object): def tree_to_binary(self, elem, nsrmap=NSRMAP, parents=[], inhead=False, preserve=False): - if not isinstance(elem.tag, basestring): + if not isinstance(elem.tag, string_or_bytes): # Don't emit any comments or raw entities return nsrmap = copy.copy(nsrmap) diff --git a/src/calibre/ebooks/lrf/html/table.py b/src/calibre/ebooks/lrf/html/table.py index e2cb0d1b9f..6d0485d82f 100644 --- a/src/calibre/ebooks/lrf/html/table.py +++ b/src/calibre/ebooks/lrf/html/table.py @@ -7,6 +7,7 @@ from calibre.ebooks.lrf.fonts import get_font from calibre.ebooks.lrf.pylrs.pylrs import TextBlock, Text, CR, Span, \ CharButton, Plot, Paragraph, \ LrsTextTag +from polyglot.builtins import string_or_bytes def ceil(num): @@ -38,7 +39,7 @@ def tokens(tb): yield 2, None elif isinstance(x, Text): yield x.text, cattrs(attrs, {}) - elif isinstance(x, basestring): + elif isinstance(x, string_or_bytes): yield x, cattrs(attrs, {}) elif isinstance(x, (CharButton, LrsTextTag)): if x.contents: @@ -382,7 +383,3 @@ class Table(object): yield tb, xpos[c], sypos, delta, None sypos += tb.blockStyle.attrs['blockheight'] - - - - diff --git a/src/calibre/ebooks/lrf/lrs/convert_from.py b/src/calibre/ebooks/lrf/lrs/convert_from.py index 44e3425b56..ed0088f1e5 100644 --- a/src/calibre/ebooks/lrf/lrs/convert_from.py +++ b/src/calibre/ebooks/lrf/lrs/convert_from.py @@ -17,6 +17,7 @@ from calibre.ebooks.lrf.pylrs.pylrs import Book, PageStyle, TextStyle, \ Italic, Sup, Sub, Bold, EmpLine, JumpButton, CharButton, Plot, \ DropCaps, Footer, RuledLine from calibre.ebooks.chardet import xml_to_unicode +from polyglot.builtins import string_or_bytes class LrsParser(object): @@ -95,7 +96,7 @@ class LrsParser(object): if isinstance(contents[0], NavigableString): contents[0] = contents[0].string.lstrip() for item in contents: - if isinstance(item, basestring): + if isinstance(item, string_or_bytes): p.append(item) elif isinstance(item, NavigableString): p.append(item.string) diff --git a/src/calibre/ebooks/lrf/objects.py b/src/calibre/ebooks/lrf/objects.py index 83895b8860..883ea82ccd 100644 --- a/src/calibre/ebooks/lrf/objects.py +++ b/src/calibre/ebooks/lrf/objects.py @@ -7,7 +7,7 @@ from calibre.ebooks.lrf import LRFParseError, PRS500_PROFILE from calibre.constants import ispy3 from calibre import entity_to_unicode, prepare_string_for_xml from calibre.ebooks.lrf.tags import Tag -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes ruby_tags = { 0xF575: ['rubyAlignAndAdjust', 'W'], @@ -121,7 +121,7 @@ class LRFContentObject(LRFObject): def handle_tag(self, tag): if tag.id in self.tag_map: action = self.tag_map[tag.id] - if isinstance(action, basestring): + if isinstance(action, string_or_bytes): func, args = action, tuple([]) else: func, args = action[0], (action[1],) @@ -880,7 +880,7 @@ class Text(LRFStream): self.add_text(stream.read(tag.word)) elif tag.id in self.__class__.text_tags: # A Text tag action = self.__class__.text_tags[tag.id] - if isinstance(action, basestring): + if isinstance(action, string_or_bytes): getattr(self, action)(tag, stream) else: getattr(self, action[0])(tag, action[1]) @@ -904,7 +904,7 @@ class Text(LRFStream): s = u'' open_containers = collections.deque() for c in self.content: - if isinstance(c, basestring): + if isinstance(c, string_or_bytes): s += prepare_string_for_xml(c).replace('\0', '') elif c is None: if open_containers: @@ -930,7 +930,7 @@ class Text(LRFStream): open_containers = collections.deque() in_p = False for c in self.content: - if isinstance(c, basestring): + if isinstance(c, string_or_bytes): s += c elif c is None: if c.name == 'P': diff --git a/src/calibre/ebooks/lrf/pylrs/elements.py b/src/calibre/ebooks/lrf/pylrs/elements.py index 08316eaa7d..f61f79b15f 100644 --- a/src/calibre/ebooks/lrf/pylrs/elements.py +++ b/src/calibre/ebooks/lrf/pylrs/elements.py @@ -1,6 +1,6 @@ """ elements.py -- replacements and helpers for ElementTree """ -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class ElementWriter(object): @@ -24,7 +24,7 @@ class ElementWriter(object): def _writeAttribute(self, f, name, value): f.write(u' %s="' % unicode_type(name)) - if not isinstance(value, basestring): + if not isinstance(value, string_or_bytes): value = unicode_type(value) value = self._encodeCdata(value) value = value.replace('"', '"') diff --git a/src/calibre/ebooks/lrf/pylrs/pylrs.py b/src/calibre/ebooks/lrf/pylrs/pylrs.py index a5399eb5d8..7b8e5c75f4 100644 --- a/src/calibre/ebooks/lrf/pylrs/pylrs.py +++ b/src/calibre/ebooks/lrf/pylrs/pylrs.py @@ -58,6 +58,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 class LrsError(Exception): @@ -96,7 +97,7 @@ def ElementWithReading(tag, text, reading=False): if text is None: readingText = "" - elif isinstance(text, basestring): + elif isinstance(text, string_or_bytes): readingText = text else: # assumed to be a sequence of (name, sortas) @@ -155,7 +156,7 @@ class Delegator(object): """ for setting in d.getSettings(): - if isinstance(setting, basestring): + if isinstance(setting, string_or_bytes): setting = (d, setting) delegates = \ self.delegatedSettingsDict.setdefault(setting[1], []) @@ -293,7 +294,7 @@ class LrsContainer(object): (content.__class__.__name__, self.__class__.__name__)) - if convertText and isinstance(content, basestring): + if convertText and isinstance(content, string_or_bytes): content = Text(content) content.setParent(self) @@ -587,15 +588,15 @@ class Book(Delegator): ts.attrs['baselineskip'] = rescale(ts.attrs['baselineskip']) def renderLrs(self, lrsFile, encoding="UTF-8"): - if isinstance(lrsFile, basestring): + if isinstance(lrsFile, string_or_bytes): lrsFile = codecs.open(lrsFile, "wb", encoding=encoding) self.render(lrsFile, outputEncodingName=encoding) lrsFile.close() def renderLrf(self, lrfFile): self.appendReferencedObjects(self) - if isinstance(lrfFile, basestring): - lrfFile = file(lrfFile, "wb") + if isinstance(lrfFile, string_or_bytes): + lrfFile = open(lrfFile, "wb") lrfWriter = LrfWriter(self.sourceencoding) lrfWriter.optimizeTags = self.optimizeTags @@ -1493,9 +1494,9 @@ class Paragraph(LrsContainer): def __init__(self, text=None): LrsContainer.__init__(self, [Text, CR, DropCaps, CharButton, - LrsSimpleChar1, basestring]) + LrsSimpleChar1, bytes, unicode_type]) if text is not None: - if isinstance(text, basestring): + if isinstance(text, string_or_bytes): text = Text(text) self.append(text) @@ -1528,7 +1529,7 @@ class Paragraph(LrsContainer): class LrsTextTag(LrsContainer): def __init__(self, text, validContents): - LrsContainer.__init__(self, [Text, basestring] + validContents) + LrsContainer.__init__(self, [Text, bytes, unicode_type] + validContents) if text is not None: self.append(text) @@ -1792,7 +1793,7 @@ class Box(LrsSimpleChar1, LrsContainer): """ def __init__(self, linetype="solid"): - LrsContainer.__init__(self, [Text, basestring]) + LrsContainer.__init__(self, [Text, bytes, unicode_type]) if linetype not in LINE_TYPE_ENCODING: raise LrsError(linetype + " is not a valid line type") self.linetype = linetype @@ -1812,9 +1813,9 @@ class Box(LrsSimpleChar1, LrsContainer): class Span(LrsSimpleChar1, LrsContainer): def __init__(self, text=None, **attrs): - LrsContainer.__init__(self, [LrsSimpleChar1, Text, basestring]) + LrsContainer.__init__(self, [LrsSimpleChar1, Text, bytes, unicode_type]) if text is not None: - if isinstance(text, basestring): + if isinstance(text, string_or_bytes): text = Text(text) self.append(text) @@ -1956,7 +1957,7 @@ class CharButton(LrsSimpleChar1, LrsContainer): """ def __init__(self, button, text=None): - LrsContainer.__init__(self, [basestring, Text, LrsSimpleChar1]) + LrsContainer.__init__(self, [bytes, unicode_type, Text, LrsSimpleChar1]) self.button = None if button is not None: self.setButton(button) diff --git a/src/calibre/ebooks/lrf/tags.py b/src/calibre/ebooks/lrf/tags.py index f557a8886d..ae71a6dc97 100644 --- a/src/calibre/ebooks/lrf/tags.py +++ b/src/calibre/ebooks/lrf/tags.py @@ -5,7 +5,7 @@ __copyright__ = '2008, Kovid Goyal ' import struct from calibre.ebooks.lrf import LRFParseError -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class Tag(object): @@ -196,7 +196,7 @@ class Tag(object): self.id = 0xF500 + tag_id[0] size, self.name = self.__class__.tags[tag_id[0]] - if isinstance(size, basestring): + if isinstance(size, string_or_bytes): parser = getattr(self, size + '_parser') self.contents = parser(stream) else: diff --git a/src/calibre/ebooks/metadata/odt.py b/src/calibre/ebooks/metadata/odt.py index d520573021..1e6aa1e7fc 100644 --- a/src/calibre/ebooks/metadata/odt.py +++ b/src/calibre/ebooks/metadata/odt.py @@ -33,6 +33,7 @@ from calibre.ebooks.metadata import MetaInformation, string_to_authors, check_is from calibre.utils.imghdr import identify from calibre.utils.date import parse_date from calibre.utils.localization import canonicalize_lang +from polyglot.builtins import string_or_bytes whitespace = re.compile(r'\s+') @@ -125,7 +126,7 @@ class odfmetaparser(xml.sax.saxutils.XMLGenerator): if name == (OFFICENS,u'meta'): for k,v in self.addfields.items(): if len(v) > 0: - if isinstance(k, basestring): + if isinstance(k, string_or_bytes): xml.sax.saxutils.XMLGenerator.startElementNS(self,(METANS,u'user-defined'),None,{(METANS,u'name'):k}) xml.sax.saxutils.XMLGenerator.characters(self, v) xml.sax.saxutils.XMLGenerator.endElementNS(self, (METANS,u'user-defined'),None) @@ -270,4 +271,3 @@ def read_cover(stream, zin, mi, opfmeta, extract_cover): else: cover_data = (fmt, raw) mi.cover_data = cover_data - diff --git a/src/calibre/ebooks/metadata/rtf.py b/src/calibre/ebooks/metadata/rtf.py index 084f0d8ae9..42563bf3d9 100644 --- a/src/calibre/ebooks/metadata/rtf.py +++ b/src/calibre/ebooks/metadata/rtf.py @@ -8,7 +8,7 @@ import re, cStringIO, codecs from calibre import force_unicode from calibre.ebooks.metadata import MetaInformation, string_to_authors -from polyglot.builtins import codepoint_to_chr, unicode_type +from polyglot.builtins import codepoint_to_chr, unicode_type, string_or_bytes title_pat = re.compile(r'\{\\info.*?\{\\title(.*?)(?]+encoding\s*=\s*[\'"](.*?)[\'"][^<>]*>', re.IGNORECASE) @@ -49,6 +50,7 @@ def expand(name): prefix, name = name.partition(':')[::2] return '{%s}%s' % (NS_MAP[prefix], name) + xpath_cache = {} @@ -478,7 +480,7 @@ def metadata_to_xmp_packet(mi): 'authors':('dc:creator', True), 'tags':('dc:subject', False), 'publisher':('dc:publisher', False), }.iteritems(): val = mi.get(prop) or () - if isinstance(val, basestring): + if isinstance(val, string_or_bytes): val = [val] create_sequence_property(dc, tag, val, ordered) if not mi.is_null('pubdate'): @@ -636,10 +638,10 @@ def merge_xmp_packet(old, new): return serialize_xmp_packet(root) + if __name__ == '__main__': from calibre.utils.podofo import get_xmp_metadata xmp_packet = get_xmp_metadata(sys.argv[-1]) mi = metadata_from_xmp_packet(xmp_packet) np = metadata_to_xmp_packet(mi) - print (merge_xmp_packet(xmp_packet, np)) - + print(merge_xmp_packet(xmp_packet, np)) diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py index 4db55b204e..effa29c7a0 100644 --- a/src/calibre/ebooks/mobi/mobiml.py +++ b/src/calibre/ebooks/mobi/mobiml.py @@ -16,7 +16,7 @@ from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks.oeb.transforms.flatcss import KeyMapper from calibre.ebooks.mobi.utils import convert_color_for_font_tag from calibre.utils.imghdr import identify -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes MBP_NS = 'http://mobipocket.com/ns/mbp' @@ -144,7 +144,7 @@ class MobiMLizer(object): return self.fnums[self.fmap[ptsize]] def mobimlize_measure(self, ptsize): - if isinstance(ptsize, basestring): + if isinstance(ptsize, string_or_bytes): return ptsize embase = self.profile.fbase if round(ptsize) < embase: @@ -187,7 +187,7 @@ class MobiMLizer(object): parent = bstate.nested[-1] if bstate.nested else bstate.body indent = istate.indent left = istate.left - if isinstance(indent, basestring): + if isinstance(indent, string_or_bytes): indent = 0 if indent < 0 and abs(indent) < left: left += indent @@ -308,7 +308,7 @@ class MobiMLizer(object): inline = bstate.inline content = self.preize_text(text, pre_wrap=istate.pre_wrap) if istate.preserve or istate.pre_wrap else [text] for item in content: - if isinstance(item, basestring): + if isinstance(item, string_or_bytes): if len(inline) == 0: inline.text = (inline.text or '') + item else: @@ -319,7 +319,7 @@ class MobiMLizer(object): def mobimlize_elem(self, elem, stylizer, bstate, istates, ignore_valign=False): - if not isinstance(elem.tag, basestring) \ + if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) != XHTML_NS: return style = stylizer.style(elem) diff --git a/src/calibre/ebooks/mobi/writer2/serializer.py b/src/calibre/ebooks/mobi/writer2/serializer.py index c86dfff2be..65343c3a6d 100644 --- a/src/calibre/ebooks/mobi/writer2/serializer.py +++ b/src/calibre/ebooks/mobi/writer2/serializer.py @@ -18,7 +18,7 @@ from calibre.ebooks.mobi.utils import is_guide_ref_start from calibre.ebooks.oeb.base import ( OEB_DOCS, XHTML, XHTML_NS, XML_NS, namespace, prefixname, urlnormalize ) -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class Buf(BytesIO): @@ -310,7 +310,7 @@ class Serializer(object): def serialize_elem(self, elem, item, nsrmap=NSRMAP): buf = self.buf - if not isinstance(elem.tag, basestring) \ + if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) not in nsrmap: return tag = prefixname(elem.tag, nsrmap) diff --git a/src/calibre/ebooks/odt/input.py b/src/calibre/ebooks/odt/input.py index 7f02d187b6..abb2f18daf 100644 --- a/src/calibre/ebooks/odt/input.py +++ b/src/calibre/ebooks/odt/input.py @@ -19,7 +19,7 @@ from odf.namespaces import TEXTNS as odTEXTNS from calibre import CurrentDir, walk from calibre.ebooks.oeb.base import _css_logger -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class Extract(ODF2XHTML): @@ -249,7 +249,7 @@ class Extract(ODF2XHTML): # first load the odf structure self.lines = [] self._wfunc = self._wlines - if isinstance(odffile, basestring) \ + if isinstance(odffile, string_or_bytes) \ or hasattr(odffile, 'read'): # Added by Kovid self.document = odLoad(odffile) else: diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index 9c16e54ee4..d312faf993 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -22,7 +22,7 @@ from calibre.ebooks.oeb.parse_utils import (barename, XHTML_NS, RECOVER_PARSER, namespace, XHTML, parse_html, NotHTML) from calibre.utils.cleantext import clean_xml_chars from calibre.utils.short_uuid import uuid4 -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes XML_NS = 'http://www.w3.org/XML/1998/namespace' OEB_DOC_NS = 'http://openebook.org/namespaces/oeb-document/1.0/' @@ -1055,7 +1055,7 @@ class Manifest(object): mt = self.media_type.lower() except Exception: mt = 'application/octet-stream' - if not isinstance(data, basestring): + if not isinstance(data, string_or_bytes): pass # already parsed elif mt in OEB_DOCS: data = self._parse_xhtml(data) @@ -1318,7 +1318,7 @@ class Spine(object): self.page_progression_direction = None def _linear(self, linear): - if isinstance(linear, basestring): + if isinstance(linear, string_or_bytes): linear = linear.lower() if linear is None or linear in ('yes', 'true'): linear = True diff --git a/src/calibre/ebooks/oeb/normalize_css.py b/src/calibre/ebooks/oeb/normalize_css.py index 117b90520d..a3bb7a0ad3 100644 --- a/src/calibre/ebooks/oeb/normalize_css.py +++ b/src/calibre/ebooks/oeb/normalize_css.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -from polyglot.builtins import zip +from polyglot.builtins import zip, string_or_bytes from functools import wraps from css_parser.css import PropertyValue @@ -127,10 +127,10 @@ def normalize_font(cssvalue, font_family_as_list=False): ans = {k:DEFAULTS[k] for k in composition} ans.update(parse_font(val)) if font_family_as_list: - if isinstance(ans['font-family'], basestring): + if isinstance(ans['font-family'], string_or_bytes): ans['font-family'] = [x.strip() for x in ans['font-family'].split(',')] else: - if not isinstance(ans['font-family'], basestring): + if not isinstance(ans['font-family'], string_or_bytes): ans['font-family'] = serialize_font_family(ans['font-family']) return ans diff --git a/src/calibre/ebooks/oeb/parse_utils.py b/src/calibre/ebooks/oeb/parse_utils.py index 2dd153799d..ed80b7d083 100644 --- a/src/calibre/ebooks/oeb/parse_utils.py +++ b/src/calibre/ebooks/oeb/parse_utils.py @@ -14,7 +14,7 @@ from lxml import etree, html from calibre import xml_replace_entities, force_unicode from calibre.constants import filesystem_encoding from calibre.ebooks.chardet import xml_to_unicode, strip_encoding_declarations -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes RECOVER_PARSER = etree.XMLParser(recover=True, no_network=True) XHTML_NS = 'http://www.w3.org/1999/xhtml' @@ -99,7 +99,7 @@ def html5_parse(data, max_nesting_depth=100): # Check that the asinine HTML 5 algorithm did not result in a tree with # insane nesting depths for x in data.iterdescendants(): - if isinstance(x.tag, basestring) and not len(x): # Leaf node + if isinstance(x.tag, string_or_bytes) and not len(x): # Leaf node depth = node_depth(x) if depth > max_nesting_depth: raise ValueError('HTML 5 parsing resulted in a tree with nesting' @@ -310,7 +310,7 @@ def parse_html(data, log=None, decoder=None, preprocessor=None, nroot = etree.Element(XHTML('html'), nsmap={None: XHTML_NS}, attrib=attrib) for elem in data.iterdescendants(): - if isinstance(elem.tag, basestring) and \ + if isinstance(elem.tag, string_or_bytes) and \ namespace(elem.tag) == ns: elem.tag = XHTML(barename(elem.tag)) for elem in data: diff --git a/src/calibre/ebooks/oeb/polish/embed.py b/src/calibre/ebooks/oeb/polish/embed.py index 18ca638ab9..ad57d3f6ed 100644 --- a/src/calibre/ebooks/oeb/polish/embed.py +++ b/src/calibre/ebooks/oeb/polish/embed.py @@ -15,13 +15,14 @@ from lxml import etree from calibre import prints from calibre.ebooks.oeb.base import XHTML from calibre.utils.filenames import ascii_filename +from polyglot.builtins import string_or_bytes props = {'font-family':None, 'font-weight':'normal', 'font-style':'normal', 'font-stretch':'normal'} def matching_rule(font, rules): ff = font['font-family'] - if not isinstance(ff, basestring): + if not isinstance(ff, string_or_bytes): ff = tuple(ff)[0] family = icu_lower(ff) wt = font['font-weight'] @@ -31,7 +32,7 @@ def matching_rule(font, rules): for rule in rules: if rule['font-style'] == style and rule['font-stretch'] == stretch and rule['font-weight'] == wt: ff = rule['font-family'] - if not isinstance(ff, basestring): + if not isinstance(ff, string_or_bytes): ff = tuple(ff)[0] if icu_lower(ff) == family: return rule @@ -162,7 +163,7 @@ def do_embed(container, font, report): def embed_font(container, font, all_font_rules, report, warned): rule = matching_rule(font, all_font_rules) ff = font['font-family'] - if not isinstance(ff, basestring): + if not isinstance(ff, string_or_bytes): ff = ff[0] if rule is None: from calibre.utils.fonts.scanner import font_scanner, NoFonts diff --git a/src/calibre/ebooks/oeb/polish/split.py b/src/calibre/ebooks/oeb/polish/split.py index ad925d529f..fc9f92c600 100644 --- a/src/calibre/ebooks/oeb/polish/split.py +++ b/src/calibre/ebooks/oeb/polish/split.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' import copy, os, re -from polyglot.builtins import map +from polyglot.builtins import map, string_or_bytes from urlparse import urlparse from calibre.ebooks.oeb.base import barename, XPNSMAP, XPath, OPF, XHTML, OEB_DOCS @@ -395,9 +395,9 @@ def merge_html(container, names, master): first_child = '' for first_child in children: - if not isinstance(first_child, basestring): + if not isinstance(first_child, string_or_bytes): break - if isinstance(first_child, basestring): + if isinstance(first_child, string_or_bytes): # body contained only text, no tags first_child = body.makeelement(XHTML('p')) first_child.text, children[0] = children[0], first_child @@ -429,7 +429,7 @@ def merge_html(container, names, master): a.set('href', '#' + amap[q]) for child in children: - if isinstance(child, basestring): + if isinstance(child, string_or_bytes): add_text(master_body, child) else: master_body.append(copy.deepcopy(child)) diff --git a/src/calibre/ebooks/oeb/transforms/flatcss.py b/src/calibre/ebooks/oeb/transforms/flatcss.py index 6af6fd2559..dd64a3a2ef 100644 --- a/src/calibre/ebooks/oeb/transforms/flatcss.py +++ b/src/calibre/ebooks/oeb/transforms/flatcss.py @@ -21,7 +21,7 @@ from calibre.ebooks.oeb.base import (XHTML, XHTML_NS, CSS_MIME, OEB_STYLES, from calibre.ebooks.oeb.stylizer import Stylizer from calibre.utils.filenames import ascii_filename, ascii_text from calibre.utils.icu import numeric_sort_key -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes COLLAPSE = re.compile(r'[ \t\r\n\v]+') STRIPNUM = re.compile(r'[-0-9]+$') @@ -367,7 +367,7 @@ class CSSFlattener(object): cssdict[property] = "%0.5fem" % (value / fsize) def flatten_node(self, node, stylizer, names, styles, pseudo_styles, psize, item_id): - if not isinstance(node.tag, basestring) \ + if not isinstance(node.tag, string_or_bytes) \ or namespace(node.tag) != XHTML_NS: return tag = barename(node.tag) diff --git a/src/calibre/ebooks/oeb/transforms/manglecase.py b/src/calibre/ebooks/oeb/transforms/manglecase.py index 47f5a2a855..9269a90084 100644 --- a/src/calibre/ebooks/oeb/transforms/manglecase.py +++ b/src/calibre/ebooks/oeb/transforms/manglecase.py @@ -11,6 +11,7 @@ from calibre.ebooks.oeb.base import XHTML, XHTML_NS from calibre.ebooks.oeb.base import CSS_MIME from calibre.ebooks.oeb.base import namespace from calibre.ebooks.oeb.stylizer import Stylizer +from polyglot.builtins import string_or_bytes CASE_MANGLER_CSS = """ .calibre_lowercase { @@ -95,7 +96,7 @@ class CaseMangler(object): last = child def mangle_elem(self, elem, stylizer): - if not isinstance(elem.tag, basestring) or \ + if not isinstance(elem.tag, string_or_bytes) or \ namespace(elem.tag) != XHTML_NS: return children = list(elem) diff --git a/src/calibre/ebooks/pml/pmlml.py b/src/calibre/ebooks/pml/pmlml.py index d024ca7581..f6f737275e 100644 --- a/src/calibre/ebooks/pml/pmlml.py +++ b/src/calibre/ebooks/pml/pmlml.py @@ -14,7 +14,7 @@ from lxml import etree from calibre.ebooks.pdb.ereader import image_name from calibre.ebooks.pml import unipmlcode -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes TAG_MAP = { 'b' : 'B', @@ -224,9 +224,9 @@ class PMLMLizer(object): def dump_text(self, elem, stylizer, page, tag_stack=[]): from calibre.ebooks.oeb.base import XHTML_NS, barename, namespace - if not isinstance(elem.tag, basestring) or namespace(elem.tag) != XHTML_NS: + if not isinstance(elem.tag, string_or_bytes) or namespace(elem.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return [elem.tail] return [] diff --git a/src/calibre/ebooks/rb/rbml.py b/src/calibre/ebooks/rb/rbml.py index fd181bb17a..a337086388 100644 --- a/src/calibre/ebooks/rb/rbml.py +++ b/src/calibre/ebooks/rb/rbml.py @@ -12,6 +12,7 @@ import re from calibre import prepare_string_for_xml from calibre.ebooks.rb import unique_name +from polyglot.builtins import string_or_bytes TAGS = [ 'b', @@ -142,9 +143,9 @@ class RBMLizer(object): def dump_text(self, elem, stylizer, page, tag_stack=[]): from calibre.ebooks.oeb.base import XHTML_NS, barename, namespace - if not isinstance(elem.tag, basestring) or namespace(elem.tag) != XHTML_NS: + if not isinstance(elem.tag, string_or_bytes) or namespace(elem.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return [elem.tail] return [u''] diff --git a/src/calibre/ebooks/rtf/rtfml.py b/src/calibre/ebooks/rtf/rtfml.py index 8cb1422dc3..92de7f0c2e 100644 --- a/src/calibre/ebooks/rtf/rtfml.py +++ b/src/calibre/ebooks/rtf/rtfml.py @@ -17,7 +17,7 @@ from lxml import etree from calibre.ebooks.metadata import authors_to_string from calibre.utils.img import save_cover_data_to from calibre.utils.imghdr import identify -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes TAGS = { 'b': '\\b', @@ -224,10 +224,10 @@ class RTFMLizer(object): from calibre.ebooks.oeb.base import (XHTML_NS, namespace, barename, urlnormalize) - if not isinstance(elem.tag, basestring) \ + if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return elem.tail return u'' diff --git a/src/calibre/ebooks/snb/snbml.py b/src/calibre/ebooks/snb/snbml.py index 29fdf4210a..d04c590ab9 100644 --- a/src/calibre/ebooks/snb/snbml.py +++ b/src/calibre/ebooks/snb/snbml.py @@ -12,7 +12,7 @@ import os import re from lxml import etree -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes def ProcessFileName(fileName): @@ -212,10 +212,10 @@ class SNBMLizer(object): def dump_text(self, subitems, elem, stylizer, end='', pre=False, li=''): from calibre.ebooks.oeb.base import XHTML_NS, barename, namespace - if not isinstance(elem.tag, basestring) \ + if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return [elem.tail] return [''] diff --git a/src/calibre/ebooks/txt/markdownml.py b/src/calibre/ebooks/txt/markdownml.py index 6f121de4c1..70346df569 100644 --- a/src/calibre/ebooks/txt/markdownml.py +++ b/src/calibre/ebooks/txt/markdownml.py @@ -15,7 +15,7 @@ from functools import partial from calibre.ebooks.htmlz.oeb2html import OEB2HTML from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace, rewrite_links from calibre.ebooks.oeb.stylizer import Stylizer -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class MarkdownMLizer(OEB2HTML): @@ -111,10 +111,10 @@ class MarkdownMLizer(OEB2HTML): ''' # We can only processes tags. If there isn't a tag return any text. - if not isinstance(elem.tag, basestring) \ + if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return [elem.tail] return [''] diff --git a/src/calibre/ebooks/txt/textileml.py b/src/calibre/ebooks/txt/textileml.py index 1786c0a4ff..b4f12e2e74 100644 --- a/src/calibre/ebooks/txt/textileml.py +++ b/src/calibre/ebooks/txt/textileml.py @@ -16,6 +16,7 @@ from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace, rewrit from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks import unit_convert from calibre.ebooks.textile.unsmarten import unsmarten +from polyglot.builtins import string_or_bytes class TextileMLizer(OEB2HTML): @@ -72,9 +73,9 @@ class TextileMLizer(OEB2HTML): # I'm not checking for duplicated spans '%' as any that follow each other were being incorrectly merged txt = '%s' % t if txt != '%': - text = re.sub(r'([^'+t+'|^\n])'+t+'\]\['+t+'([^'+t+'])', r'\1\2', text) + text = re.sub(r'([^'+t+'|^\n])'+t+r'\]\['+t+'([^'+t+'])', r'\1\2', text) text = re.sub(r'([^'+t+'|^\n])'+t+t+'([^'+t+'])', r'\1\2', text) - text = re.sub(r'(\s|[*_\'"])\[('+t+'[a-zA-Z0-9 \'",.*_]+'+t+')\](\s|[*_\'"?!,.])', r'\1\2\3', text) + text = re.sub(r'(\s|[*_\'"])\[('+t+'[a-zA-Z0-9 \'",.*_]+'+t+r')\](\s|[*_\'"?!,.])', r'\1\2\3', text) return text # Now tidyup links and ids - remove ones that don't have a correponding opposite @@ -82,13 +83,13 @@ class TextileMLizer(OEB2HTML): for i in self.our_links: if i[0] == '#': if i not in self.our_ids: - text = re.sub(r'"(.+)":'+i+'(\s)', r'\1\2', text) + text = re.sub(r'"(.+)":'+i+r'(\s)', r'\1\2', text) for i in self.our_ids: if i not in self.our_links: - text = re.sub(r'%?\('+i+'\)\xa0?%?', r'', text) + text = re.sub(r'%?\('+i+'\\)\xa0?%?', r'', text) # Remove obvious non-needed escaping, add sub/sup-script ones - text = check_escaping(text, ['\*', '_', '\*']) + text = check_escaping(text, [r'\*', '_', r'\*']) # escape the super/sub-scripts if needed text = re.sub(r'(\w)([~^]\w+[~^])', r'\1[\2]', text) # escape the super/sub-scripts if needed @@ -111,16 +112,16 @@ class TextileMLizer(OEB2HTML): # reduce blank lines text = re.sub(r'\n{3}', r'\n\np. \n\n', text) - text = re.sub(u'%\n(p[<>=]{1,2}\.|p\.)', r'%\n\n\1', text) + text = re.sub(u'%\n(p[<>=]{1,2}\\.|p\\.)', r'%\n\n\1', text) # Check span following blank para text = re.sub(r'\n+ +%', r' %', text) - text = re.sub(u'p[<>=]{1,2}\.\n\n?', r'', text) + text = re.sub(u'p[<>=]{1,2}\\.\n\n?', r'', text) # blank paragraph text = re.sub(r'\n(p.*\.)\n', r'\n\1 \n\n', text) # blank paragraph text = re.sub(u'\n\xa0', r'\np. ', text) # blank paragraph - text = re.sub(u'\np[<>=]{1,2}?\. \xa0', r'\np. ', text) + text = re.sub(u'\np[<>=]{1,2}?\\. \xa0', r'\np. ', text) text = re.sub(r'(^|\n)(p.*\. ?\n)(p.*\.)', r'\1\3', text) text = re.sub(r'\n(p\. \n)(p.*\.|h.*\.)', r'\n\2', text) # sort out spaces in tables @@ -225,10 +226,10 @@ class TextileMLizer(OEB2HTML): ''' # We can only processes tags. If there isn't a tag return any text. - if not isinstance(elem.tag, basestring) \ + if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return [elem.tail] return [''] diff --git a/src/calibre/ebooks/txt/txtml.py b/src/calibre/ebooks/txt/txtml.py index fd653f8b7b..2ef99d4884 100644 --- a/src/calibre/ebooks/txt/txtml.py +++ b/src/calibre/ebooks/txt/txtml.py @@ -11,7 +11,7 @@ Transform OEB content into plain text import re from lxml import etree -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes BLOCK_TAGS = [ @@ -192,10 +192,10 @@ class TXTMLizer(object): ''' from calibre.ebooks.oeb.base import XHTML_NS, barename, namespace - if not isinstance(elem.tag, basestring) \ + if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) != XHTML_NS: p = elem.getparent() - if p is not None and isinstance(p.tag, basestring) and namespace(p.tag) == XHTML_NS \ + if p is not None and isinstance(p.tag, string_or_bytes) and namespace(p.tag) == XHTML_NS \ and elem.tail: return [elem.tail] return [''] diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index dc8e3993ae..8275e0b7ba 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -35,7 +35,7 @@ from calibre.utils.config import Config, ConfigProxy, JSONConfig, dynamic from calibre.utils.date import UNDEFINED_DATE from calibre.utils.file_type_icons import EXT_MAP from calibre.utils.localization import get_lang -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes try: NO_URL_FORMATTING = QUrl.None_ @@ -1125,7 +1125,7 @@ def open_url(qurl): # Qt 5 requires QApplication to be constructed before trying to use # QDesktopServices::openUrl() ensure_app() - if isinstance(qurl, basestring): + if isinstance(qurl, string_or_bytes): qurl = QUrl(qurl) with sanitize_env_vars(): QDesktopServices.openUrl(qurl) diff --git a/src/calibre/gui2/actions/__init__.py b/src/calibre/gui2/actions/__init__.py index d60a26e42d..30f85adef6 100644 --- a/src/calibre/gui2/actions/__init__.py +++ b/src/calibre/gui2/actions/__init__.py @@ -15,7 +15,7 @@ from calibre import prints from calibre.constants import isosx from calibre.gui2 import Dispatcher from calibre.gui2.keyboard import NameConflict -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes def menu_action_unique_name(plugin, unique_name): @@ -177,7 +177,7 @@ class InterfaceAction(QObject): if attr == 'qaction': shortcut_action = ma if shortcut is not None: - keys = ((shortcut,) if isinstance(shortcut, basestring) else + keys = ((shortcut,) if isinstance(shortcut, string_or_bytes) else tuple(shortcut)) if shortcut_name is None and spec[0]: shortcut_name = unicode_type(spec[0]) @@ -249,7 +249,7 @@ class InterfaceAction(QObject): ac.setIcon(icon) keys = () if shortcut is not None and shortcut is not False: - keys = ((shortcut,) if isinstance(shortcut, basestring) else + keys = ((shortcut,) if isinstance(shortcut, string_or_bytes) else tuple(shortcut)) unique_name = menu_action_unique_name(self, unique_name) if description is not None: diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 94fae7d247..28f45282f0 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -25,6 +25,7 @@ from calibre.gui2.actions import InterfaceAction from calibre.gui2 import question_dialog from calibre.ebooks.metadata import MetaInformation from calibre.ptempfile import PersistentTemporaryFile +from polyglot.builtins import string_or_bytes def get_filters(): @@ -436,7 +437,7 @@ class AddAction(InterfaceAction): self.gui.refresh_cover_browser() def __add_filesystem_book(self, paths, allow_device=True): - if isinstance(paths, basestring): + if isinstance(paths, string_or_bytes): paths = [paths] books = [path for path in map(os.path.abspath, paths) if os.access(path, os.R_OK)] @@ -591,7 +592,7 @@ class AddAction(InterfaceAction): self.gui.device_job_exception(job) return paths = job.result - ok_paths = [x for x in paths if isinstance(x, basestring)] + ok_paths = [x for x in paths if isinstance(x, string_or_bytes)] failed_paths = [x for x in paths if isinstance(x, tuple)] if failed_paths: if not ok_paths: diff --git a/src/calibre/gui2/actions/similar_books.py b/src/calibre/gui2/actions/similar_books.py index fe2d0e4e0a..5febe5f51f 100644 --- a/src/calibre/gui2/actions/similar_books.py +++ b/src/calibre/gui2/actions/similar_books.py @@ -9,6 +9,7 @@ __docformat__ = 'restructuredtext en' from PyQt5.Qt import QToolButton from calibre.gui2.actions import InterfaceAction +from polyglot.builtins import string_or_bytes class SimilarBooksAction(InterfaceAction): @@ -74,7 +75,7 @@ class SimilarBooksAction(InterfaceAction): if not val: return - if isinstance(val, basestring): + if isinstance(val, string_or_bytes): val = [val] search = [col + ':"='+t.replace('"', '\\"')+'"' for t in val] if search: diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index c9bb3fbc41..482b735745 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -11,7 +11,7 @@ from threading import Thread from collections import OrderedDict from Queue import Empty from io import BytesIO -from polyglot.builtins import map, unicode_type +from polyglot.builtins import map, unicode_type, string_or_bytes from PyQt5.Qt import QObject, Qt, pyqtSignal @@ -33,7 +33,7 @@ from calibre.utils.ipc.pool import Pool, Failure def validate_source(source, parent=None): # {{{ - if isinstance(source, basestring): + if isinstance(source, string_or_bytes): if not os.path.exists(source): error_dialog(parent, _('Cannot add books'), _( 'The path %s does not exist') % source, show=True) @@ -173,7 +173,7 @@ class Adder(QObject): return tdir try: - if isinstance(self.source, basestring): + if isinstance(self.source, string_or_bytes): find_files(self.source) self.ignore_opf = True else: diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index f4b54a08ba..7d5beb3359 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -34,7 +34,7 @@ from calibre.utils.config import tweaks, device_prefs from calibre.utils.img import scale_image from calibre.library.save_to_disk import find_plugboard from calibre.ptempfile import PersistentTemporaryFile, force_unicode as filename_to_unicode -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes # }}} @@ -471,7 +471,7 @@ class DeviceManager(Thread): # {{{ info = self.device.get_device_information(end_session=False) if len(info) < 5: info = tuple(list(info) + [{}]) - info = [i.replace('\x00', '').replace('\x01', '') if isinstance(i, basestring) else i + info = [i.replace('\x00', '').replace('\x01', '') if isinstance(i, string_or_bytes) else i for i in info] cp = self.device.card_prefix(end_session=False) fs = self.device.free_space() diff --git a/src/calibre/gui2/ebook_download.py b/src/calibre/gui2/ebook_download.py index 50739ce13d..76d4a2e8bb 100644 --- a/src/calibre/gui2/ebook_download.py +++ b/src/calibre/gui2/ebook_download.py @@ -19,6 +19,7 @@ from calibre.gui2.threaded_jobs import ThreadedJob from calibre.ptempfile import PersistentTemporaryDirectory from calibre.utils.filenames import ascii_filename from calibre.web import get_download_filename_from_response +from polyglot.builtins import string_or_bytes class DownloadInfo(MessageBox): @@ -141,7 +142,7 @@ class EbookDownloadMixin(object): def download_ebook(self, url='', cookie_file=None, filename='', save_loc='', add_to_lib=True, tags=[], create_browser=None): if tags: - if isinstance(tags, basestring): + if isinstance(tags, string_or_bytes): tags = tags.split(',') start_ebook_download(Dispatcher(self.downloaded_ebook), self.job_manager, self, cookie_file, url, filename, save_loc, add_to_lib, tags, create_browser) self.status_bar.show_message(_('Downloading') + ' ' + filename.decode('utf-8', 'ignore') if filename else url.decode('utf-8', 'ignore'), 3000) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index c11d8be97c..49c6df478e 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -30,7 +30,7 @@ from calibre.constants import filesystem_encoding, DEBUG, config_dir from calibre.gui2.library import DEFAULT_SORT from calibre.utils.localization import calibre_langcode_to_name from calibre.library.coloring import color_row_key -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes Counts = namedtuple('Counts', 'library_total total current') @@ -1282,7 +1282,7 @@ class OnDeviceSearch(SearchQueryParser): # {{{ vals = accessor(row) if vals is None: vals = '' - if isinstance(vals, basestring): + if isinstance(vals, string_or_bytes): vals = vals.split(',') if locvalue == 'collections' else [vals] if _match(query, vals, m, use_primary_find_in_search=upf): matches.add(index) diff --git a/src/calibre/gui2/linux_file_dialogs.py b/src/calibre/gui2/linux_file_dialogs.py index a012ae25c4..b324265ff8 100644 --- a/src/calibre/gui2/linux_file_dialogs.py +++ b/src/calibre/gui2/linux_file_dialogs.py @@ -11,7 +11,7 @@ import sys import time from threading import Thread -from polyglot.builtins import reraise, unicode_type +from polyglot.builtins import reraise, unicode_type, string_or_bytes from PyQt5.Qt import QEventLoop from calibre import force_unicode @@ -68,7 +68,7 @@ def get_initial_dir(name, title, default_dir, no_save_dir): return ensure_dir(process_path(default_dir)) key = dialog_name(name, title) saved = dynamic.get(key) - if not isinstance(saved, basestring): + if not isinstance(saved, string_or_bytes): saved = None if saved and os.path.isdir(saved): return ensure_dir(process_path(saved)) diff --git a/src/calibre/gui2/lrf_renderer/text.py b/src/calibre/gui2/lrf_renderer/text.py index 8e30c0162c..3467a09e68 100644 --- a/src/calibre/gui2/lrf_renderer/text.py +++ b/src/calibre/gui2/lrf_renderer/text.py @@ -10,7 +10,7 @@ from PyQt5.Qt import ( from calibre.ebooks.lrf.fonts import LIBERATION_FONT_MAP from calibre.ebooks.BeautifulSoup import Tag from calibre.ebooks.hyphenate import hyphenate_word -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes WEIGHT_MAP = lambda wt : int((wt/10.)-1) NULL = lambda a, b: a @@ -223,7 +223,7 @@ class TextBlock(object): open_containers = collections.deque() self.in_para = False for i in tb.content: - if isinstance(i, basestring): + if isinstance(i, string_or_bytes): self.process_text(i) elif i is None: if len(open_containers) > 0: diff --git a/src/calibre/gui2/open_with.py b/src/calibre/gui2/open_with.py index 565dcfdc50..4000649201 100644 --- a/src/calibre/gui2/open_with.py +++ b/src/calibre/gui2/open_with.py @@ -22,6 +22,7 @@ from calibre.gui2.widgets2 import Dialog from calibre.gui2.progress_indicator import ProgressIndicator from calibre.utils.config import JSONConfig from calibre.utils.icu import numeric_sort_key as sort_key +from polyglot.builtins import string_or_bytes ENTRY_ROLE = Qt.UserRole @@ -197,7 +198,7 @@ else: def entry_to_item(entry, parent): icon_path = entry.get('Icon') or I('blank.png') - if not isinstance(icon_path, basestring): + if not isinstance(icon_path, string_or_bytes): icon_path = I('blank.png') ans = QListWidgetItem(QIcon(icon_path), entry.get('Name') or _('Unknown'), parent) ans.setData(ENTRY_ROLE, entry) diff --git a/src/calibre/gui2/preferences/__init__.py b/src/calibre/gui2/preferences/__init__.py index 4b87413192..304043d4ef 100644 --- a/src/calibre/gui2/preferences/__init__.py +++ b/src/calibre/gui2/preferences/__init__.py @@ -14,7 +14,7 @@ from PyQt5.Qt import (QWidget, pyqtSignal, QCheckBox, QAbstractSpinBox, from calibre.customize.ui import preferences_plugins from calibre.utils.config import ConfigProxy from calibre.gui2.complete2 import EditWithComplete -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class AbortCommit(Exception): @@ -144,7 +144,7 @@ class Setting(object): else: self.gui_obj.clear() for x in choices: - if isinstance(x, basestring): + if isinstance(x, string_or_bytes): x = (x, x) self.gui_obj.addItem(x[0], (x[1])) self.set_gui_val(self.get_config_val(default=False)) diff --git a/src/calibre/gui2/qt_file_dialogs.py b/src/calibre/gui2/qt_file_dialogs.py index 632e243789..11223c12e3 100644 --- a/src/calibre/gui2/qt_file_dialogs.py +++ b/src/calibre/gui2/qt_file_dialogs.py @@ -11,7 +11,7 @@ from PyQt5.Qt import QFileDialog, QObject from calibre.gui2.linux_file_dialogs import dialog_name, image_extensions from calibre.utils.filenames import expanduser -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes def select_initial_dir(q): @@ -71,7 +71,7 @@ class FileDialog(QObject): else: initial_dir = dynamic.get(self.dialog_name, expanduser(default_dir)) - if not isinstance(initial_dir, basestring): + if not isinstance(initial_dir, string_or_bytes): initial_dir = expanduser(default_dir) if not initial_dir or (not os.path.exists(initial_dir) and not ( mode == QFileDialog.AnyFile and (no_save_dir or combine_file_and_saved_dir))): diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index c8c011b7d5..a92ef4a1a1 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -20,7 +20,7 @@ from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.saved_search_editor import SavedSearchEditor from calibre.gui2.dialogs.search import SearchDialog from calibre.utils.icu import primary_sort_key -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes QT_HIDDEN_CLEAR_ACTION = '_q_qlineeditclearaction' @@ -183,7 +183,7 @@ class SearchBox2(QComboBox): # {{{ self.setFocus(Qt.OtherFocusReason) def search_done(self, ok): - if isinstance(ok, basestring): + if isinstance(ok, string_or_bytes): self.setToolTip(ok) ok = False if not unicode_type(self.currentText()).strip(): diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index 080aa81613..db170f37fd 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -70,7 +70,7 @@ from calibre.utils.config import JSONConfig from calibre.utils.icu import numeric_sort_key from calibre.utils.imghdr import identify from calibre.utils.tdir_in_cache import tdir_in_cache -from polyglot.builtins import iteritems +from polyglot.builtins import iteritems, string_or_bytes _diff_dialogs = [] last_used_transform_rules = [] @@ -1337,7 +1337,7 @@ class Boss(QObject): @in_thread_job def export_requested(self, name_or_names, path): - if isinstance(name_or_names, basestring): + if isinstance(name_or_names, string_or_bytes): return self.export_file(name_or_names, path) for name in name_or_names: dest = os.path.abspath(os.path.join(path, name)) diff --git a/src/calibre/gui2/tweak_book/editor/widget.py b/src/calibre/gui2/tweak_book/editor/widget.py index 4f9132f994..b1aa5cb5c7 100644 --- a/src/calibre/gui2/tweak_book/editor/widget.py +++ b/src/calibre/gui2/tweak_book/editor/widget.py @@ -24,11 +24,11 @@ from calibre.gui2.tweak_book.editor import SPELL_PROPERTY, LINK_PROPERTY, TAG_NA from calibre.gui2.tweak_book.editor.help import help_url from calibre.gui2.tweak_book.editor.text import TextEdit from calibre.utils.icu import utf16_length -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes def create_icon(text, palette=None, sz=None, divider=2, fill='white'): - if isinstance(fill, basestring): + if isinstance(fill, string_or_bytes): fill = QColor(fill) sz = sz or int(math.ceil(tprefs['toolbar_icon_size'] * QApplication.instance().devicePixelRatio())) if palette is None: diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 5642ba1a24..4bdbecded6 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -53,7 +53,7 @@ from calibre.gui2.dbus_export.widgets import factory from calibre.gui2.open_with import register_keyboard_shortcuts from calibre.library import current_library_name from calibre.srv.library_broker import GuiLibraryBroker -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class Listener(Thread): # {{{ @@ -615,7 +615,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ self.tags_view.recount() def handle_cli_args(self, args): - if isinstance(args, basestring): + if isinstance(args, string_or_bytes): args = [args] files = [os.path.abspath(p) for p in args if not os.path.isdir(p) and os.access(p, os.R_OK)] if files: diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index 430b3d940b..857e1be147 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' import math, json from base64 import b64encode from functools import partial -from polyglot.builtins import map, unicode_type +from polyglot.builtins import map, unicode_type, string_or_bytes from PyQt5.Qt import ( QSize, QSizePolicy, QUrl, Qt, QPainter, QPalette, QBrush, @@ -1169,12 +1169,12 @@ class DocumentView(QWebView): # {{{ old_pos = (self.document.xpos if self.document.in_paged_mode else self.document.ypos) if self.document.in_paged_mode: - if isinstance(pos, basestring): + if isinstance(pos, string_or_bytes): self.document.jump_to_anchor(pos) else: self.document.scroll_fraction = pos else: - if isinstance(pos, basestring): + if isinstance(pos, string_or_bytes): self.document.jump_to_anchor(pos) else: if pos >= 1: diff --git a/src/calibre/gui2/win_file_dialogs.py b/src/calibre/gui2/win_file_dialogs.py index 206b43cabf..fffb39638a 100644 --- a/src/calibre/gui2/win_file_dialogs.py +++ b/src/calibre/gui2/win_file_dialogs.py @@ -9,6 +9,7 @@ from threading import Thread from uuid import uuid4 from PyQt5.Qt import pyqtSignal, QEventLoop, Qt +from polyglot.builtins import string_or_bytes is64bit = sys.maxsize > (1 << 32) base = sys.extensions_location if hasattr(sys, 'new_app_layout') else os.path.dirname(sys.executable) @@ -76,7 +77,7 @@ def serialize_file_types(file_types): buf.append(struct.pack(b'=H%ds' % len(x), len(x), x)) for name, extensions in file_types: add(name or _('Files')) - if isinstance(extensions, basestring): + if isinstance(extensions, string_or_bytes): extensions = extensions.split() add('; '.join('*.' + ext.lower() for ext in extensions)) return b''.join(buf) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index daea1f0bb5..05eba9972b 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -20,7 +20,7 @@ from calibre.db.search import CONTAINS_MATCH, EQUALS_MATCH, REGEXP_MATCH, _match from calibre.ebooks.metadata import title_sort, author_to_author_sort from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre import prints, force_unicode -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class MetadataBackup(Thread): # {{{ @@ -793,7 +793,7 @@ class ResultCache(SearchQueryParser): # {{{ continue if q == 'true' and matchkind == CONTAINS_MATCH: - if isinstance(item[loc], basestring): + if isinstance(item[loc], string_or_bytes): if item[loc].strip() == '': continue matches.add(item[0]) diff --git a/src/calibre/library/catalogs/bibtex.py b/src/calibre/library/catalogs/bibtex.py index 66efa81571..f22bcc8d5a 100644 --- a/src/calibre/library/catalogs/bibtex.py +++ b/src/calibre/library/catalogs/bibtex.py @@ -15,6 +15,7 @@ from calibre.library.catalogs import FIELDS, TEMPLATE_ALLOWED_FIELDS from calibre.customize.conversion import DummyReporter from calibre.constants import preferred_encoding from calibre.ebooks.metadata import format_isbn +from polyglot.builtins import string_or_bytes class BIBTEX(CatalogPlugin): @@ -212,13 +213,13 @@ class BIBTEX(CatalogPlugin): bibtex_entry.append(u'year = "%s"' % item.year) bibtex_entry.append(u'month = "%s"' % bibtexdict.utf8ToBibtex(strftime("%b", item))) - elif field.startswith('#') and isinstance(item, basestring): + elif field.startswith('#') and isinstance(item, string_or_bytes): bibtex_entry.append(u'custom_%s = "%s"' % (field[1:], bibtexdict.utf8ToBibtex(item))) - elif isinstance(item, basestring): + elif isinstance(item, string_or_bytes): # elif field in ['title', 'publisher', 'cover', 'uuid', 'ondevice', - # 'author_sort', 'series', 'title_sort'] : + # 'author_sort', 'series', 'title_sort'] : bibtex_entry.append(u'%s = "%s"' % (field, bibtexdict.utf8ToBibtex(item))) bibtex_entry = u',\n '.join(bibtex_entry) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 5ed44f5d89..59bf0e746c 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -48,7 +48,7 @@ from calibre.db.lazy import FormatMetadata, FormatsList from calibre.db.categories import Tag, CATEGORY_SORTS from calibre.utils.localization import (canonicalize_lang, calibre_langcode_to_name) -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes copyfile = os.link if hasattr(os, 'link') else shutil.copyfile SPOOL_SIZE = 30*1024*1024 @@ -1115,7 +1115,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def find_identical_books(self, mi): fuzzy_title_patterns = [(re.compile(pat, re.IGNORECASE) if - isinstance(pat, basestring) else pat, repl) for pat, repl in + isinstance(pat, string_or_bytes) else pat, repl) for pat, repl in [ (r'[\[\](){}<>\'";,:#]', ''), (get_title_sort_pat(), ''), @@ -1398,7 +1398,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): id_ = index if index_is_id else self.id(index) raise NoSuchFormat('Record %d has no %s file'%(id_, fmt)) if windows_atomic_move is not None: - if not isinstance(dest, basestring): + if not isinstance(dest, string_or_bytes): raise Exception("Error, you must pass the dest as a path when" " using windows_atomic_move") if dest: @@ -1454,7 +1454,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): id = index if index_is_id else self.id(index) path = os.path.join(self.library_path, self.path(id, index_is_id=True), 'cover.jpg') if windows_atomic_move is not None: - if not isinstance(dest, basestring): + if not isinstance(dest, string_or_bytes): raise Exception("Error, you must pass the dest as a path when" " using windows_atomic_move") if os.access(path, os.R_OK) and dest and not samefile(dest, path): @@ -2334,7 +2334,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # force_changes has no effect on cover manipulation if mi.cover_data[1] is not None: doit(self.set_cover, id, mi.cover_data[1], commit=False) - elif isinstance(mi.cover, basestring) and mi.cover: + elif isinstance(mi.cover, string_or_bytes) and mi.cover: if os.access(mi.cover, os.R_OK): with lopen(mi.cover, 'rb') as f: raw = f.read() @@ -2641,7 +2641,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): def set_pubdate(self, id, dt, notify=True, commit=True): if not dt: dt = UNDEFINED_DATE - if isinstance(dt, basestring): + if isinstance(dt, string_or_bytes): dt = parse_only_date(dt) self.conn.execute('UPDATE books SET pubdate=? WHERE id=?', (dt, id)) self.data.set(id, self.FIELD_MAP['pubdate'], dt, row_is_id=True) diff --git a/src/calibre/srv/ajax.py b/src/calibre/srv/ajax.py index b1838387e4..ccd8319eaf 100644 --- a/src/calibre/srv/ajax.py +++ b/src/calibre/srv/ajax.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' from functools import partial -from polyglot.builtins import unicode_type, zip +from polyglot.builtins import unicode_type, zip, string_or_bytes from itertools import cycle from calibre import force_unicode @@ -107,7 +107,7 @@ def book_to_json(ctx, rd, db, book_id, if (fm and fm['is_category'] and not fm['is_csp'] and key != 'formats' and fm['datatype'] != 'rating'): categories = mi.get(key) or [] - if isinstance(categories, basestring): + if isinstance(categories, string_or_bytes): categories = [categories] category_urls[key] = dbtags = {} for category in categories: diff --git a/src/calibre/srv/legacy.py b/src/calibre/srv/legacy.py index 5872740123..51e7ebf19f 100644 --- a/src/calibre/srv/legacy.py +++ b/src/calibre/srv/legacy.py @@ -2,29 +2,31 @@ # vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal -from __future__ import (unicode_literals, division, absolute_import, - print_function) +from __future__ import absolute_import, division, print_function, unicode_literals + from functools import partial +from urllib import urlencode + from lxml.html import tostring from lxml.html.builder import E as E_ -from urllib import urlencode from calibre import strftime from calibre.constants import __appname__ from calibre.db.view import sanitize_sort_field_name from calibre.ebooks.metadata import authors_to_string -from calibre.srv.content import get, book_filename -from calibre.srv.errors import HTTPRedirect, HTTPBadRequest +from calibre.srv.content import book_filename, get +from calibre.srv.errors import HTTPBadRequest, HTTPRedirect from calibre.srv.routes import endpoint from calibre.srv.utils import get_library_data, http_date from calibre.utils.cleantext import clean_xml_chars -from calibre.utils.date import timestampfromdt, dt_as_local, is_date_undefined +from calibre.utils.date import dt_as_local, is_date_undefined, timestampfromdt +from polyglot.builtins import string_or_bytes # /mobile {{{ def clean(x): - if isinstance(x, basestring): + if isinstance(x, string_or_bytes): x = clean_xml_chars(x) return x diff --git a/src/calibre/utils/config_base.py b/src/calibre/utils/config_base.py index 0a0345df26..5ef1ef5f98 100644 --- a/src/calibre/utils/config_base.py +++ b/src/calibre/utils/config_base.py @@ -234,7 +234,7 @@ class OptionSet(object): def serialize_opt(self, val): if val is val is True or val is False or val is None or \ - isinstance(val, (int, float, long, basestring)): + isinstance(val, (int, float, long, bytes, unicode_type)): return repr(val) pickle = cPickle.dumps(val, -1) return 'cPickle.loads(%s)'%repr(pickle) diff --git a/src/calibre/utils/img.py b/src/calibre/utils/img.py index 8d7dead317..8c8083cabb 100644 --- a/src/calibre/utils/img.py +++ b/src/calibre/utils/img.py @@ -23,6 +23,7 @@ from calibre.ptempfile import TemporaryDirectory from calibre.utils.config_base import tweaks from calibre.utils.filenames import atomic_rename from calibre.utils.imghdr import what +from polyglot.builtins import string_or_bytes # Utilities {{{ imageops, imageops_err = plugins['imageops'] @@ -436,7 +437,7 @@ def quantize_image(img, max_colors=256, dither=True, palette=''): img = image_from_data(img) if img.hasAlphaChannel(): img = blend_image(img) - if palette and isinstance(palette, basestring): + if palette and isinstance(palette, string_or_bytes): palette = palette.split() return imageops.quantize(img, max_colors, dither, [QColor(x).rgb() for x in palette]) diff --git a/src/calibre/utils/imghdr.py b/src/calibre/utils/imghdr.py index c03cd01e8b..ce2903f0e5 100644 --- a/src/calibre/utils/imghdr.py +++ b/src/calibre/utils/imghdr.py @@ -7,6 +7,7 @@ from __future__ import (unicode_literals, division, absolute_import, from struct import unpack, error import os from calibre.utils.speedups import ReadOnlyFileBuffer +from polyglot.builtins import string_or_bytes """ Recognize image file formats and sizes based on their first few bytes.""" @@ -16,7 +17,7 @@ HSIZE = 120 def what(file, h=None): ' Recognize image headers ' if h is None: - if isinstance(file, basestring): + if isinstance(file, string_or_bytes): with lopen(file, 'rb') as f: h = f.read(HSIZE) else: diff --git a/src/calibre/utils/ipc/launch.py b/src/calibre/utils/ipc/launch.py index 31c742c65b..b0c777518d 100644 --- a/src/calibre/utils/ipc/launch.py +++ b/src/calibre/utils/ipc/launch.py @@ -12,7 +12,7 @@ from functools import partial from calibre.constants import iswindows, isosx, isfrozen, filesystem_encoding from calibre.utils.config import prefs from calibre.ptempfile import PersistentTemporaryFile, base_dir -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes if iswindows: import win32process @@ -186,7 +186,7 @@ class Worker(object): _cwd = cwd if priority is None: priority = prefs['worker_process_priority'] - cmd = [exe] if isinstance(exe, basestring) else exe + cmd = [exe] if isinstance(exe, string_or_bytes) else exe args = { 'env' : env, 'cwd' : _cwd, diff --git a/src/calibre/utils/ipc/server.py b/src/calibre/utils/ipc/server.py index 810fde9761..4452d9809c 100644 --- a/src/calibre/utils/ipc/server.py +++ b/src/calibre/utils/ipc/server.py @@ -21,6 +21,7 @@ from calibre.utils.ipc.worker import PARALLEL_FUNCS from calibre import detect_ncpus as cpu_count from calibre.constants import iswindows, DEBUG, islinux from calibre.ptempfile import base_dir +from polyglot.builtins import string_or_bytes _counter = 0 @@ -216,7 +217,7 @@ class Server(Thread): 'CALIBRE_WORKER_RESULT' : hexlify(rfile.encode('utf-8')), } cw = self.do_launch(env, gui, redirect_output, rfile, job_name=job_name) - if isinstance(cw, basestring): + if isinstance(cw, string_or_bytes): raise CriticalError('Failed to launch worker process:\n'+cw) if DEBUG: print('Worker Launch took:', time.time() - start) diff --git a/src/calibre/utils/ipc/simple_worker.py b/src/calibre/utils/ipc/simple_worker.py index decaa9d554..78c280ce60 100644 --- a/src/calibre/utils/ipc/simple_worker.py +++ b/src/calibre/utils/ipc/simple_worker.py @@ -16,7 +16,7 @@ from contextlib import closing from calibre.constants import iswindows from calibre.utils.ipc import eintr_retry_call from calibre.utils.ipc.launch import Worker -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class WorkerError(Exception): @@ -164,7 +164,7 @@ def start_pipe_worker(command, env=None, priority='normal', **process_args): args['close_fds'] = True exe = w.executable - cmd = [exe] if isinstance(exe, basestring) else exe + cmd = [exe] if isinstance(exe, string_or_bytes) else exe p = subprocess.Popen(cmd + ['--pipe-worker', command], **args) return p diff --git a/src/calibre/utils/open_with/linux.py b/src/calibre/utils/open_with/linux.py index 05038da9c8..39b314bce7 100644 --- a/src/calibre/utils/open_with/linux.py +++ b/src/calibre/utils/open_with/linux.py @@ -13,6 +13,7 @@ from calibre import walk, guess_type, prints, force_unicode from calibre.constants import filesystem_encoding, cache_dir from calibre.utils.icu import numeric_sort_key as sort_key from calibre.utils.localization import canonicalize_lang, get_lang +from polyglot.builtins import string_or_bytes def parse_localized_key(key): @@ -73,6 +74,7 @@ def parse_desktop_file(path): if 'Exec' in ans and 'MimeType' in ans and 'Name' in ans: return ans + icon_data = None @@ -197,7 +199,7 @@ def find_programs(extensions): data['Icon'] = icon else: data.pop('Icon') - if not isinstance(data.get('Icon'), basestring): + if not isinstance(data.get('Icon'), string_or_bytes): data.pop('Icon', None) for k in ('Name', 'GenericName', 'Comment'): val = data.get(k) diff --git a/src/calibre/utils/open_with/osx.py b/src/calibre/utils/open_with/osx.py index 68f5a66862..760a29a265 100644 --- a/src/calibre/utils/open_with/osx.py +++ b/src/calibre/utils/open_with/osx.py @@ -11,7 +11,7 @@ from collections import defaultdict from calibre.ptempfile import TemporaryDirectory from calibre.utils.icu import numeric_sort_key -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes application_locations = ('/Applications', '~/Applications', '~/Desktop') @@ -240,7 +240,7 @@ def get_extensions_from_utis(utis, plist): for decl in plist.get(key, ()): if isinstance(decl, dict): uti = decl.get('UTTypeIdentifier') - if isinstance(uti, basestring): + if isinstance(uti, string_or_bytes): spec = decl.get('UTTypeTagSpecification') if isinstance(spec, dict): ext = spec.get('public.filename-extension') @@ -287,10 +287,10 @@ def get_bundle_data(path): extensions |= get_extensions_from_utis(utis, plist) else: for ext in dtype.get('CFBundleTypeExtensions', ()): - if isinstance(ext, basestring): + if isinstance(ext, string_or_bytes): extensions.add(ext.lower()) for mt in dtype.get('CFBundleTypeMIMETypes', ()): - if isinstance(mt, basestring): + if isinstance(mt, string_or_bytes): for ext in mimetypes.guess_all_extensions(mt, strict=False): extensions.add(ext.lower()) return ans diff --git a/src/calibre/utils/rss_gen.py b/src/calibre/utils/rss_gen.py index d270f3dbf4..f4419234f7 100644 --- a/src/calibre/utils/rss_gen.py +++ b/src/calibre/utils/rss_gen.py @@ -7,6 +7,7 @@ __author__ = "Andrew Dalke " _generator_name = __name__ + "-" + ".".join(map(str, __version__)) import datetime +from polyglot.builtins import string_or_bytes # Could make this the base class; will need to add 'publish' @@ -32,7 +33,7 @@ class WriteXmlMixin: def _element(handler, name, obj, d={}): - if isinstance(obj, basestring) or obj is None: + if isinstance(obj, string_or_bytes) or obj is None: # special-case handling to make the API easier # to use for the common case. handler.startElement(name, d) @@ -373,7 +374,7 @@ class RSS2(WriteXmlMixin): _opt_element(handler, "lastBuildDate", lastBuildDate) for category in self.categories: - if isinstance(category, basestring): + if isinstance(category, string_or_bytes): category = Category(category) category.publish(handler) @@ -454,7 +455,7 @@ class RSSItem(WriteXmlMixin): _opt_element(handler, "author", self.author) for category in self.categories: - if isinstance(category, basestring): + if isinstance(category, string_or_bytes): category = Category(category) category.publish(handler) diff --git a/src/calibre/utils/smtplib.py b/src/calibre/utils/smtplib.py index 3db4b978af..b15bc6988c 100755 --- a/src/calibre/utils/smtplib.py +++ b/src/calibre/utils/smtplib.py @@ -52,7 +52,7 @@ from email.base64mime import encode as encode_base64 from sys import stderr from functools import partial -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes __all__ = ["SMTPException", "SMTPServerDisconnected", "SMTPResponseException", "SMTPSenderRefused", "SMTPRecipientsRefused", "SMTPDataError", @@ -766,7 +766,7 @@ class SMTP: self.rset() raise SMTPSenderRefused(code, resp, from_addr) senderrs = {} - if isinstance(to_addrs, basestring): + if isinstance(to_addrs, string_or_bytes): to_addrs = [to_addrs] for each in to_addrs: (code, resp) = self.rcpt(each, rcpt_options) diff --git a/src/calibre/utils/unrar.py b/src/calibre/utils/unrar.py index 2fd0af3886..882a636ba6 100644 --- a/src/calibre/utils/unrar.py +++ b/src/calibre/utils/unrar.py @@ -13,6 +13,7 @@ from io import BytesIO from calibre.constants import filesystem_encoding, iswindows from calibre.ptempfile import PersistentTemporaryFile, TemporaryDirectory +from polyglot.builtins import string_or_bytes def as_unicode(x): @@ -28,7 +29,7 @@ class StreamAsPath(object): def __enter__(self): self.temppath = None - if isinstance(self.stream, basestring): + if isinstance(self.stream, string_or_bytes): return as_unicode(self.stream) name = getattr(self.stream, 'name', None) if name and os.access(name, os.R_OK): diff --git a/src/calibre/utils/zipfile.py b/src/calibre/utils/zipfile.py index 068438e358..9699543d9b 100644 --- a/src/calibre/utils/zipfile.py +++ b/src/calibre/utils/zipfile.py @@ -11,7 +11,7 @@ from tempfile import SpooledTemporaryFile from calibre import sanitize_file_name2 from calibre.constants import filesystem_encoding from calibre.ebooks.chardet import detect -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes try: import zlib # We may need its compression method @@ -747,7 +747,7 @@ class ZipFile: self.comment = '' # Check if we were passed a file-like object - if isinstance(file, basestring): + if isinstance(file, string_or_bytes): self._filePassed = 0 self.filename = file modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'} diff --git a/src/calibre/web/feeds/__init__.py b/src/calibre/web/feeds/__init__.py index cceac992f3..c0303e3e1c 100644 --- a/src/calibre/web/feeds/__init__.py +++ b/src/calibre/web/feeds/__init__.py @@ -12,7 +12,7 @@ from calibre.utils.logging import default_log from calibre import entity_to_unicode, strftime, force_unicode from calibre.utils.date import dt_factory, utcnow, local_tz from calibre.utils.cleantext import clean_ascii_chars, clean_xml_chars -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class Article(object): @@ -21,7 +21,7 @@ class Article(object): from lxml import html self.downloaded = False self.id = id - if not title or not isinstance(title, basestring): + if not title or not isinstance(title, string_or_bytes): title = _('Unknown') title = force_unicode(title, 'utf-8') self._title = clean_xml_chars(title).strip() diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py index d93cd3e815..9a2e616867 100644 --- a/src/calibre/web/feeds/news.py +++ b/src/calibre/web/feeds/news.py @@ -31,7 +31,7 @@ from calibre.utils.icu import numeric_sort_key from calibre.utils.img import save_cover_data_to, add_borders_to_image, image_to_data from calibre.utils.localization import canonicalize_lang from calibre.utils.logging import ThreadSafeWrapper -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, string_or_bytes class LoginFailed(ValueError): @@ -1612,7 +1612,7 @@ class BasicNewsRecipe(Recipe): feeds = self.get_feeds() parsed_feeds = [] for obj in feeds: - if isinstance(obj, basestring): + if isinstance(obj, string_or_bytes): title, url = None, obj else: title, url = obj @@ -1659,7 +1659,7 @@ class BasicNewsRecipe(Recipe): ''' if tag is None: return '' - if isinstance(tag, basestring): + if isinstance(tag, string_or_bytes): return tag if callable(getattr(tag, 'xpath', None)) and not hasattr(tag, 'contents'): # a lxml tag from lxml.etree import tostring diff --git a/src/odf/odf2xhtml.py b/src/odf/odf2xhtml.py index 9f1e763551..89d75a1961 100644 --- a/src/odf/odf2xhtml.py +++ b/src/odf/odf2xhtml.py @@ -1580,7 +1580,7 @@ dl.notes dd:last-of-type { page-break-after: avoid } """ self.lines = [] self._wfunc = self._wlines - if isinstance(odffile, basestring) \ + if isinstance(odffile, (bytes, type(u'')) \ or hasattr(odffile, 'read'): # Added by Kovid self.document = load(odffile) else: diff --git a/src/odf/userfield.py b/src/odf/userfield.py index a0f6b1641d..5dc2f0818d 100644 --- a/src/odf/userfield.py +++ b/src/odf/userfield.py @@ -62,7 +62,7 @@ class UserFields(object): self.document = None def loaddoc(self): - if isinstance(self.src_file, basestring): + if isinstance(self.src_file, (bytes, type(u'')): # src_file is a filename, check if it is a zip-file if not zipfile.is_zipfile(self.src_file): raise TypeError("%s is no odt file." % self.src_file) @@ -164,6 +164,5 @@ class UserFields(object): if value_type == 'string': f.setAttribute('stringvalue', value) else: - f.setAttribute('value', value) + f.setAttribute('value', value) self.savedoc() - diff --git a/src/polyglot/builtins.py b/src/polyglot/builtins.py index d4fbe45933..806807f43c 100644 --- a/src/polyglot/builtins.py +++ b/src/polyglot/builtins.py @@ -29,6 +29,7 @@ if is_py3: codepoint_to_chr = chr unicode_type = str + string_or_bytes = str, bytes def iteritems(d): return iter(d.items()) @@ -53,6 +54,7 @@ else: codepoint_to_chr = unichr unicode_type = unicode + string_or_bytes = unicode, bytes def iteritems(d): return d.iteritems()