mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Get rid of basestring
This commit is contained in:
parent
073e97121e
commit
55151a3cdd
@ -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 = {}
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -9,7 +9,7 @@ __copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||
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(), ''),
|
||||
|
@ -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 []
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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:]
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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 = ['']
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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}
|
||||
|
@ -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)
|
||||
|
@ -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 []
|
||||
|
@ -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 ['']
|
||||
|
@ -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('%'):
|
||||
|
@ -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)
|
||||
|
@ -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']
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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':
|
||||
|
@ -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('"', '"')
|
||||
|
@ -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)
|
||||
|
@ -5,7 +5,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||
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:
|
||||
|
@ -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
|
||||
|
||||
|
@ -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(.*?)(?<!\\)\}', 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,))
|
||||
|
@ -19,6 +19,7 @@ from calibre.ebooks.metadata.book.base import Metadata
|
||||
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))
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import,
|
||||
__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
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -7,7 +7,7 @@ __license__ = 'GPL v3'
|
||||
__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))
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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 []
|
||||
|
@ -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'']
|
||||
|
@ -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''
|
||||
|
@ -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 ['']
|
||||
|
@ -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 ['']
|
||||
|
@ -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 ['']
|
||||
|
@ -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 ['']
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
@ -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))):
|
||||
|
@ -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():
|
||||
|
@ -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))
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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])
|
||||
|
@ -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,11 +213,11 @@ 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'] :
|
||||
bibtex_entry.append(u'%s = "%s"' % (field, bibtexdict.utf8ToBibtex(item)))
|
||||
|
@ -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)
|
||||
|
@ -7,7 +7,7 @@ __license__ = 'GPL v3'
|
||||
__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:
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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])
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -7,6 +7,7 @@ __author__ = "Andrew Dalke <dalke@dalkescientific.com>"
|
||||
_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)
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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):
|
||||
|
@ -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'}
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
@ -166,4 +166,3 @@ class UserFields(object):
|
||||
else:
|
||||
f.setAttribute('value', value)
|
||||
self.savedoc()
|
||||
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user