mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 02:34:06 -04:00
Fix bug in HTML serialization.
Remove whitespace collapse -- will be done in markup conversion. Add support to generate Mobipocket <reference/> elements from OPF guide.
This commit is contained in:
parent
b8373de13b
commit
7ff96f540f
@ -439,6 +439,9 @@ class Guide(object):
|
|||||||
def __contains__(self, key):
|
def __contains__(self, key):
|
||||||
return key in self.refs
|
return key in self.refs
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.refs)
|
||||||
|
|
||||||
def to_opf1(self, parent=None):
|
def to_opf1(self, parent=None):
|
||||||
elem = element(parent, 'guide')
|
elem = element(parent, 'guide')
|
||||||
for ref in self.refs.values():
|
for ref in self.refs.values():
|
||||||
|
@ -46,10 +46,8 @@ UNCOMPRESSED = 1
|
|||||||
PALMDOC = 2
|
PALMDOC = 2
|
||||||
HUFFDIC = 17480
|
HUFFDIC = 17480
|
||||||
|
|
||||||
COLLAPSE = re.compile(r'[ \t\r\n\v]+')
|
|
||||||
|
|
||||||
def encode(data):
|
def encode(data):
|
||||||
return COLLAPSE.sub(' ', data).encode('ascii', 'xmlcharrefreplace')
|
return data.encode('ascii', 'xmlcharrefreplace')
|
||||||
|
|
||||||
|
|
||||||
class Serializer(object):
|
class Serializer(object):
|
||||||
@ -72,8 +70,38 @@ class Serializer(object):
|
|||||||
def serialize_head(self):
|
def serialize_head(self):
|
||||||
buffer = self.buffer
|
buffer = self.buffer
|
||||||
buffer.write('<head>')
|
buffer.write('<head>')
|
||||||
|
if len(self.oeb.guide) > 0:
|
||||||
|
self.serialize_guide()
|
||||||
buffer.write('</head>')
|
buffer.write('</head>')
|
||||||
|
|
||||||
|
def serialize_guide(self):
|
||||||
|
buffer = self.buffer
|
||||||
|
buffer.write('<guide>')
|
||||||
|
for ref in self.oeb.guide.values():
|
||||||
|
buffer.write('<reference title="%s" type="%s" '
|
||||||
|
% (ref.title, ref.type))
|
||||||
|
self.serialize_href(ref.href)
|
||||||
|
buffer.write('/>')
|
||||||
|
buffer.write('</guide>')
|
||||||
|
|
||||||
|
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):
|
def serialize_body(self):
|
||||||
buffer = self.buffer
|
buffer = self.buffer
|
||||||
buffer.write('<body>')
|
buffer.write('<body>')
|
||||||
@ -109,30 +137,22 @@ class Serializer(object):
|
|||||||
for attr, val in elem.attrib.items():
|
for attr, val in elem.attrib.items():
|
||||||
buffer.write(' ')
|
buffer.write(' ')
|
||||||
if attr == 'href':
|
if attr == 'href':
|
||||||
path, frag = urldefrag(val)
|
if self.serialize_href(val, item.id):
|
||||||
# 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')
|
|
||||||
continue
|
continue
|
||||||
elif attr == 'src' and val in hrefs:
|
elif attr == 'src' and val in hrefs:
|
||||||
index = self.images[val]
|
index = self.images[val]
|
||||||
buffer.write('recindex="%05d"' % index)
|
buffer.write('recindex="%05d"' % index)
|
||||||
continue
|
continue
|
||||||
buffer.write('%s="%s"' % (attr, val))
|
buffer.write('%s="%s"' % (attr, val))
|
||||||
if not elem.text and len(elem) == 0:
|
if elem.text or len(elem) > 0:
|
||||||
buffer.write('/>')
|
|
||||||
return
|
|
||||||
buffer.write('>')
|
buffer.write('>')
|
||||||
if elem.text:
|
if elem.text:
|
||||||
buffer.write(encode(elem.text))
|
buffer.write(encode(elem.text))
|
||||||
for child in elem:
|
for child in elem:
|
||||||
self.serialize_elem(child, item)
|
self.serialize_elem(child, item)
|
||||||
buffer.write('</%s>' % tag)
|
buffer.write('</%s>' % tag)
|
||||||
|
else:
|
||||||
|
buffer.write('/>')
|
||||||
if elem.tail:
|
if elem.tail:
|
||||||
buffer.write(encode(elem.tail))
|
buffer.write(encode(elem.tail))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user