diff --git a/Makefile b/Makefile
index 153c6d7..aaaa913 100644
--- a/Makefile
+++ b/Makefile
@@ -2,11 +2,11 @@
help:
@echo "Available commands:"
- @echo " make prep - Create venv and install requirements"
+ @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 build - Full website build sequence"
+ @echo " make prep - Create venv and install requirements"
@echo " make help - Show this help message"
prep:
@@ -28,3 +28,4 @@ dev:
stop:
nginx -p . -s stop
+
diff --git a/build_pages.py b/build_pages.py
index 8098634..4c02069 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 = [
@@ -14,34 +14,52 @@ PAGES = [
{'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)
- 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()
+ 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__':
main()
+
+
+
+
+
+
+
+
diff --git a/prep.py b/prep.py
index 2171a92..5de939c 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"]
@@ -18,6 +18,8 @@ TYPES_DICT = {
"party": ("zabava", "entertainment"),
}
+env = Environment(loader=FileSystemLoader('template'))
+
def load_events(csv_path:str) -> list[dict]:
events = []
with open(csv_path, encoding='utf-8') as csv_file:
@@ -39,51 +41,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"]
@@ -92,85 +54,165 @@ 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)
+ 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 = date + "T" + time.replace(":", "") + "00"
+ date_str = date_str + "T" + time.replace(":", "") + "00"
- 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)
- if location.startswith("DC Krov"):
- event_template = event_template.replace("", "DC Krov\\, Kraljice Marije 47\\, 6\\, Beograd\\, Serbia")
- elif location.startswith("Matematički fakultet (Učionica 153)"):
- event_template = event_template.replace("", "Matematički fakultet\\, Svetog Nikole 39\\, Beograd\\, Serbia")
- else:
- event_template = event_template.replace("", location)
+ 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)
+ )
+ events_ical += event_template_str
-
- 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"])
+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:
file.write(build_ical(new_events))
-
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 @@
-