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('%s>' % 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('%s>' % tag)
if elem.tail:
buffer.write(encode(elem.tail))