mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Add support for following links when using --level1-toc and --level2-toc
This commit is contained in:
parent
35d7034d52
commit
a2a2ad3ef1
@ -585,18 +585,35 @@ class Processor(Parser):
|
|||||||
|
|
||||||
# Add level 1 and level 2 TOC items
|
# Add level 1 and level 2 TOC items
|
||||||
counter = 0
|
counter = 0
|
||||||
|
|
||||||
|
def elem_to_link(elem, href, counter):
|
||||||
|
text = (u''.join(elem.xpath('string()'))).strip()
|
||||||
|
if not text:
|
||||||
|
return None, None, None
|
||||||
|
t = elem.xpath('descendant-or-self::a[@href]')
|
||||||
|
if t:
|
||||||
|
_href = 'content/' + t[0].get('href', '')
|
||||||
|
parts = _href.split('#')
|
||||||
|
_href = parts[0]
|
||||||
|
frag = None if len(parts) == 1 else parts[-1]
|
||||||
|
else:
|
||||||
|
_href = href
|
||||||
|
id = elem.get('id', 'calibre_chapter_%d'%counter)
|
||||||
|
elem.set('id', id)
|
||||||
|
frag = id
|
||||||
|
return text, _href, frag
|
||||||
|
|
||||||
|
|
||||||
if self.opts.level1_toc is not None:
|
if self.opts.level1_toc is not None:
|
||||||
level1 = self.opts.level1_toc(self.root)
|
level1 = self.opts.level1_toc(self.root)
|
||||||
if level1:
|
if level1:
|
||||||
added = {}
|
added = {}
|
||||||
for elem in level1:
|
for elem in level1:
|
||||||
text = (u''.join(elem.xpath('string()'))).strip()
|
text, _href, frag = elem_to_link(elem, href, counter)
|
||||||
|
counter += 1
|
||||||
if text:
|
if text:
|
||||||
id = elem.get('id', 'calibre_chapter_%d'%counter)
|
added[elem] = add_item(_href, frag, text, toc, type='chapter')
|
||||||
counter += 1
|
add_item(_href, frag, 'Top', added[elem], type='chapter')
|
||||||
elem.set('id', id)
|
|
||||||
added[elem] = add_item(href, id, text, toc, type='chapter')
|
|
||||||
add_item(href, id, 'Top', added[elem], type='chapter')
|
|
||||||
if self.opts.level2_toc is not None:
|
if self.opts.level2_toc is not None:
|
||||||
level2 = list(self.opts.level2_toc(self.root))
|
level2 = list(self.opts.level2_toc(self.root))
|
||||||
for elem in level2:
|
for elem in level2:
|
||||||
@ -605,14 +622,13 @@ class Processor(Parser):
|
|||||||
if item in added.keys():
|
if item in added.keys():
|
||||||
level1 = added[item]
|
level1 = added[item]
|
||||||
elif item == elem and level1 is not None:
|
elif item == elem and level1 is not None:
|
||||||
text = (u''.join(elem.xpath('string()'))).strip()
|
text, _href, frag = elem_to_link(elem, href, counter)
|
||||||
|
counter += 1
|
||||||
if text:
|
if text:
|
||||||
id = elem.get('id', 'calibre_chapter_%d'%counter)
|
add_item(_href, frag, text, level1, type='chapter')
|
||||||
counter += 1
|
|
||||||
elem.set('id', id)
|
|
||||||
add_item(href, id, text, level1, type='chapter')
|
|
||||||
|
|
||||||
|
if len(toc) > 0:
|
||||||
|
return
|
||||||
# Add chapters to TOC
|
# Add chapters to TOC
|
||||||
|
|
||||||
if not self.opts.no_chapters_in_toc:
|
if not self.opts.no_chapters_in_toc:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user