diff --git a/postoffice/README b/postoffice/README index 633aa94..52ab938 100644 --- a/postoffice/README +++ b/postoffice/README @@ -16,3 +16,4 @@ Requirements: License: - included code CC-0 - matplotlib Copyright (c) 2012- Matplotlib Development Team; All Rights Reserved + - Jinja2 Copyright 2007 Pallets, used under BSD-3-Clause License \ No newline at end of file diff --git a/postoffice/post_office_jinja/__init__.py b/postoffice/post_office_jinja/__init__.py new file mode 100644 index 0000000..1431f76 --- /dev/null +++ b/postoffice/post_office_jinja/__init__.py @@ -0,0 +1,84 @@ +import collections +import csv +import dataclasses +import datetime +import pathlib +import sys +from html_minifier.minify import Minifier +from bs4 import BeautifulSoup as bs +import jinja2 + +LOW = 13 +HIGH = 15 + + +@dataclasses.dataclass +class Postbox: + owner: str | None + x: int + y: int + z: int + + def to_dict(self): + return vars(self) + + +def main(): + env = jinja2.Environment(loader=jinja2.PackageLoader("post_office_jinja")) + + postboxes = get_postboxes("data.csv") + postbox_map = collections.defaultdict(lambda: collections.defaultdict(dict)) + for box in postboxes: + postbox_map[box.x][box.y][box.z] = box + + minx, maxx, minz, maxz = get_limits(postboxes) + + entries = [] + + for z in range(minz, maxz + 1): + superrow = [] + for y in (HIGH, LOW): + row = [] + for x in range(minx, maxx + 1): + try: + pb: Postbox = postbox_map[x][y][z] + row.append(pb) + except KeyError: + row.append(Postbox(None, x, y, z)) + superrow.append(row) + entries.append(superrow) + + tpl = env.get_template("postbox.j2.html") + dat = tpl.render(postboxes=entries, today=datetime.date.today().isoformat()) + + minifier = Minifier(dat) + dat = minifier.minify() + + soup = bs(dat, features="html.parser") + dat = soup.prettify() + + with open("out.html", "wt", encoding="utf-8") as fw: + fw.write(dat) + + +def get_postboxes(fname): + postboxes = [] + + with open(fname, "rt", newline="") as fr: + for line in csv.reader(fr): + x, y, z, owner = line + pb = Postbox(owner, int(x), int(y), int(z)) + postboxes.append(pb) + + return postboxes + + +def get_limits(postboxes): + minz, maxz = min([pb.z for pb in postboxes]), max([pb.z for pb in postboxes]) + minx, maxx = min([pb.x for pb in postboxes]), max([pb.x for pb in postboxes]) + + return minx, maxx, minz, maxz + + +if __name__ == "__main__": + main() diff --git a/postoffice/post_office_jinja/templates/__init__.py b/postoffice/post_office_jinja/templates/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/postoffice/post_office_jinja/templates/postbox.j2.html b/postoffice/post_office_jinja/templates/postbox.j2.html new file mode 100644 index 0000000..ba21772 --- /dev/null +++ b/postoffice/post_office_jinja/templates/postbox.j2.html @@ -0,0 +1,40 @@ + + +
+ + |
+ {% elif pb.owner %}
+ {{pb.owner}} {{pb.x}}, {{pb.y}}, {{pb.z}} |
+ {% else %}
+ empty {{pb.x}}, {{pb.y}}, {{pb.z}} |
+ {% endif %}
+ {% endfor %}
+