diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index a19abf77d0..638eac538b 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -22,6 +22,7 @@ from calibre.startup import initialize_calibre initialize_calibre() from calibre.utils.icu import safe_chr from calibre.prints import prints +from calibre.utils.resources import get_path as P if False: # Prevent pyflakes from complaining diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index 19b941dd1d..f8d2b7ab09 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -20,7 +20,7 @@ from functools import partial from calibre import as_unicode, force_unicode, isbytestring, prints from calibre.constants import ( - filesystem_encoding, iswindows, plugins, preferred_encoding + filesystem_encoding, iswindows, plugins, preferred_encoding, ) from calibre.db import SPOOL_SIZE, FTSQueryError from calibre.db.annotations import annot_db_data, unicode_normalize @@ -29,7 +29,7 @@ from calibre.db.errors import NoSuchFormat from calibre.db.schema_upgrades import SchemaUpgrade from calibre.db.tables import ( AuthorsTable, CompositeTable, FormatsTable, IdentifiersTable, ManyToManyTable, - ManyToOneTable, OneToOneTable, PathTable, RatingTable, SizeTable, UUIDTable + ManyToOneTable, OneToOneTable, PathTable, RatingTable, SizeTable, UUIDTable, ) from calibre.ebooks.metadata import author_to_author_sort, title_sort from calibre.library.field_metadata import FieldMetadata @@ -40,15 +40,16 @@ from calibre.utils.date import EPOCH, parse_date, utcfromtimestamp, utcnow from calibre.utils.filenames import ( WindowsAtomicFolderMove, ascii_filename, atomic_rename, copyfile_using_links, copytree_using_links, hardlink_file, is_case_sensitive, is_fat_filesystem, - remove_dir_if_empty, samefile + remove_dir_if_empty, samefile, ) from calibre.utils.formatter_functions import ( - compile_user_template_functions, formatter_functions, - load_user_template_functions, unload_user_template_functions + compile_user_template_functions, formatter_functions, load_user_template_functions, + unload_user_template_functions, ) from calibre.utils.icu import sort_key +from calibre.utils.resources import get_path as P from polyglot.builtins import ( - cmp, iteritems, itervalues, native_string_type, reraise, string_or_bytes + cmp, iteritems, itervalues, native_string_type, reraise, string_or_bytes, ) # }}} diff --git a/src/calibre/db/fts/schema_upgrade.py b/src/calibre/db/fts/schema_upgrade.py index 3ed9fd7837..5a31156cc2 100644 --- a/src/calibre/db/fts/schema_upgrade.py +++ b/src/calibre/db/fts/schema_upgrade.py @@ -2,6 +2,8 @@ # vim:fileencoding=utf-8 # License: GPL v3 Copyright: 2022, Kovid Goyal +from calibre.utils.resources import get_path as P + class SchemaUpgrade: diff --git a/src/calibre/ebooks/conversion/plugins/fb2_input.py b/src/calibre/ebooks/conversion/plugins/fb2_input.py index cccd6fa4a7..dae3137270 100644 --- a/src/calibre/ebooks/conversion/plugins/fb2_input.py +++ b/src/calibre/ebooks/conversion/plugins/fb2_input.py @@ -3,10 +3,12 @@ __copyright__ = '2008, Anatoly Shipitsin ' """ Convert .fb2 files to .lrf """ -import os, re +import os +import re -from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation from calibre import guess_type +from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems FB2NS = 'http://www.gribuser.ru/xml/fictionbook/2.0' @@ -37,12 +39,13 @@ class FB2Input(InputFormatPlugin): def convert(self, stream, options, file_ext, log, accelerators): from lxml import etree - from calibre.utils.xml_parse import safe_xml_fromstring - from calibre.ebooks.metadata.fb2 import ensure_namespace, get_fb2_data - from calibre.ebooks.metadata.opf2 import OPFCreator - from calibre.ebooks.metadata.meta import get_metadata - from calibre.ebooks.oeb.base import XLINK_NS, XHTML_NS + from calibre.ebooks.chardet import xml_to_unicode + from calibre.ebooks.metadata.fb2 import ensure_namespace, get_fb2_data + from calibre.ebooks.metadata.meta import get_metadata + from calibre.ebooks.metadata.opf2 import OPFCreator + from calibre.ebooks.oeb.base import XHTML_NS, XLINK_NS + from calibre.utils.xml_parse import safe_xml_fromstring self.log = log log.debug('Parsing XML...') raw = get_fb2_data(stream)[0] @@ -68,7 +71,8 @@ class FB2Input(InputFormatPlugin): css += etree.tostring(s, encoding='unicode', method='text', with_tail=False) + '\n\n' if css: - import css_parser, logging + import css_parser + import logging parser = css_parser.CSSParser(fetcher=None, log=logging.getLogger('calibre.css')) diff --git a/src/calibre/ebooks/conversion/plugins/html_output.py b/src/calibre/ebooks/conversion/plugins/html_output.py index 1694ef29ef..d8e2f1880e 100644 --- a/src/calibre/ebooks/conversion/plugins/html_output.py +++ b/src/calibre/ebooks/conversion/plugins/html_output.py @@ -2,12 +2,15 @@ __license__ = 'GPL 3' __copyright__ = '2010, Fabian Grassl ' __docformat__ = 'restructuredtext en' -import os, re, shutil -from os.path import dirname, abspath, relpath as _relpath, exists, basename +import os +import re +import shutil +from os.path import abspath, basename, dirname, exists, relpath as _relpath -from calibre.customize.conversion import OutputFormatPlugin, OptionRecommendation from calibre import CurrentDir +from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin from calibre.ptempfile import PersistentTemporaryDirectory +from calibre.utils.resources import get_path as P def relpath(*args): @@ -45,10 +48,10 @@ class HTMLOutput(OutputFormatPlugin): Generate table of contents ''' from lxml import etree - from polyglot.urllib import unquote from calibre.ebooks.oeb.base import element from calibre.utils.cleantext import clean_xml_chars + from polyglot.urllib import unquote with CurrentDir(output_dir): def build_node(current_node, parent=None): if parent is None: @@ -82,10 +85,11 @@ class HTMLOutput(OutputFormatPlugin): def convert(self, oeb_book, output_path, input_plugin, opts, log): from lxml import etree - from calibre.utils import zipfile - from templite import Templite - from polyglot.urllib import unquote + from calibre.ebooks.html.meta import EasyMeta + from calibre.utils import zipfile + from polyglot.urllib import unquote + from templite import Templite # read template files if opts.template_html_index is not None: @@ -193,6 +197,7 @@ class HTMLOutput(OutputFormatPlugin): # render template templite = Templite(template_html_data) + def toc(): return self.generate_html_toc(oeb_book, path, output_dir) t = templite.render(ebookContent=ebook_content, diff --git a/src/calibre/ebooks/conversion/plugins/lrf_input.py b/src/calibre/ebooks/conversion/plugins/lrf_input.py index bd2ab4ecd7..650a105171 100644 --- a/src/calibre/ebooks/conversion/plugins/lrf_input.py +++ b/src/calibre/ebooks/conversion/plugins/lrf_input.py @@ -7,6 +7,7 @@ __docformat__ = 'restructuredtext en' import os, sys from calibre.customize.conversion import InputFormatPlugin +from calibre.utils.resources import get_path as P class LRFInput(InputFormatPlugin): diff --git a/src/calibre/ebooks/conversion/plugins/rtf_input.py b/src/calibre/ebooks/conversion/plugins/rtf_input.py index 3db7518ab2..4651bfe89a 100644 --- a/src/calibre/ebooks/conversion/plugins/rtf_input.py +++ b/src/calibre/ebooks/conversion/plugins/rtf_input.py @@ -1,10 +1,14 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import os, glob, re, textwrap +import glob +import os +import re +import textwrap from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation -from polyglot.builtins import iteritems, as_bytes +from calibre.utils.resources import get_path as P +from polyglot.builtins import as_bytes, iteritems border_style_map = { 'single' : 'solid', @@ -116,8 +120,9 @@ class RTFInput(InputFormatPlugin): return f.read() def extract_images(self, picts): - from calibre.utils.imghdr import what from binascii import unhexlify + + from calibre.utils.imghdr import what self.log('Extracting images...') with open(picts, 'rb') as f: @@ -246,6 +251,7 @@ class RTFInput(InputFormatPlugin): def convert(self, stream, options, file_ext, log, accelerators): from lxml import etree + from calibre.ebooks.metadata.meta import get_metadata from calibre.ebooks.metadata.opf2 import OPFCreator from calibre.ebooks.rtf2xml.ParseRtf import RtfInvalidCodeException diff --git a/src/calibre/ebooks/lrf/fonts.py b/src/calibre/ebooks/lrf/fonts.py index 7da59cae0b..eafc65b95f 100644 --- a/src/calibre/ebooks/lrf/fonts.py +++ b/src/calibre/ebooks/lrf/fonts.py @@ -25,6 +25,7 @@ def get_font(name, size, encoding='unic'): @param encoding: Font encoding to use. E.g. 'unic', 'symbol', 'ADOB', 'ADBE', 'aprm' @param manager: A dict that will store the PersistentTemporary ''' + from calibre.utils.resources import get_path as P if name in LIBERATION_FONT_MAP: return ImageFont.truetype(P('fonts/liberation/%s.ttf' % LIBERATION_FONT_MAP[name]), size, encoding=encoding) elif name in FONT_FILE_MAP: diff --git a/src/calibre/ebooks/lrf/input.py b/src/calibre/ebooks/lrf/input.py index 08224595f0..d14def7d79 100644 --- a/src/calibre/ebooks/lrf/input.py +++ b/src/calibre/ebooks/lrf/input.py @@ -5,9 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import textwrap, operator -from copy import deepcopy, copy - +import operator +import textwrap +from copy import copy, deepcopy from lxml import etree from calibre import guess_type diff --git a/src/calibre/ebooks/oeb/polish/cascade.py b/src/calibre/ebooks/oeb/polish/cascade.py index 6a18120338..5f71b31074 100644 --- a/src/calibre/ebooks/oeb/polish/cascade.py +++ b/src/calibre/ebooks/oeb/polish/cascade.py @@ -2,22 +2,22 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal +import re from collections import defaultdict, namedtuple +from css_parser.css import CSSRule, CSSStyleSheet, Property from functools import partial from itertools import count from operator import itemgetter -import re -from css_parser.css import CSSStyleSheet, CSSRule, Property - -from css_selectors import Select, INAPPROPRIATE_PSEUDO_CLASSES, SelectorError from calibre import as_unicode from calibre.ebooks.css_transform_rules import all_properties from calibre.ebooks.oeb.base import OEB_STYLES, XHTML, css_text -from calibre.ebooks.oeb.normalize_css import normalizers, DEFAULTS -from calibre.ebooks.oeb.stylizer import media_ok, INHERITED -from tinycss.fonts3 import serialize_font_family, parse_font_family +from calibre.ebooks.oeb.normalize_css import DEFAULTS, normalizers +from calibre.ebooks.oeb.stylizer import INHERITED, media_ok +from calibre.utils.resources import get_path as P +from css_selectors import INAPPROPRIATE_PSEUDO_CLASSES, Select, SelectorError from polyglot.builtins import iteritems, itervalues +from tinycss.fonts3 import parse_font_family, serialize_font_family _html_css_stylesheet = None diff --git a/src/calibre/ebooks/oeb/polish/check/css.py b/src/calibre/ebooks/oeb/polish/check/css.py index 7aa3aac121..f910c47e92 100644 --- a/src/calibre/ebooks/oeb/polish/check/css.py +++ b/src/calibre/ebooks/oeb/polish/check/css.py @@ -7,15 +7,13 @@ import numbers import sys from collections import namedtuple from itertools import repeat - from qt.core import QApplication, QEventLoop, pyqtSignal, sip -from qt.webengine import ( - QWebEnginePage, QWebEngineProfile, QWebEngineScript -) +from qt.webengine import QWebEnginePage, QWebEngineProfile, QWebEngineScript from calibre import detect_ncpus as cpu_count, prints from calibre.ebooks.oeb.polish.check.base import ERROR, WARN, BaseError from calibre.gui2 import must_use_qt +from calibre.utils.resources import get_path as P from calibre.utils.webengine import secure_webengine, setup_profile diff --git a/src/calibre/ebooks/oeb/polish/create.py b/src/calibre/ebooks/oeb/polish/create.py index 470bd8f7b0..9645aa71b9 100644 --- a/src/calibre/ebooks/oeb/polish/create.py +++ b/src/calibre/ebooks/oeb/polish/create.py @@ -4,23 +4,24 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import sys, os - +import os +import sys from lxml import etree -from calibre import prepare_string_for_xml, CurrentDir -from calibre.ptempfile import TemporaryDirectory -from calibre.ebooks.oeb.base import serialize +from calibre import CurrentDir, prepare_string_for_xml from calibre.ebooks.metadata import authors_to_string from calibre.ebooks.metadata.opf2 import metadata_to_opf +from calibre.ebooks.oeb.base import serialize +from calibre.ebooks.oeb.polish.container import OPF_NAMESPACES, Container, opf_to_azw3 from calibre.ebooks.oeb.polish.parsing import parse -from calibre.ebooks.oeb.polish.container import OPF_NAMESPACES, opf_to_azw3, Container -from calibre.ebooks.oeb.polish.utils import guess_type -from calibre.ebooks.oeb.polish.pretty import pretty_xml_tree, pretty_html_tree +from calibre.ebooks.oeb.polish.pretty import pretty_html_tree, pretty_xml_tree from calibre.ebooks.oeb.polish.toc import TOC, create_ncx +from calibre.ebooks.oeb.polish.utils import guess_type +from calibre.ptempfile import TemporaryDirectory from calibre.utils.localization import lang_as_iso639_1 from calibre.utils.logging import DevNull -from calibre.utils.zipfile import ZipFile, ZIP_STORED +from calibre.utils.resources import get_path as P +from calibre.utils.zipfile import ZIP_STORED, ZipFile from polyglot.builtins import as_bytes valid_empty_formats = {'epub', 'txt', 'docx', 'azw3', 'md'} diff --git a/src/calibre/ebooks/oeb/polish/tests/base.py b/src/calibre/ebooks/oeb/polish/tests/base.py index 6684d33627..fb68c038ac 100644 --- a/src/calibre/ebooks/oeb/polish/tests/base.py +++ b/src/calibre/ebooks/oeb/polish/tests/base.py @@ -4,13 +4,15 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import os, unittest, shutil +import os +import shutil +import unittest -from calibre import CurrentDir -from calibre.ptempfile import TemporaryDirectory -from calibre.ptempfile import PersistentTemporaryDirectory -from calibre.utils.logging import DevNull import calibre.ebooks.oeb.polish.container as pc +from calibre import CurrentDir +from calibre.ptempfile import PersistentTemporaryDirectory, TemporaryDirectory +from calibre.utils.logging import DevNull +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/oeb/polish/tests/container.py b/src/calibre/ebooks/oeb/polish/tests/container.py index b84f9973ac..597ff2c297 100644 --- a/src/calibre/ebooks/oeb/polish/tests/container.py +++ b/src/calibre/ebooks/oeb/polish/tests/container.py @@ -4,16 +4,22 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import os, subprocess +import os +import subprocess from zipfile import ZipFile from calibre import CurrentDir -from calibre.ebooks.oeb.polish.tests.base import BaseTest, get_simple_book, get_split_book -from calibre.ebooks.oeb.polish.container import get_container as _gc, clone_container, OCF_NS -from calibre.ebooks.oeb.polish.replace import rename_files, rationalize_folders -from calibre.ebooks.oeb.polish.split import split, merge +from calibre.ebooks.oeb.polish.container import ( + OCF_NS, clone_container, get_container as _gc, +) +from calibre.ebooks.oeb.polish.replace import rationalize_folders, rename_files +from calibre.ebooks.oeb.polish.split import merge, split +from calibre.ebooks.oeb.polish.tests.base import ( + BaseTest, get_simple_book, get_split_book, +) +from calibre.ptempfile import TemporaryDirectory, TemporaryFile from calibre.utils.filenames import nlinks_file -from calibre.ptempfile import TemporaryFile, TemporaryDirectory +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems, itervalues @@ -193,7 +199,9 @@ class ContainerTests(BaseTest): def test_actual_case(self): ' Test getting the actual case for files from names on case insensitive filesystems ' - from calibre.ebooks.oeb.polish.utils import actual_case_for_name, corrected_case_for_name + from calibre.ebooks.oeb.polish.utils import ( + actual_case_for_name, corrected_case_for_name, + ) book = get_simple_book() c = get_container(book) name = 'f1/f2/added file.html' diff --git a/src/calibre/ebooks/oeb/polish/toc.py b/src/calibre/ebooks/oeb/polish/toc.py index 8dbe2cebc6..a6f51ea1b0 100644 --- a/src/calibre/ebooks/oeb/polish/toc.py +++ b/src/calibre/ebooks/oeb/polish/toc.py @@ -8,20 +8,22 @@ __docformat__ = 'restructuredtext en' import re from collections import Counter, OrderedDict from functools import partial -from operator import itemgetter - from lxml import etree from lxml.builder import ElementMaker +from operator import itemgetter from calibre import __version__ from calibre.ebooks.oeb.base import ( - XPath, uuid_id, xml2text, NCX, NCX_NS, XML, XHTML, XHTML_NS, serialize, EPUB_NS, XML_NS, OEB_DOCS) + EPUB_NS, NCX, NCX_NS, OEB_DOCS, XHTML, XHTML_NS, XML, XML_NS, XPath, serialize, + uuid_id, xml2text, +) from calibre.ebooks.oeb.polish.errors import MalformedMarkup -from calibre.ebooks.oeb.polish.utils import guess_type, extract -from calibre.ebooks.oeb.polish.opf import set_guide_item, get_book_language +from calibre.ebooks.oeb.polish.opf import get_book_language, set_guide_item from calibre.ebooks.oeb.polish.pretty import pretty_html_tree, pretty_xml_tree +from calibre.ebooks.oeb.polish.utils import extract, guess_type from calibre.translations.dynamic import translate -from calibre.utils.localization import get_lang, canonicalize_lang, lang_as_iso639_1 +from calibre.utils.localization import canonicalize_lang, get_lang, lang_as_iso639_1 +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems from polyglot.urllib import urlparse diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py index 4bbd182503..ce08fb6962 100644 --- a/src/calibre/ebooks/oeb/stylizer.py +++ b/src/calibre/ebooks/oeb/stylizer.py @@ -5,19 +5,29 @@ CSS property propagation class. __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' -import os, re, logging, copy, unicodedata, numbers +import copy +import logging +import numbers +import os +import re +import unicodedata +from css_parser import ( + CSSParser, log as css_parser_log, parseString, parseStyle, profile as cssprofiles, + profiles, replaceUrls, +) +from css_parser.css import CSSFontFaceRule, CSSPageRule, CSSStyleRule, cssproperties from operator import itemgetter from weakref import WeakKeyDictionary from xml.dom import SyntaxErr as CSSSyntaxError -from css_parser.css import (CSSStyleRule, CSSPageRule, CSSFontFaceRule, - cssproperties) -from css_parser import (profile as cssprofiles, parseString, parseStyle, log as - css_parser_log, CSSParser, profiles, replaceUrls) -from calibre import force_unicode, as_unicode + +from calibre import as_unicode, force_unicode from calibre.ebooks import unit_convert -from calibre.ebooks.oeb.base import XHTML, XHTML_NS, CSS_MIME, OEB_STYLES, xpath, urlnormalize +from calibre.ebooks.oeb.base import ( + CSS_MIME, OEB_STYLES, XHTML, XHTML_NS, urlnormalize, xpath, +) from calibre.ebooks.oeb.normalize_css import DEFAULTS, normalizers -from css_selectors import Select, SelectorError, INAPPROPRIATE_PSEUDO_CLASSES +from calibre.utils.resources import get_path as P +from css_selectors import INAPPROPRIATE_PSEUDO_CLASSES, Select, SelectorError from polyglot.builtins import iteritems from tinycss.media3 import CSSMedia3Parser diff --git a/src/calibre/ebooks/oeb/transforms/jacket.py b/src/calibre/ebooks/oeb/transforms/jacket.py index 70ce8b3820..9b1b0fb27a 100644 --- a/src/calibre/ebooks/oeb/transforms/jacket.py +++ b/src/calibre/ebooks/oeb/transforms/jacket.py @@ -18,12 +18,13 @@ from calibre.ebooks.chardet import strip_encoding_declarations from calibre.ebooks.metadata import fmt_sidx, rating_to_stars from calibre.ebooks.metadata.sources.identify import urls_from_identifiers from calibre.ebooks.oeb.base import ( - XHTML, XHTML_NS, XPath, urldefrag, urlnormalize, xml2text + XHTML, XHTML_NS, XPath, urldefrag, urlnormalize, xml2text, ) from calibre.library.comments import comments_to_html, markdown from calibre.utils.config import tweaks from calibre.utils.date import as_local_time, format_date, is_date_undefined from calibre.utils.icu import sort_key +from calibre.utils.resources import get_path as P JACKET_XPATH = '//h:meta[@name="calibre-content" and @content="jacket"]' diff --git a/src/calibre/ebooks/pdf/html_writer.py b/src/calibre/ebooks/pdf/html_writer.py index b1d16f0db2..6da4ef1d29 100644 --- a/src/calibre/ebooks/pdf/html_writer.py +++ b/src/calibre/ebooks/pdf/html_writer.py @@ -2,8 +2,6 @@ # License: GPL v3 Copyright: 2019, Kovid Goyal # Imports {{{ - - import copy import json import os @@ -16,25 +14,23 @@ from io import BytesIO from itertools import count, repeat from qt.core import ( QApplication, QByteArray, QMarginsF, QObject, QPageLayout, Qt, QTimer, QUrl, - pyqtSignal, sip + pyqtSignal, sip, ) from qt.webengine import ( QWebEnginePage, QWebEngineProfile, QWebEngineSettings, QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestJob, - QWebEngineUrlSchemeHandler + QWebEngineUrlSchemeHandler, ) from calibre import detect_ncpus, human_readable, prepare_string_for_xml -from calibre.constants import ( - FAKE_HOST, FAKE_PROTOCOL, __version__, ismacos, iswindows -) +from calibre.constants import FAKE_HOST, FAKE_PROTOCOL, __version__, ismacos, iswindows from calibre.ebooks.metadata.xmp import metadata_to_xmp_packet from calibre.ebooks.oeb.base import XHTML, XPath from calibre.ebooks.oeb.polish.container import Container as ContainerBase from calibre.ebooks.oeb.polish.toc import get_toc from calibre.ebooks.oeb.polish.utils import guess_type from calibre.ebooks.pdf.image_writer import ( - Image, PDFMetadata, draw_image_page, get_page_layout + Image, PDFMetadata, draw_image_page, get_page_layout, ) from calibre.ebooks.pdf.render.serialize import PDFStream from calibre.gui2 import setup_unix_signals @@ -46,8 +42,10 @@ from calibre.utils.fonts.sfnt.subset import pdf_subset from calibre.utils.logging import default_log from calibre.utils.monotonic import monotonic from calibre.utils.podofo import ( - dedup_type3_fonts, get_podofo, remove_unused_fonts, set_metadata_implementation + dedup_type3_fonts, get_podofo, remove_unused_fonts, set_metadata_implementation, ) + +from calibre.utils.resources import get_path as P from calibre.utils.short_uuid import uuid4 from calibre.utils.webengine import secure_webengine, send_reply, setup_profile from polyglot.builtins import as_bytes, iteritems diff --git a/src/calibre/ebooks/unihandecode/pykakasi/jisyo.py b/src/calibre/ebooks/unihandecode/pykakasi/jisyo.py index a08c2f586a..749ba30971 100644 --- a/src/calibre/ebooks/unihandecode/pykakasi/jisyo.py +++ b/src/calibre/ebooks/unihandecode/pykakasi/jisyo.py @@ -22,6 +22,7 @@ class jisyo : def __init__(self): from calibre.utils.serialize import msgpack_loads + from calibre.utils.resources import get_path as P if self.kanwadict is None: self.kanwadict = msgpack_loads( P('localization/pykakasi/kanwadict2.calibre_msgpack', data=True)) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 151f5b59ab..bdf28807d8 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -12,11 +12,11 @@ from contextlib import contextmanager, suppress from functools import lru_cache from qt.core import ( QApplication, QBuffer, QByteArray, QColor, QDateTime, QDesktopServices, QDialog, - QDialogButtonBox, QEvent, QFile, QFileDialog, QFileIconProvider, QFileInfo, - QFont, QFontDatabase, QFontInfo, QFontMetrics, QGuiApplication, QIcon, - QImageReader, QImageWriter, QIODevice, QLocale, QNetworkProxyFactory, QObject, - QPalette, QResource, QSettings, QSocketNotifier, QStringListModel, Qt, QThread, - QTimer, QTranslator, QUrl, pyqtSignal, pyqtSlot + QDialogButtonBox, QEvent, QFile, QFileDialog, QFileIconProvider, QFileInfo, QFont, + QFontDatabase, QFontInfo, QFontMetrics, QGuiApplication, QIcon, QImageReader, + QImageWriter, QIODevice, QLocale, QNetworkProxyFactory, QObject, QPalette, + QResource, QSettings, QSocketNotifier, QStringListModel, Qt, QThread, QTimer, + QTranslator, QUrl, pyqtSignal, pyqtSlot, ) from threading import Lock, RLock @@ -24,13 +24,13 @@ import calibre.gui2.pyqt6_compat as pqc from calibre import as_unicode, prints from calibre.constants import ( DEBUG, __appname__ as APP_UID, __version__, builtin_colors_dark, - builtin_colors_light, config_dir, is_running_from_develop, isbsd, isfrozen, - islinux, ismacos, iswindows, isxp, numeric_version, plugins_loc + builtin_colors_light, config_dir, is_running_from_develop, isbsd, isfrozen, islinux, + ismacos, iswindows, isxp, numeric_version, plugins_loc, ) from calibre.ebooks.metadata import MetaInformation from calibre.gui2.geometry import geometry_for_restore_as_dict from calibre.gui2.linux_file_dialogs import ( - check_for_linux_native_dialogs, linux_native_dialog + check_for_linux_native_dialogs, linux_native_dialog, ) from calibre.gui2.palette import PaletteManager from calibre.gui2.qt_file_dialogs import FileDialog @@ -41,7 +41,7 @@ from calibre.utils.date import UNDEFINED_DATE from calibre.utils.file_type_icons import EXT_MAP from calibre.utils.img import set_image_allocation_limit from calibre.utils.localization import get_lang -from calibre.utils.resources import user_dir +from calibre.utils.resources import get_path as P, user_dir from polyglot import queue from polyglot.builtins import iteritems, string_or_bytes @@ -888,14 +888,14 @@ if not iswindows and not ismacos and 'CALIBRE_NO_NATIVE_FILEDIALOGS' not in os.e if has_windows_file_dialog_helper: from calibre.gui2.win_file_dialogs import ( - choose_dir, choose_files, choose_images, choose_save_file + choose_dir, choose_files, choose_images, choose_save_file, ) elif has_linux_file_dialog_helper: choose_dir, choose_files, choose_save_file, choose_images = map( linux_native_dialog, 'dir files save_file images'.split()) else: from calibre.gui2.qt_file_dialogs import ( - choose_dir, choose_files, choose_images, choose_save_file + choose_dir, choose_files, choose_images, choose_save_file, ) choose_files, choose_images, choose_dir, choose_save_file diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 8e6628af25..b085f4f9dd 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -5,12 +5,11 @@ import os import re from collections import namedtuple -from functools import partial, lru_cache +from functools import lru_cache, partial from qt.core import ( QAction, QApplication, QClipboard, QColor, QDialog, QEasingCurve, QIcon, - QKeySequence, QMenu, QMimeData, QPainter, QPen, QPixmap, QSplitter, - QPropertyAnimation, QRect, QSize, QSizePolicy, Qt, QUrl, QWidget, pyqtProperty, - QTimer, pyqtSignal + QKeySequence, QMenu, QMimeData, QPainter, QPen, QPixmap, QPropertyAnimation, QRect, + QSize, QSizePolicy, QSplitter, Qt, QTimer, QUrl, QWidget, pyqtProperty, pyqtSignal, ) from calibre import fit_image, sanitize_file_name @@ -20,20 +19,21 @@ from calibre.ebooks.metadata.book.base import Metadata, field_metadata from calibre.ebooks.metadata.book.render import mi_to_html from calibre.ebooks.metadata.search_internet import ( all_author_searches, all_book_searches, name_for, url_for_author_search, - url_for_book_search + url_for_book_search, ) from calibre.gui2 import ( NO_URL_FORMATTING, choose_save_file, config, default_author_link, gprefs, - pixmap_to_data, rating_font, safe_open_url + pixmap_to_data, rating_font, safe_open_url, ) from calibre.gui2.dialogs.confirm_delete import confirm, confirm as confirm_delete from calibre.gui2.dnd import ( - dnd_get_files, dnd_get_image, dnd_has_extension, dnd_has_image, image_extensions + dnd_get_files, dnd_get_image, dnd_has_extension, dnd_has_image, image_extensions, ) from calibre.gui2.widgets2 import HTMLDisplay from calibre.utils.config import tweaks from calibre.utils.img import blend_image, image_from_x from calibre.utils.localization import is_rtl, langnames_to_langcodes +from calibre.utils.resources import get_path as P from calibre.utils.serialize import json_loads from polyglot.binary import from_hex_bytes diff --git a/src/calibre/gui2/dialogs/template_dialog.py b/src/calibre/gui2/dialogs/template_dialog.py index 1444870cd5..22086c705f 100644 --- a/src/calibre/gui2/dialogs/template_dialog.py +++ b/src/calibre/gui2/dialogs/template_dialog.py @@ -5,30 +5,36 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __license__ = 'GPL v3' -import json, os, traceback, re -from functools import partial +import json +import os +import re import sys - -from qt.core import (Qt, QDialog, QDialogButtonBox, QSyntaxHighlighter, QFont, - QApplication, QTextCharFormat, QColor, QCursor, - QIcon, QSize, QPalette, QLineEdit, QFontInfo, - QFontDatabase, QVBoxLayout, QTableWidget, QTableWidgetItem, - QComboBox, QAbstractItemView, QTextOption, QFontMetrics) +import traceback +from functools import partial +from qt.core import ( + QAbstractItemView, QApplication, QColor, QComboBox, QCursor, QDialog, + QDialogButtonBox, QFont, QFontDatabase, QFontInfo, QFontMetrics, QIcon, QLineEdit, + QPalette, QSize, QSyntaxHighlighter, Qt, QTableWidget, QTableWidgetItem, + QTextCharFormat, QTextOption, QVBoxLayout, +) from calibre import sanitize_file_name from calibre.constants import config_dir from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.book.formatter import SafeFormat -from calibre.gui2 import (gprefs, error_dialog, choose_files, choose_save_file, - pixmap_to_data, question_dialog) +from calibre.gui2 import ( + choose_files, choose_save_file, error_dialog, gprefs, pixmap_to_data, + question_dialog, +) from calibre.gui2.dialogs.template_dialog_ui import Ui_TemplateDialog -from calibre.library.coloring import (displayable_columns, color_row_key) +from calibre.library.coloring import color_row_key, displayable_columns from calibre.utils.config_base import tweaks from calibre.utils.date import DEFAULT_DATE -from calibre.utils.formatter_functions import formatter_functions, StoredObjectType -from calibre.utils.formatter import StopException, PythonTemplateContext +from calibre.utils.formatter import PythonTemplateContext, StopException +from calibre.utils.formatter_functions import StoredObjectType, formatter_functions from calibre.utils.icu import sort_key from calibre.utils.localization import localize_user_manual_link +from calibre.utils.resources import get_path as P class ParenPosition: diff --git a/src/calibre/gui2/icon_theme.py b/src/calibre/gui2/icon_theme.py index 15a7b3e0a7..0268ccb2ed 100644 --- a/src/calibre/gui2/icon_theme.py +++ b/src/calibre/gui2/icon_theme.py @@ -20,10 +20,10 @@ from multiprocessing.pool import ThreadPool from qt.core import ( QAbstractItemView, QApplication, QCheckBox, QComboBox, QDialog, QDialogButtonBox, QFormLayout, QGroupBox, QHBoxLayout, QIcon, QImage, QImageReader, - QItemSelectionModel, QLabel, QLineEdit, QListWidget, QListWidgetItem, QPen, - QPixmap, QProgressDialog, QSize, QSpinBox, QSplitter, QStackedLayout, - QStaticText, QStyle, QStyledItemDelegate, Qt, QTabWidget, QTextEdit, QVBoxLayout, - QWidget, pyqtSignal, sip + QItemSelectionModel, QLabel, QLineEdit, QListWidget, QListWidgetItem, QPen, QPixmap, + QProgressDialog, QSize, QSpinBox, QSplitter, QStackedLayout, QStaticText, QStyle, + QStyledItemDelegate, Qt, QTabWidget, QTextEdit, QVBoxLayout, QWidget, pyqtSignal, + sip, ) from threading import Event, Thread @@ -32,7 +32,7 @@ from calibre.constants import cache_dir from calibre.customize.ui import interface_actions from calibre.gui2 import ( choose_dir, choose_save_file, empty_index, error_dialog, gprefs, - icon_resource_manager, must_use_qt, safe_open_url + icon_resource_manager, must_use_qt, safe_open_url, ) from calibre.gui2.dialogs.progress import ProgressDialog from calibre.gui2.progress_indicator import ProgressIndicator @@ -42,6 +42,7 @@ from calibre.utils.filenames import ascii_filename, atomic_rename from calibre.utils.https import HTTPError, get_https_resource_securely from calibre.utils.icu import numeric_sort_key as sort_key from calibre.utils.img import Canvas, image_from_data, optimize_jpeg, optimize_png +from calibre.utils.resources import get_path as P from calibre.utils.zipfile import ZIP_STORED, ZipFile from polyglot import http_client from polyglot.builtins import as_bytes, iteritems, reraise @@ -127,6 +128,7 @@ def read_theme_from_folder(path): return int(x) except Exception: return -1 + def g(x, defval=''): return metadata.get(x, defval) theme = Theme(g('title'), g('author'), safe_int(g('version', -1)), g('description'), g('license', 'Unknown'), g('url', None)) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 8069af295e..30e9c1755b 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -14,10 +14,14 @@ import time import traceback from collections import defaultdict, namedtuple from itertools import groupby +from qt.core import ( + QAbstractTableModel, QApplication, QColor, QDateTime, QFont, QFontMetrics, QIcon, + QImage, QModelIndex, QPainter, QPixmap, Qt, pyqtSignal, +) from calibre import ( fit_image, force_unicode, human_readable, isbytestring, prepare_string_for_xml, - strftime + strftime, ) from calibre.constants import DEBUG, config_dir, dark_link_color, filesystem_encoding from calibre.db.search import CONTAINS_MATCH, EQUALS_MATCH, REGEXP_MATCH, _match @@ -30,15 +34,14 @@ from calibre.library.coloring import color_row_key from calibre.library.save_to_disk import find_plugboard from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config import device_prefs, prefs, tweaks -from calibre.utils.date import (UNDEFINED_DATE, as_local_time, dt_factory, - is_date_undefined, qt_to_dt) +from calibre.utils.date import ( + UNDEFINED_DATE, as_local_time, dt_factory, is_date_undefined, qt_to_dt, +) from calibre.utils.icu import sort_key from calibre.utils.localization import calibre_langcode_to_name +from calibre.utils.resources import get_path as P from calibre.utils.search_query_parser import ParseException, SearchQueryParser from polyglot.builtins import iteritems, itervalues, string_or_bytes -from qt.core import (QAbstractTableModel, QApplication, QColor, QDateTime, - QFont, QFontMetrics, QIcon, QImage, QModelIndex, QPainter, - QPixmap, Qt, pyqtSignal) Counts = namedtuple('Counts', 'library_total total current') diff --git a/src/calibre/gui2/lrf_renderer/document.py b/src/calibre/gui2/lrf_renderer/document.py index b2f062ff82..54a80a59ac 100644 --- a/src/calibre/gui2/lrf_renderer/document.py +++ b/src/calibre/gui2/lrf_renderer/document.py @@ -1,15 +1,17 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import collections, itertools, glob - +import collections +import glob +import itertools from qt.core import ( - Qt, QByteArray, pyqtSignal, QGraphicsRectItem, QGraphicsScene, QPen, - QBrush, QColor, QFontDatabase, QGraphicsItem, QGraphicsLineItem) + QBrush, QByteArray, QColor, QFontDatabase, QGraphicsItem, QGraphicsLineItem, + QGraphicsRectItem, QGraphicsScene, QPen, Qt, pyqtSignal, +) -from calibre.gui2.lrf_renderer.text import TextBlock, FontLoader, COLOR, PixmapItem -from calibre.ebooks.lrf.objects import RuledLine as _RuledLine -from calibre.ebooks.lrf.objects import Canvas as __Canvas +from calibre.ebooks.lrf.objects import Canvas as __Canvas, RuledLine as _RuledLine +from calibre.gui2.lrf_renderer.text import COLOR, FontLoader, PixmapItem, TextBlock +from calibre.utils.resources import get_path as P class Color(QColor): diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index 71437c65fa..ae951cc5e8 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -7,39 +7,40 @@ __docformat__ = 'restructuredtext en' import json from collections import defaultdict -from threading import Thread from functools import partial - from qt.core import ( - QApplication, QFont, QFontInfo, QFontDialog, QColorDialog, QPainter, QDialog, - QAbstractListModel, Qt, QIcon, QKeySequence, QColor, pyqtSignal, QHeaderView, QListWidgetItem, - QWidget, QSizePolicy, QBrush, QPixmap, QSize, QPushButton, QVBoxLayout, QItemSelectionModel, - QTableWidget, QTableWidgetItem, QLabel, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox + QAbstractListModel, QApplication, QBrush, QColor, QColorDialog, QComboBox, QDialog, + QDialogButtonBox, QFont, QFontDialog, QFontInfo, QFormLayout, QHeaderView, QIcon, + QItemSelectionModel, QKeySequence, QLabel, QLineEdit, QListWidgetItem, QPainter, + QPixmap, QPushButton, QSize, QSizePolicy, Qt, QTableWidget, QTableWidgetItem, + QVBoxLayout, QWidget, pyqtSignal, ) +from threading import Thread from calibre import human_readable from calibre.constants import ismacos, iswindows from calibre.db.categories import is_standard_category from calibre.ebooks.metadata.book.render import DEFAULT_AUTHOR_LINK from calibre.ebooks.metadata.sources.prefs import msprefs -from calibre.gui2.custom_column_widgets import get_field_list as em_get_field_list -from calibre.gui2 import default_author_link, icon_resource_manager, choose_save_file, choose_files -from calibre.gui2.dialogs.template_dialog import TemplateDialog -from calibre.gui2.preferences import ConfigWidgetBase, test_widget -from calibre.gui2.preferences.look_feel_ui import Ui_Form -from calibre.gui2 import config, gprefs, qt_app, open_local_file, question_dialog, error_dialog -from calibre.utils.localization import (available_translations, - get_language, get_lang) -from calibre.utils.config import prefs -from calibre.utils.icu import sort_key +from calibre.gui2 import ( + choose_files, choose_save_file, config, default_author_link, error_dialog, gprefs, + icon_resource_manager, open_local_file, qt_app, question_dialog, +) +from calibre.gui2.actions.show_quickview import get_quickview_action_plugin from calibre.gui2.book_details import get_field_list +from calibre.gui2.custom_column_widgets import get_field_list as em_get_field_list from calibre.gui2.dialogs.quickview import get_qv_field_list +from calibre.gui2.dialogs.template_dialog import TemplateDialog +from calibre.gui2.library.alternate_views import CM_TO_INCH, auto_height +from calibre.gui2.preferences import ConfigWidgetBase, test_widget from calibre.gui2.preferences.coloring import EditRules -from calibre.gui2.library.alternate_views import auto_height, CM_TO_INCH +from calibre.gui2.preferences.look_feel_ui import Ui_Form from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import Dialog -from calibre.gui2.actions.show_quickview import get_quickview_action_plugin -from calibre.utils.resources import set_data +from calibre.utils.config import prefs +from calibre.utils.icu import sort_key +from calibre.utils.localization import available_translations, get_lang, get_language +from calibre.utils.resources import get_path as P, set_data from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/preferences/template_functions.py b/src/calibre/gui2/preferences/template_functions.py index e83504c992..a373b64b53 100644 --- a/src/calibre/gui2/preferences/template_functions.py +++ b/src/calibre/gui2/preferences/template_functions.py @@ -12,10 +12,11 @@ from calibre.gui2.preferences import AbortInitialize, ConfigWidgetBase, test_wid from calibre.gui2.preferences.template_functions_ui import Ui_Form from calibre.gui2.widgets import PythonHighlighter from calibre.utils.formatter_functions import ( - compile_user_function, compile_user_template_functions, formatter_functions, - function_object_type, function_pref_name, load_user_template_functions, - StoredObjectType + StoredObjectType, compile_user_function, compile_user_template_functions, + formatter_functions, function_object_type, function_pref_name, + load_user_template_functions, ) +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/toc/location.py b/src/calibre/gui2/toc/location.py index fa825e6416..e67eec1527 100644 --- a/src/calibre/gui2/toc/location.py +++ b/src/calibre/gui2/toc/location.py @@ -10,12 +10,12 @@ from functools import lru_cache from qt.core import ( QApplication, QByteArray, QFrame, QGridLayout, QIcon, QLabel, QLineEdit, QListWidget, QPushButton, QSize, QSplitter, Qt, QUrl, QVBoxLayout, QWidget, - pyqtSignal + pyqtSignal, ) from qt.webengine import ( QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestJob, - QWebEngineUrlSchemeHandler, QWebEngineView + QWebEngineUrlSchemeHandler, QWebEngineView, ) from calibre.constants import FAKE_HOST, FAKE_PROTOCOL @@ -23,6 +23,7 @@ from calibre.ebooks.oeb.polish.utils import guess_type from calibre.gui2 import error_dialog, gprefs, is_dark_theme, question_dialog from calibre.gui2.palette import dark_color, dark_link_color, dark_text_color from calibre.utils.logging import default_log +from calibre.utils.resources import get_path as P from calibre.utils.short_uuid import uuid4 from calibre.utils.webengine import secure_webengine, send_reply, setup_profile from polyglot.builtins import as_bytes diff --git a/src/calibre/gui2/tweak_book/editor/help.py b/src/calibre/gui2/tweak_book/editor/help.py index 2a35f4dc20..b1853aef21 100644 --- a/src/calibre/gui2/tweak_book/editor/help.py +++ b/src/calibre/gui2/tweak_book/editor/help.py @@ -12,6 +12,7 @@ from lxml import html from calibre import browser from calibre.ebooks.oeb.polish.container import OEB_DOCS from calibre.ebooks.oeb.polish.utils import guess_type +from calibre.utils.resources import get_path as P class URLMap: diff --git a/src/calibre/gui2/tweak_book/editor/syntax/javascript.py b/src/calibre/gui2/tweak_book/editor/syntax/javascript.py index a00d65c1dc..2eb9a7c712 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/javascript.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/javascript.py @@ -4,13 +4,17 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import re - -from pygments.lexer import RegexLexer, default, include -from pygments.token import Comment, Punctuation, Number, Keyword, Text, String, Operator, Name import pygments.unistring as uni +import re +from pygments.lexer import RegexLexer, default, include +from pygments.token import ( + Comment, Keyword, Name, Number, Operator, Punctuation, String, Text, +) -from calibre.gui2.tweak_book.editor.syntax.pygments_highlighter import create_highlighter +from calibre.gui2.tweak_book.editor.syntax.pygments_highlighter import ( + create_highlighter, +) +from calibre.utils.resources import get_path as P from polyglot.builtins import native_string_type JS_IDENT_START = ('(?:[$_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + diff --git a/src/calibre/gui2/tweak_book/function_replace.py b/src/calibre/gui2/tweak_book/function_replace.py index d6c6cf2778..f8a89f829a 100644 --- a/src/calibre/gui2/tweak_book/function_replace.py +++ b/src/calibre/gui2/tweak_book/function_replace.py @@ -4,22 +4,28 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import re, io, weakref, sys - +import io +import re +import sys +import weakref from qt.core import ( - pyqtSignal, QVBoxLayout, QHBoxLayout, QPlainTextEdit, QLabel, QFontMetrics, - QSize, Qt, QApplication, QIcon, QDialogButtonBox) + QApplication, QDialogButtonBox, QFontMetrics, QHBoxLayout, QIcon, QLabel, + QPlainTextEdit, QSize, Qt, QVBoxLayout, pyqtSignal, +) -from calibre.ebooks.oeb.polish.utils import apply_func_to_match_groups, apply_func_to_html_text +from calibre.ebooks.oeb.polish.utils import ( + apply_func_to_html_text, apply_func_to_match_groups, +) from calibre.gui2 import error_dialog from calibre.gui2.complete2 import EditWithComplete from calibre.gui2.tweak_book import dictionaries -from calibre.gui2.tweak_book.widgets import Dialog from calibre.gui2.tweak_book.editor.text import TextEdit +from calibre.gui2.tweak_book.widgets import Dialog from calibre.utils.config import JSONConfig -from calibre.utils.icu import capitalize, upper, lower, swapcase -from calibre.utils.titlecase import titlecase +from calibre.utils.icu import capitalize, lower, swapcase, upper from calibre.utils.localization import localize_user_manual_link +from calibre.utils.resources import get_path as P +from calibre.utils.titlecase import titlecase from polyglot.builtins import iteritems from polyglot.io import PolyglotStringIO diff --git a/src/calibre/gui2/tweak_book/preview.py b/src/calibre/gui2/tweak_book/preview.py index 8cd226ef5a..16c9b37cd4 100644 --- a/src/calibre/gui2/tweak_book/preview.py +++ b/src/calibre/gui2/tweak_book/preview.py @@ -9,25 +9,24 @@ from functools import partial from qt.core import ( QAction, QApplication, QByteArray, QHBoxLayout, QIcon, QLabel, QMenu, QSize, QSizePolicy, QStackedLayout, Qt, QTimer, QToolBar, QUrl, QVBoxLayout, QWidget, - pyqtSignal + pyqtSignal, ) from qt.webengine import ( - QWebEngineContextMenuRequest, QWebEnginePage, QWebEngineProfile, - QWebEngineScript, QWebEngineSettings, QWebEngineUrlRequestJob, - QWebEngineUrlSchemeHandler, QWebEngineView + QWebEngineContextMenuRequest, QWebEnginePage, QWebEngineProfile, QWebEngineScript, + QWebEngineSettings, QWebEngineUrlRequestJob, QWebEngineUrlSchemeHandler, + QWebEngineView, ) from threading import Thread from calibre import prints from calibre.constants import ( - FAKE_HOST, FAKE_PROTOCOL, __version__, is_running_from_develop, ismacos, - iswindows + FAKE_HOST, FAKE_PROTOCOL, __version__, is_running_from_develop, ismacos, iswindows, ) from calibre.ebooks.oeb.base import OEB_DOCS, XHTML_MIME, serialize from calibre.ebooks.oeb.polish.parsing import parse from calibre.gui2 import ( NO_URL_FORMATTING, QT_HIDDEN_CLEAR_ACTION, error_dialog, is_dark_theme, - safe_open_url + safe_open_url, ) from calibre.gui2.palette import dark_color, dark_link_color, dark_text_color from calibre.gui2.tweak_book import TOP, actions, current_container, editors, tprefs @@ -36,9 +35,10 @@ from calibre.gui2.viewer.web_view import handle_mathjax_request, send_reply from calibre.gui2.webengine import RestartingWebEngineView from calibre.gui2.widgets2 import HistoryLineEdit2 from calibre.utils.ipc.simple_worker import offload_worker +from calibre.utils.resources import get_path as P from calibre.utils.webengine import ( Bridge, create_script, from_js, insert_scripts, secure_webengine, setup_profile, - to_js + to_js, ) from polyglot.builtins import iteritems from polyglot.queue import Empty, Queue diff --git a/src/calibre/gui2/tweak_book/spell.py b/src/calibre/gui2/tweak_book/spell.py index d0238905ac..3ab38c25bf 100644 --- a/src/calibre/gui2/tweak_book/spell.py +++ b/src/calibre/gui2/tweak_book/spell.py @@ -10,27 +10,27 @@ from collections import OrderedDict, defaultdict from functools import partial from itertools import chain from qt.core import ( - QT_VERSION_STR, QAbstractTableModel, QApplication, QCheckBox, QComboBox, QDialog, - QDialogButtonBox, QFont, QFormLayout, QGridLayout, QHBoxLayout, QIcon, - QInputDialog, QKeySequence, QLabel, QLineEdit, QListWidget, QListWidgetItem, + QT_VERSION_STR, QAbstractItemView, QAbstractTableModel, QApplication, QCheckBox, + QComboBox, QDialog, QDialogButtonBox, QFont, QFormLayout, QGridLayout, QHBoxLayout, + QIcon, QInputDialog, QKeySequence, QLabel, QLineEdit, QListWidget, QListWidgetItem, QMenu, QModelIndex, QPlainTextEdit, QPushButton, QSize, QStackedLayout, Qt, - QTableView, QTimer, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, - QWidget, pyqtSignal, QAbstractItemView + QTableView, QTimer, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, + pyqtSignal, ) from threading import Thread from calibre.constants import __appname__ -from calibre.ebooks.oeb.base import OEB_DOCS, NCX_MIME, OPF_MIME +from calibre.ebooks.oeb.base import NCX_MIME, OEB_DOCS, OPF_MIME from calibre.ebooks.oeb.polish.spell import ( get_all_words, get_checkable_file_names, merge_locations, replace_word, - undo_replace_word + undo_replace_word, ) from calibre.gui2 import choose_files, error_dialog from calibre.gui2.complete2 import LineEdit from calibre.gui2.languages import LanguagesEdit from calibre.gui2.progress_indicator import ProgressIndicator from calibre.gui2.tweak_book import ( - current_container, dictionaries, editors, set_book_locale, tprefs + current_container, dictionaries, editors, set_book_locale, tprefs, ) from calibre.gui2.tweak_book.widgets import Dialog from calibre.gui2.widgets2 import FlowLayout @@ -38,13 +38,14 @@ from calibre.spell import DictionaryLocale from calibre.spell.break_iterator import split_into_words from calibre.spell.dictionary import ( best_locale_for_language, builtin_dictionaries, custom_dictionaries, dprefs, - get_dictionary, remove_dictionary, rename_dictionary + get_dictionary, remove_dictionary, rename_dictionary, ) from calibre.spell.import_from import import_from_oxt from calibre.utils.icu import contains, primary_contains, primary_sort_key, sort_key from calibre.utils.localization import ( - calibre_langcode_to_name, canonicalize_lang, get_lang, get_language + calibre_langcode_to_name, canonicalize_lang, get_lang, get_language, ) +from calibre.utils.resources import get_path as P from calibre_extensions.progress_indicator import set_no_activate_on_click from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index a9f98a0aee..c2caf99f7d 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -20,19 +20,19 @@ from collections import OrderedDict, deque from io import BytesIO from qt.core import ( QAction, QApplication, QDialog, QFont, QIcon, QMenu, QSystemTrayIcon, Qt, QTimer, - QUrl, pyqtSignal + QUrl, pyqtSignal, ) from calibre import detect_ncpus, force_unicode, prints from calibre.constants import ( - DEBUG, __appname__, config_dir, filesystem_encoding, ismacos, iswindows + DEBUG, __appname__, config_dir, filesystem_encoding, ismacos, iswindows, ) from calibre.customize import PluginInstallationType from calibre.customize.ui import available_store_plugins, interface_actions from calibre.db.legacy import LibraryDatabase from calibre.gui2 import ( Dispatcher, GetMetadata, config, error_dialog, gprefs, info_dialog, - max_available_height, open_url, question_dialog, warning_dialog + max_available_height, open_url, question_dialog, warning_dialog, ) from calibre.gui2.auto_add import AutoAdder from calibre.gui2.changes import handle_changes @@ -59,6 +59,7 @@ from calibre.library import current_library_name from calibre.srv.library_broker import GuiLibraryBroker, db_matches from calibre.utils.config import dynamic, prefs from calibre.utils.ipc.pool import Pool +from calibre.utils.resources import get_path as P from polyglot.builtins import string_or_bytes from polyglot.queue import Empty, Queue @@ -625,7 +626,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ self.tags_view.recount() def handle_cli_args(self, args): - from urllib.parse import unquote, urlparse, parse_qs + from urllib.parse import parse_qs, unquote, urlparse if isinstance(args, string_or_bytes): args = [args] files, urls = [], [] @@ -870,7 +871,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ ) if repair: from calibre.gui2.dialogs.restore_library import ( - repair_library_at + repair_library_at, ) if repair_library_at(newloc, parent=self): db = LibraryDatabase(newloc, default_prefs=default_prefs) diff --git a/src/calibre/gui2/viewer/lookup.py b/src/calibre/gui2/viewer/lookup.py index 51d4f7ee33..f1e74c1584 100644 --- a/src/calibre/gui2/viewer/lookup.py +++ b/src/calibre/gui2/viewer/lookup.py @@ -8,10 +8,10 @@ from functools import lru_cache from qt.core import ( QAbstractItemView, QApplication, QCheckBox, QComboBox, QDialog, QDialogButtonBox, QFormLayout, QHBoxLayout, QIcon, QLabel, QLineEdit, QListWidget, QListWidgetItem, - QPalette, QPushButton, QSize, Qt, QTimer, QUrl, QVBoxLayout, QWidget, pyqtSignal + QPalette, QPushButton, QSize, Qt, QTimer, QUrl, QVBoxLayout, QWidget, pyqtSignal, ) from qt.webengine import ( - QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineView + QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineView, ) from calibre import prints, random_user_agent @@ -19,8 +19,9 @@ from calibre.gui2 import error_dialog from calibre.gui2.viewer.web_view import apply_font_settings, vprefs from calibre.gui2.widgets2 import Dialog from calibre.utils.localization import canonicalize_lang, get_lang, lang_as_iso639_1 +from calibre.utils.resources import get_path as P from calibre.utils.webengine import ( - create_script, insert_scripts, secure_webengine, setup_profile + create_script, insert_scripts, secure_webengine, setup_profile, ) diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index a75a3db420..40470c3ec0 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -7,19 +7,18 @@ import shutil import sys from itertools import count from qt.core import ( - QT_VERSION, QApplication, QByteArray, QEvent, QFontDatabase, QFontInfo, - QHBoxLayout, QLocale, QMimeData, QPalette, QSize, Qt, QTimer, QUrl, QWidget, - pyqtSignal, sip + QT_VERSION, QApplication, QByteArray, QEvent, QFontDatabase, QFontInfo, QHBoxLayout, + QLocale, QMimeData, QPalette, QSize, Qt, QTimer, QUrl, QWidget, pyqtSignal, sip, ) from qt.webengine import ( QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineSettings, - QWebEngineUrlRequestJob, QWebEngineUrlSchemeHandler, QWebEngineView + QWebEngineUrlRequestJob, QWebEngineUrlSchemeHandler, QWebEngineView, ) from calibre import as_unicode, prints from calibre.constants import ( FAKE_HOST, FAKE_PROTOCOL, __version__, in_develop_mode, is_running_from_develop, - ismacos, iswindows + ismacos, iswindows, ) from calibre.ebooks.metadata.book.base import field_metadata from calibre.ebooks.oeb.polish.utils import guess_type @@ -30,11 +29,12 @@ from calibre.gui2.viewer.tts import TTS from calibre.gui2.webengine import RestartingWebEngineView from calibre.srv.code import get_translations_data from calibre.utils.localization import localize_user_manual_link +from calibre.utils.resources import get_path as P from calibre.utils.serialize import json_loads from calibre.utils.shared_file import share_open from calibre.utils.webengine import ( Bridge, create_script, from_js, insert_scripts, secure_webengine, send_reply, - to_js, setup_profile + setup_profile, to_js, ) from polyglot.builtins import as_bytes, iteritems from polyglot.functools import lru_cache diff --git a/src/calibre/library/catalogs/epub_mobi_builder.py b/src/calibre/library/catalogs/epub_mobi_builder.py index 42fa7f40dd..ebfc2594e4 100644 --- a/src/calibre/library/catalogs/epub_mobi_builder.py +++ b/src/calibre/library/catalogs/epub_mobi_builder.py @@ -11,16 +11,14 @@ import time import unicodedata import zlib from copy import deepcopy +from lxml import etree from xml.sax.saxutils import escape -from lxml import etree - from calibre import ( - as_unicode, force_unicode, isbytestring, prepare_string_for_xml, - replace_entities, strftime, xml_replace_entities + as_unicode, force_unicode, isbytestring, prepare_string_for_xml, replace_entities, + strftime, xml_replace_entities, ) from calibre.constants import cache_dir, ismacos -from calibre.utils.xml_parse import safe_xml_fromstring from calibre.customize.conversion import DummyReporter from calibre.customize.ui import output_profiles from calibre.ebooks.BeautifulSoup import BeautifulSoup, NavigableString, prettify @@ -29,17 +27,19 @@ from calibre.ebooks.metadata import author_to_author_sort from calibre.ebooks.oeb.polish.pretty import pretty_opf, pretty_xml_tree from calibre.library.catalogs import ( AuthorSortMismatchException, EmptyCatalogException, - InvalidGenresSourceFieldException + InvalidGenresSourceFieldException, ) from calibre.library.comments import comments_to_html from calibre.ptempfile import PersistentTemporaryDirectory from calibre.utils.date import ( - as_local_time, format_date, is_date_undefined, now as nowf + as_local_time, format_date, is_date_undefined, now as nowf, ) from calibre.utils.filenames import ascii_text, shorten_components_to from calibre.utils.formatter import TemplateFormatter from calibre.utils.icu import capitalize, collation_order, sort_key from calibre.utils.localization import get_lang, lang_as_iso639_1 +from calibre.utils.resources import get_path as P +from calibre.utils.xml_parse import safe_xml_fromstring from calibre.utils.zipfile import ZipFile from polyglot.builtins import iteritems @@ -1096,8 +1096,8 @@ class CatalogBuilder: bookmarked_books (dict): dict of Bookmarks """ - from calibre.devices.usbms.device import Device from calibre.devices.kindle.bookmark import Bookmark + from calibre.devices.usbms.device import Device from calibre.ebooks.metadata import MetaInformation MBP_FORMATS = ['azw', 'mobi', 'prc', 'txt'] diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 5b186aa0ea..268258a21a 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -6,47 +6,64 @@ __docformat__ = 'restructuredtext en' The database used to store ebook metadata ''' -import os, sys, shutil, glob, time, functools, traceback, re, \ - json, uuid, hashlib, copy, numbers +import copy +import functools +import glob +import hashlib +import json +import numbers +import os +import random +import re +import shutil +import sys +import threading +import time +import traceback +import uuid from collections import defaultdict, namedtuple -import threading, random -from calibre import prints, force_unicode -from calibre.ebooks.metadata import (title_sort, author_to_author_sort, - string_to_authors, get_title_sort_pat) -from calibre.ebooks.metadata.opf2 import metadata_to_opf -from calibre.library.database import LibraryDatabase -from calibre.library.field_metadata import FieldMetadata -from calibre.library.schema_upgrades import SchemaUpgrade -from calibre.library.caches import ResultCache -from calibre.library.custom_columns import CustomColumns -from calibre.library.sqlite import connect, IntegrityError -from calibre.library.prefs import DBPrefs -from calibre.ebooks.metadata.book.base import Metadata -from calibre.constants import preferred_encoding, iswindows, filesystem_encoding -from calibre.ptempfile import (PersistentTemporaryFile, - base_dir, SpooledTemporaryFile) -from calibre.customize.ui import (run_plugins_on_import, - run_plugins_on_postimport) -from calibre import isbytestring -from calibre.utils.filenames import (ascii_filename, samefile, - WindowsAtomicFolderMove, hardlink_file) -from calibre.utils.date import (utcnow, now as nowf, utcfromtimestamp, - parse_only_date, UNDEFINED_DATE, parse_date) -from calibre.utils.config import prefs, tweaks, from_json, to_json -from calibre.utils.icu import sort_key, strcmp, lower -from calibre.utils.search_query_parser import saved_searches, set_saved_searches -from calibre.ebooks import check_ebook_format -from calibre.utils.img import save_cover_data_to -from calibre.utils.recycle_bin import delete_file, delete_tree -from calibre.utils.formatter_functions import load_user_template_functions -from calibre.db import _get_next_series_num_for_list, _get_series_values, get_data_as_dict -from calibre.db.adding import find_books_in_directory, import_book_directory_multiple, import_book_directory, recursive_import +from calibre import force_unicode, isbytestring, prints +from calibre.constants import filesystem_encoding, iswindows, preferred_encoding +from calibre.customize.ui import run_plugins_on_import, run_plugins_on_postimport +from calibre.db import ( + _get_next_series_num_for_list, _get_series_values, get_data_as_dict, +) +from calibre.db.adding import ( + find_books_in_directory, import_book_directory, import_book_directory_multiple, + recursive_import, +) +from calibre.db.categories import CATEGORY_SORTS, Tag from calibre.db.errors import NoSuchFormat 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 calibre.ebooks import check_ebook_format +from calibre.ebooks.metadata import ( + author_to_author_sort, get_title_sort_pat, string_to_authors, title_sort, +) +from calibre.ebooks.metadata.book.base import Metadata +from calibre.ebooks.metadata.opf2 import metadata_to_opf +from calibre.library.caches import ResultCache +from calibre.library.custom_columns import CustomColumns +from calibre.library.database import LibraryDatabase +from calibre.library.field_metadata import FieldMetadata +from calibre.library.prefs import DBPrefs +from calibre.library.schema_upgrades import SchemaUpgrade +from calibre.library.sqlite import IntegrityError, connect +from calibre.ptempfile import PersistentTemporaryFile, SpooledTemporaryFile, base_dir +from calibre.utils.config import from_json, prefs, to_json, tweaks +from calibre.utils.date import ( + UNDEFINED_DATE, now as nowf, parse_date, parse_only_date, utcfromtimestamp, utcnow, +) +from calibre.utils.filenames import ( + WindowsAtomicFolderMove, ascii_filename, hardlink_file, samefile, +) +from calibre.utils.formatter_functions import load_user_template_functions +from calibre.utils.icu import lower, sort_key, strcmp +from calibre.utils.img import save_cover_data_to +from calibre.utils.localization import calibre_langcode_to_name, canonicalize_lang +from calibre.utils.recycle_bin import delete_file, delete_tree +from calibre.utils.resources import get_path as P +from calibre.utils.search_query_parser import saved_searches, set_saved_searches from polyglot.builtins import iteritems, string_or_bytes copyfile = os.link if hasattr(os, 'link') else shutil.copyfile diff --git a/src/calibre/linux.py b/src/calibre/linux.py index 0843c0ea08..c979b39fe2 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -3,18 +3,21 @@ ''' Post installation script for linux ''' -import sys, os, textwrap, stat, errno -from subprocess import check_call, check_output +import errno +import os +import stat +import sys +import textwrap from functools import partial +from subprocess import check_call, check_output -from calibre import __appname__, prints, guess_type -from calibre.constants import islinux, isbsd +from calibre import CurrentDir, __appname__, guess_type, prints +from calibre.constants import isbsd, islinux from calibre.customize.ui import all_input_formats from calibre.ptempfile import TemporaryDirectory -from calibre import CurrentDir +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems - entry_points = { 'console_scripts': [ 'ebook-device = calibre.devices.cli:main', @@ -322,11 +325,11 @@ class ZshCompleter: # {{{ self.commands[name] = txt def do_ebook_convert(self, f): - from calibre.ebooks.conversion.plumber import supported_input_formats - from calibre.web.feeds.recipes.collection import get_builtin_recipe_titles from calibre.customize.ui import available_output_formats from calibre.ebooks.conversion.cli import create_option_parser, group_titles + from calibre.ebooks.conversion.plumber import supported_input_formats from calibre.utils.logging import DevNull + from calibre.web.feeds.recipes.collection import get_builtin_recipe_titles input_fmts = set(supported_input_formats()) output_fmts = set(available_output_formats()) iexts = {x.upper() for x in input_fmts}.union(input_fmts) @@ -417,8 +420,8 @@ class ZshCompleter: # {{{ w('\n}\n') def do_ebook_edit(self, f): - from calibre.ebooks.oeb.polish.main import SUPPORTED from calibre.ebooks.oeb.polish.import_book import IMPORTABLE + from calibre.ebooks.oeb.polish.main import SUPPORTED from calibre.gui2.tweak_book.main import option_parser tweakable_fmts = SUPPORTED | IMPORTABLE parser = option_parser() @@ -468,8 +471,8 @@ _ebook_edit() {{ '''.format(opt_lines, '|'.join(tweakable_fmts)) + '\n\n') def do_calibredb(self, f): - from calibre.db.cli.main import COMMANDS, option_parser_for from calibre.customize.ui import available_catalog_formats + from calibre.db.cli.main import COMMANDS, option_parser_for parsers, descs = {}, {} for command in COMMANDS: p = option_parser_for(command)() @@ -568,20 +571,22 @@ def get_bash_completion_path(root, share, info): def write_completion(self, bash_comp_dest, zsh): - from calibre.ebooks.metadata.cli import option_parser as metaop, filetypes as meta_filetypes - from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop - from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop - from calibre.gui2.viewer.main import option_parser as viewer_op - from calibre.gui2.tweak_book.main import option_parser as tweak_op - from calibre.ebooks.metadata.sources.cli import option_parser as fem_op - from calibre.gui2.main import option_parser as guiop - from calibre.utils.smtp import option_parser as smtp_op - from calibre.srv.standalone import create_option_parser as serv_op - from calibre.ebooks.oeb.polish.main import option_parser as polish_op, SUPPORTED - from calibre.ebooks.oeb.polish.import_book import IMPORTABLE + from calibre.customize.ui import available_input_formats from calibre.debug import option_parser as debug_op from calibre.ebooks import BOOK_EXTENSIONS - from calibre.customize.ui import available_input_formats + from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop + from calibre.ebooks.metadata.cli import ( + filetypes as meta_filetypes, option_parser as metaop, + ) + from calibre.ebooks.metadata.sources.cli import option_parser as fem_op + from calibre.ebooks.oeb.polish.import_book import IMPORTABLE + from calibre.ebooks.oeb.polish.main import SUPPORTED, option_parser as polish_op + from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop + from calibre.gui2.main import option_parser as guiop + from calibre.gui2.tweak_book.main import option_parser as tweak_op + from calibre.gui2.viewer.main import option_parser as viewer_op + from calibre.srv.standalone import create_option_parser as serv_op + from calibre.utils.smtp import option_parser as smtp_op input_formats = sorted(all_input_formats()) tweak_formats = sorted(x.lower() for x in SUPPORTED|IMPORTABLE) @@ -917,8 +922,8 @@ class PostInstall: line += extra + ';' f.write(line.encode('utf-8') + b'\n') - from calibre.ebooks.oeb.polish.main import SUPPORTED from calibre.ebooks.oeb.polish.import_book import IMPORTABLE + from calibre.ebooks.oeb.polish.main import SUPPORTED with open('calibre-lrfviewer.desktop', 'wb') as f: f.write(VIEWER.encode('utf-8')) with open('calibre-ebook-viewer.desktop', 'wb') as f: @@ -1208,8 +1213,8 @@ def changelog_bullet_to_text(bullet): def make_appdata_releases(): - from lxml.builder import E import json + from lxml.builder import E changelog = json.loads(P('changelog.json', data=True)) releases = E.releases() @@ -1247,8 +1252,8 @@ def make_appdata_releases(): def write_appdata(key, entry, base, translators): - from lxml.etree import tostring from lxml.builder import E + from lxml.etree import tostring fpath = os.path.join(base, '%s.metainfo.xml' % key) screenshots = E.screenshots() for w, h, url in entry['screenshots']: diff --git a/src/calibre/scraper/simple.py b/src/calibre/scraper/simple.py index bb34526425..72cfbcf068 100644 --- a/src/calibre/scraper/simple.py +++ b/src/calibre/scraper/simple.py @@ -13,6 +13,7 @@ from calibre.constants import iswindows from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.filenames import retry_on_fail from calibre.utils.ipc.simple_worker import start_pipe_worker +from calibre.utils.resources import get_path as P def worker_main(source): diff --git a/src/calibre/scraper/simple_backend.py b/src/calibre/scraper/simple_backend.py index 025f6571b9..5e1da83d10 100644 --- a/src/calibre/scraper/simple_backend.py +++ b/src/calibre/scraper/simple_backend.py @@ -10,6 +10,7 @@ from functools import lru_cache from qt.core import QApplication, QEventLoop, QUrl from qt.webengine import QWebEnginePage, QWebEngineProfile, QWebEngineSettings +from calibre.utils.resources import get_path as P from calibre.utils.webengine import create_script, insert_scripts, setup_profile diff --git a/src/calibre/spell/__init__.py b/src/calibre/spell/__init__.py index c63ad4e799..253dcbda4d 100644 --- a/src/calibre/spell/__init__.py +++ b/src/calibre/spell/__init__.py @@ -7,6 +7,7 @@ __copyright__ = '2014, Kovid Goyal ' from collections import namedtuple from calibre.utils.localization import canonicalize_lang +from calibre.utils.resources import get_path as P DictionaryLocale = namedtuple('DictionaryLocale', 'langcode countrycode') diff --git a/src/calibre/spell/dictionary.py b/src/calibre/spell/dictionary.py index 3aae5a9d81..89042bcf63 100644 --- a/src/calibre/spell/dictionary.py +++ b/src/calibre/spell/dictionary.py @@ -17,6 +17,7 @@ from calibre.spell import parse_lang_code from calibre.utils.config import JSONConfig from calibre.utils.icu import capitalize from calibre.utils.localization import get_lang, get_system_locale +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems, itervalues Dictionary = namedtuple('Dictionary', 'primary_locale locales dicpath affpath builtin name id') diff --git a/src/calibre/spell/import_from.py b/src/calibre/spell/import_from.py index 90d3fb10fe..5fa7b36f17 100644 --- a/src/calibre/spell/import_from.py +++ b/src/calibre/spell/import_from.py @@ -11,6 +11,7 @@ from lxml import etree from calibre.constants import config_dir from calibre.utils.xml_parse import safe_xml_fromstring from calibre.utils.zipfile import ZipFile +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems NS_MAP = { @@ -19,8 +20,11 @@ NS_MAP = { 'manifest': 'http://openoffice.org/2001/manifest', } + def XPath(x): return etree.XPath(x, namespaces=NS_MAP) + + BUILTIN_LOCALES = {'en-US', 'en-GB', 'es-ES'} diff --git a/src/calibre/srv/books.py b/src/calibre/srv/books.py index 463016281b..3af369b0d8 100644 --- a/src/calibre/srv/books.py +++ b/src/calibre/srv/books.py @@ -21,6 +21,7 @@ from calibre.srv.render_book import RENDER_VERSION from calibre.srv.routes import endpoint, json from calibre.srv.utils import get_db, get_library_data from calibre.utils.filenames import rmtree +from calibre.utils.resources import get_path as P from calibre.utils.serialize import json_dumps from polyglot.builtins import as_unicode, itervalues diff --git a/src/calibre/srv/code.py b/src/calibre/srv/code.py index 73e1d3c754..4fa3a4d2ab 100644 --- a/src/calibre/srv/code.py +++ b/src/calibre/srv/code.py @@ -29,6 +29,7 @@ from calibre.utils.icu import numeric_sort_key, sort_key from calibre.utils.localization import ( get_lang, lang_code_for_user_manual, lang_map_for_ui, localize_website_link, ) +from calibre.utils.resources import get_path as P from calibre.utils.search_query_parser import ParseException from calibre.utils.serialize import json_dumps from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/srv/content.py b/src/calibre/srv/content.py index 57729f10fc..17fe89b863 100644 --- a/src/calibre/srv/content.py +++ b/src/calibre/srv/content.py @@ -4,30 +4,34 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import os, errno -from io import BytesIO -from threading import Lock +import errno +import os from contextlib import suppress from functools import partial +from io import BytesIO +from threading import Lock from calibre import fit_image, sanitize_file_name from calibre.constants import config_dir, iswindows from calibre.db.errors import NoSuchFormat -from calibre.ebooks.covers import cprefs, override_prefs, scale_cover, generate_cover, set_use_roman +from calibre.ebooks.covers import ( + cprefs, generate_cover, override_prefs, scale_cover, set_use_roman, +) from calibre.ebooks.metadata import authors_to_string from calibre.ebooks.metadata.meta import set_metadata from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.library.save_to_disk import find_plugboard -from calibre.srv.errors import HTTPNotFound, BookNotFound +from calibre.srv.errors import BookNotFound, HTTPNotFound from calibre.srv.routes import endpoint, json -from calibre.srv.utils import http_date, get_db, get_use_roman +from calibre.srv.utils import get_db, get_use_roman, http_date from calibre.utils.config_base import tweaks from calibre.utils.date import timestampfromdt -from calibre.utils.img import scale_image, image_from_data from calibre.utils.filenames import ascii_filename, atomic_rename +from calibre.utils.img import image_from_data, scale_image +from calibre.utils.resources import get_path as P from calibre.utils.shared_file import share_open -from polyglot.urllib import quote from polyglot.binary import as_hex_unicode +from polyglot.urllib import quote plugboard_content_server_value = 'content_server' plugboard_content_server_formats = ['epub', 'mobi', 'azw3'] diff --git a/src/calibre/srv/tests/base.py b/src/calibre/srv/tests/base.py index dd3efcf1b8..5ab2ded116 100644 --- a/src/calibre/srv/tests/base.py +++ b/src/calibre/srv/tests/base.py @@ -5,12 +5,19 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import unittest, time, shutil, gc, tempfile, atexit, os -from io import BytesIO +import atexit +import gc +import os +import shutil +import tempfile +import time +import unittest from functools import partial +from io import BytesIO from threading import Thread from calibre.srv.utils import ServerLog +from calibre.utils.resources import get_path as P from polyglot import http_client rmtree = partial(shutil.rmtree, ignore_errors=True) @@ -70,8 +77,8 @@ class LibraryBaseTest(BaseTest): return ans def create_db(self, library_path): - from calibre.db.legacy import create_backend from calibre.db.cache import Cache + from calibre.db.legacy import create_backend d = os.path.dirname src = os.path.join(d(d(d(os.path.abspath(__file__)))), 'db', 'tests', 'metadata.db') dest = os.path.join(library_path, 'metadata.db') @@ -98,9 +105,9 @@ class TestServer(Thread): def __init__(self, handler, plugins=(), **kwargs): Thread.__init__(self, name='ServerMain') - from calibre.srv.opts import Options - from calibre.srv.loop import ServerLoop from calibre.srv.http_response import create_http_handler + from calibre.srv.loop import ServerLoop + from calibre.srv.opts import Options self.setup_defaults(kwargs) self.loop = ServerLoop( create_http_handler(handler), @@ -155,10 +162,10 @@ class LibraryServer(TestServer): def __init__(self, library_path, libraries=(), plugins=(), **kwargs): Thread.__init__(self, name='ServerMain') - from calibre.srv.opts import Options - from calibre.srv.loop import ServerLoop from calibre.srv.handler import Handler from calibre.srv.http_response import create_http_handler + from calibre.srv.loop import ServerLoop + from calibre.srv.opts import Options self.setup_defaults(kwargs) opts = Options(**kwargs) self.libraries = libraries or (library_path,) diff --git a/src/calibre/srv/tests/content.py b/src/calibre/srv/tests/content.py index ac5aa1a3a0..aa76b94ebf 100644 --- a/src/calibre/srv/tests/content.py +++ b/src/calibre/srv/tests/content.py @@ -4,13 +4,17 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import zlib, json, time, os +import json +import os +import time +import zlib from io import BytesIO from calibre.ebooks.metadata.epub import get_metadata from calibre.ebooks.metadata.opf2 import OPF from calibre.srv.tests.base import LibraryBaseTest from calibre.utils.imghdr import identify +from calibre.utils.resources import get_path as P from calibre.utils.shared_file import share_open from polyglot import http_client from polyglot.binary import from_hex_unicode @@ -226,8 +230,8 @@ class ContentTest(LibraryBaseTest): # }}} def test_char_count(self): # {{{ - from calibre.srv.render_book import get_length from calibre.ebooks.oeb.parse_utils import html5_parse + from calibre.srv.render_book import get_length root = html5_parse('

