Get rid of basestring

This commit is contained in:
Kovid Goyal 2019-03-13 14:57:26 +05:30
parent 073e97121e
commit 55151a3cdd
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
86 changed files with 251 additions and 226 deletions

View file

@ -15,6 +15,7 @@
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 = {}

View file

@ -12,7 +12,7 @@
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 @@ def cover_last_modified(self, path):
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 @@ def copy_format_to(self, book_id, fmt, fname, path, dest,
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:

View file

@ -11,7 +11,7 @@
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 @@ def set_field(self, name, book_id_to_val_map, allow_case_change=True, do_path_up
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 @@ def protected_set_field(name, val):
# 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:

View file

@ -19,7 +19,7 @@
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 @@ def fi(default_value=None):
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

View file

@ -9,7 +9,7 @@
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(), ''),

View file

@ -10,6 +10,7 @@
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 @@ def post_open_callback(self):
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 []

View file

@ -14,7 +14,7 @@
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 @@ def none_cmp(xx, yy):
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:

View file

@ -32,7 +32,7 @@
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 @@ def migrate_old_settings(cls, settings):
# 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 @@ def migrate_old_settings(cls, settings):
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:]

View file

@ -14,6 +14,7 @@
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 @@ def none_cmp(xx, yy):
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)

View file

@ -23,6 +23,7 @@
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 @@ def _sanity_check(self, on_card, files):
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 = ['']

View file

@ -20,7 +20,7 @@
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 @@ def update_booklist(filename, path, prefix):
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)

View file

@ -89,7 +89,7 @@
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 @@ def _lastRecursiveChild(self):
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)

View file

@ -18,7 +18,7 @@
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 @@ def dump_oeb(self, oeb, out_dir):
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 @@ def run(self):
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,

View file

@ -10,7 +10,7 @@
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 safe_format(field):
@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}

View file

@ -19,7 +19,7 @@
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 @@ def process_tag(self, html_tag, stylizer, is_first_tag=False, float_spec=None):
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)

View file

@ -19,7 +19,7 @@
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 @@ def dump_text(self, elem_tree, stylizer, page, tag_stack=[]):
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 []

View file

