forked from Decentrala/website
		
	Png poster maker
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -5,5 +5,7 @@ site/atom_blog.xml
 | 
				
			|||||||
site/atom_events.xml
 | 
					site/atom_events.xml
 | 
				
			||||||
poster.html
 | 
					poster.html
 | 
				
			||||||
poster.pdf
 | 
					poster.pdf
 | 
				
			||||||
 | 
					poster_light.png
 | 
				
			||||||
 | 
					poster_dark.png
 | 
				
			||||||
http.access.log
 | 
					http.access.log
 | 
				
			||||||
http.error.log
 | 
					http.error.log
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										89
									
								
								image_poster.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								image_poster.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
				
			|||||||
 | 
					#! /usr/bin/env python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import freetype
 | 
				
			||||||
 | 
					import io
 | 
				
			||||||
 | 
					from PIL import Image, ImageDraw, ImageFont
 | 
				
			||||||
 | 
					import csv
 | 
				
			||||||
 | 
					import datetime as dt
 | 
				
			||||||
 | 
					from dateutil import relativedelta
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CURRENT_TIME = dt.date.today()
 | 
				
			||||||
 | 
					NEXT_MONTH = CURRENT_TIME
 | 
				
			||||||
 | 
					DAYS_OF_WEEK_SR = ("PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED")
 | 
				
			||||||
 | 
					MONTHS_SR = ("Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust",\
 | 
				
			||||||
 | 
					            "Septembar", "Oktobar", "Novembar", "Decembar")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def load_events(csv_path:str) -> list[dict]:
 | 
				
			||||||
 | 
					    events = []
 | 
				
			||||||
 | 
					    with open(csv_path) as csv_file:
 | 
				
			||||||
 | 
					        csv_reader = csv.reader(csv_file)
 | 
				
			||||||
 | 
					        next(csv_reader, None)
 | 
				
			||||||
 | 
					        for event in csv_reader:
 | 
				
			||||||
 | 
					            event_date = event[0]
 | 
				
			||||||
 | 
					            event_date_parsed = dt.datetime.strptime(event_date, "%d-%m-%Y").date()
 | 
				
			||||||
 | 
					            event_time = event[1]
 | 
				
			||||||
 | 
					            event_title = event[3]
 | 
				
			||||||
 | 
					            current_event = {"date":event_date_parsed,
 | 
				
			||||||
 | 
					                             "time":event_time,
 | 
				
			||||||
 | 
					                             "title":event_title.strip()}
 | 
				
			||||||
 | 
					            if event_date_parsed >= NEXT_MONTH:
 | 
				
			||||||
 | 
					                events.append(current_event)
 | 
				
			||||||
 | 
					        return events
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def drawPoster(events, bg, fg):
 | 
				
			||||||
 | 
					    fontFacade = ImageFont.truetype('./site/font/Facade-Sud.woff', size=110)
 | 
				
			||||||
 | 
					    fontIosevka = ImageFont.truetype('./site/font/iosevka-regular.woff', size=60)
 | 
				
			||||||
 | 
					    fontIosevkaSmall = ImageFont.truetype('./site/font/iosevka-regular.woff', size=45)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    W = 1200
 | 
				
			||||||
 | 
					    H = 1500 
 | 
				
			||||||
 | 
					    img = Image.new('RGB', (W, H), bg)
 | 
				
			||||||
 | 
					    draw = ImageDraw.Draw(img)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    header = "DECENTRALA"
 | 
				
			||||||
 | 
					    _, _, w, _ = draw.textbbox((0, 0), header, font=fontFacade)
 | 
				
			||||||
 | 
					    draw.text(((W-w)/2, 120), header, font=fontFacade, fill=fg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    subheader = f"Plan za {MONTHS_SR[NEXT_MONTH.month - 1]}"
 | 
				
			||||||
 | 
					    _, _, w, _ = draw.textbbox((0, 0), subheader, font=fontIosevka)
 | 
				
			||||||
 | 
					    draw.text(((W-w)/2, 240), subheader, font=fontIosevka, fill=fg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    height = 410
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for event in events:
 | 
				
			||||||
 | 
					        date = DAYS_OF_WEEK_SR[event["date"].weekday()]
 | 
				
			||||||
 | 
					        day = event["date"].day
 | 
				
			||||||
 | 
					        title = event["title"]
 | 
				
			||||||
 | 
					        pad = " " if event["date"].day < 10 else ""
 | 
				
			||||||
 | 
					        eventText = f"{date} {day}. {pad} {title}"
 | 
				
			||||||
 | 
					        draw.text((120, height), eventText, font=fontIosevkaSmall, fill=fg)
 | 
				
			||||||
 | 
					        height += 70
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def drawCircle(x, y):
 | 
				
			||||||
 | 
					        r = 10
 | 
				
			||||||
 | 
					        draw.ellipse((x - r, y - r, x + r, y+r), fill=fg, outline=(0, 0, 0), width=0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LCX = 950 # logo center x
 | 
				
			||||||
 | 
					    LCY = 1200 # logo center y
 | 
				
			||||||
 | 
					    d = 50 # delta
 | 
				
			||||||
 | 
					    drawCircle(LCX - d, LCY)
 | 
				
			||||||
 | 
					    drawCircle(LCX, LCY)
 | 
				
			||||||
 | 
					    drawCircle(LCX, LCY - d)
 | 
				
			||||||
 | 
					    drawCircle(LCX, LCY + d)
 | 
				
			||||||
 | 
					    drawCircle(LCX + d, LCY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    draw.line([(LCX - d, LCY), (LCX + d, LCY)], fill=fg, width=5, joint=None)
 | 
				
			||||||
 | 
					    draw.line([(LCX, LCY), (LCX, LCY + d), (LCX + d, LCY), (LCX, LCY - d)], fill=fg, width=5, joint=None)
 | 
				
			||||||
 | 
					    draw.text((LCX - 1.7*d, LCY + 1.5*d), "dmz.rs", font=fontIosevka, fill=fg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return img
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					events = load_events("dogadjaji.csv")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					img = drawPoster(events, (0, 0, 0), (20, 250, 50))
 | 
				
			||||||
 | 
					img.save('poster_dark.png')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					img = drawPoster(events, (255, 255, 255), (0, 0, 0))
 | 
				
			||||||
 | 
					img.save('poster_light.png')
 | 
				
			||||||
		Reference in New Issue
	
	Block a user