File size: 3,484 Bytes
58da73e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
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;") # 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=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) # 添加body居中
print("--> " + html_file)
if __name__ == "__main__": # 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()
|