@ -22,7 +22,7 @@
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 @@ def map_resources(self, oeb_book):
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 @@ def dump_text(self, elem, stylizer, page):
'''
# 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 @@ def dump_text(self, elem, stylizer, page):
'''
# 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 @@ def dump_text(self, elem, stylizer, page):
'''
# 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 ['']

View file

@ -22,7 +22,7 @@
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 @@ def binary_to_text_inner(self, bin, buf, stack):
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('%'):

View file

@ -31,7 +31,7 @@
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 @@ def is_block(self, style):
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)

View file

@ -7,6 +7,7 @@
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 process_element(x, attrs):
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 @@ def blocks(self, maxwidth, maxheight):
yield tb, xpos[c], sypos, delta, None
sypos += tb.blockStyle.attrs['blockheight']

View file

@ -17,6 +17,7 @@
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 @@ def process_paragraph(self, tag):
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)

View file

@ -7,7 +7,7 @@
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 @@ def stream_size(self):
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 @@ def find_first_tag(start):
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 @@ def __str__(self):
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 @@ def to_html(self):
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':

View file

@ -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 @@ def _encodeCdata(self, rawText):
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('"', '&quot;')

View file

@ -58,6 +58,7 @@
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 @@ def __init__(self, delegates):
"""
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 @@ def append(self, content, convertText=True):
(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 @@ def rescale(old):
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 @@ def toElement(self, sourceEncoding):
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 @@ def toLrfContainer(self, lrfWriter, container):
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)

View file

@ -5,7 +5,7 @@
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 @@ def __init__(self, stream):
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:

View file

@ -33,6 +33,7 @@
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 @@ def endElementNS(self, name, qname):
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

View file

@ -8,7 +8,7 @@
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(.*?)(?<!\\)\}', re.DOTALL)
author_pat = re.compile(r'\{\\info.*?\{\\author(.*?)(?<!\\)\}', re.DOTALL)
@ -146,7 +146,7 @@ def create_metadata(stream, options):
md.append(r'{\title %s}'%(title,))
if options.authors:
au = options.authors
if not isinstance(au, basestring):
if not isinstance(au, string_or_bytes):
au = u', '.join(au)
author = encode(au)
md.append(r'{\author %s}'%(author,))

View file

@ -19,6 +19,7 @@
from calibre.ebooks.metadata.opf2 import dump_dict
from calibre.utils.date import parse_date, isoformat, now
from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1
from polyglot.builtins import string_or_bytes
_xml_declaration = re.compile(r'<\?xml[^<>]+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))

View file

@ -16,7 +16,7 @@
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 @@ def mobimlize_font(self, ptsize):
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 @@ def mobimlize_content(self, tag, text, bstate, istates):
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 @@ def mobimlize_content(self, tag, text, bstate, istates):
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 @@ def mobimlize_content(self, tag, text, bstate, istates):
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)

View file

@ -18,7 +18,7 @@
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 @@ def serialize_item(self, item):
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)

View file

@ -19,7 +19,7 @@
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 @@ def filter_load(self, odffile, mi, log):
# 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:

View file

@ -22,7 +22,7 @@
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 @@ def fget(self):
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 @@ def __init__(self, oeb):
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

View file

@ -6,7 +6,7 @@
__license__ = 'GPL v3'
__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
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

View file

@ -14,7 +14,7 @@
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:

View file

@ -15,13 +15,14 @@
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

View file

@ -7,7 +7,7 @@
__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
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))

View file

@ -21,7 +21,7 @@
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 @@ def clean_edges(self, cssdict, style, fsize):
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)

View file

@ -11,6 +11,7 @@
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 @@ def smallcaps_elem(self, elem, attr):
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)

View file

@ -14,7 +14,7 @@
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 @@ def clean_text(self, text):
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 []

View file

@ -12,6 +12,7 @@
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 @@ def clean_text(self, text):
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'']

View file

@ -17,7 +17,7 @@
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 @@ def dump_text(self, elem, stylizer, tag_stack=[]):
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''

View file

@ -12,7 +12,7 @@
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 @@ def cleanup_text(self, text):
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 ['']

View file

@ -15,7 +15,7 @@
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 @@ def dump_text(self, elem, stylizer):
'''
# 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 ['']

View file

@ -16,6 +16,7 @@
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 @@ def check_escaping(text, tests):
# 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 @@ def check_escaping(text, tests):
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 @@ def check_escaping(text, tests):
# 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 @@ def dump_text(self, elem, stylizer):
'''
# 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 ['']

View file

@ -11,7 +11,7 @@
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 @@ def dump_text(self, elem, stylizer, page):
'''
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 ['']

View file

@ -35,7 +35,7 @@
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)

View file

@ -15,7 +15,7 @@
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 @@ def create_action(self, spec=None, attr='qaction', shortcut_name=None):
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 @@ def create_menu_action(self, menu, unique_name, text, icon=None, shortcut=None,
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:

View file

@ -25,6 +25,7 @@
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 @@ def files_dropped_on_book(self, event, paths, cid=None, do_confirm=True):
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 @@ def books_prepared(self, view, job):
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:

View file

@ -9,6 +9,7 @@
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 @@ def show_similar_books(self, typ, *args):
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:

View file

@ -11,7 +11,7 @@
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 @@
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 @@ def extract(source):
return tdir
try:
if isinstance(self.source, basestring):
if isinstance(self.source, string_or_bytes):
find_files(self.source)
self.ignore_opf = True
else:

View file

@ -34,7 +34,7 @@
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 @@ def _get_device_information(self):
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()

View file

@ -19,6 +19,7 @@
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 @@ def __init__(self, *args, **kwargs):
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)

View file

@ -30,7 +30,7 @@
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 @@ def get_matches(self, location, query):
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)

View file

@ -11,7 +11,7 @@
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))

View file

@ -10,7 +10,7 @@
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 @@ def populate(self, tb):
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:

