From ec7a5e8496c4bfdf69caf0ea42ffbb8b2eaef48c Mon Sep 17 00:00:00 2001 From: ado Date: Wed, 6 Dec 2023 18:02:57 -0500 Subject: [PATCH] Image generation --- generate.py | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/generate.py b/generate.py index a6a93dd..5ed371f 100644 --- a/generate.py +++ b/generate.py @@ -1,7 +1,13 @@ from dataclasses import dataclass from pathlib import Path import re +from html.parser import HTMLParser +from PIL import Image +from os import path +# image optimization ~ +INPUT_SOURCE = "./politecafe/input" +OUTPUT_TARGET = "./politecafe/images" @dataclass class Article: @@ -11,9 +17,79 @@ class Article: return Path(self.path).read_text() +class SSGParser(HTMLParser): + def __init__(self): + super().__init__() + self.scales = [0.6, 1] + self.output = "" + + def handle_endtag(self, tag): + if tag not in ["img", "br"]: + self.output += "" + + def handle_data(self, data): + data = data.replace("<", "<") + data = data.replace(">", ">") + self.output += data + + def handle_starttag(self, tag, attrs): + new_attrs = [] + self.output += "<" + tag + if tag != "img": + new_attrs = attrs + else: + img = None + img_path = None + new_attrs.append(("sizes", "(min-width: 768px) 25vw, 35vw")) + for attr in attrs: + if attr[0] != "src": + new_attrs.append(attr) + elif attr[0] == "src": + img_path = path.join(INPUT_SOURCE, attr[1]) + img = Image.open(img_path) + width = img.size[0] + height = img.size[1] + + src_set = [] + for scale in self.scales: + new_width = int(width * scale) + new_height = int(height * scale) + img_name = Path(path.basename(img_path)).stem + destination_path = path.join( + OUTPUT_TARGET, f"{img_name}{new_width}{new_height}.webp" + ) + result = img.resize(size=(new_width, new_height)) + # write image + result.save( + fp=destination_path, + format="WEBP", + height=new_height, + width=new_width, + ) + # modify attribute + src = path.relpath(destination_path, "politecafe") + src_set.append(f"{src} {new_width}w") + # capture src_set + new_attrs.append(("srcset", ",".join(src_set))) + # write attrs to tag + for name, value in new_attrs: + self.output += ' {}="{}"'.format(name, value) + + self.output += ">" + + articles = [ Article( - "./input/art-001.html", + "./politecafe/input/tech-002.html", + ), + Article( + "./politecafe/input/art-002.html", + ), + Article( + "./politecafe/input/art-001.html", + ), + Article( + "./politecafe/input/tech-001.html", ), ] @@ -22,6 +98,10 @@ slugs = [] article_contents = [] for article in articles: contents = article.read_contents() + parser = SSGParser() + parser.feed(contents) + contents = parser.output + id_match = re.search(r'

", "\n".join(article_contents) ) template = template.replace("
", "\n".join(slugs)) -with open("./index.html", "w", encoding="utf-8") as index_html: +with open("./politecafe/index.html", "w", encoding="utf-8") as index_html: index_html.write(template)