From acfcc63cfc5bf73e2aa6f5a80b6cd053a4817256 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 1 Jan 2015 08:57:03 +0530 Subject: [PATCH] AZW3 Input: Handle AZW3 files that contain Amazon specific CSS media queries. Fixes #1406708 [Converting azw3 to epub creates artifacts](https://bugs.launchpad.net/calibre/+bug/1406708) --- src/calibre/ebooks/mobi/reader/markup.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/calibre/ebooks/mobi/reader/markup.py b/src/calibre/ebooks/mobi/reader/markup.py index ebee47eb98..9e7a48274c 100644 --- a/src/calibre/ebooks/mobi/reader/markup.py +++ b/src/calibre/ebooks/mobi/reader/markup.py @@ -306,6 +306,24 @@ def upshift_markup(parts): # store away modified version parts[i] = part +def handle_media_queries(raw): + # cssutils cannot handle CSS 3 media queries. We look for media queries + # that use amzn-mobi or amzn-kf8 and map them to asimple @media screen + # rule. See https://bugs.launchpad.net/bugs/1406708 for an example + import tinycss + parser = tinycss.make_full_parser() + def replace(m): + sheet = parser.parse_stylesheet(m.group() + '}') + for mq in sheet.rules[0].media: + # Only accept KF8 media types + if (mq.media_type, mq.negated) in {('amzn-mobi', True), ('amzn-kf8', False)}: + break + else: + return m.group() + return '@media screen {' + + return re.sub(r'@media\s[^{]*{', replace, raw) + def expand_mobi8_markup(mobi8_reader, resource_map, log): # First update all internal links that are based on offsets parts = update_internal_links(mobi8_reader, log) @@ -347,6 +365,8 @@ def expand_mobi8_markup(mobi8_reader, resource_map, log): if not os.path.exists(fi.dir): os.mkdir(fi.dir) with open(os.path.join(fi.dir, fi.fname), 'wb') as f: + if fi.fname.endswith('.css') and '@media' in flow: + flow = handle_media_queries(flow) f.write(flow.encode('utf-8')) return spine