From 2e3d6bba32c1d2ab414668d5f68f2c3c1bfcb54f Mon Sep 17 00:00:00 2001 From: TT-392 Date: Wed, 27 Nov 2024 23:55:50 +0100 Subject: [PATCH 1/4] Add "Remove by" template --- app.py | 19 ++++++++++++++++++- templates/image.html | 2 +- templates/text.html | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app.py b/app.py index d51509d..a691a3f 100644 --- a/app.py +++ b/app.py @@ -3,7 +3,7 @@ from flask import Flask, render_template, request, redirect, url_for, session, s from PIL import Image from gen_image import gen_image from config import * -from datetime import datetime +from datetime import * from print import * from process_image import * from file_handler import * @@ -44,6 +44,19 @@ templates = { "pos": 130 }, "cut": True + }, + "Remove by": { + "text1": { + "string": "Remove by", + "size": 130, + "pos": 0 + }, + "text2": { + "string": "", + "size": 50, + "pos": 130 + }, + "cut": True } } @@ -140,9 +153,13 @@ def text_template(): if request.method == 'POST': template = templates[request.form["template"]] + if request.form["template"] == "Food": template["text2"]["string"] = datetime.now().strftime('%Y-%m-%d') + if request.form["template"] == "Remove by": + template["text2"]["string"] = (datetime.now() + timedelta(weeks=3)).strftime('%Y-%m-%d') + session["text1"] = template["text1"] session["text2"] = template["text2"] session["cut"] = template["cut"] diff --git a/templates/image.html b/templates/image.html index 1a4f2f5..c23ffe6 100644 --- a/templates/image.html +++ b/templates/image.html @@ -6,7 +6,7 @@

