Neue einheitliche vereinfachte Navigationsleiste eingefügt. Rand links/rechts/ohne nun für den Nutzer konfigurierbar.

This commit is contained in:
2025-09-26 19:27:37 +02:00
parent 2703638f4f
commit 7b43408e7e
23 changed files with 3977 additions and 6885 deletions

File diff suppressed because one or more lines are too long

View File

@@ -17,8 +17,8 @@ stundenplandatei = stundenplan.md
# Trenner der Spalten in den CSV-Eingabedateien
csvtrenner = ;
# Navigationsleiste auch auf Klassen- und Kursseiten einblenden: ja, nein (nein schafft Platz für ca. 2 weitere Schülerzeilen)
navileiste = ja
# Rand für Toolbar des Devices lassen: links, rechts (leer = kein Rand)
rand = links
# Ausgabegerät: rm2, paperpro, a4
device = rm2

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
@page {
size: a4 portrait;
margin-left: 0.5cm;
margin-right: 0.5cm;
margin-left: 0.5cm;
margin-right: 0.5cm;
margin-top: 0.25cm;
margin-bottom: 0.25cm;
}

View File

@@ -1,9 +1,3 @@
/* Navizelle oben links in der Ecke neutral grau */
.n0 {
background-color: lightgrey;
}
/* Navizelle, Titel und Stundenplanlink einheitlich eingefärbt */

View File

