92 lines
3.2 KiB
Python
92 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import sys
|
|
import json
|
|
|
|
def generuj_wiersze(wezel, wiersze, poziom=0):
|
|
"""
|
|
Funkcja rekurencyjna:
|
|
- Odczytuje z węzła (wezel) pola nr, opis, punkty.
|
|
- Dodaje do listy 'wiersze' wiersz tabeli w stylu:
|
|
[wcięcie + nr] & [wcięcie + opis] & [wcięcie + punkty] \\
|
|
przy czym każde pole jest dodatkowo wcięte zależnie od poziomu zagnieżdżenia.
|
|
- Pomija węzeł "Wymagania ogólne" i jego dzieci.
|
|
"""
|
|
# Sprawdź, czy bieżący węzeł to "Wymagania ogólne"
|
|
if wezel.get("opis") == "Wymagania ogólne":
|
|
return # Pomijamy ten węzeł i jego dzieci
|
|
|
|
nr = wezel.get("nr", "")
|
|
opis = wezel.get("opis", "")
|
|
punkty = wezel.get("punkty", "")
|
|
|
|
# Wcięcie w LaTeX-u (np. 0.5 em na poziom) zależnie od poziomu
|
|
wciecie = r"\hspace{" + f"{0.5 * poziom}em" + "}" # 0.5em na poziom
|
|
|
|
# Lista kolorów dla Wymagań Standardowych
|
|
kolory_standard = [
|
|
r"\cellcolor{gray!20}", # Poziom 0
|
|
r"\cellcolor{red!40}", # Poziom 1
|
|
r"\cellcolor{blue!20}", # Poziom 2
|
|
r"\cellcolor{yellow!20}", # Poziom 3
|
|
r"\cellcolor{red!30}", # Poziom 4
|
|
r"\cellcolor{red!20}", # Poziom 5
|
|
]
|
|
|
|
# Wybierz kolor na podstawie poziomu
|
|
kolor = kolory_standard[poziom % len(kolory_standard)]
|
|
|
|
# Tworzymy wiersz:
|
|
# [wcięcie + nr] & [wcięcie + opis] & [wcięcie + punkty] \\
|
|
linia = f"{kolor}{wciecie}{nr} & {kolor}{wciecie}{opis} & {kolor}{wciecie}{punkty} \\\\"
|
|
wiersze.append(linia)
|
|
|
|
# Rekurencja dla dzieci
|
|
for dziecko in wezel.get("children", []):
|
|
generuj_wiersze(dziecko, wiersze, poziom + 1)
|
|
|
|
def main():
|
|
if len(sys.argv) < 3:
|
|
print("Użycie: skrypt.py plik_wejściowy.json plik_wyjściowy.tex")
|
|
sys.exit(1)
|
|
|
|
plik_json = sys.argv[1]
|
|
plik_tekstowy = sys.argv[2]
|
|
|
|
# 1. Wczytanie danych JSON z pliku
|
|
with open(plik_json, 'r', encoding='utf-8') as f:
|
|
dane = json.load(f)
|
|
|
|
# 2. Bufor na wszystkie wiersze LaTeX
|
|
wiersze = []
|
|
|
|
# Dostosowanie szerokości kolumn do 0.1, 0.8 i 0.1 textwidth
|
|
wiersze.append(r"\begin{longtable}{|p{0.1\textwidth}|p{0.74\textwidth}|p{0.1\textwidth}|}")
|
|
wiersze.append(r"\caption{Lista wymagań szczegółowych}\\")
|
|
wiersze.append(r"\hline")
|
|
wiersze.append(r"\textbf{Nr} & \textbf{Opis} & \textbf{Punkty} \\")
|
|
wiersze.append(r"\hline")
|
|
# firsthead -> co ma się powtórzyć na kolejnej stronie tabeli
|
|
wiersze.append(r"\endfirsthead")
|
|
wiersze.append(r"\hline")
|
|
wiersze.append(r"\textbf{Nr} & \textbf{Opis} & \textbf{Punkty} \\")
|
|
wiersze.append(r"\hline")
|
|
wiersze.append(r"\endhead")
|
|
|
|
# 3. Generowanie wierszy tabeli na podstawie JSON-a
|
|
for element in dane.get("items", []):
|
|
generuj_wiersze(element, wiersze)
|
|
wiersze.append(r"\hline") # Dodanie linii odcinającej po każdej sekcji
|
|
|
|
# 4. Zakończenie longtable
|
|
wiersze.append(r"\hline")
|
|
wiersze.append(r"\end{longtable}")
|
|
|
|
# 5. Zapis do pliku .tex (z polskimi znakami w UTF-8)
|
|
with open(plik_tekstowy, 'w', encoding='utf-8') as f:
|
|
f.write("\n".join(wiersze) + "\n")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |