From 8a2f2f2510749ff4a5a894f8bb71b3f3291dce70 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 1 Feb 2009 21:10:03 -0800 Subject: [PATCH] Fix #1747 (Bug in TOC epub for level 2) --- src/calibre/ebooks/html.py | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/calibre/ebooks/html.py b/src/calibre/ebooks/html.py index a7883ed763..de863cca75 100644 --- a/src/calibre/ebooks/html.py +++ b/src/calibre/ebooks/html.py @@ -594,15 +594,21 @@ class Processor(Parser): ''' Populate the Table of Contents from detected chapters and links. ''' - - def add_item(href, fragment, text, target, type='link'): - for entry in toc.flat(): - if entry.href == href and entry.fragment == fragment: - return entry - if len(text) > 50: - text = text[:50] + u'\u2026' - return target.add_item(href, fragment, text, type=type) - + class Adder(object): + + def __init__(self, toc): + self.next_play_order = max([x.play_order for x in toc.flat()]) + + def __call__(self, href, fragment, text, target, type='link'): + for entry in toc.flat(): + if entry.href == href and entry.fragment == fragment: + return entry + if len(text) > 50: + text = text[:50] + u'\u2026' + self.next_play_order += 1 + return target.add_item(href, fragment, text, type=type, + play_order=self.next_play_order) + add_item = Adder(toc) name = self.htmlfile_map[self.htmlfile.path] href = 'content/'+name @@ -629,13 +635,15 @@ class Processor(Parser): if self.opts.level1_toc is not None: level1 = self.opts.level1_toc(self.root) + level1_order = [] if level1: added = {} for elem in level1: text, _href, frag = elem_to_link(elem, href, counter) counter += 1 if text: - added[elem] = add_item(_href, frag, text, toc, type='chapter') + level1_order.append(add_item(_href, frag, text, toc, type='chapter')) + added[elem] = level1_order[-1] add_item(_href, frag, 'Top', added[elem], type='chapter') if self.opts.level2_toc is not None: added2 = {} @@ -664,6 +672,15 @@ class Processor(Parser): if text: add_item(_href, frag, text, level2, type='chapter') + + if level1_order: # Fix play order + next_play_order = level1_order[0].play_order + for x in level1_order: + for y in x.flat(): + y.play_order = next_play_order + next_play_order += 1 + + if len(toc) > 0: return