diff --git a/recipes/el_pais.recipe b/recipes/el_pais.recipe
index 22d49cb866..849a931493 100644
--- a/recipes/el_pais.recipe
+++ b/recipes/el_pais.recipe
@@ -64,7 +64,7 @@ class ElPais(BasicNewsRecipe):
def preprocess_html(self, soup):
for img in soup.findAll('img', srcset=True):
try:
- img['src'] = filter(None, img['srcset'].split())[0]
+ img['src'] = list(filter(None, img['srcset'].split()))[0]
except IndexError:
continue
return soup
diff --git a/recipes/hurriyet_daily_news.recipe b/recipes/hurriyet_daily_news.recipe
index c49b35222d..c7ea9582e4 100644
--- a/recipes/hurriyet_daily_news.recipe
+++ b/recipes/hurriyet_daily_news.recipe
@@ -102,7 +102,7 @@ def include_link(link):
regex = re.compile('rmRootLink', re.IGNORECASE)
links = soup.findAll('a', {'class': regex})
- filtered_links = filter(include_link, links)
+ filtered_links = list(filter(include_link, links))
self._p(' all sections: ' + ', '.join(map(self.text, links)))
self._p(' filtered sections: ' +
', '.join(map(self.text, filtered_links)))
diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py
index f259e9819c..a2ec0e093b 100644
--- a/src/calibre/__init__.py
+++ b/src/calibre/__init__.py
@@ -5,7 +5,7 @@
import sys, os, re, time, random, warnings
from polyglot.builtins import (builtins, codepoint_to_chr, iteritems,
- itervalues, unicode_type, range)
+ itervalues, unicode_type, range, filter)
builtins.__dict__['dynamic_property'] = lambda func: func(None)
from math import floor
from functools import partial
@@ -376,9 +376,9 @@ def get_proxy_info(proxy_scheme, proxy_string):
def random_user_agent(choose=None, allow_ie=True):
from calibre.utils.random_ua import common_user_agents
ua_list = common_user_agents()
- ua_list = filter(lambda x: 'Mobile/' not in x, ua_list)
+ ua_list = list(filter(lambda x: 'Mobile/' not in x, ua_list))
if not allow_ie:
- ua_list = filter(lambda x: 'Trident/' not in x and 'Edge/' not in x, ua_list)
+ ua_list = list(filter(lambda x: 'Trident/' not in x and 'Edge/' not in x, ua_list))
return random.choice(ua_list) if choose is None else ua_list[choose]
diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py
index 0414e878ea..d6504520ea 100644
--- a/src/calibre/db/cache.py
+++ b/src/calibre/db/cache.py
@@ -11,7 +11,7 @@
from io import BytesIO
from collections import defaultdict, Set, MutableSet
from functools import wraps, partial
-from polyglot.builtins import iteritems, itervalues, unicode_type, zip, string_or_bytes, cmp
+from polyglot.builtins import iteritems, itervalues, unicode_type, zip, string_or_bytes, cmp, filter
from time import time
from calibre import isbytestring, as_unicode
diff --git a/src/calibre/db/restore.py b/src/calibre/db/restore.py
index 7db2ad78d1..e187ea559f 100644
--- a/src/calibre/db/restore.py
+++ b/src/calibre/db/restore.py
@@ -16,7 +16,7 @@
from calibre.constants import filesystem_encoding
from calibre.utils.date import utcfromtimestamp
from calibre import isbytestring, force_unicode
-from polyglot.builtins import iteritems
+from polyglot.builtins import iteritems, filter
NON_EBOOK_EXTENSIONS = frozenset([
'jpg', 'jpeg', 'gif', 'png', 'bmp',
@@ -184,7 +184,7 @@ def is_ebook_file(self, filename):
def process_dir(self, dirpath, filenames, book_id):
book_id = int(book_id)
- formats = filter(self.is_ebook_file, filenames)
+ formats = list(filter(self.is_ebook_file, filenames))
fmts = [os.path.splitext(x)[1][1:].upper() for x in formats]
sizes = [os.path.getsize(os.path.join(dirpath, x)) for x in formats]
names = [os.path.splitext(x)[0] for x in formats]
diff --git a/src/calibre/db/utils.py b/src/calibre/db/utils.py
index d9d2b48893..657ed232ef 100644
--- a/src/calibre/db/utils.py
+++ b/src/calibre/db/utils.py
@@ -9,7 +9,7 @@
import os, errno, sys, re
from locale import localeconv
from collections import OrderedDict, namedtuple
-from polyglot.builtins import iteritems, itervalues, map, unicode_type, string_or_bytes
+from polyglot.builtins import iteritems, itervalues, map, unicode_type, string_or_bytes, filter
from threading import Lock
from calibre import as_unicode, prints
diff --git a/src/calibre/devices/winusb.py b/src/calibre/devices/winusb.py
index dd927e5df4..6b0809714c 100644
--- a/src/calibre/devices/winusb.py
+++ b/src/calibre/devices/winusb.py
@@ -15,7 +15,7 @@
)
from ctypes.wintypes import DWORD, WORD, ULONG, LPCWSTR, HWND, BOOL, LPWSTR, UINT, BYTE, HANDLE, USHORT
from pprint import pprint, pformat
-from polyglot.builtins import iteritems, itervalues, map
+from polyglot.builtins import iteritems, itervalues, map, filter
from calibre import prints, as_unicode
@@ -677,7 +677,7 @@ def get_volume_pathnames(volume_id, buf=None):
continue
raise
ans = wstring_at(buf, bufsize.value)
- return buf, filter(None, ans.split('\0'))
+ return buf, list(filter(None, ans.split('\0')))
# }}}
@@ -979,7 +979,7 @@ def initbuf(b):
if dtype != 0x03:
raise WindowsError('Invalid datatype for string descriptor: 0x%x' % dtype)
data = cast(data.String, POINTER(USHORT*(sz//2)))
- return buf, filter(None, data.contents)
+ return buf, list(filter(None, data.contents))
# }}}
diff --git a/src/calibre/ebooks/conversion/plugins/epub_output.py b/src/calibre/ebooks/conversion/plugins/epub_output.py
index ff2b9742e7..ec1a1fc540 100644
--- a/src/calibre/ebooks/conversion/plugins/epub_output.py
+++ b/src/calibre/ebooks/conversion/plugins/epub_output.py
@@ -12,7 +12,7 @@
OptionRecommendation)
from calibre.ptempfile import TemporaryDirectory
from calibre import CurrentDir
-from polyglot.builtins import unicode_type
+from polyglot.builtins import unicode_type, filter
block_level_tags = (
'address',
@@ -432,7 +432,7 @@ def workaround_ade_quirks(self): # {{{
br.tag = XHTML('p')
br.text = u'\u00a0'
style = br.get('style', '').split(';')
- style = filter(None, map(lambda x: x.strip(), style))
+ style = list(filter(None, map(lambda x: x.strip(), style)))
style.append('margin:0pt; border:0pt')
# If the prior tag is a block (including a
we replaced)
# then this
replacement should have a 1-line height.
diff --git a/src/calibre/ebooks/conversion/plugins/rtf_input.py b/src/calibre/ebooks/conversion/plugins/rtf_input.py
index 98059a3eca..f94ccc9ec4 100644
--- a/src/calibre/ebooks/conversion/plugins/rtf_input.py
+++ b/src/calibre/ebooks/conversion/plugins/rtf_input.py
@@ -5,7 +5,7 @@
import os, glob, re, textwrap
from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation
-from polyglot.builtins import iteritems
+from polyglot.builtins import iteritems, filter
border_style_map = {
'single' : 'solid',
diff --git a/src/calibre/ebooks/docx/index.py b/src/calibre/ebooks/docx/index.py
index 38220a1c86..1168d9ba2c 100644
--- a/src/calibre/ebooks/docx/index.py
+++ b/src/calibre/ebooks/docx/index.py
@@ -11,7 +11,7 @@
from lxml import etree
from calibre.utils.icu import partition_by_first_letter, sort_key
-from polyglot.builtins import iteritems, unicode_type
+from polyglot.builtins import iteritems, unicode_type, filter
def get_applicable_xe_fields(index, xe_fields, XPath, expand):
@@ -249,7 +249,7 @@ def polish_index_markup(index, blocks):
if a:
text = etree.tostring(a[0], method='text', with_tail=False, encoding=unicode_type).strip()
if ':' in text:
- path_map[block] = parts = filter(None, (x.strip() for x in text.split(':')))
+ path_map[block] = parts = list(filter(None, (x.strip() for x in text.split(':'))))
if len(parts) > 1:
split_up_block(block, a[0], text, parts, ldict)
else:
diff --git a/src/calibre/ebooks/docx/tables.py b/src/calibre/ebooks/docx/tables.py
index a6b5f8ef69..7351bb8098 100644
--- a/src/calibre/ebooks/docx/tables.py
+++ b/src/calibre/ebooks/docx/tables.py
@@ -10,7 +10,7 @@
from calibre.ebooks.docx.block_styles import inherit, read_shd as rs, read_border, binary_property, border_props, ParagraphStyle, border_to_css
from calibre.ebooks.docx.char_styles import RunStyle
-from polyglot.builtins import iteritems, itervalues, range
+from polyglot.builtins import iteritems, itervalues, range, filter
# Read from XML {{{
read_shd = rs
diff --git a/src/calibre/ebooks/docx/to_html.py b/src/calibre/ebooks/docx/to_html.py
index 85ab2554bc..c32258c4e5 100644
--- a/src/calibre/ebooks/docx/to_html.py
+++ b/src/calibre/ebooks/docx/to_html.py
@@ -29,7 +29,7 @@
from calibre.ebooks.docx.settings import Settings
from calibre.ebooks.metadata.opf2 import OPFCreator
from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1
-from polyglot.builtins import iteritems, itervalues
+from polyglot.builtins import iteritems, itervalues, filter
NBSP = '\xa0'
diff --git a/src/calibre/ebooks/docx/writer/styles.py b/src/calibre/ebooks/docx/writer/styles.py
index 272553f33d..3ea5cd6172 100644
--- a/src/calibre/ebooks/docx/writer/styles.py
+++ b/src/calibre/ebooks/docx/writer/styles.py
@@ -15,7 +15,7 @@
from calibre.ebooks import parse_css_length
from calibre.ebooks.docx.writer.utils import convert_color, int_or_zero
from calibre.utils.localization import lang_as_iso639_1
-from polyglot.builtins import iteritems, unicode_type
+from polyglot.builtins import iteritems, unicode_type, filter
from tinycss.css21 import CSS21Parser
css_parser = CSS21Parser()
@@ -702,7 +702,7 @@ def finalize(self, all_blocks):
counts[s] += sum(1 for b in blocks if not b.is_empty())
for i, heading_tag in enumerate(sorted(heading_styles)):
styles = sorted((smap[k] for k in heading_styles[heading_tag]), key=counts.__getitem__)
- styles = filter(lambda s:s.outline_level is None, styles)
+ styles = list(filter(lambda s:s.outline_level is None, styles))
if styles:
heading_style = styles[-1]
heading_style.outline_level = i
diff --git a/src/calibre/ebooks/epub/periodical.py b/src/calibre/ebooks/epub/periodical.py
index 8b39cfe681..b5943b7dff 100644
--- a/src/calibre/ebooks/epub/periodical.py
+++ b/src/calibre/ebooks/epub/periodical.py
@@ -11,7 +11,7 @@
from calibre.constants import __appname__, __version__
from calibre import strftime, prepare_string_for_xml as xml
from calibre.utils.date import parse_date
-from polyglot.builtins import unicode_type
+from polyglot.builtins import unicode_type, filter
SONY_METADATA = u'''\
diff --git a/src/calibre/ebooks/metadata/archive.py b/src/calibre/ebooks/metadata/archive.py
index 251b117bd3..5ff350858e 100644
--- a/src/calibre/ebooks/metadata/archive.py
+++ b/src/calibre/ebooks/metadata/archive.py
@@ -10,6 +10,7 @@
from contextlib import closing
from calibre.customize import FileTypePlugin
+from polyglot.builtins import filter
def is_comic(list_of_names):
diff --git a/src/calibre/ebooks/metadata/author_mapper.py b/src/calibre/ebooks/metadata/author_mapper.py
index d4e10d118b..9db1742a2c 100644
--- a/src/calibre/ebooks/metadata/author_mapper.py
+++ b/src/calibre/ebooks/metadata/author_mapper.py
@@ -8,6 +8,7 @@
from collections import deque
from calibre.utils.icu import capitalize, lower, upper
+from polyglot.builtins import filter
def cap_author_token(token):
@@ -142,7 +143,7 @@ def map_authors(authors, rules=()):
ans = []
for a in authors:
ans.extend(apply_rules(a, rules))
- return uniq(filter(None, ans))
+ return uniq(list(filter(None, ans)))
def find_tests():
diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py
index 0f5c3fd176..26bec6ab96 100644
--- a/src/calibre/ebooks/metadata/book/base.py
+++ b/src/calibre/ebooks/metadata/book/base.py
@@ -14,7 +14,7 @@
TOP_LEVEL_IDENTIFIERS, ALL_METADATA_FIELDS)
from calibre.library.field_metadata import FieldMetadata
from calibre.utils.icu import sort_key
-from polyglot.builtins import iteritems, unicode_type
+from polyglot.builtins import iteritems, unicode_type, filter
# Special sets used to optimize the performance of getting and setting
# attributes on Metadata objects
diff --git a/src/calibre/ebooks/metadata/book/render.py b/src/calibre/ebooks/metadata/book/render.py
index 2a19041903..88cc350916 100644
--- a/src/calibre/ebooks/metadata/book/render.py
+++ b/src/calibre/ebooks/metadata/book/render.py
@@ -20,7 +20,7 @@
from calibre.utils.date import is_date_undefined
from calibre.utils.localization import calibre_langcode_to_name
from calibre.utils.serialize import json_dumps
-from polyglot.builtins import unicode_type
+from polyglot.builtins import unicode_type, filter
from polyglot.binary import as_hex_unicode
default_sort = ('title', 'title_sort', 'authors', 'author_sort', 'series', 'rating', 'pubdate', 'tags', 'publisher', 'identifiers')
diff --git a/src/calibre/ebooks/metadata/kfx.py b/src/calibre/ebooks/metadata/kfx.py
index 17ccf21dbf..0b662346d6 100644
--- a/src/calibre/ebooks/metadata/kfx.py
+++ b/src/calibre/ebooks/metadata/kfx.py
@@ -18,7 +18,7 @@
from calibre.utils.date import parse_only_date
from calibre.utils.localization import canonicalize_lang
from calibre.utils.imghdr import identify
-from polyglot.builtins import unicode_type
+from polyglot.builtins import unicode_type, filter
from polyglot.binary import as_base64_bytes, from_base64_bytes
diff --git a/src/calibre/ebooks/metadata/opf3.py b/src/calibre/ebooks/metadata/opf3.py
index 26cde2b802..043207cd9d 100644
--- a/src/calibre/ebooks/metadata/opf3.py
+++ b/src/calibre/ebooks/metadata/opf3.py
@@ -8,7 +8,7 @@
import re
from collections import defaultdict, namedtuple
from functools import wraps
-from polyglot.builtins import iteritems, map
+from polyglot.builtins import iteritems, map, filter
from lxml import etree
@@ -411,7 +411,7 @@ def set_languages(root, prefixes, refines, languages):
val = (lang.text or '').strip()
if val:
opf_languages.append(val)
- languages = filter(lambda x: x and x != 'und', normalize_languages(opf_languages, languages))
+ languages = list(filter(lambda x: x and x != 'und', normalize_languages(opf_languages, languages)))
if not languages:
# EPUB spec says dc:language is required
languages = ['und']
@@ -688,7 +688,7 @@ def read_tags(root, prefixes, refines):
for dc in XPath('./opf:metadata/dc:subject')(root):
if dc.text:
ans.extend(map(normalize_whitespace, dc.text.split(',')))
- return uniq(filter(None, ans))
+ return uniq(list(filter(None, ans)))
def set_tags(root, prefixes, refines, val):
@@ -696,7 +696,7 @@ def set_tags(root, prefixes, refines, val):
remove_element(dc, refines)
m = XPath('./opf:metadata')(root)[0]
if val:
- val = uniq(filter(None, val))
+ val = uniq(list(filter(None, val)))
for x in val:
c = m.makeelement(DC('subject'))
c.text = normalize_whitespace(x)
diff --git a/src/calibre/ebooks/metadata/rtf.py b/src/calibre/ebooks/metadata/rtf.py
index 4361d5dc99..d208436256 100644
--- a/src/calibre/ebooks/metadata/rtf.py
+++ b/src/calibre/ebooks/metadata/rtf.py
@@ -11,7 +11,7 @@
from calibre import force_unicode
from calibre.ebooks.metadata import MetaInformation
-from polyglot.builtins import codepoint_to_chr, string_or_bytes, unicode_type, int_to_byte
+from polyglot.builtins import codepoint_to_chr, string_or_bytes, unicode_type, int_to_byte, filter
title_pat = re.compile(br'\{\\info.*?\{\\title(.*?)(?]+encoding\s*=\s*[\'"](.*?)[\'"][^<>]*>', re.IGNORECASE)
diff --git a/src/calibre/ebooks/mobi/debug/containers.py b/src/calibre/ebooks/mobi/debug/containers.py
index 8712831e4a..4776be3221 100644
--- a/src/calibre/ebooks/mobi/debug/containers.py
+++ b/src/calibre/ebooks/mobi/debug/containers.py
@@ -9,6 +9,7 @@
from struct import unpack_from
from calibre.ebooks.mobi.debug.headers import EXTHHeader
+from polyglot.builtins import filter
class ContainerHeader(object):
@@ -43,7 +44,7 @@ def __init__(self, data):
def add_hrefs(self, data):
# kindlegen inserts a trailing | after the last href
- self.hrefs = filter(None, data.decode('utf-8').split('|'))
+ self.hrefs = list(filter(None, data.decode('utf-8').split('|')))
def __str__(self):
ans = [('*'*10) + ' Container Header ' + ('*'*10)]
@@ -64,4 +65,3 @@ def __str__(self):
if len(self.bytes_after_exth) != self.null_bytes_after_exth:
a('Non-null bytes present after EXTH header!!!!')
return '\n'.join(ans) + '\n\n' + str(self.exth) + '\n\n' + ('Title: %s' % self.title)
-
diff --git a/src/calibre/ebooks/odt/input.py b/src/calibre/ebooks/odt/input.py
index abb2f18daf..e62c080e35 100644
--- a/src/calibre/ebooks/odt/input.py
+++ b/src/calibre/ebooks/odt/input.py
@@ -19,7 +19,7 @@
from calibre import CurrentDir, walk
from calibre.ebooks.oeb.base import _css_logger
-from polyglot.builtins import unicode_type, string_or_bytes
+from polyglot.builtins import unicode_type, string_or_bytes, filter
class Extract(ODF2XHTML):
@@ -129,8 +129,8 @@ def epubify_markup(self, root, log):
if (len(div1), len(div2)) != (1, 1):
continue
cls = div1.get('class', '')
- first_rules = filter(None, [self.get_css_for_class(x) for x in
- cls.split()])
+ first_rules = list(filter(None, [self.get_css_for_class(x) for x in
+ cls.split()]))
has_align = False
for r in first_rules:
if r.style.getProperty(u'text-align') is not None:
@@ -139,8 +139,8 @@ def epubify_markup(self, root, log):
if not has_align:
aval = None
cls = div2.get(u'class', u'')
- rules = filter(None, [self.get_css_for_class(x) for x in
- cls.split()])
+ rules = list(filter(None, [self.get_css_for_class(x) for x in
+ cls.split()]))
for r in rules:
ml = r.style.getPropertyCSSValue(u'margin-left') or ml
mr = r.style.getPropertyCSSValue(u'margin-right') or mr
diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py
index 35204efa6b..4cfcc07c08 100644
--- a/src/calibre/ebooks/oeb/base.py
+++ b/src/calibre/ebooks/oeb/base.py
@@ -22,7 +22,7 @@
namespace, XHTML, parse_html, NotHTML)
from calibre.utils.cleantext import clean_xml_chars
from calibre.utils.short_uuid import uuid4
-from polyglot.builtins import iteritems, unicode_type, string_or_bytes, range, itervalues
+from polyglot.builtins import iteritems, unicode_type, string_or_bytes, range, itervalues, filter
from polyglot.urllib import unquote, urldefrag, urljoin, urlparse, urlunparse
from calibre.utils.icu import numeric_sort_key
@@ -2008,7 +2008,7 @@ def rel_href(base_href, href):
return href
if '/' not in base_href:
return href
- base = filter(lambda x: x and x != '.', os.path.dirname(os.path.normpath(base_href)).replace(os.sep, '/').split('/'))
+ base = list(filter(lambda x: x and x != '.', os.path.dirname(os.path.normpath(base_href)).replace(os.sep, '/').split('/')))
while True:
try:
idx = base.index('..')
diff --git a/src/calibre/ebooks/oeb/polish/css.py b/src/calibre/ebooks/oeb/polish/css.py
index 2d52bc9af4..c6bdbdc7c9 100644
--- a/src/calibre/ebooks/oeb/polish/css.py
+++ b/src/calibre/ebooks/oeb/polish/css.py
@@ -18,7 +18,7 @@
from calibre.ebooks.oeb.polish.pretty import pretty_script_or_style, pretty_xml_tree, serialize
from calibre.utils.icu import numeric_sort_key
from css_selectors import Select, SelectorError
-from polyglot.builtins import iteritems, itervalues, unicode_type
+from polyglot.builtins import iteritems, itervalues, unicode_type, filter
def filter_used_rules(rules, log, select):
@@ -325,8 +325,7 @@ def remove_property_value(prop, predicate):
values of the property would be removed, the property is removed from its
parent instead. Note that this means the property must have a parent (a
CSSStyleDeclaration). '''
- removed_vals = []
- removed_vals = filter(predicate, prop.propertyValue)
+ removed_vals = list(filter(predicate, prop.propertyValue))
if len(removed_vals) == len(prop.propertyValue):
prop.parent.removeProperty(prop.name)
else:
diff --git a/src/calibre/ebooks/oeb/polish/fonts.py b/src/calibre/ebooks/oeb/polish/fonts.py
index d6e2443e4d..74a1f36978 100644
--- a/src/calibre/ebooks/oeb/polish/fonts.py
+++ b/src/calibre/ebooks/oeb/polish/fonts.py
@@ -9,7 +9,7 @@
from calibre.ebooks.oeb.polish.container import OEB_STYLES, OEB_DOCS
from calibre.ebooks.oeb.normalize_css import normalize_font
from tinycss.fonts3 import parse_font_family, parse_font, serialize_font_family, serialize_font
-from polyglot.builtins import iteritems
+from polyglot.builtins import iteritems, filter
def unquote(x):
@@ -68,7 +68,7 @@ def change_font_in_declaration(style, old_name, new_name=None):
ff = style.getProperty('font-family')
if ff is not None:
fams = parse_font_family(ff.propertyValue.cssText)
- nfams = filter(None, [new_name if x == old_name else x for x in fams])
+ nfams = list(filter(None, [new_name if x == old_name else x for x in fams]))
if fams != nfams:
if nfams:
ff.propertyValue.cssText = serialize_font_family(nfams)
@@ -79,7 +79,7 @@ def change_font_in_declaration(style, old_name, new_name=None):
if ff is not None:
props = parse_font(ff.propertyValue.cssText)
fams = props.get('font-family') or []
- nfams = filter(None, [new_name if x == old_name else x for x in fams])
+ nfams = list(filter(None, [new_name if x == old_name else x for x in fams]))
if fams != nfams:
props['font-family'] = nfams
if nfams:
diff --git a/src/calibre/ebooks/oeb/polish/spell.py b/src/calibre/ebooks/oeb/polish/spell.py
index 6d7fc5c53f..77dd4a6d34 100644
--- a/src/calibre/ebooks/oeb/polish/spell.py
+++ b/src/calibre/ebooks/oeb/polish/spell.py
@@ -17,7 +17,7 @@
from calibre.ebooks.oeb.polish.parsing import parse
from calibre.ebooks.oeb.polish.toc import find_existing_ncx_toc, find_existing_nav_toc
from calibre.utils.icu import ord_string
-from polyglot.builtins import iteritems, unicode_type
+from polyglot.builtins import iteritems, unicode_type, filter
_patterns = None
@@ -86,7 +86,7 @@ def get_words(text, lang):
ans = split_into_words(unicode_type(text), lang)
except (TypeError, ValueError):
return ()
- return filter(filter_words, ans)
+ return list(filter(filter_words, ans))
def add_words(text, node, words, file_name, locale, node_item):
diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py
index 4e496a7b49..595779ebd8 100644
--- a/src/calibre/ebooks/oeb/stylizer.py
+++ b/src/calibre/ebooks/oeb/stylizer.py
@@ -20,7 +20,7 @@
from calibre.ebooks.oeb.base import XHTML, XHTML_NS, CSS_MIME, OEB_STYLES, xpath, urlnormalize
from calibre.ebooks.oeb.normalize_css import DEFAULTS, normalizers
from css_selectors import Select, SelectorError, INAPPROPRIATE_PSEUDO_CLASSES
-from polyglot.builtins import iteritems, unicode_type
+from polyglot.builtins import iteritems, unicode_type, filter
from tinycss.media3 import CSSMedia3Parser
css_parser_log.setLevel(logging.WARN)
diff --git a/src/calibre/ebooks/rtf2xml/tokenize.py b/src/calibre/ebooks/rtf2xml/tokenize.py
index 1cb0608009..0158ffd39c 100755
--- a/src/calibre/ebooks/rtf2xml/tokenize.py
+++ b/src/calibre/ebooks/rtf2xml/tokenize.py
@@ -15,7 +15,7 @@
from calibre.ebooks.rtf2xml import copy
from calibre.utils.mreplace import MReplace
from calibre.ptempfile import better_mktemp
-from polyglot.builtins import codepoint_to_chr, range
+from polyglot.builtins import codepoint_to_chr, range, filter
class Tokenize:
@@ -124,7 +124,7 @@ def __sub_reg_split(self,input_file):
# split
tokens = re.split(self.__splitexp, input_file)
# remove empty tokens and \n
- return filter(lambda x: len(x) > 0 and x != '\n', tokens)
+ return list(filter(lambda x: len(x) > 0 and x != '\n', tokens))
def __compile_expressions(self):
SIMPLE_RPL = {
@@ -184,7 +184,7 @@ def tokenize(self):
# correct unicode
tokens = map(self.__unicode_process, tokens)
# remove empty items created by removing \uc
- tokens = filter(lambda x: len(x) > 0, tokens)
+ tokens = list(filter(lambda x: len(x) > 0, tokens))
# write
with open(self.__write_to, 'wb') as write_obj:
diff --git a/src/calibre/gui2/dialogs/add_from_isbn.py b/src/calibre/gui2/dialogs/add_from_isbn.py
index f8712dc49c..436d000c3b 100644
--- a/src/calibre/gui2/dialogs/add_from_isbn.py
+++ b/src/calibre/gui2/dialogs/add_from_isbn.py
@@ -15,7 +15,7 @@
from calibre.ebooks.metadata import check_isbn
from calibre.constants import iswindows
from calibre.gui2 import gprefs, question_dialog, error_dialog
-from polyglot.builtins import unicode_type
+from polyglot.builtins import unicode_type, filter
class AddFromISBN(QDialog):
diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py
index 6b82d69b37..19cec02a4d 100644
--- a/src/calibre/gui2/dialogs/metadata_bulk.py
+++ b/src/calibre/gui2/dialogs/metadata_bulk.py
@@ -32,7 +32,7 @@
from calibre.utils.icu import capitalize, sort_key
from calibre.utils.titlecase import titlecase
from calibre.gui2.widgets import LineEditECM
-from polyglot.builtins import iteritems, itervalues, unicode_type, error_message
+from polyglot.builtins import iteritems, itervalues, unicode_type, error_message, filter
Settings = namedtuple('Settings',
'remove_all remove add au aus do_aus rating pub do_series do_autonumber '
@@ -186,7 +186,7 @@ def read_file_metadata(self, args):
self.progress_next_step_range.emit(len(self.ids))
for book_id in self.ids:
fmts = db.formats(book_id, verify_formats=False)
- paths = filter(None, [db.format_abspath(book_id, fmt) for fmt in fmts])
+ paths = list(filter(None, [db.format_abspath(book_id, fmt) for fmt in fmts]))
if paths:
ret = worker(
'calibre.ebooks.metadata.worker', 'read_metadata_bulk',
diff --git a/src/calibre/gui2/dialogs/plugin_updater.py b/src/calibre/gui2/dialogs/plugin_updater.py
index b3a09de848..4d2844e891 100644
--- a/src/calibre/gui2/dialogs/plugin_updater.py
+++ b/src/calibre/gui2/dialogs/plugin_updater.py
@@ -24,7 +24,7 @@
from calibre.gui2.preferences.plugins import ConfigWidget
from calibre.utils.date import UNDEFINED_DATE, format_date
from calibre.utils.https import get_https_resource_securely
-from polyglot.builtins import itervalues, unicode_type
+from polyglot.builtins import itervalues, unicode_type, filter
SERVER = 'https://code.calibre-ebook.com/plugins/'
INDEX_URL = '%splugins.json.bz2' % SERVER
diff --git a/src/calibre/gui2/icon_theme.py b/src/calibre/gui2/icon_theme.py
index ad23b71af2..d6191ea373 100644
--- a/src/calibre/gui2/icon_theme.py
+++ b/src/calibre/gui2/icon_theme.py
@@ -35,7 +35,7 @@
from calibre.utils.zipfile import ZipFile, ZIP_STORED
from calibre.utils.filenames import atomic_rename
from lzma.xz import compress, decompress
-from polyglot.builtins import iteritems, map, range, reraise
+from polyglot.builtins import iteritems, map, range, reraise, filter
from polyglot import http_client
from polyglot.queue import Queue, Empty
diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py
index 03e0749b98..508bce45ad 100644
--- a/src/calibre/gui2/metadata/single.py
+++ b/src/calibre/gui2/metadata/single.py
@@ -31,7 +31,7 @@
from calibre.utils.localization import canonicalize_lang
from calibre.utils.date import local_tz
from calibre.library.comments import merge_comments as merge_two_comments
-from polyglot.builtins import iteritems, unicode_type
+from polyglot.builtins import iteritems, unicode_type, filter
BASE_TITLE = _('Edit Metadata')
fetched_fields = ('title', 'title_sort', 'authors', 'author_sort', 'series',
diff --git a/src/calibre/gui2/tag_mapper.py b/src/calibre/gui2/tag_mapper.py
index fc05cc6468..1993873b2e 100644
--- a/src/calibre/gui2/tag_mapper.py
+++ b/src/calibre/gui2/tag_mapper.py
@@ -20,7 +20,7 @@
from calibre.gui2.widgets2 import Dialog
from calibre.utils.config import JSONConfig
from calibre.utils.localization import localize_user_manual_link
-from polyglot.builtins import iteritems, unicode_type, range
+from polyglot.builtins import iteritems, unicode_type, range, filter
tag_maps = JSONConfig('tag-map-rules')
@@ -154,7 +154,7 @@ def specialise_context_menu(self, menu):
def edit_tags(self):
from calibre.gui2.dialogs.tag_editor import TagEditor
- d = TagEditor(self, get_gui().current_db, current_tags=filter(None, [x.strip() for x in self.query.text().split(',')]))
+ d = TagEditor(self, get_gui().current_db, current_tags=list(filter(None, [x.strip() for x in self.query.text().split(',')])))
if d.exec_() == d.Accepted:
self.query.setText(', '.join(d.tags))
diff --git a/src/calibre/gui2/tweak_book/file_list.py b/src/calibre/gui2/tweak_book/file_list.py
index 16857998db..5f3ac6d36b 100644
--- a/src/calibre/gui2/tweak_book/file_list.py
+++ b/src/calibre/gui2/tweak_book/file_list.py
@@ -38,7 +38,7 @@
from calibre.gui2.tweak_book.editor import syntax_from_mime
from calibre.gui2.tweak_book.templates import template_for
from calibre.utils.icu import numeric_sort_key
-from polyglot.builtins import iteritems, itervalues, unicode_type, range
+from polyglot.builtins import iteritems, itervalues, unicode_type, range, filter
from polyglot.binary import as_hex_unicode
try:
diff --git a/src/calibre/gui2/tweak_book/preview.py b/src/calibre/gui2/tweak_book/preview.py
index 45024ee6be..f66e58e9a1 100644
--- a/src/calibre/gui2/tweak_book/preview.py
+++ b/src/calibre/gui2/tweak_book/preview.py
@@ -8,7 +8,7 @@
import time, textwrap, json
from bisect import bisect_right
-from polyglot.builtins import map, unicode_type
+from polyglot.builtins import map, unicode_type, filter
from threading import Thread
from functools import partial
@@ -321,7 +321,7 @@ def atoi(x):
ans = None
return ans
val = self.mainFrame().evaluateJavaScript('window.calibre_preview_integration.line_numbers()')
- self._line_numbers = sorted(uniq(filter(lambda x:x is not None, map(atoi, val))))
+ self._line_numbers = sorted(uniq(list(filter(lambda x:x is not None, map(atoi, val)))))
return self._line_numbers
def go_to_line(self, lnum):
diff --git a/src/calibre/gui2/tweak_book/reports.py b/src/calibre/gui2/tweak_book/reports.py
index ee424b82cf..948356121d 100644
--- a/src/calibre/gui2/tweak_book/reports.py
+++ b/src/calibre/gui2/tweak_book/reports.py
@@ -8,7 +8,7 @@
import time, textwrap, os
from threading import Thread
-from polyglot.builtins import iteritems, map, range
+from polyglot.builtins import iteritems, map, range, filter
from operator import itemgetter
from functools import partial
from collections import defaultdict
@@ -166,7 +166,7 @@ def keyPressEvent(self, ev):
@property
def selected_locations(self):
- return filter(None, (self.proxy.sourceModel().location(self.proxy.mapToSource(index)) for index in self.selectionModel().selectedIndexes()))
+ return list(filter(None, (self.proxy.sourceModel().location(self.proxy.mapToSource(index)) for index in self.selectionModel().selectedIndexes())))
@property
def current_location(self):
diff --git a/src/calibre/gui2/tweak_book/search.py b/src/calibre/gui2/tweak_book/search.py
index 84f859e0cf..bb4598b4ac 100644
--- a/src/calibre/gui2/tweak_book/search.py
+++ b/src/calibre/gui2/tweak_book/search.py
@@ -34,7 +34,7 @@
from calibre.gui2.widgets2 import FlowLayout, HistoryComboBox
from calibre.utils.icu import primary_contains
from calibre.ebooks.conversion.search_replace import REGEX_FLAGS, compile_regular_expression
-from polyglot.builtins import iteritems, unicode_type, range, error_message
+from polyglot.builtins import iteritems, unicode_type, range, error_message, filter
# The search panel {{{
diff --git a/src/calibre/gui2/tweak_book/spell.py b/src/calibre/gui2/tweak_book/spell.py
index 130f2deac9..384357698e 100644
--- a/src/calibre/gui2/tweak_book/spell.py
+++ b/src/calibre/gui2/tweak_book/spell.py
@@ -37,7 +37,7 @@
from calibre.spell.break_iterator import split_into_words
from calibre.utils.localization import calibre_langcode_to_name, get_language, get_lang, canonicalize_lang
from calibre.utils.icu import sort_key, primary_sort_key, primary_contains, contains
-from polyglot.builtins import iteritems, unicode_type, range
+from polyglot.builtins import iteritems, unicode_type, range, filter
LANG = 0
COUNTRY = 1
@@ -720,7 +720,7 @@ def filter_item(self, x):
return True
def do_filter(self):
- self.items = filter(self.filter_item, self.words)
+ self.items = list(filter(self.filter_item, self.words))
def toggle_ignored(self, row):
w = self.word_for_row(row)
diff --git a/src/calibre/gui2/win_file_dialogs.py b/src/calibre/gui2/win_file_dialogs.py
index fffb39638a..194e211200 100644
--- a/src/calibre/gui2/win_file_dialogs.py
+++ b/src/calibre/gui2/win_file_dialogs.py
@@ -9,7 +9,7 @@
from uuid import uuid4
from PyQt5.Qt import pyqtSignal, QEventLoop, Qt
-from polyglot.builtins import string_or_bytes
+from polyglot.builtins import string_or_bytes, filter
is64bit = sys.maxsize > (1 << 32)
base = sys.extensions_location if hasattr(sys, 'new_app_layout') else os.path.dirname(sys.executable)
@@ -359,7 +359,7 @@ def test(helper=HELPER):
if server.err_msg is not None:
raise RuntimeError(server.err_msg)
server.join(2)
- parts = filter(None, server.data.split(b'\0'))
+ parts = list(filter(None, server.data.split(b'\0')))
if parts[0] != secret:
raise RuntimeError('Did not get back secret: %r != %r' % (secret, parts[0]))
q = parts[1].decode('utf-8')
diff --git a/src/calibre/library/catalogs/bibtex.py b/src/calibre/library/catalogs/bibtex.py
index 445e2e24c0..93ea6db277 100644
--- a/src/calibre/library/catalogs/bibtex.py
+++ b/src/calibre/library/catalogs/bibtex.py
@@ -14,7 +14,7 @@
from calibre.customize.conversion import DummyReporter
from calibre.constants import preferred_encoding
from calibre.ebooks.metadata import format_isbn
-from polyglot.builtins import string_or_bytes
+from polyglot.builtins import string_or_bytes, filter
class BIBTEX(CatalogPlugin):
@@ -384,7 +384,7 @@ def tpl_replace(objtplname) :
# check in book strict if all is ok else throw a warning into log
if bib_entry == 'book' :
- nb_books = len(filter(check_entry_book_valid, data))
+ nb_books = len(list(filter(check_entry_book_valid, data)))
if nb_books < nb_entries :
log.warn("Only %d entries in %d are book compatible" % (nb_books, nb_entries))
nb_entries = nb_books
diff --git a/src/calibre/library/check_library.py b/src/calibre/library/check_library.py
index 0b958c73d4..944f4af160 100644
--- a/src/calibre/library/check_library.py
+++ b/src/calibre/library/check_library.py
@@ -10,7 +10,7 @@
from calibre import isbytestring
from calibre.constants import filesystem_encoding
from calibre.ebooks import BOOK_EXTENSIONS
-from polyglot.builtins import iteritems
+from polyglot.builtins import iteritems, filter
EBOOK_EXTENSIONS = frozenset(BOOK_EXTENSIONS)
NORMALS = frozenset(['metadata.opf', 'cover.jpg'])
diff --git a/src/calibre/library/database.py b/src/calibre/library/database.py
index 8ce65a023e..1df3ce0064 100644
--- a/src/calibre/library/database.py
+++ b/src/calibre/library/database.py
@@ -12,7 +12,7 @@
from calibre.ebooks.metadata import string_to_authors
from calibre.utils.serialize import pickle_loads, pickle_dumps
from calibre import isbytestring
-from polyglot.builtins import unicode_type
+from polyglot.builtins import unicode_type, filter
class Concatenate(object):
@@ -1070,8 +1070,8 @@ def all_authors(self):
self.conn.get('SELECT id, name FROM authors')]
def all_author_names(self):
- return filter(None, [i[0].strip().replace('|', ',') for i in self.conn.get(
- 'SELECT name FROM authors')])
+ return list(filter(None, [i[0].strip().replace('|', ',') for i in self.conn.get(
+ 'SELECT name FROM authors')]))
def all_publishers(self):
return [(i[0], i[1]) for i in
diff --git a/src/calibre/library/restore.py b/src/calibre/library/restore.py
index 153d005dd1..47df5d20a4 100644
--- a/src/calibre/library/restore.py
+++ b/src/calibre/library/restore.py
@@ -16,7 +16,7 @@
from calibre.constants import filesystem_encoding
from calibre.utils.date import utcfromtimestamp
from calibre import isbytestring
-from polyglot.builtins import iteritems
+from polyglot.builtins import iteritems, filter
NON_EBOOK_EXTENSIONS = frozenset([
'jpg', 'jpeg', 'gif', 'png', 'bmp',
@@ -174,7 +174,7 @@ def is_ebook_file(self, filename):
def process_dir(self, dirpath, filenames, book_id):
book_id = int(book_id)
- formats = filter(self.is_ebook_file, filenames)
+ formats = list(filter(self.is_ebook_file, filenames))
fmts = [os.path.splitext(x)[1][1:].upper() for x in formats]
sizes = [os.path.getsize(os.path.join(dirpath, x)) for x in formats]
names = [os.path.splitext(x)[0] for x in formats]
diff --git a/src/calibre/spell/dictionary.py b/src/calibre/spell/dictionary.py
index 5086dc08b4..aab81ad1ab 100644
--- a/src/calibre/spell/dictionary.py
+++ b/src/calibre/spell/dictionary.py
@@ -18,7 +18,7 @@
from calibre.utils.config import JSONConfig
from calibre.utils.icu import capitalize
from calibre.utils.localization import get_lang, get_system_locale
-from polyglot.builtins import iteritems, itervalues, unicode_type
+from polyglot.builtins import iteritems, itervalues, unicode_type, filter
Dictionary = namedtuple('Dictionary', 'primary_locale locales dicpath affpath builtin name id')
LoadedDictionary = namedtuple('Dictionary', 'primary_locale locales obj builtin name id')
diff --git a/src/calibre/srv/handler.py b/src/calibre/srv/handler.py
index abf609f404..5e536fbb57 100644
--- a/src/calibre/srv/handler.py
+++ b/src/calibre/srv/handler.py
@@ -15,7 +15,7 @@
from calibre.srv.users import UserManager
from calibre.utils.date import utcnow
from calibre.utils.search_query_parser import ParseException
-from polyglot.builtins import itervalues
+from polyglot.builtins import itervalues, filter
class Context(object):
diff --git a/src/calibre/srv/http_request.py b/src/calibre/srv/http_request.py
index 376139cc58..c0e87d252c 100644
--- a/src/calibre/srv/http_request.py
+++ b/src/calibre/srv/http_request.py
@@ -16,7 +16,7 @@
from calibre.srv.utils import MultiDict, HTTP1, HTTP11, Accumulator
from polyglot import http_client, reprlib
from polyglot.urllib import unquote
-from polyglot.builtins import error_message
+from polyglot.builtins import error_message, filter
protocol_map = {(1, 0):HTTP1, (1, 1):HTTP11}
quoted_slash = re.compile(br'%2[fF]')
diff --git a/src/calibre/srv/legacy.py b/src/calibre/srv/legacy.py
index 197d56ac18..3fd1f82afa 100644
--- a/src/calibre/srv/legacy.py
+++ b/src/calibre/srv/legacy.py
@@ -19,7 +19,7 @@
from calibre.srv.utils import get_library_data, http_date
from calibre.utils.cleantext import clean_xml_chars
from calibre.utils.date import dt_as_local, is_date_undefined, timestampfromdt
-from polyglot.builtins import iteritems, string_or_bytes
+from polyglot.builtins import iteritems, string_or_bytes, filter
from polyglot.urllib import urlencode
# /mobile {{{
diff --git a/src/calibre/srv/manage_users_cli.py b/src/calibre/srv/manage_users_cli.py
index 31423e594b..83ea0e17e3 100644
--- a/src/calibre/srv/manage_users_cli.py
+++ b/src/calibre/srv/manage_users_cli.py
@@ -9,7 +9,7 @@
from calibre import prints
from calibre.constants import preferred_encoding
-from polyglot.builtins import iteritems, raw_input
+from polyglot.builtins import iteritems, raw_input, filter
# Manage users CLI {{{
@@ -175,7 +175,7 @@ def change_restriction(username):
pass
else:
names = get_input(_('Enter a comma separated list of library names:'))
- names = filter(None, [x.strip() for x in names.split(',')])
+ names = list(filter(None, [x.strip() for x in names.split(',')]))
w = 'allowed_library_names' if c == 1 else 'blocked_library_names'
t = _('Allowing access only to libraries: {}') if c == 1 else _(
'Allowing access to all libraries, except: {}')
diff --git a/src/calibre/srv/metadata.py b/src/calibre/srv/metadata.py
index 2e28cf7786..6d7bf56573 100644
--- a/src/calibre/srv/metadata.py
+++ b/src/calibre/srv/metadata.py
@@ -22,7 +22,7 @@
from calibre.utils.localization import calibre_langcode_to_name
from calibre.library.comments import comments_to_html, markdown
from calibre.library.field_metadata import category_icon_map
-from polyglot.builtins import iteritems, itervalues, range
+from polyglot.builtins import iteritems, itervalues, range, filter
from polyglot.urllib import quote
IGNORED_FIELDS = frozenset('cover ondevice path marked au_map size'.split())
@@ -304,7 +304,7 @@ def build_first_letter_list(category_items):
def get_name_components(name):
- components = filter(None, [t.strip() for t in name.split('.')])
+ components = list(filter(None, [t.strip() for t in name.split('.')]))
if not components or '.'.join(components) != name:
components = [name]
return components
@@ -533,9 +533,9 @@ def render_categories(opts, db, category_data):
if opts.hidden_categories:
# We have to remove hidden categories after all processing is done as
# items from a hidden category could be in a user category
- root['children'] = filter((lambda child:items[child['id']]['category'] not in opts.hidden_categories), root['children'])
+ root['children'] = list(filter((lambda child:items[child['id']]['category'] not in opts.hidden_categories), root['children']))
if opts.hide_empty_categories:
- root['children'] = filter((lambda child:items[child['id']]['count'] > 0), root['children'])
+ root['children'] = list(filter((lambda child:items[child['id']]['count'] > 0), root['children']))
return {'root':root, 'item_map': items}
diff --git a/src/calibre/srv/opds.py b/src/calibre/srv/opds.py
index 1166a151ed..91c4b7fe98 100644
--- a/src/calibre/srv/opds.py
+++ b/src/calibre/srv/opds.py
@@ -26,7 +26,7 @@
from calibre.srv.errors import HTTPNotFound, HTTPInternalServerError
from calibre.srv.routes import endpoint
from calibre.srv.utils import get_library_data, http_date, Offsets
-from polyglot.builtins import iteritems, unicode_type
+from polyglot.builtins import iteritems, unicode_type, filter
from polyglot.urllib import urlencode
from polyglot.binary import as_hex_unicode, from_hex_unicode
diff --git a/src/calibre/srv/routes.py b/src/calibre/srv/routes.py
index 621b412c6c..12698c5921 100644
--- a/src/calibre/srv/routes.py
+++ b/src/calibre/srv/routes.py
@@ -12,7 +12,7 @@
from calibre.srv.errors import HTTPSimpleResponse, HTTPNotFound, RouteError
from calibre.srv.utils import http_date
from calibre.utils.serialize import msgpack_dumps, json_dumps, MSGPACK_MIME
-from polyglot.builtins import iteritems, itervalues, unicode_type, range, zip
+from polyglot.builtins import iteritems, itervalues, unicode_type, range, zip, filter
from polyglot import http_client
from polyglot.urllib import quote as urlquote
@@ -114,7 +114,7 @@ def __init__(self, endpoint_):
del endpoint_
if not self.endpoint.route.startswith('/'):
raise RouteError('A route must start with /, %s does not' % self.endpoint.route)
- parts = filter(None, self.endpoint.route.split('/'))
+ parts = list(filter(None, self.endpoint.route.split('/')))
matchers = self.matchers = []
self.defaults = {}
found_optional_part = False
diff --git a/src/calibre/srv/tests/routes.py b/src/calibre/srv/tests/routes.py
index ca735897bc..ab4aa93f2e 100644
--- a/src/calibre/srv/tests/routes.py
+++ b/src/calibre/srv/tests/routes.py
@@ -8,7 +8,7 @@
import os
from calibre.srv.tests.base import BaseTest
-from polyglot.builtins import itervalues
+from polyglot.builtins import itervalues, filter
class TestRouter(BaseTest):
@@ -53,7 +53,7 @@ def test_route_finding(self):
router = Router()
def find(path):
- path = filter(None, path.split('/'))
+ path = list(filter(None, path.split('/')))
ep, args = router.find_route(path)
args = list(args)
return ep, args
diff --git a/src/calibre/utils/cleantext.py b/src/calibre/utils/cleantext.py
index f8ba151de3..7069dac39f 100644
--- a/src/calibre/utils/cleantext.py
+++ b/src/calibre/utils/cleantext.py
@@ -3,7 +3,7 @@
__docformat__ = 'restructuredtext en'
import re
-from polyglot.builtins import codepoint_to_chr, map, range
+from polyglot.builtins import codepoint_to_chr, map, range, filter
from polyglot.html_entities import name2codepoint
from calibre.constants import plugins, preferred_encoding
diff --git a/src/calibre/utils/fonts/scanner.py b/src/calibre/utils/fonts/scanner.py
index f97fc03f84..6e96fe6063 100644
--- a/src/calibre/utils/fonts/scanner.py
+++ b/src/calibre/utils/fonts/scanner.py
@@ -16,7 +16,7 @@
isworker, filesystem_encoding)
from calibre.utils.fonts.metadata import FontMetadata, UnsupportedFont
from calibre.utils.icu import sort_key
-from polyglot.builtins import itervalues, unicode_type
+from polyglot.builtins import itervalues, unicode_type, filter
class NoFonts(ValueError):
@@ -281,7 +281,7 @@ def filter_faces(font):
return False
for family in self.find_font_families():
- faces = filter(filter_faces, self.fonts_for_family(family))
+ faces = list(filter(filter_faces, self.fonts_for_family(family)))
if not faces:
continue
generic_family = panose_to_css_generic_family(faces[0]['panose'])
diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py
index 7290a921b8..470becc674 100644
--- a/src/calibre/utils/icu.py
+++ b/src/calibre/utils/icu.py
@@ -8,6 +8,7 @@
__docformat__ = 'restructuredtext en'
import sys
+from polyglot.builtins import filter
is_narrow_build = sys.maxunicode < 0x10ffff
diff --git a/src/calibre/utils/matcher.py b/src/calibre/utils/matcher.py
index 20e1cc9135..bcd2792a08 100644
--- a/src/calibre/utils/matcher.py
+++ b/src/calibre/utils/matcher.py
@@ -16,7 +16,7 @@
from calibre import detect_ncpus as cpu_count, as_unicode
from calibre.constants import plugins, filesystem_encoding
from calibre.utils.icu import primary_sort_key, primary_find, primary_collator
-from polyglot.builtins import iteritems, itervalues, map, unicode_type, range, zip, raw_input
+from polyglot.builtins import iteritems, itervalues, map, unicode_type, range, zip, raw_input, filter
from polyglot.queue import Queue
DEFAULT_LEVEL1 = '/'
diff --git a/src/calibre/utils/open_with/windows.py b/src/calibre/utils/open_with/windows.py
index be4d08a482..3d277d9f19 100644
--- a/src/calibre/utils/open_with/windows.py
+++ b/src/calibre/utils/open_with/windows.py
@@ -16,6 +16,7 @@
from calibre import prints
from calibre.gui2 import must_use_qt
from calibre.utils.winreg.default_programs import split_commandline
+from polyglot.builtins import filter
ICON_SIZE = 64
diff --git a/src/calibre/utils/rapydscript.py b/src/calibre/utils/rapydscript.py
index 4c73700ab8..297374ecc5 100644
--- a/src/calibre/utils/rapydscript.py
+++ b/src/calibre/utils/rapydscript.py
@@ -22,7 +22,7 @@
from calibre.utils.terminal import ANSIStream
from duktape import Context, JSError, to_python
from lzma.xz import compress, decompress
-from polyglot.builtins import itervalues, range, exec_path, raw_input, error_message
+from polyglot.builtins import itervalues, range, exec_path, raw_input, error_message, filter
from polyglot.queue import Empty, Queue
COMPILER_PATH = 'rapydscript/compiler.js.xz'
@@ -395,8 +395,8 @@ def __call__(self):
def completer(text, num):
if self.completions is None:
self.to_repl.put(('complete', text))
- self.completions = filter(None, self.get_from_repl())
- if self.completions is None:
+ self.completions = list(filter(None, self.get_from_repl()))
+ if not self.completions:
return None
try:
return self.completions[num]