View file

@ -22,6 +22,7 @@
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 @@ def choose_manually(filetype, parent):
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)

View file

@ -14,7 +14,7 @@
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 @@ def initialize(self):
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))

View file

@ -11,7 +11,7 @@
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 @@ def __init__(self, title=_('Choose Files'),
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))):

View file

@ -20,7 +20,7 @@
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 @@ def clear_clicked(self, *args):
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():

View file

@ -70,7 +70,7 @@
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 @@ def link_stylesheets_requested(self, names, sheets, remove):
@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))

View file

@ -24,11 +24,11 @@
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:

View file

@ -53,7 +53,7 @@
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 @@ def refresh_all(self):
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:

View file

@ -7,7 +7,7 @@
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 @@ def scroll_to(self, pos, notify=True):
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:

View file

@ -9,6 +9,7 @@
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 add(x):
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)

View file

@ -20,7 +20,7 @@
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 @@ def get_matches(self, location, query, candidates=None,
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])

View file

@ -15,6 +15,7 @@
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 @@ def create_bibtex_entry(entry, fields, mode, template_citation,
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)

View file

@ -48,7 +48,7 @@
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 @@ def books_with_same_title(self, mi, all_matches=True):
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 @@ def copy_format_to(self, index, fmt, dest, index_is_id=False,
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 @@ def copy_cover_to(self, index, dest, index_is_id=False,
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 @@ def should_replace_field(attr):
# 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 @@ def set_timestamp(self, id, dt, notify=True, commit=True):
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)

View file

@ -7,7 +7,7 @@
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
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:

View file

@ -2,29 +2,31 @@
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
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

View file

@ -234,7 +234,7 @@ def render_group(self, name, desc, opts):
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)

View file

@ -23,6 +23,7 @@
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])

View file

@ -7,6 +7,7 @@
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 @@
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:

View file

@ -12,7 +12,7 @@
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 @@ def __call__(self, redirect_output=True, cwd=None, priority=None):
_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,

View file

@ -21,6 +21,7 @@
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 @@ def launch_worker(self, gui=False, redirect_output=None, job_name=None):
'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)

View file

@ -16,7 +16,7 @@
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 renice(niceness):
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

View file

@ -13,6 +13,7 @@
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)

View file

@ -11,7 +11,7 @@
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

View file

@ -7,6 +7,7 @@
_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 @@ def to_xml(self, encoding="iso-8859-1"):
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 @@ def publish(self, handler):
_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 @@ def publish(self, handler):
_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)

View file

@ -52,7 +52,7 @@
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 @@ def sendmail(self, from_addr, to_addrs, msg, mail_options=[],
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)

View file

@ -13,6 +13,7 @@
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 @@ def __init__(self, stream):
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):

View file

@ -11,7 +11,7 @@
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 @@ def __init__(self, file, mode="r", compression=ZIP_DEFLATED, allowZip64=False):
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'}

View file

@ -12,7 +12,7 @@
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 @@ def __init__(self, id, title, url, author, summary, published, content):
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()

View file

@ -31,7 +31,7 @@
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 @@ def parse_feeds(self):
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 @@ def tag_to_string(self, tag, use_alt=True, normalize_whitespace=True):
'''
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

View file

@ -1580,7 +1580,7 @@ def load(self, odffile):
"""
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:

View file

@ -62,7 +62,7 @@ def __init__(self, src=None, dest=None):
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 @@ def update(self, data):
if value_type == 'string':
f.setAttribute('stringvalue', value)
else:
f.setAttribute('value', value)
f.setAttribute('value', value)
self.savedoc()

View file

@ -29,6 +29,7 @@ def reraise(tp, value, tb=None):
codepoint_to_chr = chr
unicode_type = str
string_or_bytes = str, bytes
def iteritems(d):
return iter(d.items())
@ -53,6 +54,7 @@ def iterkeys(d):
codepoint_to_chr = unichr
unicode_type = unicode
string_or_bytes = unicode, bytes
def iteritems(d):
return d.iteritems()