diff --git a/Makefile b/Makefile
index 7d50a12..691cdfa 100644
--- a/Makefile
+++ b/Makefile
@@ -2,11 +2,11 @@
help:
@echo "Available commands:"
- @echo " make prep - Create venv and install requirements"
- @echo " make events - Update site from CSV (build pages + images)"
- @echo " make dev - Start development server (might need sudo)"
- @echo " make stop - Stop development server (might need sudo)"
@echo " make build - Full website build sequence"
+ @echo " make events - Update site from CSV (build pages + images)"
+ @echo " make dev - Start development server"
+ @echo " make stop - Stop development server"
+ @echo " make prep - Create venv and install requirements"
@echo " make help - Show this help message"
prep:
diff --git a/build_pages.py b/build_pages.py
index 4886130..90a80cb 100755
--- a/build_pages.py
+++ b/build_pages.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python3
+from jinja2 import Environment, FileSystemLoader
import os
PAGES = [
@@ -29,48 +29,45 @@ PAGES = [
},
]
-
-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
+env = Environment(loader=FileSystemLoader('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:
- templateSR = fTempSR.read()
- templateEN = fTempEN.read()
- for page in PAGES:
- with open(f'pages/sr/{page["name"]}.html') as f:
- pageHtml = "
"
- pageHtml += f.read()
- 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 = " "
- pageHtml += f.read()
- html = buildPage(
- page["name"], page["titleEN"], pageHtml, page["style"], templateEN
- )
- f = open(f'site/en/{page["name"]}.html', "w")
- f.write(html)
- f.close()
+ os.makedirs('site/en/', exist_ok=True)
+ for page in PAGES:
+ # Build SR Page
+ with open(f'pages/sr/{page["name"]}.html') as f:
+ page_content = " ' if page['style'] else '',
+ lang="sr",
+ sr_link=f"/en/{page['name']}"
+ )
+
+ sr_filename = "index.html" if page['name'] == 'index' else f"{page['name']}.html"
+ with open(f'site/{sr_filename}', 'w') as f:
+ f.write(sr_html)
+
+ # Build EN Page
+ with open(f'pages/en/{page["name"]}.html') as f:
+ page_content = " ' if page['style'] else '',
+ lang="en",
+ sr_link=f"/{page['name']}"
+ )
+
+ en_filename = "index.html" if page['name'] == 'index' else f"{page['name']}.html"
+ with open(f'site/en/{en_filename}', 'w') as f:
+ f.write(en_html)
if __name__ == "__main__":
diff --git a/prep.py b/prep.py
index fd9d783..38b239a 100755
--- a/prep.py
+++ b/prep.py
@@ -1,7 +1,7 @@
-#! /usr/bin/env python3
-
+from jinja2 import Environment, FileSystemLoader
import csv
from datetime import datetime
+import os
DAYS_SR = ["PON", "UTO", "SRE", "ČET", "PET", "SUB", "NED"]
DAYS_EN = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
@@ -25,8 +25,9 @@ TYPES_DICT = {
"party": ("zabava", "entertainment"),
}
+env = Environment(loader=FileSystemLoader('template'))
-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:
csv_reader = csv.DictReader(csv_file, skipinitialspace=True)
@@ -49,65 +50,11 @@ def load_events(csv_path: str) -> list[dict]:
events.append(current_event)
return events
-
-def build_html(events: list[dict], dayNames: list[str], typesNames: dict) -> str:
- events_html = []
- for event in events:
- 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"
- event_html = []
- event_html.append(f"{date} {time}
")
- if event["link"] != "":
- event_html.append(
- f""
- )
- else:
- event_html.append(f"{title}
")
- if "https://" in location:
- place, link = location.split("https://")
- event_html.append(
- f""
- )
- else:
- event_html.append(f"@{location.strip()}
")
-
- if len(event["types"]) != 0:
- types_list = ""
- last_item = event["types"][-1]
- for t in event["types"]:
- if typesNames.get(t) is not None:
- types_list += typesNames.get(t)
- if t != last_item:
- types_list += ", "
- else:
- print(f"Unknown type {t}!")
- types_list += "
"
- event_html.append(types_list)
-
- event_html = "".join(event_html)
- events_html.append(f"\n{event_html}
")
- return events_html
-
-
def build_ical(events: list[dict]) -> str:
today = datetime.today().now()
- # Header
events_ical = ""
with open("template/head.ical", "r") as file:
events_ical += file.read()
- # Events
for event in events:
title = event["title"]
location = event["location"]
@@ -116,92 +63,164 @@ 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 = 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_str + "T" + time.replace(":", "") + "00"
+
+ event_template_str = env.get_template("event.ical").render(
+ UID=uid,
+ CREATED=created,
+ DATE=date_str,
+ TITLE=title,
+ URL=url,
+ LOCATION="DC Krov\\, Kraljice Marije 47\\, 6\\, Beograd\\, Serbia" if location.startswith("DC Krov") else ("Matematički fakultet\\, Svetog Nikole 39\\, Beograd\\, Serbia" if location.startswith("Matematički fakultet (Učionica 153)") else location)
)
- date = date + "T" + time.replace(":", "") + "00"
+ events_ical += event_template_str
- event_template = ""
- with open("template/event.ical", "r") as file:
- event_template += file.read()
- event_template = event_template.replace("", uid)
- event_template = event_template.replace("", created)
- event_template = event_template.replace("", date)
- event_template = event_template.replace("", title)
- event_template = event_template.replace("", url)
- ical_location = location
- for prefix, address in ICAL_LOCATION_ADDRESSES.items():
- if location.startswith(prefix):
- ical_location = address
- 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
+def render_page(template_name, output_path, context):
+ template = env.get_template(template_name)
+ with open(output_path, "w") as file:
+ file.write(template.render(context))
+# Main execution
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))
+past_events = sorted([e for e in events if e["date"] <= today], key=lambda e: e["date"], reverse=True)
+new_events = [e for e in events if e["date"] >= today]
+sr_types = {k: v[0] for k, v in TYPES_DICT.items()}
+en_types = {k: v[1] for k, v in TYPES_DICT.items()}
-page_template = ""
+# Build Serbian Pages
+render_page("events-sr.html", "pages/sr/events.html", {
+ "lang": "sr",
+ "title": "Događaji",
+ "sr_link": "/events_archive",
+ "events_html": env.from_string("""
+ {% for event in events %}
+
+
{{ event.date.strftime('%a, %d. %b. %Y') }}, {{ event.time }}h
+ {% if event.link %}
+
+ {% else %}
+
{{ event.title }}
+ {% endif %}
+ {% if 'https://' in event.location %}
+ {% set place, link = event.location.split('https://') %}
+
+ {% else %}
+
@{{ event.location.strip() }}
+ {% endif %}
+ {% if event.types %}
+
+ {% for t in event.types %}
+ {{ types_names.get(t, t) }}{% if not loop.last %}, {% endif %}
+ {% endfor %}
+
+ {% endif %}
+
+ {% endfor %}
+ """).render(events=new_events, types_names=sr_types)
+})
-sr_types = {}
-en_types = {}
+render_page("events-en.html", "pages/en/events.html", {
+ "lang": "en",
+ "title": "Events",
+ "sr_link": "/events_archive",
+ "events_html": env.from_string("""
+ {% for event in events %}
+
+
{{ event.date.strftime('%a, %d. %b. %Y') }}, {{ event.time }}h
+ {% if event.link %}
+
+ {% else %}
+
{{ event.title }}
+ {% endif %}
+ {% if 'https://' in event.location %}
+ {% set place, link = event.location.split('https://') %}
+
+ {% else %}
+
@{{ event.location.strip() }}
+ {% endif %}
+ {% if event.types %}
+
+ {% for t in event.types %}
+ {{ types_names.get(t, t) }}{% if not loop.last %}, {% endif %}
+ {% endfor %}
+
+ {% endif %}
+
+ {% endfor %}
+ """).render(events=new_events, types_names=en_types)
+})
-for key, value_pair in TYPES_DICT.items():
- sr_types[key] = value_pair[0]
- en_types[key] = value_pair[1]
+# Build Archive Pages
+render_page("events_archive-sr.html", "pages/sr/events_archive.html", {
+ "lang": "sr",
+ "title": "Arhiva događaja",
+ "sr_link": "/events",
+ "events_html": env.from_string("""
+ {% for event in events %}
+
+
{{ event.date.strftime('%a, %d. %b. %Y') }}, {{ event.time }}h
+ {% if event.link %}
+
+ {% else %}
+
{{ event.title }}
+ {% endif %}
+ {% if 'https://' in event.location %}
+ {% set place, link = event.location.split('https://') %}
+
+ {% else %}
+
@{{ event.location.strip() }}
+ {% endif %}
+ {% if event.types %}
+
+ {% for t in event.types %}
+ {{ types_names.get(t, t) }}{% if not loop.last %}, {% endif %}
+ {% endfor %}
+
+ {% endif %}
+
+ {% endfor %}
+ """).render(events=past_events, types_names=sr_types)
+})
-# 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]
-
-with open("pages/sr/events.html", "w") as file:
- file.writelines(page_template + new_events_html)
-
-# 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]
-
-with open("pages/en/events.html", "w") as file:
- file.writelines(page_template + new_events_html)
-
-# 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]
-
-with open("pages/sr/events_archive.html", "w") as file:
- file.writelines(page_template + past_events_html)
-
-# 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]
-
-with open("pages/en/events_archive.html", "w") as file:
- file.writelines(page_template + past_events_html)
-
-new_events_ical = build_ical(new_events)
+render_page("events_archive-en.html", "pages/en/events_archive.html", {
+ "lang": "en",
+ "title": "Events archive",
+ "sr_link": "/en/events",
+ "events_html": env.from_string("""
+ {% for event in events %}
+
+
{{ event.date.strftime('%a, %d. %b. %Y') }}, {{ event.time }}h
+ {% if event.link %}
+
+ {% else %}
+
{{ event.title }}
+ {% endif %}
+ {% if 'https://' in event.location %}
+ {% set place, link = event.location.split('https://') %}
+
+ {% else %}
+
@{{ event.location.strip() }}
+ {% endif %}
+ {% if event.types %}
+
+ {% for t in event.types %}
+ {{ types_names.get(t, t) }}{% if not loop.last %}, {% endif %}
+ {% endfor %}
+
+ {% endif %}
+
+ {% endfor %}
+ """).render(events=past_events, types_names=en_types)
+})
# Build ical
with open("site/events.ical", "w") as file:
diff --git a/requirements.txt b/requirements.txt
index d8cb4b8..e1ee0f7 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,3 +4,4 @@ freetype-py
python-dateutil
feedgen
pillow
+jinja2
diff --git a/site/deconference.html b/site/deconference.html
index 0de7e7c..2174b35 100644
--- a/site/deconference.html
+++ b/site/deconference.html
@@ -14,50 +14,26 @@
-
-
-
+
Dekonferencija Decentrala
-
+
-
-
Dekonferencija
+
+
+
Dekonferencija
11:00 Otvaranje
@@ -93,18 +69,20 @@
Decentrala prihvata donacije isključivo od fizičkih lica.
-
+
+
@@ -123,4 +101,4 @@
-