Spaces:
Runtime error
Runtime error
| from PIL import Image | |
| import dominate | |
| from dominate.tags import meta, h3, table, tr, td, p, a, img, br | |
| import os | |
| class HTML: | |
| """This HTML class allows us to save images and write texts into a single HTML file. | |
| It consists of functions such as <add_header> (add a text header to the HTML file), | |
| <add_images> (add a row of images to the HTML file), and <save> (save the HTML to the disk). | |
| It is based on Python library 'dominate', a Python library for creating and manipulating HTML documents using a DOM API. | |
| """ | |
| def __init__(self, web_dir, title, refresh=0): | |
| """Initialize the HTML classes | |
| Parameters: | |
| web_dir (str) -- a directory that stores the webpage. HTML file will be created at <web_dir>/index.html; images will be saved at <web_dir/images/ | |
| title (str) -- the webpage name | |
| refresh (int) -- how often the website refresh itself; if 0; no refreshing | |
| """ | |
| self.title = title | |
| self.web_dir = web_dir | |
| self.img_dir = os.path.join(self.web_dir, 'images') | |
| if not os.path.exists(self.web_dir): | |
| os.makedirs(self.web_dir) | |
| if not os.path.exists(self.img_dir): | |
| os.makedirs(self.img_dir) | |
| self.doc = dominate.document(title=title) | |
| if refresh > 0: | |
| with self.doc.head: | |
| meta(http_equiv="refresh", content=str(refresh)) | |
| self.add_header(title) | |
| def get_image_dir(self): | |
| """Return the directory that stores images""" | |
| return self.img_dir | |
| def add_header(self, text): | |
| """Insert a header to the HTML file | |
| Parameters: | |
| text (str) -- the header text | |
| """ | |
| with self.doc: | |
| h3(text) | |
| def add_images(self, ims, txts, links=None, width=None): | |
| """add images to the HTML file | |
| Parameters: | |
| ims (str list) -- a list of image paths | |
| txts (str list) -- a list of image names shown on the website | |
| links (str list) -- a list of hyperref links; when you click an image, it will redirect you to a new page | |
| """ | |
| if links is None: | |
| links = ims | |
| input_is_path = type(ims[0]) == str | |
| if not input_is_path: # input is PIL Image | |
| assert type(ims[0]) == Image.Image | |
| paths = [] | |
| for im, name in zip(ims, txts): | |
| if "." not in name[-5:]: | |
| name = name + ".png" | |
| savepath = os.path.join(self.img_dir, name) | |
| im.save(savepath) | |
| paths.append(savepath) | |
| names = [os.path.basename(p) for p in paths] | |
| return self.add_images(names, | |
| names, | |
| names, | |
| width) | |
| self.t = table(border=1, style="table-layout: fixed;") # Insert a table | |
| self.doc.add(self.t) | |
| with self.t: | |
| with tr(): | |
| for im, txt, link in zip(ims, txts, links): | |
| with td(style="word-wrap: break-word;", halign="center", valign="top"): | |
| with p(): | |
| with a(href=os.path.join('images', link)): | |
| #img(style="width:%dpx" % width, src=os.path.join('images', im)) | |
| img(src=os.path.join('images', im)) | |
| br() | |
| p(txt, style="font-size:9px") | |
| def save(self): | |
| """save the current content to the HMTL file""" | |
| html_file = '%s/index.html' % self.web_dir | |
| f = open(html_file, 'wt') | |
| f.write(self.doc.render()) | |
| f.close() | |
| if __name__ == '__main__': # we show an example usage here. | |
| html = HTML('web/', 'test_html') | |
| html.add_header('hello world') | |
| ims, txts, links = [], [], [] | |
| for n in range(4): | |
| ims.append('image_%d.png' % n) | |
| txts.append('text_%d' % n) | |
| links.append('image_%d.png' % n) | |
| html.add_images(ims, txts, links) | |
| html.save() | |