mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
When rendering EPUB covers on OS X remove @font-face rules as well to prevent multi-render crashes
This commit is contained in:
parent
1f97500e84
commit
86ad40298a
@ -142,17 +142,40 @@ def render_cover(opf, opf_path, zf, reader=None):
|
|||||||
with TemporaryDirectory('_epub_meta') as tdir:
|
with TemporaryDirectory('_epub_meta') as tdir:
|
||||||
with CurrentDir(tdir):
|
with CurrentDir(tdir):
|
||||||
zf.extractall()
|
zf.extractall()
|
||||||
if isosx:
|
|
||||||
# On OS X trying to render an HTML cover which uses embedded
|
|
||||||
# fonts more than once in the same process causes a crash in Qt
|
|
||||||
# so be safe and remove the fonts.
|
|
||||||
for f in walk('.'):
|
|
||||||
if os.path.splitext(f)[1].lower() in ('.ttf', '.otf'):
|
|
||||||
os.remove(f)
|
|
||||||
opf_path = opf_path.replace('/', os.sep)
|
opf_path = opf_path.replace('/', os.sep)
|
||||||
cpage = os.path.join(tdir, os.path.dirname(opf_path), cpage)
|
cpage = os.path.join(tdir, os.path.dirname(opf_path), cpage)
|
||||||
if not os.path.exists(cpage):
|
if not os.path.exists(cpage):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if isosx:
|
||||||
|
# On OS X trying to render a HTML cover which uses embedded
|
||||||
|
# fonts more than once in the same process causes a crash in Qt
|
||||||
|
# so be safe and remove the fonts as well as any @font-face
|
||||||
|
# rules
|
||||||
|
for f in walk('.'):
|
||||||
|
if os.path.splitext(f)[1].lower() in ('.ttf', '.otf'):
|
||||||
|
os.remove(f)
|
||||||
|
ffpat = re.compile(br'@font-face.*?{.*?}',
|
||||||
|
re.DOTALL|re.IGNORECASE)
|
||||||
|
with open(cpage, 'r+b') as f:
|
||||||
|
raw = f.read()
|
||||||
|
f.truncate(0)
|
||||||
|
raw = ffpat.sub(b'', raw)
|
||||||
|
f.write(raw)
|
||||||
|
from calibre.ebooks.chardet import xml_to_unicode
|
||||||
|
raw = xml_to_unicode(raw,
|
||||||
|
strip_encoding_pats=True, resolve_entities=True)[0]
|
||||||
|
from lxml import html
|
||||||
|
for link in html.fromstring(raw).xpath('//link'):
|
||||||
|
href = link.get('href', '')
|
||||||
|
if href:
|
||||||
|
path = os.path.join(os.path.dirname(cpage), href)
|
||||||
|
if os.path.exists(path):
|
||||||
|
with open(path, 'r+b') as f:
|
||||||
|
raw = f.read()
|
||||||
|
f.truncate(0)
|
||||||
|
raw = ffpat.sub(b'', raw)
|
||||||
|
f.write(raw)
|
||||||
return render_html_svg_workaround(cpage, default_log)
|
return render_html_svg_workaround(cpage, default_log)
|
||||||
|
|
||||||
def get_cover(opf, opf_path, stream, reader=None):
|
def get_cover(opf, opf_path, stream, reader=None):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user