a b\nc\td\re') self.ae(get_length(root), 5) @@ -238,8 +242,8 @@ class ContentTest(LibraryBaseTest): # }}} def test_html_as_json(self): # {{{ - from calibre.srv.render_book import html_as_json from calibre.ebooks.oeb.parse_utils import html5_parse + from calibre.srv.render_book import html_as_json def t(html, body_children, nsmap=('http://www.w3.org/1999/xhtml',)): root = html5_parse(html) diff --git a/src/calibre/srv/tests/http.py b/src/calibre/srv/tests/http.py index 2970cfa31a..5f217d5806 100644 --- a/src/calibre/srv/tests/http.py +++ b/src/calibre/srv/tests/http.py @@ -4,7 +4,11 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import hashlib, zlib, string, time, os +import hashlib +import os +import string +import time +import zlib from io import BytesIO from tempfile import NamedTemporaryFile @@ -12,8 +16,9 @@ from calibre import guess_type from calibre.srv.tests.base import BaseTest, TestServer from calibre.srv.utils import eintr_retry_call from calibre.utils.monotonic import monotonic -from polyglot.builtins import iteritems +from calibre.utils.resources import get_path as P from polyglot import http_client +from polyglot.builtins import iteritems is_ci = os.environ.get('CI', '').lower() == 'true' diff --git a/src/calibre/test_build.py b/src/calibre/test_build.py index 5b3bd63f12..cad191b616 100644 --- a/src/calibre/test_build.py +++ b/src/calibre/test_build.py @@ -18,6 +18,7 @@ import time import unittest from calibre.constants import islinux, ismacos, iswindows, plugins_loc +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems is_ci = os.environ.get('CI', '').lower() == 'true' @@ -304,7 +305,8 @@ class BuildTest(unittest.TestCase): if is_sanitized: raise unittest.SkipTest('Skipping Qt build test as sanitizer is enabled') from qt.core import ( - QApplication, QFontDatabase, QImageReader, QNetworkAccessManager, QTimer, QSslSocket + QApplication, QFontDatabase, QImageReader, QNetworkAccessManager, + QSslSocket, QTimer, ) from qt.webengine import QWebEnginePage diff --git a/src/calibre/utils/config_base.py b/src/calibre/utils/config_base.py index c89fecbfc6..2caeaea00a 100644 --- a/src/calibre/utils/config_base.py +++ b/src/calibre/utils/config_base.py @@ -15,8 +15,9 @@ from functools import partial from calibre.constants import ( CONFIG_DIR_MODE, config_dir, filesystem_encoding, get_umask, iswindows, - preferred_encoding + preferred_encoding, ) +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems plugin_dir = os.path.join(config_dir, 'plugins') diff --git a/src/calibre/utils/fonts/scanner.py b/src/calibre/utils/fonts/scanner.py index ca24757f40..d3b2983308 100644 --- a/src/calibre/utils/fonts/scanner.py +++ b/src/calibre/utils/fonts/scanner.py @@ -9,11 +9,13 @@ import os from collections import defaultdict from threading import Thread -from calibre import walk, prints, as_unicode -from calibre.constants import (config_dir, iswindows, ismacos, DEBUG, - isworker, filesystem_encoding) +from calibre import as_unicode, prints, walk +from calibre.constants import ( + DEBUG, config_dir, filesystem_encoding, ismacos, iswindows, isworker, +) from calibre.utils.fonts.metadata import FontMetadata, UnsupportedFont from calibre.utils.icu import sort_key +from calibre.utils.resources import get_path as P from polyglot.builtins import itervalues @@ -267,8 +269,9 @@ class FontScanner(Thread): :return: (family name, faces) or None, None ''' - from calibre.utils.fonts.utils import (supports_text, - panose_to_css_generic_family, get_printable_characters) + from calibre.utils.fonts.utils import ( + get_printable_characters, panose_to_css_generic_family, supports_text, + ) if not isinstance(text, str): raise TypeError('%r is not unicode'%text) text = get_printable_characters(text) diff --git a/src/calibre/utils/fonts/sfnt/container.py b/src/calibre/utils/fonts/sfnt/container.py index da7a341277..93cf47e08a 100644 --- a/src/calibre/utils/fonts/sfnt/container.py +++ b/src/calibre/utils/fonts/sfnt/container.py @@ -13,12 +13,13 @@ from calibre.utils.fonts.sfnt.errors import UnsupportedFont from calibre.utils.fonts.sfnt.glyf import GlyfTable from calibre.utils.fonts.sfnt.gsub import GSUBTable from calibre.utils.fonts.sfnt.head import ( - HeadTable, HorizontalHeader, OS2Table, PostTable, VerticalHeader + HeadTable, HorizontalHeader, OS2Table, PostTable, VerticalHeader, ) from calibre.utils.fonts.sfnt.kern import KernTable from calibre.utils.fonts.sfnt.loca import LocaTable from calibre.utils.fonts.sfnt.maxp import MaxpTable from calibre.utils.fonts.utils import checksum_of_block, get_tables, verify_checksums +from calibre.utils.resources import get_path as P # OpenType spec: http://www.microsoft.com/typography/otspec/otff.htm @@ -105,7 +106,7 @@ class Sfnt: return ans def get_all_font_names(self): - from calibre.utils.fonts.metadata import get_font_names2, FontNames + from calibre.utils.fonts.metadata import FontNames, get_font_names2 name_table = self.get(b'name') if name_table is not None: return FontNames(*get_font_names2(name_table.raw, raw_is_table=True)) diff --git a/src/calibre/utils/fonts/sfnt/subset.py b/src/calibre/utils/fonts/sfnt/subset.py index c90118b2c8..2377467ba5 100644 --- a/src/calibre/utils/fonts/sfnt/subset.py +++ b/src/calibre/utils/fonts/sfnt/subset.py @@ -7,12 +7,13 @@ __docformat__ = 'restructuredtext en' import traceback from collections import OrderedDict -from operator import itemgetter from functools import partial +from operator import itemgetter -from calibre.utils.icu import safe_chr, ord_string from calibre.utils.fonts.sfnt.container import Sfnt -from calibre.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs +from calibre.utils.fonts.sfnt.errors import NoGlyphs, UnsupportedFont +from calibre.utils.icu import ord_string, safe_chr +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems, itervalues # TrueType outlines {{{ @@ -197,6 +198,7 @@ def subset(raw, individual_chars, ranges=(), warnings=None): def option_parser(): import textwrap + from calibre.utils.config import OptionParser parser = OptionParser(usage=textwrap.dedent('''\ %prog [options] input_font_file output_font_file characters_to_keep @@ -239,7 +241,9 @@ def print_stats(old_stats, new_stats): def main(args): - import sys, time + import sys + import time + from calibre import prints parser = option_parser() opts, args = parser.parse_args(args) @@ -308,8 +312,9 @@ if __name__ == '__main__': def test_mem(): - from calibre.utils.mem import memory import gc + + from calibre.utils.mem import memory gc.collect() start_mem = memory() raw = P('fonts/liberation/LiberationSerif-Regular.ttf', data=True) diff --git a/src/calibre/utils/fonts/utils.py b/src/calibre/utils/fonts/utils.py index 3c589c8479..9450a17699 100644 --- a/src/calibre/utils/fonts/utils.py +++ b/src/calibre/utils/fonts/utils.py @@ -6,10 +6,11 @@ __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' import struct -from io import BytesIO from collections import defaultdict +from io import BytesIO -from polyglot.builtins import iteritems, itervalues, as_bytes +from calibre.utils.resources import get_path as P +from polyglot.builtins import as_bytes, iteritems, itervalues class UnsupportedFont(ValueError): @@ -484,7 +485,8 @@ def test(): def main(): - import sys, os + import os + import sys for arg in sys.argv[1:]: print(os.path.basename(arg)) with open(arg, 'rb') as f: diff --git a/src/calibre/utils/fonts/win_fonts.py b/src/calibre/utils/fonts/win_fonts.py index f3c981cf4a..3411a73ce2 100644 --- a/src/calibre/utils/fonts/win_fonts.py +++ b/src/calibre/utils/fonts/win_fonts.py @@ -9,6 +9,7 @@ import os, sys, atexit from itertools import product from calibre import prints, isbytestring +from calibre.utils.resources import get_path as P from calibre.constants import filesystem_encoding from calibre.utils.fonts.utils import (is_truetype_font, get_font_names, get_font_characteristics) diff --git a/src/calibre/utils/https.py b/src/calibre/utils/https.py index 94a8648989..84395de07f 100644 --- a/src/calibre/utils/https.py +++ b/src/calibre/utils/https.py @@ -8,6 +8,7 @@ import ssl, socket, re from contextlib import closing from calibre import get_proxies +from calibre.utils.resources import get_path as P from polyglot import http_client from polyglot.urllib import urlsplit has_ssl_verify = hasattr(ssl, 'create_default_context') and hasattr(ssl, '_create_unverified_context') diff --git a/src/calibre/utils/hyphenation/dictionaries.py b/src/calibre/utils/hyphenation/dictionaries.py index 381c80a7a3..1d562f27ee 100644 --- a/src/calibre/utils/hyphenation/dictionaries.py +++ b/src/calibre/utils/hyphenation/dictionaries.py @@ -10,6 +10,7 @@ from io import BytesIO from calibre.constants import cache_dir from calibre.ptempfile import TemporaryDirectory +from calibre.utils.resources import get_path as P from calibre.utils.localization import lang_as_iso639_1 from calibre.utils.lock import ExclusiveFile from polyglot.builtins import iteritems diff --git a/src/calibre/utils/random_ua.py b/src/calibre/utils/random_ua.py index be487947d6..4e69bc622b 100644 --- a/src/calibre/utils/random_ua.py +++ b/src/calibre/utils/random_ua.py @@ -4,6 +4,7 @@ import json import random +from calibre.utils.resources import get_path as P def user_agent_data(): diff --git a/src/calibre/utils/rapydscript.py b/src/calibre/utils/rapydscript.py index d228363058..01fdce65a9 100644 --- a/src/calibre/utils/rapydscript.py +++ b/src/calibre/utils/rapydscript.py @@ -17,6 +17,7 @@ from calibre.constants import ( ) from calibre.ptempfile import TemporaryDirectory from calibre.utils.filenames import atomic_rename +from calibre.utils.resources import get_path as P from polyglot.builtins import as_bytes, as_unicode, exec_path COMPILER_PATH = 'rapydscript/compiler.js.xz' diff --git a/src/calibre/utils/search_query_parser.py b/src/calibre/utils/search_query_parser.py index 149943cf41..c72615595f 100644 --- a/src/calibre/utils/search_query_parser.py +++ b/src/calibre/utils/search_query_parser.py @@ -20,7 +20,7 @@ If this module is run, it will perform a series of unit tests. import weakref, re from calibre.constants import preferred_encoding -from calibre.utils.icu import sort_key +from calibre.utils.icu import sort_key, lower as icu_lower from calibre.utils.localization import _ from calibre import prints from polyglot.binary import as_hex_unicode, from_hex_unicode diff --git a/src/calibre/utils/titlecase.py b/src/calibre/utils/titlecase.py index 61857a6329..f5d5163e04 100644 --- a/src/calibre/utils/titlecase.py +++ b/src/calibre/utils/titlecase.py @@ -10,7 +10,7 @@ License: http://www.opensource.org/licenses/mit-license.php import re -from calibre.utils.icu import capitalize, upper +from calibre.utils.icu import capitalize, lower as icu_lower, upper as icu_upper __all__ = ['titlecase'] __version__ = '0.5' @@ -52,7 +52,7 @@ def titlecase(text): """ - all_caps = upper(text) == text + all_caps = icu_upper(text) == text pat = re.compile(r'(\s+)') line = [] diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py index 19ed7e04fc..52a6555f7a 100644 --- a/src/calibre/web/feeds/news.py +++ b/src/calibre/web/feeds/news.py @@ -28,7 +28,7 @@ from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.date import now as nowf from calibre.utils.icu import numeric_sort_key from calibre.utils.img import add_borders_to_image, image_to_data, save_cover_data_to -from calibre.utils.localization import _, canonicalize_lang +from calibre.utils.localization import _, canonicalize_lang, ngettext from calibre.utils.logging import ThreadSafeWrapper from calibre.utils.threadpool import NoResultsPending, ThreadPool, WorkRequest from calibre.web import Recipe