diff --git a/atom_gen.py b/atom_gen.py index 52b74859..40f3e845 100755 --- a/atom_gen.py +++ b/atom_gen.py @@ -11,7 +11,7 @@ import os blogs_dir = os.fsencode("blog") -#def blogposts_list_gen(): +# def blogposts_list_gen(): # output_list = [] # for file in os.listdir(blogs_dir): # filename = os.fsdecode(file) @@ -26,46 +26,48 @@ blogs_dir = os.fsencode("blog") # output_list.append([author, title, time, content_html, full_path]) # return output_list + def events_list_gen(): output_list = [] events_file = open("dogadjaji.csv", "r") for line in events_file.readlines(): - date, time, location, title = line.split(", ") - author = "Decentrala" - content_html = f"Event is taking place at {location} on {date} at {time}. For more information see the forum at https://forum.dmz.rs" + date, time, location, title = line.split(", ") + author = "Decentrala" + content_html = f"Event is taking place at {location} on {date} at {time}. For more information see the forum at https://forum.dmz.rs" - output_list.append([author, title, content_html]) + output_list.append([author, title, content_html]) events_file.close() return output_list + def feedgen(blogs, events): fg_blog = FeedGenerator() - fg_blog.id('http://dmz.rs/') - fg_blog.title('Decentrala Blog') - fg_blog.author( {'name':'Decentrala','email':'dmz@dmz.rs'} ) - fg_blog.link( href='https://dmz.rs/atom_blog.xml', rel='self' ) + fg_blog.id("http://dmz.rs/") + fg_blog.title("Decentrala Blog") + fg_blog.author({"name": "Decentrala", "email": "dmz@dmz.rs"}) + fg_blog.link(href="https://dmz.rs/atom_blog.xml", rel="self") fg_events = FeedGenerator() - fg_events.id('http://dmz.rs/') - fg_events.title('Decentrala Blog') - fg_events.author( {'name':'Decentrala','email':'dmz@dmz.rs'} ) - fg_events.link( href='https://dmz.rs/atom_events.xml', rel='self' ) + fg_events.id("http://dmz.rs/") + fg_events.title("Decentrala Blog") + fg_events.author({"name": "Decentrala", "email": "dmz@dmz.rs"}) + fg_events.link(href="https://dmz.rs/atom_events.xml", rel="self") for post in blogs: fe_blogs = fg_blog.add_entry() fe_blogs.id("https://dmz.rs/" + post[4][:-3] + ".html") - fe_blogs.author({'name': post[0]}) + fe_blogs.author({"name": post[0]}) fe_blogs.title(post[1]) fe_blogs.updated(post[2]) - fe_blogs.content(content=post[3], type='html') + fe_blogs.content(content=post[3], type="html") for event in events: fe_events = fg_events.add_entry() fe_events.id("https://dmz.rs/pages/events.html") - fe_events.author({'name': event[0]}) + fe_events.author({"name": event[0]}) fe_events.title(event[1]) fe_events.updated(datetime.datetime.now(datetime.timezone.utc)) - fe_events.content(content=event[2], type='html') + fe_events.content(content=event[2], type="html") - fg_blog.atom_file('site/atom_blog.xml') - fg_events.atom_file('site/atom_events.xml') + fg_blog.atom_file("site/atom_blog.xml") + fg_events.atom_file("site/atom_events.xml") diff --git a/blog.py b/blog.py index 4bfb3040..545777f2 100755 --- a/blog.py +++ b/blog.py @@ -5,8 +5,8 @@ from markdown import markdown as to_markdown blog = "" -with open('blogs/Lorem Ipsum.md','rt') as file: +with open("blogs/Lorem Ipsum.md", "rt") as file: blog = file.read() -with open('blogs/Lorem Ipsum.html', 'wt') as file: +with open("blogs/Lorem Ipsum.html", "wt") as file: file.write(to_markdown(blog)) diff --git a/build_pages.py b/build_pages.py index 8098634e..4886130b 100755 --- a/build_pages.py +++ b/build_pages.py @@ -2,46 +2,76 @@ import os PAGES = [ - {'name': 'index', 'titleSR': 'Početna', 'titleEN': 'Home', 'style': 'home'}, - {'name': 'account', 'titleSR': 'Nalog', 'titleEN': 'Account', 'style': 'account'}, - {'name': 'about', 'titleSR': 'O nama', 'titleEN': 'About us', 'style': 'about'}, - {'name': 'statute', 'titleSR': 'Statut', 'titleEN': 'Statute', 'style': 'statute'}, - {'name': 'events', 'titleSR': 'Događaji', 'titleEN': 'Events', 'style': 'events'}, - {'name': 'events_archive', 'titleSR': 'Arhiva događaja', 'titleEN': 'Events archive', 'style': 'events'}, - {'name': 'services', 'titleSR': 'Servisi', 'titleEN': 'Services', 'style': 'services'}, - {'name': 'webring', 'titleSR': 'Webring', 'titleEN': 'Webring', 'style': ''}, - {'name': 'support', 'titleSR': 'Podrška', 'titleEN': 'Support', 'style': 'support'}, - {'name': 'deconference', 'titleSR': 'Dekonferencija', 'titleEN': 'Deconference', 'style': 'deconference'}, + {"name": "index", "titleSR": "Početna", "titleEN": "Home", "style": "home"}, + {"name": "account", "titleSR": "Nalog", "titleEN": "Account", "style": "account"}, + {"name": "about", "titleSR": "O nama", "titleEN": "About us", "style": "about"}, + {"name": "statute", "titleSR": "Statut", "titleEN": "Statute", "style": "statute"}, + {"name": "events", "titleSR": "Događaji", "titleEN": "Events", "style": "events"}, + { + "name": "events_archive", + "titleSR": "Arhiva događaja", + "titleEN": "Events archive", + "style": "events", + }, + { + "name": "services", + "titleSR": "Servisi", + "titleEN": "Services", + "style": "services", + }, + {"name": "webring", "titleSR": "Webring", "titleEN": "Webring", "style": ""}, + {"name": "support", "titleSR": "Podrška", "titleEN": "Support", "style": "support"}, + { + "name": "deconference", + "titleSR": "Dekonferencija", + "titleEN": "Deconference", + "style": "deconference", + }, ] -def buildPage(filename: str, pageTitle: str, pageHtml: str, pageStyle: str, template: str) -> str: - template = template.replace('', pageTitle) - style = '' if not pageStyle else f'' - template = template.replace('', style) - template = template.replace('PAGE_NAME', filename) - template = template.replace('', pageHtml) + +def buildPage( + filename: str, pageTitle: str, pageHtml: str, pageStyle: str, template: str +) -> str: + template = template.replace("", pageTitle) + style = ( + "" + if not pageStyle + else f'' + ) + template = template.replace("", style) + template = template.replace("PAGE_NAME", filename) + template = template.replace("", pageHtml) return template + def main(): - os.makedirs('site/en/', exist_ok=True) - with open('template/page-en.html') as fTempEN, open('template/page-sr.html') as fTempSR: + os.makedirs("site/en/", exist_ok=True) + with open("template/page-en.html") as fTempEN, open( + "template/page-sr.html" + ) as fTempSR: templateSR = fTempSR.read() templateEN = fTempEN.read() for page in PAGES: with open(f'pages/sr/{page["name"]}.html') as f: pageHtml = "
Studenti su nasli bug
" pageHtml += f.read() - html = buildPage(page['name'], page['titleSR'], pageHtml, page['style'], templateSR) - f = open(f'site/{page["name"]}.html', 'w') + html = buildPage( + page["name"], page["titleSR"], pageHtml, page["style"], templateSR + ) + f = open(f'site/{page["name"]}.html', "w") f.write(html) f.close() with open(f'pages/en/{page["name"]}.html') as f: pageHtml = "
Students found the bug
" pageHtml += f.read() - html = buildPage(page['name'], page['titleEN'], pageHtml, page['style'], templateEN) - f = open(f'site/en/{page["name"]}.html', 'w') + html = buildPage( + page["name"], page["titleEN"], pageHtml, page["style"], templateEN + ) + f = open(f'site/en/{page["name"]}.html', "w") f.write(html) f.close() -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/image_poster.py b/image_poster.py index 635a580e..99d66501 100755 --- a/image_poster.py +++ b/image_poster.py @@ -13,10 +13,34 @@ NEXT_MONTH = CURRENT_TIME + relativedelta.relativedelta(months=1, day=1) DAYS_OF_WEEK_SR = ("PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED") DAYS_OF_WEEK_EN = ("MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN") -MONTHS_SR = ("Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", - "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar") -MONTHS_EN = ("January", "February", "March", "April", "May", "June", "July", - "August", "September", "October", "November", "December") +MONTHS_SR = ( + "Januar", + "Februar", + "Mart", + "April", + "Maj", + "Jun", + "Jul", + "Avgust", + "Septembar", + "Oktobar", + "Novembar", + "Decembar", +) +MONTHS_EN = ( + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +) HEADER_SR = "Plan za {}" @@ -36,10 +60,15 @@ All events are always free def parseArgs(parser): """ - Parse all arguments and return the list of argument values + Parse all arguments and return the list of argument values """ - parser.add_argument("month", metavar="MM", - help="two digit number representing the month for which to generate poster", default="empty", nargs="?") + parser.add_argument( + "month", + metavar="MM", + help="two digit number representing the month for which to generate poster", + default="empty", + nargs="?", + ) return parser.parse_args() @@ -51,18 +80,19 @@ def load_events(csv_path: str, month: int) -> list[dict]: 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_date_parsed = dt.datetime.strptime(event_date, "%d-%m-%Y").date() event_time = event[1] event_title = event[3] event_title_en = event[3] if len(event) > 6: event_title_en = event[6] - current_event = {"date": event_date_parsed, - "time": event_time, - "title": event_title.strip(), - "title_en": event_title_en.strip()} + current_event = { + "date": event_date_parsed, + "time": event_time, + "title": event_title.strip(), + "title_en": event_title_en.strip(), + } if event_date_parsed >= month and event_date_parsed < monthafter: events.append(current_event) return events @@ -71,8 +101,7 @@ def load_events(csv_path: str, month: int) -> list[dict]: def drawMesh(draw, img, fg, bg, font, W, H): def drawCircle(x, y): r = 50 - draw.ellipse((x - r, y - r, x + r, y+r), - fill=fg, outline=(0, 0, 0), width=0) + draw.ellipse((x - r, y - r, x + r, y + r), fill=fg, outline=(0, 0, 0), width=0) LCX = 415 # logo center x LCY = 4350 # logo center y @@ -84,11 +113,15 @@ def drawMesh(draw, img, fg, bg, font, W, H): drawCircle(LCX + d, LCY) draw.line([(LCX - d, LCY), (LCX + d, LCY)], fill=fg, width=20, joint=None) - draw.line([(LCX, LCY), (LCX, LCY + d), (LCX + d, LCY), - (LCX, LCY - d)], fill=fg, width=20, joint=None) - draw.text((LCX - 1.7*d, LCY + 1.5*d), "dmz.rs", font=font, fill=fg) + draw.line( + [(LCX, LCY), (LCX, LCY + d), (LCX + d, LCY), (LCX, LCY - d)], + fill=fg, + width=20, + joint=None, + ) + draw.text((LCX - 1.7 * d, LCY + 1.5 * d), "dmz.rs", font=font, fill=fg) - mesh_svg = svg2png(url='site/img/mesh-light.svg') + mesh_svg = svg2png(url="site/img/mesh-light.svg") mesh_svg_bytes = io.BytesIO(mesh_svg) mesh_img = Image.open(mesh_svg_bytes) if bg == (0, 0, 0): @@ -107,35 +140,32 @@ def drawMesh(draw, img, fg, bg, font, W, H): def drawPoster(events, bg, fg, month: int, en: bool): - fontFacade = ImageFont.truetype('./site/font/Facade-Sud.woff', size=365) - fontIosevka = ImageFont.truetype( - './site/font/iosevka-regular.woff', size=200) - fontIosevkaSmall = ImageFont.truetype( - './site/font/iosevka-regular.woff', size=150) + fontFacade = ImageFont.truetype("./site/font/Facade-Sud.woff", size=365) + fontIosevka = ImageFont.truetype("./site/font/iosevka-regular.woff", size=200) + fontIosevkaSmall = ImageFont.truetype("./site/font/iosevka-regular.woff", size=150) W = 3508 H = 4960 - img = Image.new('RGB', (W, H), bg) + img = Image.new("RGB", (W, H), bg) draw = ImageDraw.Draw(img) drawMesh(draw, img, fg, bg, fontIosevka, W, H) title = "DECENTRALA" _, _, w, _ = draw.textbbox((0, 0), title, font=fontFacade) - draw.text(((W-w)/2, 165), title, font=fontFacade, fill=fg) + draw.text(((W - w) / 2, 165), title, font=fontFacade, fill=fg) header = HEADER_EN if en else HEADER_SR months = MONTHS_EN if en else MONTHS_SR header = header.format(months[month.month - 1]) _, _, w, _ = draw.textbbox((0, 0), header, font=fontIosevka) - draw.text(((W-w)/2, 560), header, font=fontIosevka, fill=fg) + draw.text(((W - w) / 2, 560), header, font=fontIosevka, fill=fg) height = 890 sub_header = SUBHEADER_EN if en else SUBHEADER_SR - draw.text((165, height), sub_header, - font=fontIosevkaSmall, fill=fg) + draw.text((165, height), sub_header, font=fontIosevkaSmall, fill=fg) height += 800 # Write list of events to sperate text file as well @@ -167,8 +197,7 @@ def drawPoster(events, bg, fg, month: int, en: bool): def main(): # Parse arguments - parser = argparse.ArgumentParser( - description="Generate images of the poster") + parser = argparse.ArgumentParser(description="Generate images of the poster") args = parseArgs(parser) # Set month based on user input @@ -176,22 +205,24 @@ def main(): if args.month.isdigit(): month = dt.date(CURRENT_TIME.year, int(args.month), 1) elif args.month != "empty": - print("Month has to be specified as a number. I will use next month as the default") + print( + "Month has to be specified as a number. I will use next month as the default" + ) # Load events and draw a poseter events = load_events("dogadjaji.csv", month) img = drawPoster(events, (0, 0, 0), (20, 250, 50), month, False) - img.save('poster_dark.png') + img.save("poster_dark.png") img = drawPoster(events, (255, 255, 255), (0, 0, 0), month, False) - img.save('poster_light.png') + img.save("poster_light.png") img = drawPoster(events, (0, 0, 0), (20, 250, 50), month, True) - img.save('poster_dark_en.png') + img.save("poster_dark_en.png") img = drawPoster(events, (255, 255, 255), (0, 0, 0), month, True) - img.save('poster_light_en.png') + img.save("poster_light_en.png") if __name__ == "__main__": diff --git a/poster.py b/poster.py index a6a29aed..f1060973 100755 --- a/poster.py +++ b/poster.py @@ -7,10 +7,23 @@ EVENTS_CSV_PATH = "dogadjaji.csv" CURRENT_TIME = dt.date.today() NEXT_MONTH = CURRENT_TIME + relativedelta.relativedelta(months=1, day=1) 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") +MONTHS_SR = ( + "Januar", + "Februar", + "Mart", + "April", + "Maj", + "Jun", + "Jul", + "Avgust", + "Septembar", + "Oktobar", + "Novembar", + "Decembar", +) -def load_events(csv_path:str) -> list[dict]: + +def load_events(csv_path: str) -> list[dict]: events = [] with open(csv_path) as csv_file: csv_reader = csv.reader(csv_file) @@ -20,14 +33,17 @@ def load_events(csv_path:str) -> list[dict]: 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()} + 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 render_table(events:list[dict])-> str: + +def render_table(events: list[dict]) -> str: html = "" for event in events: date = DAYS_OF_WEEK_SR[event["date"].weekday()] @@ -36,12 +52,13 @@ def render_table(events:list[dict])-> str: html += f"\t\t\t {date} {day}. {title} \n" return html + def render_page(table: str) -> str: - head = "" + head = '' header = "

DECENTRALA

" subheader = f"

Plan za {MONTHS_SR[NEXT_MONTH.month - 1]}

" - link = "" + link = '' p1 = "

Radionice počinju u 19h u Društvenom centru Krov\ u Kraljice Marije 47.

" p2 = "

Ulaz u zgradu je u prolazu pored Štark prodavnice slatkiša, odmah\ @@ -49,7 +66,8 @@ pored menjačnice. DC Krov je na poslednjem spratu.

" footer = f"{p1}{p2}{link}" return f"{head}
{header}{subheader}\ {table}
{footer}
" - + + def main(): events = load_events(EVENTS_CSV_PATH) table = render_table(events) @@ -58,5 +76,6 @@ def main(): f.write(page) f.close() + if __name__ == "__main__": main() diff --git a/prep.py b/prep.py index ce71858f..fd9d783b 100755 --- a/prep.py +++ b/prep.py @@ -25,9 +25,10 @@ TYPES_DICT = { "party": ("zabava", "entertainment"), } -def load_events(csv_path:str) -> list[dict]: + +def load_events(csv_path: str) -> list[dict]: events = [] - with open(csv_path, encoding='utf-8') as csv_file: + with open(csv_path, encoding="utf-8") as csv_file: csv_reader = csv.DictReader(csv_file, skipinitialspace=True) for event in csv_reader: event_date = event["datum"] @@ -35,14 +36,16 @@ def load_events(csv_path:str) -> list[dict]: event_time = event["vreme"] event_location = event["lokacija"] event_title = event["tema"] - types = event["tip"].split() + types = event["tip"].split() link = event.get("link", "") - current_event = {"date":event_date_parsed, - "time":event_time, - "location": event_location, - "title":event_title.strip(), - "types": types, - "link": link} + current_event = { + "date": event_date_parsed, + "time": event_time, + "location": event_location, + "title": event_title.strip(), + "types": types, + "link": link, + } events.append(current_event) return events @@ -53,17 +56,30 @@ def build_html(events: list[dict], dayNames: list[str], typesNames: dict) -> str title = event["title"] location = event["location"] date = event["date"] - date = dayNames[date.weekday()]+", "+str(date.day)+". "+str(date.month)+". "+str(date.year)+", " - time = event["time"]+"h" + date = ( + dayNames[date.weekday()] + + ", " + + str(date.day) + + ". " + + str(date.month) + + ". " + + str(date.year) + + ", " + ) + time = event["time"] + "h" event_html = [] event_html.append(f"
{date} {time}
") if event["link"] != "": - event_html.append(f"
{title}
") + event_html.append( + f"
{title}
" + ) else: event_html.append(f"
{title}
") if "https://" in location: - place,link = location.split("https://") - event_html.append(f"
@{place.strip()}
") + place, link = location.split("https://") + event_html.append( + f"
@{place.strip()}
" + ) else: event_html.append(f"
@{location.strip()}
") @@ -74,7 +90,7 @@ def build_html(events: list[dict], dayNames: list[str], typesNames: dict) -> str if typesNames.get(t) is not None: types_list += typesNames.get(t) if t != last_item: - types_list += ', ' + types_list += ", " else: print(f"Unknown type {t}!") types_list += "" @@ -84,6 +100,7 @@ def build_html(events: list[dict], dayNames: list[str], typesNames: dict) -> str events_html.append(f"\n
{event_html}
") return events_html + def build_ical(events: list[dict]) -> str: today = datetime.today().now() # Header @@ -99,8 +116,17 @@ def build_ical(events: list[dict]) -> str: url = event["link"] uid = str(date.month).zfill(2) + str(date.day).zfill(2) + time[:2] - date = str(date.year) + str(date.month).zfill(2) + str(date.day).zfill(2) - created = str(today.year) + str(today.month).zfill(2) + str(today.day).zfill(2) + "T" + str(today.hour).zfill(2) + str(today.minute).zfill(2) + str(today.second).zfill(2) + "Z" + date = str(date.year) + str(date.month).zfill(2) + str(date.day).zfill(2) + created = ( + str(today.year) + + str(today.month).zfill(2) + + str(today.day).zfill(2) + + "T" + + str(today.hour).zfill(2) + + str(today.minute).zfill(2) + + str(today.second).zfill(2) + + "Z" + ) date = date + "T" + time.replace(":", "") + "00" event_template = "" @@ -118,20 +144,20 @@ def build_ical(events: list[dict]) -> str: break event_template = event_template.replace("", ical_location) - events_ical += event_template # Footer with open("template/end.ical", "r") as file: events_ical += file.read() return events_ical + events = sorted(load_events("dogadjaji.csv"), key=lambda e: e["date"]) today = datetime.today().date() past_events = list(filter(lambda e: e["date"] <= today, events)) past_events.reverse() -new_events = list(filter(lambda e: e["date"] >= today, events)) +new_events = list(filter(lambda e: e["date"] >= today, events)) page_template = "" @@ -146,7 +172,7 @@ for key, value_pair in TYPES_DICT.items(): # Build Serbian Events page new_events_html = build_html(new_events, DAYS_SR, sr_types) with open("template/events-sr.html", "r") as file: - page_template = ([line for line in file]) + page_template = [line for line in file] with open("pages/sr/events.html", "w") as file: file.writelines(page_template + new_events_html) @@ -154,7 +180,7 @@ with open("pages/sr/events.html", "w") as file: # Build English Events page new_events_html = build_html(new_events, DAYS_EN, en_types) with open("template/events-en.html", "r") as file: - page_template = ([line for line in file]) + page_template = [line for line in file] with open("pages/en/events.html", "w") as file: file.writelines(page_template + new_events_html) @@ -162,7 +188,7 @@ with open("pages/en/events.html", "w") as file: # Build Serbian Archive page past_events_html = build_html(past_events, DAYS_SR, sr_types) with open("template/events_archive-sr.html", "r") as file: - page_template = ([line for line in file]) + page_template = [line for line in file] with open("pages/sr/events_archive.html", "w") as file: file.writelines(page_template + past_events_html) @@ -170,7 +196,7 @@ with open("pages/sr/events_archive.html", "w") as file: # Build English Archive page past_events_html = build_html(past_events, DAYS_EN, en_types) with open("template/events_archive-en.html", "r") as file: - page_template = ([line for line in file]) + page_template = [line for line in file] with open("pages/en/events_archive.html", "w") as file: file.writelines(page_template + past_events_html) @@ -180,4 +206,3 @@ new_events_ical = build_ical(new_events) # Build ical with open("site/events.ical", "w") as file: file.write(build_ical(new_events)) -