|
import os |
|
from pathlib import Path |
|
|
|
import dominate |
|
from dominate.tags import a, br, h3, img, meta, p, table, td, tr |
|
|
|
|
|
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 the 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 refreshes itself; if 0; no refreshing |
|
""" |
|
self.title = title |
|
self.web_dir = web_dir |
|
self.img_dir = Path(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)) |
|
|
|
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, width=400): |
|
"""add images to the HTML file |
|
|
|
Parameters: |
|
width: |
|
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 |
|
""" |
|
self.t = table(border=1, style="table-layout: fixed;") |
|
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=Path("images", link)): |
|
img(style="width:%dpx" % width, src=Path("images", im)) |
|
br() |
|
p(txt) |
|
|
|
def save(self): |
|
"""将内容保存到HMTL文件""" |
|
html_file = f"{self.web_dir}/index.html" |
|
with open(html_file, "wt") as f: |
|
html = ( |
|
self.doc.render() |
|
.replace("</body>", "</center></body>") |
|
.replace("<body>", "<body><center>") |
|
) |
|
f.write(html) |
|
print("--> " + html_file) |
|
|
|
|
|
if __name__ == "__main__": |
|
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() |
|
|