- Recommended image height = {{label_width}}, taller images will be scaled + Recommended image height = {{label_width}}, other sizes will be scaled
{% if info %} diff --git a/templates/text.html b/templates/text.html index bcb3f1b..02a0f7b 100644 --- a/templates/text.html +++ b/templates/text.html @@ -8,6 +8,7 @@ From 4092320c7917321cccc5a6f6b0f88457def28bee Mon Sep 17 00:00:00 2001 From: Thijs Raymakers Date: Thu, 28 Nov 2024 00:04:09 +0100 Subject: [PATCH 2/4] Freeze requirements.txt --- requirements.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..fa29020 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +blinker==1.9.0 +click==8.1.7 +colorama==0.4.6 +Flask==3.1.0 +itsdangerous==2.2.0 +Jinja2==3.1.4 +MarkupSafe==3.0.2 +pillow==11.0.0 +Werkzeug==3.1.3 From 4e2ffb0224d8140c12ceda81f119574d5ad357f5 Mon Sep 17 00:00:00 2001 From: Thijs Raymakers Date: Thu, 28 Nov 2024 00:59:36 +0100 Subject: [PATCH 3/4] Add CYBER font --- app.py | 30 ++++++++++++++++++++--- fonts.py | 20 +++++++++++++++ gen_image.py | 10 ++++---- print.py | 3 ++- resources/{LICENSE => LICENSE-ComicMono} | 0 resources/OCRAEXT.TTF | Bin 0 -> 55400 bytes templates/text.html | 16 +++++++++--- 7 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 fonts.py rename resources/{LICENSE => LICENSE-ComicMono} (100%) create mode 100644 resources/OCRAEXT.TTF diff --git a/app.py b/app.py index a691a3f..367f0f7 100644 --- a/app.py +++ b/app.py @@ -8,6 +8,7 @@ from print import * from process_image import * from file_handler import * from colorama import Fore, Style +from fonts import fonts import os text_image_filename = "text_image.png" @@ -62,7 +63,7 @@ templates = { def render_text_template(info=None, info_color=None, scrollDown=None): - return render_template('text.html', filename=session["text image path"], text1=session["text1"], text2=session["text2"], cut=session["cut"], info=info, info_color=info_color, scrollDown=scrollDown) + return render_template('text.html', filename=session["text image path"], text1=session["text1"], text2=session["text2"], cut=session["cut"], info=info, info_color=info_color, scrollDown=scrollDown, fonts=session["fonts"]) @@ -75,7 +76,6 @@ def base(): check_for_new_user(session) return render_template('base.html') - # gets triggered when the user_data folder for the user is created @new_user_handler def on_new_user(session): @@ -87,6 +87,7 @@ def on_new_user(session): session["text1"] = templates["DNH"]["text1"] session["text2"] = templates["DNH"]["text2"] session["cut"] = templates["DNH"]["cut"] + session["fonts"] = fonts() @@ -183,7 +184,30 @@ def text_form(): "pos": int(request.form["pos2"]), } - message, status, img = gen_image(label_width, session["text1"], session["text2"]) + # Clear previously saved font + for font in session["fonts"]: + session["fonts"][font]["selected"] = False + + # If an invalid font has been submitted, just default to the first one + chosen_font = request.form["font"] + if chosen_font in session["fonts"]: + session["fonts"][chosen_font]["selected"] = True + else: + first_font = next(iter(session["fonts"])) + session["fonts"][first_font]["selected"] = True + + # Select the first font that has been marked as selected + chosen_font = None + for font in session["fonts"]: + f = session["fonts"][font] + if f["selected"]: + chosen_font = f + + # If the font is still None, something has gone wrong + if chosen_font is None: + return + + message, status, img = gen_image(label_width, session["text1"], session["text2"], chosen_font) if status == "Error": session["text image path"] = None diff --git a/fonts.py b/fonts.py new file mode 100644 index 0000000..19f4f2b --- /dev/null +++ b/fonts.py @@ -0,0 +1,20 @@ +class Font: + def __init__(self, name: str, path: str, stroke_width: int, default: bool = False) -> None: + self.name = name + self.path = path + self.stroke_width = stroke_width + self.selected = default + + def to_dict(self): + return { + "name": self.name, + "path": self.path, + "selected": self.selected, + "stroke_width": self.stroke_width + } + +def fonts(): + return { + "CYBER": Font("CYBER", "resources/OCRAEXT.TTF", 3, True).to_dict(), + "ComicMono": Font("Comic Sans Mono", "resources/ComicMono.ttf", 0).to_dict() + } diff --git a/gen_image.py b/gen_image.py index ec2d3a1..ba060e2 100644 --- a/gen_image.py +++ b/gen_image.py @@ -3,11 +3,11 @@ from PIL import Image, ImageDraw, ImageFont from colorama import Fore, Style from config import * -font = "resources/ComicMono.ttf" +#font = "resources/ComicMono.ttf" -def gen_image(height, text1, text2): - font1 = ImageFont.truetype(font, size=text1["size"]) - font2 = ImageFont.truetype(font, size=text2["size"]) +def gen_image(height, text1, text2, font): + font1 = ImageFont.truetype(font["path"], size=text1["size"]) + font2 = ImageFont.truetype(font["path"], size=text2["size"]) text1["string"] = text1["string"].replace("\r\n", "\n") text2["string"] = text2["string"].replace("\r\n", "\n") @@ -33,7 +33,7 @@ def gen_image(height, text1, text2): draw = ImageDraw.Draw(img) - draw.text((0, text1["pos"]), text1["string"], font=font1) + draw.text((0, text1["pos"]), text1["string"], font=font1, stroke_width=font["stroke_width"], stroke_fill="black") draw.text((0, text2["pos"]), text2["string"], font=font2) diff --git a/print.py b/print.py index 6f94cea..3da0c10 100644 --- a/print.py +++ b/print.py @@ -6,7 +6,8 @@ import ctypes import io import time -printer = ctypes.CDLL('./epson/library_bridge.so') +#printer = ctypes.CDLL('./epson/library_bridge.so') +printer = None def print_text(text): time.sleep(0.1) diff --git a/resources/LICENSE b/resources/LICENSE-ComicMono similarity index 100% rename from resources/LICENSE rename to resources/LICENSE-ComicMono diff --git a/resources/OCRAEXT.TTF b/resources/OCRAEXT.TTF new file mode 100644 index 0000000000000000000000000000000000000000..0e77e2089aedb55301e17b6a9b5be4b260a6d5ca GIT binary patch literal 55400 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 WvTSqVYp?DzC%igc{G!s#asLOa;kIu8 literal 0 HcmV?d00001 diff --git a/templates/text.html b/templates/text.html index 02a0f7b..364fdd9 100644 --- a/templates/text.html +++ b/templates/text.html @@ -15,7 +15,7 @@
-

String 1

+

Top text

Text:

Size:
-

String 2

+

Bottom text

Text:

Size:
Y position:
+ style="width: 40px"> + +

Font

+ + + +
From 88ad1d3f6cfb9fc910155cc282c7414fe42de259 Mon Sep 17 00:00:00 2001 From: Thijs Raymakers Date: Thu, 28 Nov 2024 01:07:52 +0100 Subject: [PATCH 4/4] Undo commenting out library_bridge.so --- print.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/print.py b/print.py index 3da0c10..6f94cea 100644 --- a/print.py +++ b/print.py @@ -6,8 +6,7 @@ import ctypes import io import time -#printer = ctypes.CDLL('./epson/library_bridge.so') -printer = None +printer = ctypes.CDLL('./epson/library_bridge.so') def print_text(text): time.sleep(0.1)