def pic_to_img(self, pic, alt, parent): name = None link = None for hl in XPath('descendant::a:hlinkClick[@r:id]')(parent): link = {'id':get(hl, 'r:id')} tgt = hl.get('tgtFrame', None) if tgt: link['target'] = tgt title = hl.get('tooltip', None) if title: link['title'] = title for pr in XPath('descendant::pic:cNvPr')(pic): name = pr.get('name', None) if name: name = ascii_filename(name).replace(' ', '_') alt = pr.get('descr', None) for a in XPath('descendant::a:blip[@r:embed or @r:link]')(pic): rid = get(a, 'r:embed') if not rid: rid = get(a, 'r:link') if rid and rid in self.rid_map: try: src = self.generate_filename(rid, name) except LinkedImageNotFound as err: self.log.warn('Linked image: %s not found, ignoring' % err.fname) continue img = IMG(src='images/%s' % src) img.set('alt', alt or 'Image') if link is not None: self.links.append((img, link)) return img
def pict_to_html(self, pict, page): # First see if we have an <hr> is_hr = len(pict) == 1 and get(pict[0], 'o:hr') in {'t', 'true'} if is_hr: style = {} hr = HR() try: pct = float(get(pict[0], 'o:hrpct')) except (ValueError, TypeError, AttributeError): pass else: if pct > 0: style['width'] = '%.3g%%' % pct align = get(pict[0], 'o:hralign', 'center') if align in {'left', 'right'}: style['margin-left'] = '0' if align == 'left' else 'auto' style['margin-right'] = 'auto' if align == 'left' else '0' if style: hr.set('style', '; '.join(('%s:%s' % (k, v) for k, v in style.iteritems()))) yield hr for imagedata in XPath('descendant::v:imagedata[@r:id]')(pict): rid = get(imagedata, 'r:id') if rid in self.rid_map: try: src = self.generate_filename(rid) except LinkedImageNotFound as err: self.log.warn('Linked image: %s not found, ignoring' % err.fname) continue img = IMG(src='images/%s' % src, style="display:block") alt = get(imagedata, 'o:title') img.set('alt', alt or 'Image') yield img
def pic_to_img(self, pic, alt, parent): name = None link = None for hl in XPath('descendant::a:hlinkClick[@r:id]')(parent): link = {'id':get(hl, 'r:id')} tgt = hl.get('tgtFrame', None) if tgt: link['target'] = tgt title = hl.get('tooltip', None) if title: link['title'] = title for pr in XPath('descendant::pic:cNvPr')(pic): name = pr.get('name', None) if name: name = ascii_filename(name).replace(' ', '_') alt = pr.get('descr', None) for a in XPath('descendant::a:blip[@r:embed]')(pic): rid = get(a, 'r:embed') if rid in self.rid_map: src = self.generate_filename(rid, name) img = IMG(src='images/%s' % src) img.set('alt', alt or 'Image') if link is not None: self.links.append((img, link)) return img
def pic_to_img(self, pic, alt, parent): XPath, get = self.namespace.XPath, self.namespace.get name = None link = None for hl in XPath("descendant::a:hlinkClick[@r:id]")(parent): link = {"id": get(hl, "r:id")} tgt = hl.get("tgtFrame", None) if tgt: link["target"] = tgt title = hl.get("tooltip", None) if title: link["title"] = title for pr in XPath("descendant::pic:cNvPr")(pic): name = pr.get("name", None) if name: name = ascii_filename(name).replace(" ", "_") alt = pr.get("descr", None) for a in XPath("descendant::a:blip[@r:embed or @r:link]")(pic): rid = get(a, "r:embed") if not rid: rid = get(a, "r:link") if rid and rid in self.rid_map: try: src = self.generate_filename(rid, name) except LinkedImageNotFound as err: self.log.warn("Linked image: %s not found, ignoring" % err.fname) continue img = IMG(src="images/%s" % src) img.set("alt", alt or "Image") if link is not None: self.links.append((img, link, self.rid_map)) return img
def pict_to_html(self, pict, page): XPath, get = self.namespace.XPath, self.namespace.get # First see if we have an <hr> is_hr = len(pict) == 1 and get(pict[0], "o:hr") in {"t", "true"} if is_hr: style = {} hr = HR() try: pct = float(get(pict[0], "o:hrpct")) except (ValueError, TypeError, AttributeError): pass else: if pct > 0: style["width"] = "%.3g%%" % pct align = get(pict[0], "o:hralign", "center") if align in {"left", "right"}: style["margin-left"] = "0" if align == "left" else "auto" style["margin-right"] = "auto" if align == "left" else "0" if style: hr.set("style", "; ".join(("%s:%s" % (k, v) for k, v in style.iteritems()))) yield hr for imagedata in XPath("descendant::v:imagedata[@r:id]")(pict): rid = get(imagedata, "r:id") if rid in self.rid_map: try: src = self.generate_filename(rid) except LinkedImageNotFound as err: self.log.warn("Linked image: %s not found, ignoring" % err.fname) continue img = IMG(src="images/%s" % src, style="display:block") alt = get(imagedata, "o:title") img.set("alt", alt or "Image") yield img
def pict_to_html(self, pict, page): for imagedata in XPath('descendant::v:imagedata[@r:id]')(pict): rid = get(imagedata, 'r:id') if rid in self.rid_map: src = self.generate_filename(rid) img = IMG(src='images/%s' % src, style="display:block") alt = get(imagedata, 'o:title') if alt: img.set('alt', alt) yield img
def pic_to_img(self, pic, alt=None): name = None for pr in XPath('descendant::pic:cNvPr')(pic): name = pr.get('name', None) if name: name = ascii_filename(name).replace(' ', '_') alt = pr.get('descr', None) for a in XPath('descendant::a:blip[@r:embed]')(pic): rid = get(a, 'r:embed') if rid in self.rid_map: src = self.generate_filename(rid, name) img = IMG(src='images/%s' % src) if alt: img.set('alt', alt) return img
def _generate(self, title, masthead, datefmt, feeds, extra_css=None, style=None): self.IS_HTML = False date = strftime(datefmt) head = HEAD(TITLE(title)) if style: head.append(STYLE(style, type='text/css')) if extra_css: head.append(STYLE(extra_css, type='text/css')) ul = UL(attrs('calibre_feed_list')) for i, feed in enumerate(feeds): if len(feed): li = LI(A( feed.title, attrs('feed', rescale=120, href='feed_%d/index.html' % i)), id='feed_%d' % i) ul.append(li) div = DIV( PT(IMG(src=masthead, alt="masthead"), style='text-align:center'), PT(date, style='text-align:right'), ul, attrs(rescale=100)) self.root = HTML(head, BODY(div)) if self.html_lang: self.root.set('lang', self.html_lang)
def _generate(self, title, masthead, datefmt, feeds, extra_css=None, style=None): self.IS_HTML = False if isinstance(datefmt, unicode): datefmt = datefmt.encode(preferred_encoding) date = strftime(datefmt) head = HEAD(TITLE(title)) if style: head.append(STYLE(style, type='text/css')) if extra_css: head.append(STYLE(extra_css, type='text/css')) ul = UL(CLASS('calibre_feed_list')) for i, feed in enumerate(feeds): if feed: li = LI(A( feed.title, CLASS('feed', 'calibre_rescale_120', href='feed_%d/index.html' % i)), id='feed_%d' % i) ul.append(li) div = DIV( PT(IMG(src=masthead, alt="masthead"), style='text-align:center'), PT(date, style='text-align:right'), ul, CLASS('calibre_rescale_100')) self.root = HTML(head, BODY(div)) if self.html_lang: self.root.set('lang', self.html_lang)
def _generate(self, f, feeds, cutoff, extra_css=None, style=None): from calibre.utils.cleantext import clean_xml_chars feed = feeds[f] head = HEAD(TITLE(feed.title)) if style: head.append(STYLE(style, type='text/css')) if extra_css: head.append(STYLE(extra_css, type='text/css')) body = BODY() body.append(self.get_navbar(f, feeds)) div = DIV( H2(feed.title, CLASS('calibre_feed_title', 'calibre_rescale_160')), CLASS('calibre_rescale_100') ) body.append(div) if getattr(feed, 'image', None): div.append(DIV(IMG( alt=feed.image_alt if feed.image_alt else '', src=feed.image_url ), CLASS('calibre_feed_image'))) if getattr(feed, 'description', None): d = DIV(clean_xml_chars(feed.description), CLASS('calibre_feed_description', 'calibre_rescale_80')) d.append(BR()) div.append(d) ul = UL(CLASS('calibre_article_list')) for i, article in enumerate(feed.articles): if not getattr(article, 'downloaded', False): continue li = LI( A(article.title, CLASS('article calibre_rescale_120', href=article.url)), SPAN(article.formatted_date, CLASS('article_date')), CLASS('calibre_rescale_100', id='article_%d'%i, style='padding-bottom:0.5em') ) if article.summary: li.append(DIV(clean_xml_chars(cutoff(article.text_summary)), CLASS('article_description', 'calibre_rescale_70'))) ul.append(li) div.append(ul) div.append(self.get_navbar(f, feeds, top=False)) self.root = HTML(head, body) if self.html_lang: self.root.set('lang', self.html_lang)
def build_index(books, num, search, sort, order, start, total, url_base, CKEYS, prefix): logo = DIV(IMG(src=prefix + '/static/calibre.png', alt=__appname__), id='logo') search_box = build_search_box(num, search, sort, order, prefix) navigation = build_navigation(start, num, total, prefix + url_base) navigation2 = build_navigation(start, num, total, prefix + url_base) bookt = TABLE(id='listing') body = BODY(logo, search_box, navigation, HR(CLASS('spacer')), bookt, HR(CLASS('spacer')), navigation2) # Book list {{{ for book in books: thumbnail = TD( IMG(type='image/jpeg', border='0', src=prefix + '/get/thumb/%s' % book['id']), CLASS('thumbnail')) data = TD() for fmt in book['formats'].split(','): if not fmt or fmt.lower().startswith('original_'): continue a = quote(ascii_filename(book['authors'])) t = quote(ascii_filename(book['title'])) s = SPAN( A(fmt.lower(), href=prefix + '/get/%s/%s-%s_%d.%s' % (fmt, a, t, book['id'], fmt.lower())), CLASS('button')) s.tail = u'' data.append(s) div = DIV(CLASS('data-container')) data.append(div) series = u'[%s - %s]'%(book['series'], book['series_index']) \ if book['series'] else '' tags = u'Tags=[%s]' % book['tags'] if book['tags'] else '' ctext = '' for key in CKEYS: val = book.get(key, None) if val: ctext += '%s=[%s] ' % tuple(val.split(':#:')) first = SPAN( u'\u202f%s %s by %s' % (book['title'], series, book['authors']), CLASS('first-line')) div.append(first) second = SPAN( u'%s - %s %s %s' % (book['size'], book['timestamp'], tags, ctext), CLASS('second-line')) div.append(second) bookt.append(TR(thumbnail, data)) # }}} body.append( DIV(A(_('Switch to the full interface (non-mobile interface)'), href=prefix + "/browse", style="text-decoration: none; color: blue", title=_('The full interface gives you many more features, ' 'but it may not work well on a small screen')), style="text-align:center")) return HTML( HEAD( TITLE(__appname__ + ' Library'), LINK(rel='icon', href='http://calibre-ebook.com/favicon.ico', type='image/x-icon'), LINK(rel='stylesheet', type='text/css', href=prefix + '/mobile/style.css'), LINK(rel='apple-touch-icon', href="/static/calibre.png")), # End head body) # End html
def _generate(self, f, feeds, cutoff, extra_css=None, style=None): from calibre.utils.cleantext import clean_xml_chars def trim_title(title,clip=18): if len(title)>clip: tokens = title.split(' ') new_title_tokens = [] new_title_len = 0 if len(tokens[0]) > clip: return tokens[0][:clip] + '...' for token in tokens: if len(token) + new_title_len < clip: new_title_tokens.append(token) new_title_len += len(token) else: new_title_tokens.append('...') title = ' '.join(new_title_tokens) break return title self.IS_HTML = False feed = feeds[f] # Construct the navbar navbar_t = TABLE(CLASS('touchscreen_navbar')) navbar_tr = TR() # Previous Section link = '' if f > 0: link = A(CLASS('feed_link'), trim_title(feeds[f-1].title), href='../feed_%d/index.html' % int(f-1)) navbar_tr.append(TD(CLASS('feed_prev'),link)) # Up to Sections link = A(_('Sections'), href="../index.html") navbar_tr.append(TD(CLASS('feed_up'),link)) # Next Section link = '' if f < len(feeds)-1: link = A(CLASS('feed_link'), trim_title(feeds[f+1].title), href='../feed_%d/index.html' % int(f+1)) navbar_tr.append(TD(CLASS('feed_next'),link)) navbar_t.append(navbar_tr) top_navbar = navbar_t bottom_navbar = copy.copy(navbar_t) # print "\n%s\n" % etree.tostring(navbar_t, pretty_print=True) # Build the page head = HEAD(TITLE(feed.title)) if style: head.append(STYLE(style, type='text/css')) if extra_css: head.append(STYLE(extra_css, type='text/css')) body = BODY() div = DIV( top_navbar, H2(feed.title, CLASS('feed_title')) ) body.append(div) if getattr(feed, 'image', None): div.append(DIV(IMG( alt=feed.image_alt if feed.image_alt else '', src=feed.image_url ), CLASS('calibre_feed_image'))) if getattr(feed, 'description', None): d = DIV(clean_xml_chars(feed.description), CLASS('calibre_feed_description', 'calibre_rescale_80')) d.append(BR()) div.append(d) for i, article in enumerate(feed.articles): if not getattr(article, 'downloaded', False): continue div_td = DIV(CLASS('article_summary'), A(article.title, CLASS('summary_headline','calibre_rescale_120', href=article.url))) if article.author: div_td.append(DIV(article.author, CLASS('summary_byline', 'calibre_rescale_100'))) if article.summary: div_td.append(DIV(cutoff(article.text_summary), CLASS('summary_text', 'calibre_rescale_100'))) div.append(div_td) div.append(bottom_navbar) self.root = HTML(head, body) if self.html_lang: self.root.set('lang', self.html_lang)