def create_inline_toc(container, title=None): ''' Create an inline (HTML) Table of Contents from an existing NCX table of contents. :param title: The title for this table of contents. ''' lang = get_book_language(container) default_title = 'Table of Contents' if lang: lang = lang_as_iso639_1(lang) or lang default_title = translate(lang, default_title) title = title or default_title toc = get_toc(container) if len(toc) == 0: return None toc_name = find_inline_toc(container) name = toc_name html = toc_to_html(toc, container, name, title, lang) raw = serialize(html, 'text/html') if name is None: name, c = 'toc.xhtml', 0 while container.has_name(name): c += 1 name = 'toc%d.xhtml' % c container.add_file(name, raw, spine_index=0) else: with container.open(name, 'wb') as f: f.write(raw) set_guide_item(container, 'toc', title, name, frag='calibre_generated_inline_toc') return name
def apply_changes(self, container): from calibre.ebooks.oeb.polish.opf import set_guide_item, get_book_language from calibre.translations.dynamic import translate lang = get_book_language(container) for item_type, (name, frag) in self.changed_type_map.iteritems(): title = self.known_type_map[item_type] if lang: title = translate(lang, title) set_guide_item(container, item_type, title, name, frag=frag)
def create_nav(container, toc, landmarks, previous_nav=None): lang = get_book_language(container) if lang == 'und': lang = None if landmarks: for entry in landmarks: entry['type'] = guide_epubtype_map.get(entry['type'].lower()) if entry['type'] == 'cover' and container.mime_map.get(entry['dest'], '').lower() in OEB_DOCS: container.apply_unique_properties(entry['dest'], 'calibre:title-page') commit_nav_toc(container, toc, lang=lang, landmarks=landmarks, previous_nav=previous_nav)
def apply_changes(self, container): from calibre.ebooks.oeb.polish.opf import get_book_language, set_guide_item from calibre.translations.dynamic import translate lang = get_book_language(container) def title_for_type(item_type): title = self.known_type_map.get(item_type, item_type) if lang: title = translate(lang, title) return title for item_type, (name, frag) in self.changes.items(): set_guide_item(container, self.epubtype_guide_map[item_type], title_for_type(item_type), name, frag=frag) if container.opf_version_parsed.major > 2: final = self.original_nav_map.copy() for item_type, (name, frag) in self.changes.items(): final[item_type] = {'dest': name, 'frag': frag or '', 'title': title_for_type(item_type), 'type': item_type} tocname, root = ensure_container_has_nav(container, lang=lang) set_landmarks(container, root, tocname, final.values()) container.dirty(tocname)
def create_inline_toc(container, title=None): ''' Create an inline (HTML) Table of Contents from an existing NCX table of contents. :param title: The title for this table of contents. ''' lang = get_book_language(container) default_title = 'Table of Contents' if lang: lang = lang_as_iso639_1(lang) or lang default_title = translate(lang, default_title) title = title or default_title toc = get_toc(container) if len(toc) == 0: return None toc_name = find_inline_toc(container) def process_node(html_parent, toc, level=1, indent=' ', style_level=2): li = html_parent.makeelement(XHTML('li')) li.tail = '\n' + (indent * level) html_parent.append(li) name, frag = toc.dest, toc.frag href = '#' if name: href = container.name_to_href(name, toc_name) if frag: href += '#' + frag a = li.makeelement(XHTML('a'), href=href) a.text = toc.title li.append(a) if len(toc) > 0: parent = li.makeelement(XHTML('ul')) parent.set('class', 'level%d' % (style_level)) li.append(parent) a.tail = '\n\n' + (indent * (level + 2)) parent.text = '\n' + (indent * (level + 3)) parent.tail = '\n\n' + (indent * (level + 1)) for child in toc: process_node(parent, child, level + 3, style_level=style_level + 1) parent[-1].tail = '\n' + (indent * (level + 2)) E = ElementMaker(namespace=XHTML_NS, nsmap={None: XHTML_NS}) html = E.html( E.head( E.title(title), E.style(''' li { list-style-type: none; padding-left: 2em; margin-left: 0} a { text-decoration: none } a:hover { color: red }''', type='text/css'), ), E.body( E.h2(title), E.ul(), id="calibre_generated_inline_toc", )) name = toc_name ul = html[1][1] ul.set('class', 'level1') for child in toc: process_node(ul, child) if lang: html.set('lang', lang) pretty_html_tree(container, html) raw = serialize(html, 'text/html') if name is None: name, c = 'toc.xhtml', 0 while container.has_name(name): c += 1 name = 'toc%d.xhtml' % c container.add_file(name, raw, spine_index=0) else: with container.open(name, 'wb') as f: f.write(raw) set_guide_item(container, 'toc', title, name, frag='calibre_generated_inline_toc') return name
def create_inline_toc(container, title=None): lang = get_book_language(container) default_title = 'Table of Contents' if lang: lang = lang_as_iso639_1(lang) or lang default_title = translate(lang, default_title) title = title or default_title toc = get_toc(container) if len(toc) == 0: return None toc_name = find_inline_toc(container) def process_node(html_parent, toc, level=1, indent=' ', style_level=2): li = html_parent.makeelement(XHTML('li')) li.tail = '\n'+ (indent*level) html_parent.append(li) name, frag = toc.dest, toc.frag href = '#' if name: href = container.name_to_href(name, toc_name) if frag: href += '#' + frag a = li.makeelement(XHTML('a'), href=href) a.text = toc.title li.append(a) if len(toc) > 0: parent = li.makeelement(XHTML('ul')) parent.set('class', 'level%d' % (style_level)) li.append(parent) a.tail = '\n\n' + (indent*(level+2)) parent.text = '\n'+(indent*(level+3)) parent.tail = '\n\n' + (indent*(level+1)) for child in toc: process_node(parent, child, level+3, style_level=style_level + 1) parent[-1].tail = '\n' + (indent*(level+2)) E = ElementMaker(namespace=XHTML_NS, nsmap={None:XHTML_NS}) html = E.html( E.head( E.title(title), E.style(''' li { list-style-type: none; padding-left: 2em; margin-left: 0} a { text-decoration: none } a:hover { color: red }''', type='text/css'), ), E.body( E.h2(title), E.ul(), id="calibre_generated_inline_toc", ) ) name = toc_name ul = html[1][1] ul.set('class', 'level1') for child in toc: process_node(ul, child) if lang: html.set('lang', lang) pretty_html_tree(container, html) raw = serialize(html, 'text/html') if name is None: name, c = 'toc.xhtml', 0 while container.has_name(name): c += 1 name = 'toc%d.xhtml' % c container.add_file(name, raw, spine_index=0) else: with container.open(name, 'wb') as f: f.write(raw) set_guide_item(container, 'toc', title, name, frag='calibre_generated_inline_toc') return name