From cfb957b3e98d33de951412fedbac9739d16ce158 Mon Sep 17 00:00:00 2001 From: jkoci Date: Sun, 2 Jul 2023 17:31:07 +0200 Subject: [PATCH] postbox - jinja2 html --- postoffice/README | 1 + postoffice/post_office_jinja/__init__.py | 84 +++++++++++++++++++ .../post_office_jinja/templates/__init__.py | 0 .../templates/postbox.j2.html | 40 +++++++++ postoffice/requirements.txt | 4 +- 5 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 postoffice/post_office_jinja/__init__.py create mode 100644 postoffice/post_office_jinja/templates/__init__.py create mode 100644 postoffice/post_office_jinja/templates/postbox.j2.html 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 @@ + + + + +Haven Post Office layout + + + +

Haven Post Office

+

{{ today }}

+ + {% for X in postboxes %} + {% for Y in X %} + + {% for pb in Y %} + {% if pb.owner is none %} + + {% elif pb.owner %} + + {% else %} + + {% endif %} + {% endfor %} + + {% endfor %} + {% endfor %} +
 
 
{{pb.owner}}
{{pb.x}}, {{pb.y}}, {{pb.z}}
empty
{{pb.x}}, {{pb.y}}, {{pb.z}}
+ + \ No newline at end of file diff --git a/postoffice/requirements.txt b/postoffice/requirements.txt index 6f92c02..632eeee 100644 --- a/postoffice/requirements.txt +++ b/postoffice/requirements.txt @@ -1 +1,3 @@ -matplotlib~=3.7.1 \ No newline at end of file +matplotlib~=3.7.1 +Jinja2~=3.1.2 +beautifulsoup4~=4.12.2 \ No newline at end of file