diff --git a/ebook_converter/__init__.py b/ebook_converter/__init__.py index 6293aeb..0d71742 100644 --- a/ebook_converter/__init__.py +++ b/ebook_converter/__init__.py @@ -5,7 +5,7 @@ __docformat__ = 'restructuredtext en' import sys, os, re, time, random, warnings import pkg_resources -from ebook_converter.polyglot.builtins import codepoint_to_chr, unicode_type, range, hasenv, native_string_type +from ebook_converter.polyglot.builtins import codepoint_to_chr, unicode_type, hasenv, native_string_type from math import floor from functools import partial diff --git a/ebook_converter/constants.py b/ebook_converter/constants.py index 646f56d..945420e 100644 --- a/ebook_converter/constants.py +++ b/ebook_converter/constants.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 # vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2015, Kovid Goyal -from ebook_converter.polyglot.builtins import map, unicode_type, environ_item, hasenv, getenv, as_unicode, native_string_type +from ebook_converter.polyglot.builtins import unicode_type, environ_item, hasenv, getenv, as_unicode, native_string_type import sys, locale, codecs, os, importlib, collections __appname__ = 'calibre' diff --git a/ebook_converter/css_selectors/parser.py b/ebook_converter/css_selectors/parser.py index 1a1dc90..9a623a6 100644 --- a/ebook_converter/css_selectors/parser.py +++ b/ebook_converter/css_selectors/parser.py @@ -15,7 +15,7 @@ import operator import string from ebook_converter.css_selectors.errors import SelectorSyntaxError, ExpressionError -from ebook_converter.polyglot.builtins import unicode_type, codepoint_to_chr, range +from ebook_converter.polyglot.builtins import unicode_type, codepoint_to_chr utab = {c:c+32 for c in range(ord(u'A'), ord(u'Z')+1)} diff --git a/ebook_converter/customize/profiles.py b/ebook_converter/customize/profiles.py index a277e86..cfde21a 100644 --- a/ebook_converter/customize/profiles.py +++ b/ebook_converter/customize/profiles.py @@ -1,5 +1,5 @@ from ebook_converter.customize import Plugin as _Plugin -from ebook_converter.polyglot.builtins import zip + __license__ = 'GPL 3' __copyright__ = '2009, Kovid Goyal ' diff --git a/ebook_converter/customize/zipplugin.py b/ebook_converter/customize/zipplugin.py index 6a4b729..1bb5208 100644 --- a/ebook_converter/customize/zipplugin.py +++ b/ebook_converter/customize/zipplugin.py @@ -11,7 +11,7 @@ from ebook_converter import as_unicode from ebook_converter.constants import ispy3 from ebook_converter.customize import (Plugin, numeric_version, platform, InvalidPlugin, PluginNotFound) -from ebook_converter.polyglot.builtins import (itervalues, map, string_or_bytes, +from ebook_converter.polyglot.builtins import (itervalues, string_or_bytes, unicode_type, reload) diff --git a/ebook_converter/ebooks/BeautifulSoup.py b/ebook_converter/ebooks/BeautifulSoup.py index 31af905..fa65ad9 100644 --- a/ebook_converter/ebooks/BeautifulSoup.py +++ b/ebook_converter/ebooks/BeautifulSoup.py @@ -1,24 +1,20 @@ # License: GPLv3 Copyright: 2019, Kovid Goyal import bs4 -from bs4 import ( # noqa - CData, Comment, Declaration, NavigableString, ProcessingInstruction, - SoupStrainer, Tag, __version__ -) +from html5_parser import soup as html5_soup -from ebook_converter.polyglot.builtins import unicode_type +from ebook_converter.ebooks import chardet +from ebook_converter.utils import cleantext def parse_html(markup): - from ebook_converter.ebooks.chardet import strip_encoding_declarations, xml_to_unicode, substitute_entites - from ebook_converter.utils.cleantext import clean_xml_chars - if isinstance(markup, unicode_type): - markup = strip_encoding_declarations(markup) - markup = substitute_entites(markup) + if isinstance(markup, str): + markup = chardet.strip_encoding_declarations(markup) + markup = chardet.substitute_entites(markup) else: - markup = xml_to_unicode(markup, strip_encoding_pats=True, resolve_entities=True)[0] - markup = clean_xml_chars(markup) - from html5_parser.soup import parse - return parse(markup, return_root=False) + markup = chardet.xml_to_unicode(markup, strip_encoding_pats=True, + resolve_entities=True)[0] + markup = cleantext.clean_xml_chars(markup) + return html5_soup.parse(markup, return_root=False) def prettify(soup): @@ -28,9 +24,9 @@ def prettify(soup): return ans -def BeautifulSoup(markup='', *a, **kw): +def html5_parser(markup='', *a, **kw): return parse_html(markup) -def BeautifulStoneSoup(markup='', *a, **kw): +def beautiful_soup_parser(markup='', *a, **kw): return bs4.BeautifulSoup(markup, 'xml') diff --git a/ebook_converter/ebooks/compression/palmdoc.py b/ebook_converter/ebooks/compression/palmdoc.py index 5ae51d5..d15452e 100644 --- a/ebook_converter/ebooks/compression/palmdoc.py +++ b/ebook_converter/ebooks/compression/palmdoc.py @@ -2,7 +2,6 @@ import io from struct import pack from ebook_converter.ebooks.compression import cPalmdoc -from ebook_converter.polyglot.builtins import range __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/conversion/plugins/comic_input.py b/ebook_converter/ebooks/conversion/plugins/comic_input.py index 7322c06..17c08e8 100644 --- a/ebook_converter/ebooks/conversion/plugins/comic_input.py +++ b/ebook_converter/ebooks/conversion/plugins/comic_input.py @@ -6,7 +6,7 @@ import shutil, textwrap, codecs, os from ebook_converter.customize.conversion import InputFormatPlugin, OptionRecommendation from ebook_converter import CurrentDir from ebook_converter.ptempfile import PersistentTemporaryDirectory -from ebook_converter.polyglot.builtins import getcwd, map +from ebook_converter.polyglot.builtins import getcwd __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/conversion/plugins/epub_output.py b/ebook_converter/ebooks/conversion/plugins/epub_output.py index 48da2a0..b9674d8 100644 --- a/ebook_converter/ebooks/conversion/plugins/epub_output.py +++ b/ebook_converter/ebooks/conversion/plugins/epub_output.py @@ -4,7 +4,7 @@ from ebook_converter.customize.conversion import (OutputFormatPlugin, OptionRecommendation) from ebook_converter.ptempfile import TemporaryDirectory from ebook_converter import CurrentDir -from ebook_converter.polyglot.builtins import unicode_type, filter, map, zip, range, as_bytes +from ebook_converter.polyglot.builtins import unicode_type, as_bytes __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/conversion/plugins/html_input.py b/ebook_converter/ebooks/conversion/plugins/html_input.py index f796163..cc76395 100644 --- a/ebook_converter/ebooks/conversion/plugins/html_input.py +++ b/ebook_converter/ebooks/conversion/plugins/html_input.py @@ -7,7 +7,7 @@ from ebook_converter.customize.conversion import (InputFormatPlugin, from ebook_converter.utils.localization import get_lang from ebook_converter.utils.filenames import ascii_filename from ebook_converter.utils.imghdr import what -from ebook_converter.polyglot.builtins import unicode_type, zip, getcwd, as_unicode +from ebook_converter.polyglot.builtins import unicode_type, getcwd, as_unicode __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/conversion/plugins/rtf_input.py b/ebook_converter/ebooks/conversion/plugins/rtf_input.py index deb6527..605fb28 100644 --- a/ebook_converter/ebooks/conversion/plugins/rtf_input.py +++ b/ebook_converter/ebooks/conversion/plugins/rtf_input.py @@ -2,7 +2,7 @@ import os, glob, re, textwrap import pkg_resources from ebook_converter.customize.conversion import InputFormatPlugin, OptionRecommendation -from ebook_converter.polyglot.builtins import iteritems, filter, getcwd, as_bytes +from ebook_converter.polyglot.builtins import iteritems, getcwd, as_bytes __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' diff --git a/ebook_converter/ebooks/conversion/plumber.py b/ebook_converter/ebooks/conversion/plumber.py index c2d6a57..ec56d13 100644 --- a/ebook_converter/ebooks/conversion/plumber.py +++ b/ebook_converter/ebooks/conversion/plumber.py @@ -13,7 +13,7 @@ from ebook_converter.utils.zipfile import ZipFile from ebook_converter import (extract, walk, isbytestring, filesystem_encoding, get_types_map) from ebook_converter.constants import __version__ -from ebook_converter.polyglot.builtins import unicode_type, string_or_bytes, map +from ebook_converter.polyglot.builtins import unicode_type, string_or_bytes __license__ = 'GPL 3' diff --git a/ebook_converter/ebooks/conversion/preprocess.py b/ebook_converter/ebooks/conversion/preprocess.py index cc66b5b..1e528dd 100644 --- a/ebook_converter/ebooks/conversion/preprocess.py +++ b/ebook_converter/ebooks/conversion/preprocess.py @@ -2,7 +2,7 @@ import functools, re, json from math import ceil from ebook_converter import entity_to_unicode, as_unicode -from ebook_converter.polyglot.builtins import unicode_type, range +from ebook_converter.polyglot.builtins import unicode_type __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/covers.py b/ebook_converter/ebooks/covers.py index f7eac3a..8de7cd2 100644 --- a/ebook_converter/ebooks/covers.py +++ b/ebook_converter/ebooks/covers.py @@ -2,7 +2,7 @@ import re, random, unicodedata, numbers from collections import namedtuple from contextlib import contextmanager from math import ceil, sqrt, cos, sin, atan2 -from ebook_converter.polyglot.builtins import iteritems, itervalues, map, zip, string_or_bytes +from ebook_converter.polyglot.builtins import iteritems, itervalues, string_or_bytes from itertools import chain from PyQt5.Qt import ( diff --git a/ebook_converter/ebooks/docx/cleanup.py b/ebook_converter/ebooks/docx/cleanup.py index f4779c7..4e3a504 100644 --- a/ebook_converter/ebooks/docx/cleanup.py +++ b/ebook_converter/ebooks/docx/cleanup.py @@ -1,5 +1,5 @@ import os -from ebook_converter.polyglot.builtins import itervalues, range +from ebook_converter.polyglot.builtins import itervalues __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/docx/fonts.py b/ebook_converter/ebooks/docx/fonts.py index ee6f0e9..7dba9e1 100644 --- a/ebook_converter/ebooks/docx/fonts.py +++ b/ebook_converter/ebooks/docx/fonts.py @@ -6,7 +6,7 @@ from ebook_converter.utils.filenames import ascii_filename from ebook_converter.utils.fonts.scanner import font_scanner, NoFonts from ebook_converter.utils.fonts.utils import panose_to_css_generic_family, is_truetype_font from ebook_converter.utils.icu import ord_string -from ebook_converter.polyglot.builtins import codepoint_to_chr, iteritems, range +from ebook_converter.polyglot.builtins import codepoint_to_chr, iteritems __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/docx/index.py b/ebook_converter/ebooks/docx/index.py index 652c757..92cc092 100644 --- a/ebook_converter/ebooks/docx/index.py +++ b/ebook_converter/ebooks/docx/index.py @@ -3,7 +3,7 @@ from operator import itemgetter from lxml import etree from ebook_converter.utils.icu import partition_by_first_letter, sort_key -from ebook_converter.polyglot.builtins import iteritems, filter +from ebook_converter.polyglot.builtins import iteritems __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/docx/tables.py b/ebook_converter/ebooks/docx/tables.py index 54a32e8..cb778fa 100644 --- a/ebook_converter/ebooks/docx/tables.py +++ b/ebook_converter/ebooks/docx/tables.py @@ -2,7 +2,7 @@ from lxml.html.builder import TABLE, TR, TD from ebook_converter.ebooks.docx.block_styles import inherit, read_shd as rs, read_border, binary_property, border_props, ParagraphStyle, border_to_css from ebook_converter.ebooks.docx.char_styles import RunStyle -from ebook_converter.polyglot.builtins import filter, iteritems, itervalues, range, unicode_type +from ebook_converter.polyglot.builtins import iteritems, itervalues, unicode_type __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/docx/to_html.py b/ebook_converter/ebooks/docx/to_html.py index 4985dc5..68d28f3 100644 --- a/ebook_converter/ebooks/docx/to_html.py +++ b/ebook_converter/ebooks/docx/to_html.py @@ -21,7 +21,7 @@ from ebook_converter.ebooks.docx.fields import Fields from ebook_converter.ebooks.docx.settings import Settings from ebook_converter.ebooks.metadata.opf2 import OPFCreator from ebook_converter.utils.localization import canonicalize_lang, lang_as_iso639_1 -from ebook_converter.polyglot.builtins import iteritems, itervalues, filter, getcwd, map, unicode_type +from ebook_converter.polyglot.builtins import iteritems, itervalues, getcwd, unicode_type __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/docx/toc.py b/ebook_converter/ebooks/docx/toc.py index 2e4fa89..dc517ee 100644 --- a/ebook_converter/ebooks/docx/toc.py +++ b/ebook_converter/ebooks/docx/toc.py @@ -5,7 +5,7 @@ from lxml.etree import tostring from ebook_converter.ebooks.metadata.toc import TOC from ebook_converter.ebooks.oeb.polish.toc import elem_to_toc_text -from ebook_converter.polyglot.builtins import iteritems, range +from ebook_converter.polyglot.builtins import iteritems __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/docx/writer/container.py b/ebook_converter/ebooks/docx/writer/container.py index 1f062fb..d4b4b71 100644 --- a/ebook_converter/ebooks/docx/writer/container.py +++ b/ebook_converter/ebooks/docx/writer/container.py @@ -11,7 +11,7 @@ from ebook_converter.ebooks.pdf.render.common import PAPER_SIZES from ebook_converter.utils.date import utcnow from ebook_converter.utils.localization import canonicalize_lang, lang_as_iso639_1 from ebook_converter.utils.zipfile import ZipFile -from ebook_converter.polyglot.builtins import iteritems, map, unicode_type, native_string_type +from ebook_converter.polyglot.builtins import iteritems, unicode_type, native_string_type __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/docx/writer/fonts.py b/ebook_converter/ebooks/docx/writer/fonts.py index b4fc217..27cdf0a 100644 --- a/ebook_converter/ebooks/docx/writer/fonts.py +++ b/ebook_converter/ebooks/docx/writer/fonts.py @@ -3,7 +3,6 @@ from uuid import uuid4 from ebook_converter.ebooks.oeb.base import OEB_STYLES from ebook_converter.ebooks.oeb.transforms.subset import find_font_face_rules -from ebook_converter.polyglot.builtins import range __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/docx/writer/images.py b/ebook_converter/ebooks/docx/writer/images.py index 3488ff7..90da7c2 100644 --- a/ebook_converter/ebooks/docx/writer/images.py +++ b/ebook_converter/ebooks/docx/writer/images.py @@ -2,7 +2,7 @@ import os import posixpath from collections import namedtuple from functools import partial -from ebook_converter.polyglot.builtins import iteritems, itervalues, map, unicode_type +from ebook_converter.polyglot.builtins import iteritems, itervalues, unicode_type from lxml import etree diff --git a/ebook_converter/ebooks/docx/writer/styles.py b/ebook_converter/ebooks/docx/writer/styles.py index e171b83..8b414ee 100644 --- a/ebook_converter/ebooks/docx/writer/styles.py +++ b/ebook_converter/ebooks/docx/writer/styles.py @@ -7,7 +7,7 @@ from lxml import etree from ebook_converter.ebooks import parse_css_length from ebook_converter.ebooks.docx.writer.utils import convert_color, int_or_zero from ebook_converter.utils.localization import lang_as_iso639_1 -from ebook_converter.polyglot.builtins import iteritems, filter, unicode_type +from ebook_converter.polyglot.builtins import iteritems, unicode_type from ebook_converter.tinycss.css21 import CSS21Parser diff --git a/ebook_converter/ebooks/docx/writer/tables.py b/ebook_converter/ebooks/docx/writer/tables.py index a4e3912..f38a2c1 100644 --- a/ebook_converter/ebooks/docx/writer/tables.py +++ b/ebook_converter/ebooks/docx/writer/tables.py @@ -2,7 +2,7 @@ from collections import namedtuple from ebook_converter.ebooks.docx.writer.utils import convert_color from ebook_converter.ebooks.docx.writer.styles import read_css_block_borders as rcbb, border_edges -from ebook_converter.polyglot.builtins import iteritems, range, unicode_type +from ebook_converter.polyglot.builtins import iteritems, unicode_type __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/fb2/fb2ml.py b/ebook_converter/ebooks/fb2/fb2ml.py index b163533..590d13b 100644 --- a/ebook_converter/ebooks/fb2/fb2ml.py +++ b/ebook_converter/ebooks/fb2/fb2ml.py @@ -12,7 +12,7 @@ from ebook_converter.utils.localization import lang_as_iso639_1 from ebook_converter.utils.xml_parse import safe_xml_fromstring from ebook_converter.utils.img import save_cover_data_to from ebook_converter.ebooks.oeb.base import urlnormalize -from ebook_converter.polyglot.builtins import unicode_type, string_or_bytes, range, filter +from ebook_converter.polyglot.builtins import unicode_type, string_or_bytes from ebook_converter.polyglot.binary import as_base64_unicode from ebook_converter.polyglot.urllib import urlparse diff --git a/ebook_converter/ebooks/lrf/html/convert_from.py b/ebook_converter/ebooks/lrf/html/convert_from.py index ff6b1dc..89ee036 100644 --- a/ebook_converter/ebooks/lrf/html/convert_from.py +++ b/ebook_converter/ebooks/lrf/html/convert_from.py @@ -17,15 +17,15 @@ from functools import partial from itertools import chain from math import ceil, floor +import bs4 + from ebook_converter import ( __appname__, entity_to_unicode, fit_image, force_unicode, preferred_encoding ) from ebook_converter.constants import filesystem_encoding from ebook_converter.devices.interface import DevicePlugin as Device from ebook_converter.ebooks import ConversionError -from ebook_converter.ebooks.BeautifulSoup import ( - BeautifulSoup, Comment, Declaration, NavigableString, ProcessingInstruction, Tag -) +from ebook_converter.ebooks.BeautifulSoup import html5_parser from ebook_converter.ebooks.chardet import xml_to_unicode from ebook_converter.ebooks.lrf import Book from ebook_converter.ebooks.lrf.html.color_map import lrs_color @@ -86,7 +86,7 @@ def tag_regex(tagname): class HTMLConverter(object): SELECTOR_PAT = re.compile(r"([A-Za-z0-9\-\_\:\.]+[A-Za-z0-9\-\_\:\.\s\,]*)\s*\{([^\}]*)\}") PAGE_BREAK_PAT = re.compile(r'page-break-(?:after|before)\s*:\s*(\w+)', re.IGNORECASE) - IGNORED_TAGS = (Comment, Declaration, ProcessingInstruction) + IGNORED_TAGS = (bs4.Comment, bs4.Declaration, bs4.ProcessingInstruction) MARKUP_MASSAGE = [ # Close tags @@ -337,7 +337,7 @@ class HTMLConverter(object): raw = xml_to_unicode(raw, replace_entities=True)[0] for pat, repl in nmassage: raw = pat.sub(repl, raw) - soup = BeautifulSoup(raw) + soup = html5_parser(raw) if not self.baen and self.is_baen(soup): self.baen = True self.log.info(_('\tBaen file detected. Re-parsing...')) @@ -585,9 +585,9 @@ class HTMLConverter(object): break if isinstance(c, HTMLConverter.IGNORED_TAGS): continue - if isinstance(c, NavigableString): + if isinstance(c, bs4.NavigableString): text += unicode_type(c) - elif isinstance(c, Tag): + elif isinstance(c, bs4.Tag): if c.name.lower() == 'img' and c.has_attr('alt'): alt_text += c['alt'] continue @@ -720,9 +720,9 @@ class HTMLConverter(object): for c in copy.copy(ptag.contents): if isinstance(c, HTMLConverter.IGNORED_TAGS): continue - elif isinstance(c, Tag): + elif isinstance(c, bs4.Tag): self.parse_tag(c, pcss) - elif isinstance(c, NavigableString): + elif isinstance(c, bs4.NavigableString): self.add_text(c, pcss, ppcss) if not self.in_table: try: @@ -1551,11 +1551,11 @@ class HTMLConverter(object): if tag.contents: c = tag.contents[0] - if isinstance(c, NavigableString): + if isinstance(c, bs4.NavigableString): c = unicode_type(c).replace('\r\n', '\n').replace('\r', '\n') if c.startswith('\n'): c = c[1:] - tag.contents[0] = NavigableString(c) + tag.contents[0] = bs4.NavigableString(c) tag.contents[0].setup(tag) self.process_children(tag, tag_css, tag_pseudo_css) self.end_current_block() @@ -1823,7 +1823,7 @@ def process_file(path, options, logger): for prop in ('author', 'author_sort', 'title', 'title_sort', 'publisher', 'freetext'): val = getattr(options, prop, None) if val and not isinstance(val, unicode_type): - soup = BeautifulSoup(val) + soup = html5_parser(val) setattr(options, prop, unicode_type(soup)) title = (options.title, options.title_sort) diff --git a/ebook_converter/ebooks/lrf/html/table.py b/ebook_converter/ebooks/lrf/html/table.py index 05a27ed..a698f50 100644 --- a/ebook_converter/ebooks/lrf/html/table.py +++ b/ebook_converter/ebooks/lrf/html/table.py @@ -4,7 +4,7 @@ from ebook_converter.ebooks.lrf.fonts import get_font from ebook_converter.ebooks.lrf.pylrs.pylrs import TextBlock, Text, CR, Span, \ CharButton, Plot, Paragraph, \ LrsTextTag -from ebook_converter.polyglot.builtins import string_or_bytes, range, native_string_type +from ebook_converter.polyglot.builtins import string_or_bytes, native_string_type __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/metadata/__init__.py b/ebook_converter/ebooks/metadata/__init__.py index b7a3187..5d3648d 100644 --- a/ebook_converter/ebooks/metadata/__init__.py +++ b/ebook_converter/ebooks/metadata/__init__.py @@ -6,7 +6,7 @@ import os, sys, re from ebook_converter import relpath, guess_type, prints, force_unicode from ebook_converter.utils.config_base import tweaks -from ebook_converter.polyglot.builtins import codepoint_to_chr, unicode_type, range, map, zip, getcwd, iteritems, itervalues, as_unicode +from ebook_converter.polyglot.builtins import codepoint_to_chr, unicode_type, getcwd, iteritems, itervalues, as_unicode from ebook_converter.polyglot.urllib import quote, unquote, urlparse diff --git a/ebook_converter/ebooks/metadata/archive.py b/ebook_converter/ebooks/metadata/archive.py index 655f8c6..1c750ba 100644 --- a/ebook_converter/ebooks/metadata/archive.py +++ b/ebook_converter/ebooks/metadata/archive.py @@ -3,7 +3,7 @@ from contextlib import closing from ebook_converter.customize import FileTypePlugin from ebook_converter.utils.localization import canonicalize_lang -from ebook_converter.polyglot.builtins import filter, unicode_type +from ebook_converter.polyglot.builtins import unicode_type __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/metadata/book/base.py b/ebook_converter/ebooks/metadata/book/base.py index 372c68f..9018432 100644 --- a/ebook_converter/ebooks/metadata/book/base.py +++ b/ebook_converter/ebooks/metadata/book/base.py @@ -7,7 +7,7 @@ from ebook_converter.ebooks.metadata.book import (SC_COPYABLE_FIELDS, TOP_LEVEL_IDENTIFIERS, ALL_METADATA_FIELDS) from ebook_converter.library.field_metadata import FieldMetadata from ebook_converter.utils.icu import sort_key -from ebook_converter.polyglot.builtins import iteritems, unicode_type, filter, map +from ebook_converter.polyglot.builtins import iteritems, unicode_type __license__ = 'GPL v3' diff --git a/ebook_converter/ebooks/metadata/opf2.py b/ebook_converter/ebooks/metadata/opf2.py index 453d2e1..e3d8f48 100644 --- a/ebook_converter/ebooks/metadata/opf2.py +++ b/ebook_converter/ebooks/metadata/opf2.py @@ -17,7 +17,7 @@ from ebook_converter import prints, guess_type from ebook_converter.utils.cleantext import clean_ascii_chars, clean_xml_chars from ebook_converter.utils.config import tweaks from ebook_converter.utils.xml_parse import safe_xml_fromstring -from ebook_converter.polyglot.builtins import iteritems, unicode_type, getcwd, map +from ebook_converter.polyglot.builtins import iteritems, unicode_type, getcwd from ebook_converter.polyglot.urllib import unquote, urlparse diff --git a/ebook_converter/ebooks/metadata/opf3.py b/ebook_converter/ebooks/metadata/opf3.py index f9f62dd..6a03967 100644 --- a/ebook_converter/ebooks/metadata/opf3.py +++ b/ebook_converter/ebooks/metadata/opf3.py @@ -2,7 +2,7 @@ import json import re from collections import defaultdict, namedtuple from functools import wraps -from ebook_converter.polyglot.builtins import iteritems, map, filter +from ebook_converter.polyglot.builtins import iteritems from lxml import etree diff --git a/ebook_converter/ebooks/metadata/rtf.py b/ebook_converter/ebooks/metadata/rtf.py index a23f148..a2868e7 100644 --- a/ebook_converter/ebooks/metadata/rtf.py +++ b/ebook_converter/ebooks/metadata/rtf.py @@ -6,7 +6,7 @@ import re from ebook_converter import force_unicode from ebook_converter.ebooks.metadata import MetaInformation -from ebook_converter.polyglot.builtins import codepoint_to_chr, string_or_bytes, unicode_type, int_to_byte, filter +from ebook_converter.polyglot.builtins import codepoint_to_chr, string_or_bytes, unicode_type, int_to_byte title_pat = re.compile(br'\{\\info.*?\{\\title(.*?)(?' diff --git a/ebook_converter/library/catalogs/bibtex.py b/ebook_converter/library/catalogs/bibtex.py index d399cdb..1517296 100644 --- a/ebook_converter/library/catalogs/bibtex.py +++ b/ebook_converter/library/catalogs/bibtex.py @@ -6,7 +6,7 @@ from ebook_converter.customize import CatalogPlugin from ebook_converter.library.catalogs import FIELDS, TEMPLATE_ALLOWED_FIELDS from ebook_converter.customize.conversion import DummyReporter from ebook_converter.ebooks.metadata import format_isbn -from ebook_converter.polyglot.builtins import filter, string_or_bytes, unicode_type +from ebook_converter.polyglot.builtins import string_or_bytes, unicode_type __license__ = 'GPL v3' diff --git a/ebook_converter/library/comments.py b/ebook_converter/library/comments.py index dc6d1f9..bc31909 100644 --- a/ebook_converter/library/comments.py +++ b/ebook_converter/library/comments.py @@ -1,11 +1,10 @@ import re +import bs4 + from ebook_converter import prepare_string_for_xml from ebook_converter.constants import preferred_encoding -from ebook_converter.ebooks.BeautifulSoup import ( - BeautifulSoup, CData, Comment, Declaration, NavigableString, - ProcessingInstruction -) +from ebook_converter.ebooks.BeautifulSoup import html5_parser from ebook_converter.utils.html2text import html2text from ebook_converter.polyglot.builtins import unicode_type @@ -83,8 +82,8 @@ def comments_to_html(comments): # Convert two hyphens to emdash comments = comments.replace('--', '—') - soup = BeautifulSoup('
' + comments + '
').find('div') - result = BeautifulSoup('
') + soup = html5_parser('
' + comments + '
').find('div') + result = html5_parser('
') container = result.find('div') rtc = 0 open_pTag = False @@ -92,9 +91,10 @@ def comments_to_html(comments): all_tokens = list(soup.contents) inline_tags = ('br', 'b', 'i', 'em', 'strong', 'span', 'font', 'a', 'hr') for token in all_tokens: - if isinstance(token, (CData, Comment, Declaration, ProcessingInstruction)): + if isinstance(token, (bs4.CData, bs4.Comment, bs4.Declaration, + bs4.ProcessingInstruction)): continue - if isinstance(token, NavigableString): + if isinstance(token, bs4.NavigableString): if not open_pTag: pTag = result.new_tag('p') open_pTag = True diff --git a/ebook_converter/polyglot/builtins.py b/ebook_converter/polyglot/builtins.py index 15dca35..30591b9 100644 --- a/ebook_converter/polyglot/builtins.py +++ b/ebook_converter/polyglot/builtins.py @@ -1,3 +1,4 @@ +import importlib import os import sys @@ -32,153 +33,67 @@ def as_unicode(x, encoding='utf-8', errors='strict'): return unicode_type(x) -def only_unicode_recursive(x, encoding='utf-8', errors='strict'): - # Convert any bytestrings in sets/lists/tuples/dicts to unicode +def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + + +codepoint_to_chr = chr +unicode_type = str +string_or_bytes = str, bytes +string_or_unicode = str +long_type = int +raw_input = input +getcwd = os.getcwd +getenv = os.getenv + + +def error_message(exc): + args = getattr(exc, 'args', None) + if args and isinstance(args[0], unicode_type): + return args[0] + return unicode_type(exc) + + +def iteritems(d): + return iter(d.items()) + + +def itervalues(d): + return iter(d.values()) + + +def environ_item(x): if isinstance(x, bytes): - return x.decode(encoding, errors) - if isinstance(x, unicode_type): - return x - if isinstance(x, (set, list, tuple, frozenset)): - return type(x)(only_unicode_recursive(i, encoding, errors) for i in x) - if isinstance(x, dict): - return {only_unicode_recursive(k, encoding, errors): only_unicode_recursive(v, encoding, errors) for k, v in iteritems(x)} + x = x.decode('utf-8') return x -if is_py3: - def reraise(tp, value, tb=None): - try: - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - finally: - value = None - tb = None +def exec_path(path, ctx=None): + ctx = ctx or {} + with open(path, 'rb') as f: + code = f.read() + code = compile(code, f.name, 'exec') + exec(code, ctx) - import builtins - zip = builtins.zip - map = builtins.map - filter = builtins.filter - range = builtins.range +def cmp(a, b): + return (a > b) - (a < b) - codepoint_to_chr = chr - unicode_type = str - string_or_bytes = str, bytes - string_or_unicode = str - long_type = int - raw_input = input - getcwd = os.getcwd - getenv = os.getenv - def error_message(exc): - args = getattr(exc, 'args', None) - if args and isinstance(args[0], unicode_type): - return args[0] - return unicode_type(exc) +def int_to_byte(x): + return bytes((x,)) - def iteritems(d): - return iter(d.items()) - def itervalues(d): - return iter(d.values()) - - def environ_item(x): - if isinstance(x, bytes): - x = x.decode('utf-8') - return x - - def exec_path(path, ctx=None): - ctx = ctx or {} - with open(path, 'rb') as f: - code = f.read() - code = compile(code, f.name, 'exec') - exec(code, ctx) - - def cmp(a, b): - return (a > b) - (a < b) - - def int_to_byte(x): - return bytes((x,)) - - def reload(module): - import importlib - return importlib.reload(module) - -else: - exec("""def reraise(tp, value, tb=None): - try: - raise tp, value, tb - finally: - tb = None -""") - - from future_builtins import zip, map, filter # noqa - range = xrange - import __builtin__ as builtins - - codepoint_to_chr = unichr - unicode_type = unicode - string_or_bytes = unicode, bytes - string_or_unicode = str, unicode - long_type = long - exec_path = execfile - raw_input = builtins.raw_input - cmp = builtins.cmp - int_to_byte = chr - getcwd = os.getcwdu - - def error_message(exc): - ans = exc.message - if isinstance(ans, bytes): - ans = ans.decode('utf-8', 'replace') - return ans - - def iteritems(d): - return d.iteritems() - - def itervalues(d): - return d.itervalues() - - def environ_item(x): - if isinstance(x, unicode_type): - x = x.encode('utf-8') - return x - - if hasattr(sys, 'getwindowsversion'): - def getenv(x, default=None): - if isinstance(x, bytes): - x = x.decode('mbcs', 'replace') - - if getenv.buf is None: - import ctypes - import ctypes.wintypes as w - getenv.cub = ctypes.create_unicode_buffer - getenv.buf = getenv.cub(1024) - getenv.gev = ctypes.windll.kernel32.GetEnvironmentVariableW - getenv.gev.restype = w.DWORD - getenv.gev.argtypes = [w.LPCWSTR, w.LPWSTR, w.DWORD] - res = getenv.gev(x, getenv.buf, len(getenv.buf)) - if res == 0: - return default - if res > len(getenv.buf) - 4: - getenv.buf = getenv.cub(res + 8) - res = getenv.gev(x, getenv.buf, len(getenv.buf)) - if res == 0: - return default - return getenv.buf.value - getenv.buf = None - else: - def getenv(x, default=None): - ans = os.getenv(x, default) - if isinstance(ans, bytes): - ans = ans.decode('utf-8', 'replace') - return ans - - def reload(module): - return builtins.reload(module) +def reload(module): + return importlib.reload(module) def print_to_binary_file(fileobj, encoding='utf-8'): diff --git a/ebook_converter/ptempfile.py b/ebook_converter/ptempfile.py index f0e9235..210f447 100644 --- a/ebook_converter/ptempfile.py +++ b/ebook_converter/ptempfile.py @@ -5,7 +5,7 @@ Provides platform independent temporary files that persist even after being closed. """ import tempfile, os, atexit -from ebook_converter.polyglot.builtins import map, getenv +from ebook_converter.polyglot.builtins import getenv from ebook_converter.constants import (__version__, __appname__, filesystem_encoding, iswindows, get_windows_temp_path, isosx, ispy3) diff --git a/ebook_converter/startup.py b/ebook_converter/startup.py index 97b5177..30f2ea5 100644 --- a/ebook_converter/startup.py +++ b/ebook_converter/startup.py @@ -6,10 +6,13 @@ __docformat__ = 'restructuredtext en' Perform various initialization tasks. ''' -import locale, sys, os +import builtins +import locale +import sys +import os # Default translation is NOOP -from ebook_converter.polyglot.builtins import builtins, is_py3, unicode_type +from ebook_converter.polyglot.builtins import is_py3 builtins.__dict__['_'] = lambda s: s # For strings which belong in the translation tables, but which shouldn't be @@ -75,7 +78,7 @@ if not _run_once: winutil, winutilerror = plugins['winutil'] if not winutil: raise RuntimeError('Failed to load the winutil plugin: %s'%winutilerror) - if len(sys.argv) > 1 and not isinstance(sys.argv[1], unicode_type): + if len(sys.argv) > 1 and not isinstance(sys.argv[1], str): sys.argv[1:] = winutil.argv()[1-len(sys.argv):] if not ispy3: @@ -110,7 +113,7 @@ if not _run_once: if isosx: enc = 'utf-8' for i in range(1, len(sys.argv)): - if not isinstance(sys.argv[i], unicode_type): + if not isinstance(sys.argv[i], str): sys.argv[i] = sys.argv[i].decode(enc, 'replace') # @@ -239,7 +242,7 @@ if not _run_once: if name == 'Thread': name = self.name if name: - if isinstance(name, unicode_type): + if isinstance(name, str): name = name.encode('ascii', 'replace').decode('ascii') plugins['speedup'][0].set_thread_name(name[:15]) except Exception: diff --git a/ebook_converter/tinycss/fonts3.py b/ebook_converter/tinycss/fonts3.py index cd32ec9..75c082b 100644 --- a/ebook_converter/tinycss/fonts3.py +++ b/ebook_converter/tinycss/fonts3.py @@ -1,6 +1,5 @@ import re -from ebook_converter.polyglot.builtins import map from ebook_converter.tinycss.css21 import CSS21Parser, ParseError from ebook_converter.tinycss.tokenizer import tokenize_grouped diff --git a/ebook_converter/utils/cleantext.py b/ebook_converter/utils/cleantext.py index f376d1e..101517e 100644 --- a/ebook_converter/utils/cleantext.py +++ b/ebook_converter/utils/cleantext.py @@ -1,6 +1,6 @@ import re -from ebook_converter.polyglot.builtins import codepoint_to_chr, map, range, filter +from ebook_converter.polyglot.builtins import codepoint_to_chr from ebook_converter.polyglot.html_entities import name2codepoint from ebook_converter.constants import plugins, preferred_encoding diff --git a/ebook_converter/utils/config_base.py b/ebook_converter/utils/config_base.py index 479b5eb..b4f23e8 100644 --- a/ebook_converter/utils/config_base.py +++ b/ebook_converter/utils/config_base.py @@ -10,7 +10,7 @@ import pkg_resources from ebook_converter.utils.lock import ExclusiveFile from ebook_converter.constants import config_dir, CONFIG_DIR_MODE, ispy3, preferred_encoding, filesystem_encoding, iswindows -from ebook_converter.polyglot.builtins import unicode_type, iteritems, map +from ebook_converter.polyglot.builtins import unicode_type, iteritems plugin_dir = os.path.join(config_dir, 'plugins') diff --git a/ebook_converter/utils/filenames.py b/ebook_converter/utils/filenames.py index 04d1f19..52a491b 100644 --- a/ebook_converter/utils/filenames.py +++ b/ebook_converter/utils/filenames.py @@ -13,7 +13,7 @@ from ebook_converter.constants import ( filesystem_encoding, iswindows, plugins, preferred_encoding, isosx, ispy3 ) from ebook_converter.utils.localization import get_udc -from ebook_converter.polyglot.builtins import iteritems, itervalues, unicode_type, range +from ebook_converter.polyglot.builtins import iteritems, itervalues, unicode_type def ascii_text(orig): diff --git a/ebook_converter/utils/fonts/metadata.py b/ebook_converter/utils/fonts/metadata.py index 0729f72..85960db 100644 --- a/ebook_converter/utils/fonts/metadata.py +++ b/ebook_converter/utils/fonts/metadata.py @@ -3,7 +3,7 @@ from struct import calcsize, unpack, unpack_from from collections import namedtuple from ebook_converter.utils.fonts.utils import get_font_names2, get_font_characteristics -from ebook_converter.polyglot.builtins import range, unicode_type +from ebook_converter.polyglot.builtins import unicode_type __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/scanner.py b/ebook_converter/utils/fonts/scanner.py index 2187e83..1533ae3 100644 --- a/ebook_converter/utils/fonts/scanner.py +++ b/ebook_converter/utils/fonts/scanner.py @@ -6,7 +6,7 @@ from ebook_converter import walk, prints, as_unicode from ebook_converter.constants import (config_dir, iswindows, isosx, plugins, DEBUG, isworker, filesystem_encoding) from ebook_converter.utils.fonts.metadata import FontMetadata, UnsupportedFont -from ebook_converter.polyglot.builtins import itervalues, unicode_type, filter +from ebook_converter.polyglot.builtins import itervalues, unicode_type __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/sfnt/cff/dict_data.py b/ebook_converter/utils/fonts/sfnt/cff/dict_data.py index 9fc5497..4436b14 100644 --- a/ebook_converter/utils/fonts/sfnt/cff/dict_data.py +++ b/ebook_converter/utils/fonts/sfnt/cff/dict_data.py @@ -1,5 +1,5 @@ from struct import pack, unpack_from -from ebook_converter.polyglot.builtins import range, unicode_type +from ebook_converter.polyglot.builtins import unicode_type __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/sfnt/cff/table.py b/ebook_converter/utils/fonts/sfnt/cff/table.py index a8235ca..0bc37ed 100644 --- a/ebook_converter/utils/fonts/sfnt/cff/table.py +++ b/ebook_converter/utils/fonts/sfnt/cff/table.py @@ -6,7 +6,7 @@ from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs from ebook_converter.utils.fonts.sfnt.cff.dict_data import TopDict, PrivateDict from ebook_converter.utils.fonts.sfnt.cff.constants import (cff_standard_strings, STANDARD_CHARSETS) -from ebook_converter.polyglot.builtins import iteritems, itervalues, range +from ebook_converter.polyglot.builtins import iteritems, itervalues __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/sfnt/cmap.py b/ebook_converter/utils/fonts/sfnt/cmap.py index 5fbe648..cfcdf0d 100644 --- a/ebook_converter/utils/fonts/sfnt/cmap.py +++ b/ebook_converter/utils/fonts/sfnt/cmap.py @@ -4,7 +4,6 @@ from collections import OrderedDict from ebook_converter.utils.fonts.utils import read_bmp_prefix from ebook_converter.utils.fonts.sfnt import UnknownTable, max_power_of_two from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont -from ebook_converter.polyglot.builtins import range __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/sfnt/common.py b/ebook_converter/utils/fonts/sfnt/common.py index eaaaeca..85e3f92 100644 --- a/ebook_converter/utils/fonts/sfnt/common.py +++ b/ebook_converter/utils/fonts/sfnt/common.py @@ -2,7 +2,7 @@ from struct import unpack_from, calcsize from collections import OrderedDict, namedtuple from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont -from ebook_converter.polyglot.builtins import range, iteritems +from ebook_converter.polyglot.builtins import iteritems __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/sfnt/head.py b/ebook_converter/utils/fonts/sfnt/head.py index 02dce62..cd55018 100644 --- a/ebook_converter/utils/fonts/sfnt/head.py +++ b/ebook_converter/utils/fonts/sfnt/head.py @@ -3,7 +3,6 @@ from struct import unpack_from, pack, calcsize from ebook_converter.utils.fonts.sfnt import UnknownTable, DateTimeProperty, FixedProperty from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont from ebook_converter.utils.fonts.sfnt.loca import read_array -from ebook_converter.polyglot.builtins import zip __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/sfnt/kern.py b/ebook_converter/utils/fonts/sfnt/kern.py index 898bcbb..ce65b3b 100644 --- a/ebook_converter/utils/fonts/sfnt/kern.py +++ b/ebook_converter/utils/fonts/sfnt/kern.py @@ -3,7 +3,6 @@ from struct import unpack_from, calcsize, pack, error as struct_error from ebook_converter.utils.fonts.sfnt import (UnknownTable, FixedProperty, max_power_of_two) from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont -from ebook_converter.polyglot.builtins import range __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/sfnt/loca.py b/ebook_converter/utils/fonts/sfnt/loca.py index 98146ba..053e7d3 100644 --- a/ebook_converter/utils/fonts/sfnt/loca.py +++ b/ebook_converter/utils/fonts/sfnt/loca.py @@ -3,7 +3,7 @@ from operator import itemgetter from itertools import repeat from ebook_converter.utils.fonts.sfnt import UnknownTable -from ebook_converter.polyglot.builtins import iteritems, range +from ebook_converter.polyglot.builtins import iteritems __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/sfnt/maxp.py b/ebook_converter/utils/fonts/sfnt/maxp.py index bd94027..995cc93 100644 --- a/ebook_converter/utils/fonts/sfnt/maxp.py +++ b/ebook_converter/utils/fonts/sfnt/maxp.py @@ -2,7 +2,6 @@ from struct import unpack_from, pack from ebook_converter.utils.fonts.sfnt import UnknownTable, FixedProperty from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont -from ebook_converter.polyglot.builtins import zip __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/sfnt/subset.py b/ebook_converter/utils/fonts/sfnt/subset.py index 832e675..56802d1 100644 --- a/ebook_converter/utils/fonts/sfnt/subset.py +++ b/ebook_converter/utils/fonts/sfnt/subset.py @@ -6,7 +6,7 @@ from functools import partial from ebook_converter.utils.icu import safe_chr, ord_string from ebook_converter.utils.fonts.sfnt.container import Sfnt from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs -from ebook_converter.polyglot.builtins import unicode_type, range, iteritems, itervalues, map +from ebook_converter.polyglot.builtins import unicode_type, iteritems, itervalues __license__ = 'GPL v3' diff --git a/ebook_converter/utils/fonts/utils.py b/ebook_converter/utils/fonts/utils.py index 80cc32d..04f6d12 100644 --- a/ebook_converter/utils/fonts/utils.py +++ b/ebook_converter/utils/fonts/utils.py @@ -2,7 +2,7 @@ import struct from io import BytesIO from collections import defaultdict -from ebook_converter.polyglot.builtins import iteritems, itervalues, unicode_type, range, as_bytes +from ebook_converter.polyglot.builtins import iteritems, itervalues, unicode_type, as_bytes __license__ = 'GPL v3' diff --git a/ebook_converter/utils/icu.py b/ebook_converter/utils/icu.py index 16e6877..822150d 100644 --- a/ebook_converter/utils/icu.py +++ b/ebook_converter/utils/icu.py @@ -5,7 +5,6 @@ import unicodedata # Setup code {{{ from ebook_converter.constants import plugins from ebook_converter.polyglot.builtins import unicode_type, cmp -from ebook_converter.polyglot.builtins import filter from ebook_converter.utils.config_base import tweaks diff --git a/ebook_converter/utils/resources.py b/ebook_converter/utils/resources.py index 688a65f..c5aa025 100644 --- a/ebook_converter/utils/resources.py +++ b/ebook_converter/utils/resources.py @@ -6,7 +6,6 @@ __docformat__ = 'restructuredtext en' import sys, os from ebook_converter import config_dir -from ebook_converter.polyglot.builtins import builtins user_dir = os.path.join(config_dir, 'resources') diff --git a/ebook_converter/utils/speedups.py b/ebook_converter/utils/speedups.py index 10665e1..dc436e3 100644 --- a/ebook_converter/utils/speedups.py +++ b/ebook_converter/utils/speedups.py @@ -1,6 +1,6 @@ import os -from ebook_converter.polyglot.builtins import range, unicode_type +from ebook_converter.polyglot.builtins import unicode_type class ReadOnlyFileBuffer(object): diff --git a/ebook_converter/utils/terminal.py b/ebook_converter/utils/terminal.py index d577454..682564f 100644 --- a/ebook_converter/utils/terminal.py +++ b/ebook_converter/utils/terminal.py @@ -7,7 +7,7 @@ except ValueError: iswindows = False from ebook_converter.constants import ispy3 -from ebook_converter.polyglot.builtins import iteritems, range, zip, native_string_type +from ebook_converter.polyglot.builtins import iteritems, native_string_type __license__ = 'GPL v3' diff --git a/ebook_converter/utils/zipfile.py b/ebook_converter/utils/zipfile.py index e279613..cdf434e 100644 --- a/ebook_converter/utils/zipfile.py +++ b/ebook_converter/utils/zipfile.py @@ -10,7 +10,7 @@ from tempfile import SpooledTemporaryFile from ebook_converter import sanitize_file_name from ebook_converter.constants import filesystem_encoding from ebook_converter.ebooks.chardet import detect -from ebook_converter.polyglot.builtins import unicode_type, string_or_bytes, getcwd, map, as_bytes +from ebook_converter.polyglot.builtins import unicode_type, string_or_bytes, getcwd, as_bytes try: import zlib # We may need its compression method