Clean up the handling of anchors and page breaks.

This commit is contained in:
Marshall T. Vandegrift 2009-01-06 20:08:34 -05:00
parent 4346c7f66c
commit c4bef79096
3 changed files with 21 additions and 18 deletions

View File

@ -44,6 +44,7 @@ class BlockState(object):
self.vmargin = 0. self.vmargin = 0.
self.pbreak = False self.pbreak = False
self.istate = None self.istate = None
self.content = False
class FormatState(object): class FormatState(object):
def __init__(self): def __init__(self):
@ -120,17 +121,20 @@ class MobiMLizer(object):
return result return result
def mobimlize_content(self, tag, text, bstate, istates): def mobimlize_content(self, tag, text, bstate, istates):
bstate.content = True
istate = istates[-1] istate = istates[-1]
if istate.ids:
body = bstate.body
index = max((0, len(body) - 1))
for id in istate.ids:
body.insert(index, etree.Element('a', attrib={'id': id}))
istate.ids.clear()
para = bstate.para para = bstate.para
if tag in SPECIAL_TAGS and not text: if tag in SPECIAL_TAGS and not text:
para = para if para is not None else bstate.body para = para if para is not None else bstate.body
elif para is None: elif para is None:
body = bstate.body
if bstate.pbreak:
etree.SubElement(body, MBP('pagebreak'))
bstate.pbreak = False
if istate.ids:
for id in istate.ids:
etree.SubElement(body, 'a', attrib={'id': id})
istate.ids.clear()
bstate.istate = None bstate.istate = None
parent = bstate.nested[-1] if bstate.nested else bstate.body parent = bstate.nested[-1] if bstate.nested else bstate.body
indent = istate.indent indent = istate.indent
@ -140,9 +144,6 @@ class MobiMLizer(object):
indent = 0 indent = 0
elif indent != 0 and abs(indent) < self.profile.fbase: elif indent != 0 and abs(indent) < self.profile.fbase:
indent = (indent / abs(indent)) * self.profile.fbase indent = (indent / abs(indent)) * self.profile.fbase
if bstate.pbreak:
etree.SubElement(parent, MBP('pagebreak'))
bstate.pbreak = False
if tag in NESTABLE_TAGS: if tag in NESTABLE_TAGS:
para = wrapper = etree.SubElement(parent, tag) para = wrapper = etree.SubElement(parent, tag)
bstate.nested.append(para) bstate.nested.append(para)
@ -270,7 +271,7 @@ class MobiMLizer(object):
else: else:
last = elem[-1] last = elem[-1]
last.text = (last.text or '') + (u'\xa0' * spaces) last.text = (last.text or '') + (u'\xa0' * spaces)
if style['page-break-before'] in PAGE_BREAKS: if bstate.content and style['page-break-before'] in PAGE_BREAKS:
bstate.pbreak = True bstate.pbreak = True
istate.fsize = self.mobimlize_font(style['font-size']) istate.fsize = self.mobimlize_font(style['font-size'])
istate.italic = True if style['font-style'] == 'italic' else False istate.italic = True if style['font-style'] == 'italic' else False
@ -340,7 +341,7 @@ class MobiMLizer(object):
tail = COLLAPSE.sub(' ', child.tail) tail = COLLAPSE.sub(' ', child.tail)
if tail: if tail:
self.mobimlize_content(tag, tail, bstate, istates) self.mobimlize_content(tag, tail, bstate, istates)
if style['page-break-after'] in PAGE_BREAKS: if bstate.content and style['page-break-after'] in PAGE_BREAKS:
bstate.pbreak = True bstate.pbreak = True
if isblock: if isblock:
para = bstate.para para = bstate.para

View File

@ -103,7 +103,7 @@ class Serializer(object):
buffer.write('<reference title="%s" type="%s" ' buffer.write('<reference title="%s" type="%s" '
% (ref.title, ref.type)) % (ref.title, ref.type))
self.serialize_href(ref.href) self.serialize_href(ref.href)
buffer.write(' />') buffer.write('/>')
buffer.write('</guide>') buffer.write('</guide>')
def serialize_href(self, href, base=None): def serialize_href(self, href, base=None):
@ -118,8 +118,7 @@ class Serializer(object):
if item and item.spine_position is None: if item and item.spine_position is None:
return False return False
id = item.id if item else base.id id = item.id if item else base.id
frag = frag if frag else 'calibre_top' href = '#'.join((id, frag)) if frag else id
href = '#'.join((id, frag))
buffer.write('filepos=') buffer.write('filepos=')
self.href_offsets[href].append(buffer.tell()) self.href_offsets[href].append(buffer.tell())
buffer.write('0000000000') buffer.write('0000000000')
@ -138,10 +137,10 @@ class Serializer(object):
buffer = self.buffer buffer = self.buffer
if not item.linear: if not item.linear:
self.breaks.append(buffer.tell() - 1) self.breaks.append(buffer.tell() - 1)
self.id_offsets[item.id + '#calibre_top'] = buffer.tell() self.id_offsets[item.id] = buffer.tell()
for elem in item.data.find(XHTML('body')): for elem in item.data.find(XHTML('body')):
self.serialize_elem(elem, item) self.serialize_elem(elem, item)
buffer.write(' <mbp:pagebreak/>') buffer.write('<mbp:pagebreak/>')
def serialize_elem(self, elem, item, nsrmap=NSRMAP): def serialize_elem(self, elem, item, nsrmap=NSRMAP):
buffer = self.buffer buffer = self.buffer
@ -155,6 +154,9 @@ class Serializer(object):
id = '#'.join((item.id, elem.attrib[attr])) id = '#'.join((item.id, elem.attrib[attr]))
self.id_offsets[id] = buffer.tell() self.id_offsets[id] = buffer.tell()
del elem.attrib[attr] del elem.attrib[attr]
if tag == 'a' and not elem.attrib \
and not len(elem) and not elem.text:
return
buffer.write('<') buffer.write('<')
buffer.write(tag) buffer.write(tag)
if elem.attrib: if elem.attrib:

View File

@ -249,10 +249,10 @@ class Metadata(object):
self.oeb = oeb self.oeb = oeb
self.items = defaultdict(list) self.items = defaultdict(list)
def add(self, term, value, attrib={}, index=-1, **kwargs): def add(self, term, value, attrib={}, **kwargs):
item = self.Item(term, value, attrib, **kwargs) item = self.Item(term, value, attrib, **kwargs)
items = self.items[barename(item.term)] items = self.items[barename(item.term)]
items.insert(index, item) items.append(item)
return item return item
def iterkeys(self): def iterkeys(self):