@@ -12,76 +12,36 @@ th {
}
/* Lerngruppennavigation */
table.lerngruppen {
/* Primäre und sekundäre Navigationsleiste */
p.kn, p.hn {
width: 100%;
border: none;
margin-top: 0pt;
padding-left: 0pt;
padding-top: 2pt;
padding-bottom: 5pt;
border-bottom: 1px solid black;
}
table.lerngruppen a {
.kn-part, .hn-part {
vertical-align: middle;
}
p.kn a, p.hn a {
color: black;
text-decoration: none;
}
table.lerngruppen td {
border-left: 0.1px solid black;
border-right: 0.1px solid black;
border-top: 0.1px solid black;
border-bottom: 0.1px solid black;
}
td.group, td.current {
width: 11.125%; /* 5.5% Rest für X */
font-size: 100%;
padding-top: 3pt;
padding-bottom: 0pt;
padding-right: 2pt;
text-align: center;
}
table.lerngruppen tr {
border: none;
}
table.lerngruppen td.home {
width: 5.5%;
font-size: 100%;
border: none;
}
/* Überschriftszeile mit Icon-Symbolen */
table.headline, tr.headline, td.headline {
border: none !important;
}
table.headline {
width: 100%;
margin-top: 12pt;
margin-bottom: 4pt;
}
table.headline td {
font-size: 175%;
border: none;
}
table.headline td.nr {
width: 5.5%;
}
td.left {
width: 42.5%;
padding-top: 4pt;
text-align: left;
}
td.right {
width: 52.0%;
padding-top: 0pt;
padding-right: 0pt;
text-align: left;
}
table.headline a {
.kn-current, .hn-current {
color: black;
text-decoration: none;
font-weight: 900;
text-decoration: underline;
}
img.icon {
p.kn img.icon, p.hn img.icon {
width: 16pt;
height: 16pt;
padding-left: 1pt;
padding-right: 1pt;
padding-left: 0pt;
padding-right: 0pt;
}
p.kn-headline {
padding-top: 5pt;
padding-bottom: -15pt;
font-size: 175%;
}
@@ -110,11 +70,6 @@ th.name, td.name {
tr.header, tr.muster {
border-bottom: 1px solid black;
}
th.luecke, td.luecke {
width: 5.5%;
text-align: center;
border: none;
}
/* Startseite inkl. Stundenplan */
@@ -142,7 +97,7 @@ th.stunde, td.stunde {
border-right: 1px solid black;
}
th.tag, td.tag {
width: 17.5%;
width: 18.5%;
text-align: center;
border: 0.3px solid black;
}
@@ -206,6 +161,7 @@ th.endnote, td.endnote {
border-left: 1px solid black;
}
/* Korrektur-Tabelle */
table.korrektur td {
vertical-align: middle;
@@ -244,6 +200,7 @@ table.raster tr {
height: 25pt;
}
/* SoMi-Tabelle */
table.somi th {
vertical-align: bottom;
@@ -258,7 +215,7 @@ table.somi tr.secretheader {
height: 30pt;
}
th.somi, td.somi, th.schr, td.schr {
width: 4.25%;
width: 4.75%;
text-align: center;
padding-left: 0pt;
}
@@ -271,6 +228,7 @@ th.sominote, td.sominote {
border-left: 1px solid black;
}
/* Check-Tabelle */
table.check th {
height: 40pt;
@@ -292,9 +250,10 @@ th.ha {
border-right: none;
}
/* Geburtstagstabelle */
td.geb, th.geb {
width: 15%;
width: 20%;
padding-left: 0pt;
text-align: center;
}
@@ -307,9 +266,10 @@ td.eightteen {
background: lightgrey;
}
td.home {
width: 42.5%;
width: 40%;
}
/* Halbjahresübersicht */
table.halbjahr {
border: none;
@@ -322,7 +282,7 @@ th.kw, th.kwsmall, th.kw_sessions, th.kw_content {
border-bottom: 1px solid black;
}
th.kw, td.kw {
width: 5.5%;
width: 7%;
text-align: right;
padding-right: 2pt;
vertical-align: middle;
@@ -334,14 +294,14 @@ th.kwsmall, td.kwsmall {
font-size: 8.5pt;
}
th.kw_sessions, td.kw_sessions {
width: 19%;
width: 20%;
text-align: center;
padding-left: 0pt;
border-left: 1px solid black;
border-right: 1px solid black;
}
th.kw_content, td.kw_content {
width: 70%;
width: 75%;
}
@@ -354,5 +314,5 @@ div.footer {
font-style: italic;
}
div.footer a {
color: darkgrey;
color: black;
}

View File

@@ -1,23 +1,17 @@
/* Navileiste: aktiv grau hinterlegt, sonst weiß */
/* Primäre Navileiste: aktuell ohne Schattierung */
td.group {
background-color: white; /* keine Einfärbung */
}
td.current {
background-color: lightgrey; /* aktiv = schwach grau hinterlegt */
}
.n1, .n2, .n3, .n4, .n5, .n6, .n7, .n8 {
}
/* Überschrift: aktuell ohne Schattierung */
/* Überschrift unter sekundärer Kurs-Navileiste: aktuell ohne Schattierung */
.h1, .h2, .h3, .h4, .h5, .h6, .h7, .h8 {
}
/* Stundenplan: Links nur leicht grau schattiert Ü*/
/* Stundenplan: Links einheitlich grau schattiert */
.t1, .t2, .t3, .t4, .t5, .t6, .t7, .t8 {
background-color: #f2f2f2;

View File

@@ -1,7 +1,7 @@
@page {
size: 17.98cm 23.98cm;
margin-left: 0.5cm;
margin-right: 0.5cm;
margin-left: 0.5cm;
margin-right: 0.5cm;
margin-top: 0.25cm;
margin-bottom: 0.25cm;
}

View File

@@ -13,7 +13,7 @@ anzahl_aufgaben = 5
[SoMiNoten]
# Anzahl der SoMi-Noten-Spalten
anzahl_noten = 15
anzahl_noten = 14
[Hausaufgaben]

View File

@@ -1,7 +1,7 @@
@page {
size: 15.72cm 20.96cm;
margin-left: 0.5cm;
margin-right: 0.5cm;
margin-left: 0.5cm;
margin-right: 0.5cm;
margin-top: 0.25cm;
margin-bottom: 0.25cm;
}

View File

@@ -13,7 +13,7 @@ anzahl_aufgaben = 5
[SoMiNoten]
# Anzahl der SoMi-Noten-Spalten
anzahl_noten = 14
anzahl_noten = 12
[Hausaufgaben]

View File

@@ -50,6 +50,12 @@ except KeyError:
print('Der Schlüssel Allgemein oder "device" existiert nicht in der Input-Datei!')
exit(0)
try:
rand = inputs["Allgemein"]["rand"]
except KeyError:
print('Der Schlüssel Allgemein oder "rand" existiert nicht in der Input-Datei!')
exit(0)
# Basiskonfiguration für das Device einlesen
ini_file = 'devices/'+device+'.ini'
if (not(os.path.exists(ini_file))):
@@ -59,7 +65,12 @@ config = ConfigParser(allow_no_value=True)
config.read(ini_file)
# CSS Formatierung für das Device einlesen
css_devicefile = 'devices/'+device+'.css'
if (len(rand)>0):
myrand = "-"+rand
else:
myrand = ""
css_devicefile = 'devices/'+device+myrand+'.css'
if (not(os.path.exists(css_devicefile))):
print(css_devicefile+" nicht vorhanden!")
exit(0)

View File

@@ -29,7 +29,7 @@ def erstelleGeburtstagsBogen(kursid, klassekurs_name, dateien, path, namen, gebd
table += '<a name="'+klassekurs_name+'Birthday"></a>'
table += header.erstelleHeader(kursid, 'Geburtstage', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += header.erstelleKursnavigation(kursid, 'Geburtstagsliste', 'gebtag', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += '<table class="home" repeat="1">'

View File

@@ -26,7 +26,7 @@ def erstelleCheckliste(kursid, klassekurs_name, dateien, path, namen, gebdaten,
if check_seiten > 1:
line += 'n'
table += header.erstelleHeader(kursid, line, klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += header.erstelleKursnavigation(kursid, line, 'check', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
css = 'check'

View File

@@ -27,7 +27,7 @@ def erstelleHABogen(kursid, klassekurs_name, dateien, path, namen, gebdaten, con
table += '<a name="'+klassekurs_name+'HA"></a>'
table += header.erstelleHeader(kursid, 'HA', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += header.erstelleKursnavigation(kursid, 'Hausaufgaben', 'ha', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += '<table class="'+css+'" repeat="1">'

View File

@@ -24,13 +24,13 @@ def erstelleHalbjahresuebersicht(kursid, klassekurs_name, dateien, path, namen,
table += '<a name="'+klassekurs_name+'Halbjahr"></a>'
table += header.erstelleHeader(kursid, 'Planung', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += header.erstelleKursnavigation(kursid, 'Planung des Halbjahrs', 'halbjahr', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
css = 'halbjahr'
table += '<table class="'+css+'" repeat="1">'
table += '<tr class="header"><th class="luecke">&nbsp;</th><th class="kw">KW</th>'
table += '<tr class="header"><th class="kw">KW</th>'
table += '<th class="kw_sessions">Sitzungen</th><th class="kw_content"></th>'
table += '</tr>'
@@ -39,16 +39,16 @@ def erstelleHalbjahresuebersicht(kursid, klassekurs_name, dateien, path, namen,
if (halbjahr=='1'):
for count in range(kw_start, 52):
if (not(str(count) in ferien)):
table += '<tr><td class="luecke">&nbsp;</td><td class="kw'+extrakw+'">'+str(count)+'</td>'
table += '<tr><td class="kw'+extrakw+'">'+str(count)+'</td>'
table += '<td class="kw_sessions"></td><td class="kw_content"></td></tr>'
for count in range(1, kw_ende+1):
if (not(str(count) in ferien)):
table += '<tr><td class="luecke">&nbsp;</td><td class="kw'+extrakw+'">'+str(count)+'</td>'
table += '<tr><td class="kw'+extrakw+'">'+str(count)+'</td>'
table += '<td class="kw_sessions"></td><td class="kw_content"></td></tr>'
else:
for count in range(kw_start, kw_ende+1):
if (not(str(count) in ferien)):
table += '<tr><td class="luecke">&nbsp;</td><td class="kw'+extrakw+'">'+str(count)+'</td>'
table += '<tr><td class="kw'+extrakw+'">'+str(count)+'</td>'
table += '<td class="kw_sessions"></td><td class="kw_content"></td></tr>'
table += '</table>'

View File

@@ -1,15 +1,20 @@
import os
def erstelleNavigation(klassekurs_name, lerngruppen, path, config, inputs):
header = '<table class="lerngruppen"><tr class="lerngruppen">'
header += '<td class="home">&nbsp;</td>'
myclass = "group"
if (klassekurs_name==''):
header += '<td class="current n0">Startseite</td>'
def erstelleHauptnavigation(lerngruppen, path, config, inputs):
try:
rand = inputs["Allgemein"]["rand"]
except KeyError:
print('Der Schlüssel Allgemein oder "rand" existiert nicht in der Input-Datei!')
exit(0)
if (rand=="rechts"):
navi = "&nbsp;&nbsp;&nbsp;" # Platz für Schließen-Symbol schaffen
else:
header += '<td class="group n0"><a href="#Home">Startseite</a></td>'
navi = ""
navi += '<span class="hn-part">&nbsp;<img class="icon" src="img/home-2.svg"/><span class="hn-current">Startseite</span></span>&nbsp;&nbsp;'
count = 0
@@ -40,74 +45,41 @@ def erstelleNavigation(klassekurs_name, lerngruppen, path, config, inputs):
exit(0)
myclass = ' n'+str(count) # Navileisten-CSS nX
if (klassekurs_aktuell == klassekurs_name):
header += '<td class="current'+myclass+'">'+klassekurs_print+'</td>'
else:
header += '<td class="group'+myclass+'"><a href="#'+klassekurs_aktuell+'">'+klassekurs_print+'</a></td>'
navi += '<span class="hn-part"><a href="#'+klassekurs_aktuell+'">&nbsp;<img class="icon" src="img/user-multiple-4.svg"/><span class="'+myclass+'">'+klassekurs_print+'</span></a>&nbsp;</span>'
header += '</tr></table>'
navileiste = '<p class="hn">'+navi+'</p>'
return header
return navileiste
def erstelleKursnavigation(kursid, line, current, klassekurs_name, gebdaten, lerngruppen, path, config, inputs, kurs_inputs):
def erstelleHeader(kursid, line, klassekurs_name, gebdaten, lerngruppen, path, config, inputs, kurs_inputs):
# Navigationsleiste für die Lerngruppen
try:
navileiste = inputs["Allgemein"]["navileiste"]
except KeyError:
print('Der Schlüssel Allgemein oder "kurzbezeichnung" existiert nicht in der Input-Datei!')
exit(0)
zeige_navi = False
if (navileiste=='ja'):
zeige_navi = True
if (zeige_navi):
header = erstelleNavigation(klassekurs_name, lerngruppen, path, config, inputs)
else:
header = ''
# Überschrift inkl. verlinkte Icons für die aktuelle Lerngruppe
header += '<table class="headline"><tr class="headline">'
# Icon
header += '<td class="nr">&nbsp;</td>'
# 1. Teil Navigationsleiste
allg = inputs["Allgemein"]
schuljahr = allg["schuljahr"]
zschuljahr = int(schuljahr)
halbjahr = allg["halbjahr"]
try:
rand = inputs["Allgemein"]["rand"]
except KeyError:
print('Der Schlüssel Allgemein oder "rand" existiert nicht in der Input-Datei!')
exit(0)
# Überschrift
if len(line)>0:
myline = line
if (rand=="rechts"):
navi = "&nbsp;&nbsp;&nbsp;" # Platz für Schließen-Symbol schaffen
else:
myline = str(zschuljahr) + '/' + str((zschuljahr-2000)+1) + ', ' + halbjahr + '. Hj.'
# Überschrift links
count = 0
for gruppe in lerngruppen:
count = count + 1
if (gruppe==kursid):
break
mycss = 'h'+str(count) # Headline-CSS hX
header+= '<td class="left headline"><span class="'+mycss+'">'+klassekurs_name+'</span> - '+myline+'</td>'
# Iconleiste rechts
header += '<td class="right headline">'
navi = ""
# Link zur Startseite, falls keine Navileiste
if (not(zeige_navi)):
header += '<a href="#Home">&nbsp;<img class="icon" src="img/home-2.svg"/></a>'
navi += '<span class="kn-part"><a href="#Home">&nbsp;<img class="icon" src="img/chevron-left-circle.svg"/>zurück</a></span>&nbsp;&nbsp;'
# Notenübersicht
header += '<a href="#'+klassekurs_name+'Overview">&nbsp;<img class="icon" src="img/user-multiple-4.svg"/></a>'
if (current=='übersicht'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/user-multiple-4.svg"/><span class="kn-current">Übersicht</span></span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Overview">&nbsp;<img class="icon" src="img/user-multiple-4.svg"/>Übersicht</a></span>'
# Arbeiten/Klausuren
schr_anzahl = int(kurs_inputs["schriftlich_anzahl"])
@@ -119,30 +91,65 @@ def erstelleHeader(kursid, line, klassekurs_name, gebdaten, lerngruppen, path, c
if (halbjahr=='2'):
offset = schr_anzahl
header += '<a href="#'+klassekurs_name+'Korrektur'+str(offset+1)+'">&nbsp;<img class="icon" src="img/pen-to-square.svg"/></a>'
if (current=='korrektur'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/pen-to-square.svg"/><span class="kn-current">schriftlich</span></span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Korrektur'+str(offset+1)+'">&nbsp;<img class="icon" src="img/pen-to-square.svg"/>schriftlich</a></span>'
# SoMi
somi_quartale = int(kurs_inputs["somi_quartale"])
offset = 0
if (halbjahr=='2'):
offset = 2
header += '<a href="#'+klassekurs_name+'SoMiQ'+str(offset+1)+'">&nbsp;<img class="icon" src="img/comment-1.svg"/></a>'
if (current=='somi'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/comment-1.svg"/><span class="kn-current">mündlich</span></span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'SoMiQ'+str(offset+1)+'">&nbsp;<img class="icon" src="img/comment-1.svg"/>mündlich</a></span>'
# HA
ha_zeilen = int(kurs_inputs["ha_zeilen"])
if (ha_zeilen>0):
header += '<a href="#'+klassekurs_name+'HA">&nbsp;<img class="icon" src="img/check-square-2.svg"/></a>'
if (current=='ha'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/check-square-2.svg"/><span class="kn-current">Haus</span></span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'HA">&nbsp;<img class="icon" src="img/check-square-2.svg"/>Haus</a></span>'
# Checklisten
header += '<a href="#'+klassekurs_name+'Check">&nbsp;<img class="icon" src="img/check-circle-1.svg"/></a>'
if (current=='check'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/check-circle-1.svg"/><span class="kn-current">Check</span></span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Check">&nbsp;<img class="icon" src="img/check-circle-1.svg"/>Check</a></span>'
# Geburtstagsseite
if (len(gebdaten)>0):
header += '<a href="#'+klassekurs_name+'Birthday">&nbsp;<img class="icon" src="img/bell-1.svg"/></a>'
if (current=='gebtag'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/bell-1.svg"/><span class="kn-current">Gebtag</a></span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Birthday">&nbsp;<img class="icon" src="img/bell-1.svg"/>Gebtag</a></span>'
# Halbjahresseite
header += '<a href="#'+klassekurs_name+'Halbjahr">&nbsp;<img class="icon" src="img/calendar-days.svg"/></a>'
if (current=='halbjahr'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/calendar-days.svg"/><span class="kn-current">Plan</span></span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Halbjahr">&nbsp;<img class="icon" src="img/calendar-days.svg"/>Plan</a></span>'
header += '</td></tr></table>'
navileiste = '<p class="kn">'+navi+'</p>'
return header
# 2. Teil: Überschrift
if len(line)>0:
myline = line
else:
myline = str(zschuljahr) + '/' + str((zschuljahr-2000)+1) + ', ' + halbjahr + '. Hj.'
count = 0
for gruppe in lerngruppen:
count = count + 1
if (gruppe==kursid):
break
mycss = 'h'+str(count) # Headline-CSS hX
headline = '<p class="kn-headline"><span class="'+mycss+'">'+klassekurs_name+'</span> - '+myline+'</p>'
return navileiste + headline

View File

@@ -37,7 +37,7 @@ def erstelleKorrekturbogen(kursid, klassekurs_name, dateien, path, namen, gebdat
line = schr_bez+' Nr. '+str(no)
table += header.erstelleHeader(kursid, line, klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += header.erstelleKursnavigation(kursid, line, 'korrektur', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += '<table class="korrektur" repeat="1">'

View File

@@ -35,7 +35,7 @@ def erstelleSoMiBogen(kursid, klassekurs_name, dateien, path, namen, gebdaten, c
line += 'SoMi Q'+str(no)
line += '/Q'+str(no+1)
table += header.erstelleHeader(kursid, line, klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += header.erstelleKursnavigation(kursid, line, 'somi', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += '<table class="somi" repeat="'+str(somi_zeilen)+'">'

View File

@@ -11,7 +11,7 @@ def erstelleStartseite(lerngruppen, path,config, inputs):
table += '<a name="Home"></a>'
table += header.erstelleNavigation('', lerngruppen, path, config, inputs)
table += header.erstelleHauptnavigation(lerngruppen, path, config, inputs)
allg = inputs["Allgemein"]
schuljahr = allg["schuljahr"]
@@ -56,9 +56,9 @@ def erstelleStartseite(lerngruppen, path,config, inputs):
html = html.replace('''<td style="text-align: center;">''','''<td class="tag">''')
html = html.replace('''<tr>
<th class="tag">''','''<tr><th class="luecke">&nbsp;</th><th class="stunde">''')
<th class="tag">''','''<tr><th class="stunde">''')
html = html.replace('''<tr>
<td class="tag">''','''<tr><td class="luecke">&nbsp;</td><td class="stunde">''')
<td class="tag">''','''<tr><td class="stunde">''')
# ggf. Links zu Lerngruppen einfügen
count = 0

View File

@@ -18,7 +18,7 @@ def erstelleUebersicht(kursid, klassekurs_name, dateien, path, namen, gebdaten,
if (kurs_inputs["halbjahresnote"]=='ja'):
halbjahresnote = True
table += header.erstelleHeader(kursid, 'Übersicht', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += header.erstelleKursnavigation(kursid, 'Übersicht', 'übersicht', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
schr_bez = kurs_inputs["schriftlich_bez"]
schr_anzahl = int(kurs_inputs["schriftlich_anzahl"])