PK ! wP P pyhandsontable/__init__.pyfrom .core import generate_html, view_table from .pagination import PagedViewer PK ! w pyhandsontable/core.pyfrom jinja2 import Environment, PackageLoader from threading import Timer import os from collections import OrderedDict from IPython.display import IFrame env = Environment( loader=PackageLoader('pyhandsontable', 'templates') ) def generate_html(data, **kwargs): renderers = kwargs.pop('renderers', dict()) config = kwargs.pop('config', dict()) if isinstance(data[0], (dict, OrderedDict)): headers = sum((list(d.keys()) for d in data), list()) headers = [h for i, h in enumerate(headers) if h not in headers[:i]] config['colHeaders'] = list(headers) else: headers = range(len(data[0])) columns = [] for header in headers: columnData = { 'data': header, 'renderer': 'jsonRenderer' } if header in renderers.keys(): columnData['renderer'] = renderers.get(header) columns.append(columnData) template = env.get_template('sheet.html') return template.render(data=data, columns=columns, config=config, **kwargs) def view_table(data, width=1000, height=500, filename='temp.handsontable.html', autodelete=True, **kwargs): # A TemporaryFile does not work with Jupyter Notebook 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 ! cfj j pyhandsontable/pagination.pyfrom IPython.display import display import math from .core import view_table class PagedViewer: chunk_size = 10 i = 0 def __init__(self, records, chunk_size=10, **kwargs): self.records = list(records) self.chunk_size = chunk_size self.viewer_kwargs = kwargs @property def num_pages(self): return math.ceil(len(self.records) / self.chunk_size) @property def num_records(self): return len(self.records) def __len__(self): return self.num_records 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.i}) start {int} -- Sequence of the record to start viewing (default: {None}) Returns: Viewer function object """ if page_number is None: page_number = self.i elif page_number == -1: page_number = self.num_pages -1 self.i = 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.i + 1) * self.chunk_size: self.i = 0 else: self.i += 1 return self.view() def previous(self): """Show the previous page Returns: Viewer function object """ self.i -= 1 if self.i < 0: self.i = self.num_pages - 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 ! ln # pyhandsontable/templates/sheet.html