diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index 461c067382..02fc98d9df 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -11,6 +11,7 @@ import sys, struct, cStringIO, os import functools import re from urlparse import urldefrag +from urllib import unquote as urlunquote from lxml import etree from calibre.ebooks.lit import LitError from calibre.ebooks.lit.maps import OPF_MAP, HTML_MAP @@ -611,6 +612,8 @@ class LitReader(object): offset, raw = u32(raw), raw[4:] internal, raw = consume_sized_utf8_string(raw) original, raw = consume_sized_utf8_string(raw) + # The path should be stored unquoted, but not always + original = urlunquote(original) # Is this last one UTF-8 or ASCIIZ? mime_type, raw = consume_sized_utf8_string(raw, zpad=True) self.manifest[internal] = ManifestItem( diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index 2bc898748d..1510cb6c32 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -331,6 +331,13 @@ class Manifest(object): def _force_xhtml(self, data): if self.oeb.encoding is not None: data = data.decode(self.oeb.encoding, 'replace') + # Handle broken XHTML w/ SVG (ugh) + if 'svg:' in data and SVG_NS not in data: + data = data.replace( + '
element' % self.href) + head = etree.Element(XHTML('head')) + data.insert(0, head) + title = etree.SubElement(head, XHTML('title')) + title.text = self.oeb.translate(__('Unknown')) + elif not xpath(data, '/h:html/h:head/h:title'): + self.oeb.logger.warn( + 'File %r missing