diff --git a/src/calibre/ebooks/lit/oeb.py b/src/calibre/ebooks/lit/oeb.py index 68b51695b2..e8ae48bfa1 100644 --- a/src/calibre/ebooks/lit/oeb.py +++ b/src/calibre/ebooks/lit/oeb.py @@ -439,6 +439,9 @@ class Guide(object): def __contains__(self, key): return key in self.refs + def __len__(self): + return len(self.refs) + def to_opf1(self, parent=None): elem = element(parent, 'guide') for ref in self.refs.values(): diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index a382492e40..b273d1946b 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -46,10 +46,8 @@ UNCOMPRESSED = 1 PALMDOC = 2 HUFFDIC = 17480 -COLLAPSE = re.compile(r'[ \t\r\n\v]+') - def encode(data): - return COLLAPSE.sub(' ', data).encode('ascii', 'xmlcharrefreplace') + return data.encode('ascii', 'xmlcharrefreplace') class Serializer(object): @@ -72,7 +70,37 @@ class Serializer(object): def serialize_head(self): buffer = self.buffer buffer.write('') + if len(self.oeb.guide) > 0: + self.serialize_guide() buffer.write('') + + def serialize_guide(self): + buffer = self.buffer + buffer.write('') + for ref in self.oeb.guide.values(): + buffer.write('') + buffer.write('') + + def serialize_href(self, href, baseid=None): + hrefs = self.oeb.manifest.hrefs + path, frag = urldefrag(href) + # TODO: Absolute path translation + if path and path not in hrefs: + return False + buffer = self.buffer + item = hrefs[path] if path else None + if item and item.spine_position is None: + return False + id = item.id if item else baseid + frag = frag if frag else 'calibre_top' + href = '_'.join((id, frag)) + buffer.write('filepos=') + self.href_offsets[href].append(buffer.tell()) + buffer.write('0000000000') + return True def serialize_body(self): buffer = self.buffer @@ -109,30 +137,22 @@ class Serializer(object): for attr, val in elem.attrib.items(): buffer.write(' ') if attr == 'href': - path, frag = urldefrag(val) - # TODO: Absolute path translation - if not path or path in hrefs: - id = hrefs[path].id if path else item.id - frag = frag if frag else 'calibre_top' - href = '_'.join((id, frag)) - buffer.write('filepos=') - self.href_offsets[href].append(buffer.tell()) - buffer.write('0000000000') + if self.serialize_href(val, item.id): continue elif attr == 'src' and val in hrefs: index = self.images[val] buffer.write('recindex="%05d"' % index) continue buffer.write('%s="%s"' % (attr, val)) - if not elem.text and len(elem) == 0: + if elem.text or len(elem) > 0: + buffer.write('>') + if elem.text: + buffer.write(encode(elem.text)) + for child in elem: + self.serialize_elem(child, item) + buffer.write('' % tag) + else: buffer.write('/>') - return - buffer.write('>') - if elem.text: - buffer.write(encode(elem.text)) - for child in elem: - self.serialize_elem(child, item) - buffer.write('' % tag) if elem.tail: buffer.write(encode(elem.tail))