first commit

This commit is contained in:
kaaduu
2025-08-19 15:00:00 +02:00
parent c55d3d6cee
commit 06685c855a
59 changed files with 10610 additions and 0 deletions

137
src/generate_holidays.py Normal file
View File

@@ -0,0 +1,137 @@
#!/usr/bin/env python3
"""
Skript pro generování souboru data/holidays.json z src/vzor_svatky.json.
"""
import json
import os
from datetime import date, timedelta
def easter_sunday(year):
"""
Vypočítá datum Velikonoční neděle pro daný rok podle Gaussova algoritmu.
:param year: Rok
:return: Datum Velikonoční neděle
"""
# Gausův algoritmus pro výpočet Velikonoc
a = year % 19
b = year // 100
c = year % 100
d = b // 4
e = b % 4
f = (b + 8) // 25
g = (b - f + 1) // 3
h = (19 * a + b - d - g + 15) % 30
i = c // 4
k = c % 4
l = (32 + 2 * e + 2 * i - h - k) % 7
m = (a + 11 * h + 22 * l) // 451
month = (h + l - 7 * m + 114) // 31
day = ((h + l - 7 * m + 114) % 31) + 1
return date(year, month, day)
def load_vzor_svatky():
"""Načte vzorový soubor se svátky."""
vzor_path = os.path.join(os.path.dirname(__file__), 'vzor_svatky.json')
with open(vzor_path, 'r', encoding='utf-8') as f:
return json.load(f)
def generate_holidays_for_year(year, vzor_data):
"""
Vygeneruje seznam svátků pro daný rok.
:param year: Rok
:param vzor_data: Data z vzor_svatky.json
:return: Seznam svátků ve formátu DD.MM
"""
holidays = set()
# Přidáme ověřené svátky, pokud jsou pro daný rok k dispozici
if str(year) in vzor_data['overeneSvatky']:
for svatek in vzor_data['overeneSvatky'][str(year)]:
# Převedeme datum z YYYY-MM-DD na DD.MM
datum = svatek['datum']
den_mesic = datum[8:10] + '.' + datum[5:7]
holidays.add(den_mesic)
else:
# Pro roky bez ověřených svátků použijeme pravidla
# Pevné svátky
for svatek in vzor_data['pravidlaProBudouciSvatky']['pevneSvatky']:
# datum je ve formátu MM-DD
mesic_den = svatek['datum']
den_mesic = mesic_den[3:5] + '.' + mesic_den[0:2]
holidays.add(den_mesic)
# Pohyblivé svátky - Velikonoce
try:
velikonoce = easter_sunday(year)
# Velký pátek - 2 dny před Velikonocemi
velky_patek = velikonoce - timedelta(days=2)
den_mesic_vp = velky_patek.strftime('%d.%m')
holidays.add(den_mesic_vp)
# Velikonoční pondělí - 1 den po Velikonocích
velikonoce_po = velikonoce + timedelta(days=1)
den_mesic_vpo = velikonoce_po.strftime('%d.%m')
holidays.add(den_mesic_vpo)
except Exception as e:
print(f"Chyba při výpočtu Velikonoc pro rok {year}: {e}")
return sorted(list(holidays))
def generate_all_holidays(vzor_data, start_year=2020, end_year=2030):
"""
Vygeneruje svátky pro rozsah let.
:param vzor_data: Data z vzor_svatky.json
:param start_year: Počáteční rok
:param end_year: Koncový rok
:return: Slovník ve formátu vhodném pro holidays.json
"""
holidays_dict = {}
for year in range(start_year, end_year + 1):
holidays_list = generate_holidays_for_year(year, vzor_data)
holidays_dict[str(year)] = holidays_list
print(f"Rok {year}: {len(holidays_list)} svátků")
return holidays_dict
def save_holidays(holidays_dict, output_path):
"""
Uloží svátky do souboru.
:param holidays_dict: Slovník svátků
:param output_path: Cesta k výstupnímu souboru
"""
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(holidays_dict, f, indent=2, ensure_ascii=False)
print(f"Svátky byly uloženy do: {output_path}")
def main():
"""Hlavní funkce."""
print("Generuji soubor se svátky...")
# Načteme vzorová data
vzor_data = load_vzor_svatky()
# Vygenerujeme svátky pro roky 2020-2030
holidays_dict = generate_all_holidays(vzor_data, 2020, 2030)
# Uložíme do data/holidays.json
output_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'holidays.json')
save_holidays(holidays_dict, output_path)
print("Hotovo!")
if __name__ == '__main__':
main()