PK ! ?A A htmlviewer/__init__.pyfrom .pagination import PagedViewer from .core import view_table PK ! p$ $ htmlviewer/core.pyfrom jinja2 import Environment, PackageLoader from uuid import uuid4 import os from threading import Timer from IPython.display import IFrame env = Environment( loader=PackageLoader('htmlviewer', 'templates') ) def generate_html(data, **kwargs): rowHeader = kwargs.get('rowHeader', None) colHeader = [] for record in data: for k in record.keys(): if k not in colHeader: if k == rowHeader: colHeader.insert(0, k) else: colHeader.append(k) config = { 'colHeader': colHeader, 'data': data, 'maxColWidth': 200, 'maxRowHeight': 500, } config.update(kwargs) template = env.get_template('viewer.html') return template.render(config=config) def view_table(data, width=1000, height=500, filename=None, autodelete=True, **kwargs): # A TemporaryFile does not work with Jupyter Notebook if filename is None: filename = str(uuid4()) + '.html' try: with open(filename, 'w') as f: f.write(generate_html(data=data, width=width, height=height, **kwargs)) return IFrame(filename, width=width, height=height) finally: if autodelete: Timer(5, os.unlink, args=[filename]).start() PK ! htmlviewer/pagination.pyfrom IPython.display import display import math from .core import view_table class PagedViewer: chunk_size = 10 page_number = 0 def __init__(self, records, chunk_size=10, **kwargs): self.records = list(records) self.chunk_size = chunk_size self.viewer_kwargs = kwargs @property def page_count(self): return math.ceil(self.record_count / self.chunk_size) @property def record_count(self): return len(self.records) def __len__(self): return self.record_count def _repr_html_(self): display(self.view()) return '' def view(self, page_number=None, start=None): """Choose a page number to view Keyword Arguments: page_number {int >= -1} -- Page number to view (default: {self.page_number}) start {int} -- Sequence of the record to start viewing (default: {None}) Returns: Viewer function object """ if page_number is None: page_number = self.page_number elif page_number == -1: page_number = self.page_count - 1 self.page_number = page_number if start is None: start = page_number * self.chunk_size return view_table(self.records[start: start + self.chunk_size], **self.viewer_kwargs) def next(self): """Shows the next page Returns: Viewer function object """ if len(self.records) < (self.page_number + 1) * self.chunk_size: self.page_number = 0 else: self.page_number += 1 return self.view() def previous(self): """Show the previous page Returns: Viewer function object """ self.page_number -= 1 if self.page_number < 0: self.page_number = self.page_count - 1 return self.view() def first(self): """Shows the first page Returns: Viewer function object """ return self.view(0) def last(self): """Shows the last page Returns: Viewer function object """ return self.view(-1) PK ! , htmlviewer/templates/colResizable-1.6.min.js// colResizable 1.6 - a jQuery plugin by Alvaro Prieto Lauroba http://www.bacubacu.com/colresizable/ !function(t){var e,i=t(document),r=t("head"),o=null,s={},d=0,n="id",a="px",l="JColResizer",c="JCLRFlex",f=parseInt,h=Math,p=navigator.userAgent.indexOf("Trident/4.0")>0;try{e=sessionStorage}catch(g){}r.append("");var u=function(e,i){var o=t(e);if(o.opt=i,o.mode=i.resizeMode,o.dc=o.opt.disabledColumns,o.opt.disable)return w(o);var a=o.id=o.attr(n)||l+d++;o.p=o.opt.postbackSafe,!o.is("table")||s[a]&&!o.opt.partialRefresh||("e-resize"!==o.opt.hoverCursor&&r.append(""),o.addClass(l).attr(n,a).before('
'),o.g=[],o.c=[],o.w=o.width(),o.gc=o.prev(),o.f=o.opt.fixed,i.marginLeft&&o.gc.css("marginLeft",i.marginLeft),i.marginRight&&o.gc.css("marginRight",i.marginRight),o.cs=f(p?e.cellSpacing||e.currentStyle.borderSpacing:o.css("border-spacing"))||2,o.b=f(p?e.border||e.currentStyle.borderLeftWidth:o.css("border-left-width"))||1,s[a]=o,v(o))},w=function(t){var e=t.attr(n),t=s[e];t&&t.is("table")&&(t.removeClass(l+" "+c).gc.remove(),delete s[e])},v=function(i){var r=i.find(">thead>tr:first>th,>thead>tr:first>td");r.length||(r=i.find(">tbody>tr:first>th,>tr:first>th,>tbody>tr:first>td, >tr:first>td")),r=r.filter(":visible"),i.cg=i.find("col"),i.ln=r.length,i.p&&e&&e[i.id]&&m(i,r),r.each(function(e){var r=t(this),o=-1!=i.dc.indexOf(e),s=t(i.gc.append('')[0].lastChild);s.append(o?"":i.opt.gripInnerHtml).append(''),e==i.ln-1&&(s.addClass("JCLRLastGrip"),i.f&&s.html("")),s.bind("touchstart mousedown",J),o?s.addClass("JCLRdisabledGrip"):s.removeClass("JCLRdisabledGrip").bind("touchstart mousedown",J),s.t=i,s.i=e,s.c=r,r.w=r.width(),i.g.push(s),i.c.push(r),r.width(r.w).removeAttr("width"),s.data(l,{i:e,t:i.attr(n),last:e==i.ln-1})}),i.cg.removeAttr("width"),i.find("td, th").not(r).not("table th, table td").each(function(){t(this).removeAttr("width")}),i.f||i.removeAttr("width").addClass(c),C(i)},m=function(t,i){var r,o,s=0,d=0,n=[];if(i){if(t.cg.removeAttr("width"),t.opt.flush)return void(e[t.id]="");for(r=e[t.id].split(";"),o=r[t.ln+1],!t.f&&o&&(t.width(o*=1),t.opt.overflow&&(t.css("min-width",o+a),t.w=o));d