def remove_first_image(self): deleted_item = None for item in self.oeb.spine: if XPath(JACKET_XPATH)(item.data): continue removed = self.remove_images(item) if removed > 0: self.log('Removed first image') body = XPath('//h:body')(item.data) if body: raw = xml2text(body[0]).strip() imgs = XPath('//h:img|//svg:svg')(item.data) if not raw and not imgs: self.log('Removing %s as it has no content'%item.href) self.oeb.manifest.remove(item) deleted_item = item break else: self.log.warn('Could not find first image to remove') if deleted_item is not None: for item in list(self.oeb.toc): href = urldefrag(item.href)[0] if href == deleted_item.href: self.oeb.toc.remove(item) self.oeb.guide.remove_by_href(deleted_item.href)
def remove_first_image(self): deleted_item = None for item in self.oeb.spine: if XPath(JACKET_XPATH)(item.data): continue removed = self.remove_images(item) if removed > 0: self.log('Removed first image') body = XPath('//h:body')(item.data) if body: raw = xml2text(body[0]).strip() imgs = XPath('//h:img|//svg:svg')(item.data) if not raw and not imgs: self.log('Removing %s as it has no content' % item.href) self.oeb.manifest.remove(item) deleted_item = item break else: self.log.warn('Could not find first image to remove') if deleted_item is not None: for item in list(self.oeb.toc): href = urldefrag(item.href)[0] if href == deleted_item.href: self.oeb.toc.remove(item) self.oeb.guide.remove_by_href(deleted_item.href)
def fix_toc_entry(toc): if toc.href: href, frag = urldefrag(toc.href) if href == self.item.href: nhref = self.anchor_map[frag if frag else None] if frag: nhref = '#'.join((nhref, frag)) toc.href = nhref for x in toc: fix_toc_entry(x)
def simplify_toc_entry(toc): if toc.href: href, frag = urldefrag(toc.href) if frag: for x in self.oeb.spine: if x.href == href: if frag_is_at_top(x.data, frag): self.log.debug("Removing anchor from TOC href:", href + "#" + frag) toc.href = href break for x in toc: simplify_toc_entry(x)
def simplify_toc_entry(toc): if toc.href: href, frag = urldefrag(toc.href) if frag: for x in self.oeb.spine: if x.href == href: if frag_is_at_top(x.data, frag): self.log.debug('Removing anchor from TOC href:', href+'#'+frag) toc.href = href break for x in toc: simplify_toc_entry(x)
def insert_cover(self): from calibre.ebooks.oeb.base import urldefrag g, m = self.oeb.guide, self.oeb.manifest item = None if 'titlepage' not in g: if 'cover' in g: href = g['cover'].href else: href = self.default_cover() if href is None: return width, height = self.inspect_cover(href) if width is None or height is None: self.log.warning('Failed to read cover dimensions') width, height = 600, 800 #if self.preserve_aspect_ratio: # width, height = 600, 800 self.svg_template = self.svg_template.replace( '__viewbox__', '0 0 %d %d' % (width, height)) self.svg_template = self.svg_template.replace( '__width__', str(width)) self.svg_template = self.svg_template.replace( '__height__', str(height)) if href is not None: templ = self.non_svg_template if self.no_svg_cover \ else self.svg_template tp = templ % unquote(href) id, href = m.generate('titlepage', u'titlepage.xhtml') item = m.add(id, href, guess_type('t.xhtml')[0], data=etree.fromstring(tp)) else: item = self.oeb.manifest.hrefs[urldefrag( self.oeb.guide['titlepage'].href)[0]] if item is not None: self.oeb.spine.insert(0, item, False) if 'cover' not in self.oeb.guide.refs: self.oeb.guide.add('cover', 'Title Page', 'a') self.oeb.guide.refs['cover'].href = item.href if 'titlepage' in self.oeb.guide.refs: self.oeb.guide.refs['titlepage'].href = item.href titem = getattr(self.oeb.toc, 'item_that_refers_to_cover', None) if titem is not None: titem.href = item.href
def rewrite_links(self, url): href, frag = urldefrag(url) try: href = self.current_item.abshref(href) except ValueError: # Unparseable URL return url href = urlnormalize(href) if href in self.map: anchor_map = self.map[href] nhref = anchor_map[frag if frag else None] nhref = self.current_item.relhref(nhref) if frag: nhref = '#'.join((urlunquote(nhref), frag)) return nhref return url
def insert_cover(self): from calibre.ebooks.oeb.base import urldefrag g, m = self.oeb.guide, self.oeb.manifest item = None if 'titlepage' not in g: if 'cover' in g: href = g['cover'].href else: href = self.default_cover() if href is None: return width, height = self.inspect_cover(href) if width is None or height is None: self.log.warning('Failed to read cover dimensions') width, height = 600, 800 # if self.preserve_aspect_ratio: # width, height = 600, 800 self.svg_template = self.svg_template.replace('__viewbox__', '0 0 %d %d'%(width, height)) self.svg_template = self.svg_template.replace('__width__', str(width)) self.svg_template = self.svg_template.replace('__height__', str(height)) if href is not None: templ = self.non_svg_template if self.no_svg_cover \ else self.svg_template tp = templ%unquote(href) id, href = m.generate('titlepage', u'titlepage.xhtml') item = m.add(id, href, guess_type('t.xhtml')[0], data=etree.fromstring(tp)) else: item = self.oeb.manifest.hrefs[ urldefrag(self.oeb.guide['titlepage'].href)[0]] if item is not None: self.oeb.spine.insert(0, item, True) if 'cover' not in self.oeb.guide.refs: self.oeb.guide.add('cover', 'Title Page', 'a') self.oeb.guide.refs['cover'].href = item.href if 'titlepage' in self.oeb.guide.refs: self.oeb.guide.refs['titlepage'].href = item.href titem = getattr(self.oeb.toc, 'item_that_refers_to_cover', None) if titem is not None: titem.href = item.href
def remove_first_image(self): deleted_item = None for item in self.oeb.spine: removed = self.remove_images(item) if removed > 0: self.log('Removed first image') body = XPath('//h:body')(item.data) if body: raw = xml2text(body[0]).strip() imgs = XPath('//h:img|//svg:svg')(item.data) if not raw and not imgs: self.log('Removing %s as it has no content'%item.href) self.oeb.manifest.remove(item) deleted_item = item break if deleted_item is not None: for item in list(self.oeb.toc): href = urldefrag(item.href)[0] if href == deleted_item.href: self.oeb.toc.remove(item)
def commit(self): ''' Commit all changes caused by the split. Calculates an *anchor_map* for all anchors in the original tree. Internal links are re-directed. The original file is deleted and the split files are saved. ''' if not self.was_split: return self.anchor_map = collections.defaultdict(lambda :self.base%0) self.files = [] for i, tree in enumerate(self.trees): root = tree.getroot() self.files.append(self.base%i) for elem in root.xpath('//*[@id or @name]'): for anchor in elem.get('id', ''), elem.get('name', ''): if anchor != '' and anchor not in self.anchor_map: self.anchor_map[anchor] = self.files[-1] for elem in root.xpath('//*[@%s]'%SPLIT_POINT_ATTR): elem.attrib.pop(SPLIT_POINT_ATTR, '0') spine_pos = self.item.spine_position for current, tree in zip(*map(reversed, (self.files, self.trees))): for a in tree.getroot().xpath('//h:a[@href]', namespaces=NAMESPACES): href = a.get('href').strip() if href.startswith('#'): anchor = href[1:] file = self.anchor_map[anchor] file = self.item.relhref(file) if file != current: a.set('href', file+href) new_id = self.oeb.manifest.generate(id=self.item.id)[0] new_item = self.oeb.manifest.add(new_id, current, self.item.media_type, data=tree.getroot()) self.oeb.spine.insert(spine_pos, new_item, self.item.linear) if self.oeb.guide: for ref in self.oeb.guide.values(): href, frag = urldefrag(ref.href) if href == self.item.href: nhref = self.anchor_map[frag if frag else None] if frag: nhref = '#'.join((nhref, frag)) ref.href = nhref def fix_toc_entry(toc): if toc.href: href, frag = urldefrag(toc.href) if href == self.item.href: nhref = self.anchor_map[frag if frag else None] if frag: nhref = '#'.join((nhref, frag)) toc.href = nhref for x in toc: fix_toc_entry(x) if self.oeb.toc: fix_toc_entry(self.oeb.toc) if self.oeb.pages: for page in self.oeb.pages: href, frag = urldefrag(page.href) if href == self.item.href: nhref = self.anchor_map[frag if frag else None] if frag: nhref = '#'.join((nhref, frag)) page.href = nhref self.oeb.manifest.remove(self.item)
def commit(self): ''' Commit all changes caused by the split. Calculates an *anchor_map* for all anchors in the original tree. Internal links are re-directed. The original file is deleted and the split files are saved. ''' if not self.was_split: return self.anchor_map = collections.defaultdict(lambda: self.base % 0) self.files = [] for i, tree in enumerate(self.trees): root = tree.getroot() self.files.append(self.base % i) for elem in root.xpath('//*[@id or @name]'): for anchor in elem.get('id', ''), elem.get('name', ''): if anchor != '' and anchor not in self.anchor_map: self.anchor_map[anchor] = self.files[-1] for elem in root.xpath('//*[@%s]' % SPLIT_POINT_ATTR): elem.attrib.pop(SPLIT_POINT_ATTR, '0') spine_pos = self.item.spine_position for current, tree in zip( *list(map(reversed, (self.files, self.trees)))): for a in tree.getroot().xpath('//h:a[@href]', namespaces=NAMESPACES): href = a.get('href').strip() if href.startswith('#'): anchor = href[1:] file = self.anchor_map[anchor] file = self.item.relhref(file) if file != current: a.set('href', file + href) new_id = self.oeb.manifest.generate(id=self.item.id)[0] new_item = self.oeb.manifest.add(new_id, current, self.item.media_type, data=tree.getroot()) self.oeb.spine.insert(spine_pos, new_item, self.item.linear) if self.oeb.guide: for ref in list(self.oeb.guide.values()): href, frag = urldefrag(ref.href) if href == self.item.href: nhref = self.anchor_map[frag if frag else None] if frag: nhref = '#'.join((nhref, frag)) ref.href = nhref def fix_toc_entry(toc): if toc.href: href, frag = urldefrag(toc.href) if href == self.item.href: nhref = self.anchor_map[frag if frag else None] if frag: nhref = '#'.join((nhref, frag)) toc.href = nhref for x in toc: fix_toc_entry(x) if self.oeb.toc: fix_toc_entry(self.oeb.toc) if self.oeb.pages: for page in self.oeb.pages: href, frag = urldefrag(page.href) if href == self.item.href: nhref = self.anchor_map[frag if frag else None] if frag: nhref = '#'.join((nhref, frag)) page.href = nhref self.oeb.manifest.remove(self.item)