Neue kleine Ausgabegeräte eingefügt: Remarkable Paper Pro Move, iPad Mini

This commit is contained in:
2025-10-08 07:48:23 +02:00
parent 84e7cef74c
commit e5939becab
35 changed files with 3826 additions and 3915 deletions

View File

@@ -25,7 +25,9 @@ Diese PDF-Datei kann anschließend mit einem Tablet und einem Eingabestift mit I
Die PDF-Ausgabe kann aktuell wahlweise für die folgenden Geräte optimiert erzeugt werden. Verlinkt ist zur Illustration für jedes Gerät die aus den vorliegenden (fiktiven) Beispieldaten erzeugte PDF-Ausgabe.
- [reMarkable 2](./src/data/rm2.pdf)
- [reMarkable PaperPro](./src/data/paperpro.pdf)
- [reMarkable Paper Pro](./src/data/paperpro.pdf)
- [reMarkable Paper Pro Move](./src/data/move.pdf)
- [iPad Mini](./src/data/mini.pdf) (sichtbare Displaygröße 12x16cm)
- [DIN A4](src/data/a4.pdf) (für beliebige Geräte)

View File

@@ -25,7 +25,7 @@ csvtrenner = ;
# Rand für Toolbar des Devices lassen: links, rechts (leer = kein Rand)
rand = links
# Ausgabegerät: rm2, paperpro, a4
# Ausgabegerät: rm2, paperpro, move, mini, a4
device = rm2
```
@@ -38,4 +38,4 @@ Die Parameter sind zwar selbsterklärend, werden hier aber dennoch einmal kurz e
- Soll die Startseite des Zieldokuments einen Stundenplan enthalten, so ist dieser im Eingabeverzeichnis als Markdown Dokument anzugeben (vgl. auch nächster Abschnitt). Der Dateiname wird hier festgelegt. Fehlt der Dateiname, so wird der Stundenplan automatisch weggelassen.
- Für die CSV Dateien kann hier das Symbol zum Trennen der Spalte (voreingestellt Semikolon) bei Bedarf angepasst werden.
- Auf einigen Zieldevices (insbesondere bei den Remarkable Geräten) wird bei der Bearbeitung eines Dokuments eine Toolbar eingeblendet. Um Platz für diese Toolbar zu schaffen, kann links oder rechts ein kleiner Rand gelassen werden.
- Zum Schluss kommt die wichtigste Festlegung, das Zielgerät. Hier kann aktuell zwischen ``rm2`` (reMarkable 2), ``paperpro`` (reMarkable Paper Pro) und ``a4`` (DIN A4) gewählt werden.
- Zum Schluss kommt die wichtigste Festlegung, das Zielgerät. Hier kann aktuell zwischen ``rm2`` (reMarkable 2), ``paperpro`` (reMarkable Paper Pro), ``move`` (reMarkable Paper Pro Move), ``mini`` (iPad Mini mit 12x16cm Bildschirm) und ``a4`` (DIN A4) gewählt werden.

View File

@@ -11,6 +11,9 @@ bezeichnung = Mathe 5a
# Kurzbezeichnung der Lerngruppe
kurzbezeichnung = Mathe 5a
# Abkürzende Bezeichnung der Lerngruppe (für Stundenplan und Navileiste auf kleinen Geräten)
abkuerzung = M 5a
# Anzahl Arbeiten oder Klausuren: 0, 1, 2, ... (0=keine Arbeiten/Klausuren)
schriftlich_anzahl = 3
@@ -37,6 +40,7 @@ Die Parameter sind zwar selbsterklärend, werden hier aber dennoch einmal kurz e
- Die Bezeichnung der Lerngruppe wird als Überschrift überall dort verwendet, wo genügend Platz zur Verfügung steht.
- Ist nur wenig Platz vorhanden (z.B. im Stundenplan), kommt die Kurzbeschreibung der Lerngruppe zum Einsatz.
- Auf kleinen Devices wird entsprechend die abkürzende Schreibweise verwendet.
- Die Anzahl der schriftlichen Lernerfolgskontrollen gibt an, wie viele Korrekturbögen erzeugt werden. Die Anzahl 0 sorgt dafür, dass diese automatisch weggelassen werden.
- Die Bezeichnung der Lernerfolgskontrolle passt sich dem Sprachgebrauch an, z.B. Arbeit oder Kursarbeit oder Klausur.
- Bei der Erfassung von Notizen zur Sonstigen Mitarbeit (SoMi) wird angegeben, ob eine durchlaufende Liste für beide Quartale oder zwei getrennte Listen für die beiden Quartale generiert werden sollen.

File diff suppressed because one or more lines are too long

View File

@@ -20,7 +20,7 @@ csvtrenner = ;
# Rand für Toolbar des Devices lassen: links, rechts (leer = kein Rand)
rand = links
# Ausgabegerät: rm2, paperpro, a4
# Ausgabegerät: rm2, paperpro, move, mini, a4
device = rm2
@@ -32,6 +32,9 @@ bezeichnung = Mathe 5a
# Kurzbezeichnung der Lerngruppe (für Stundenplan)
kurzbezeichnung = Mathe 5a
# Abkürzende Bezeichnung der Lerngruppe (für Stundenplan und Navileiste auf kleinen Geräten)
abkuerzung = M 5a
# Anzahl Arbeiten oder Klausuren: 0, 1, 2, ... (0=keine Arbeiten/Klausuren)
schriftlich_anzahl = 3
@@ -62,6 +65,9 @@ bezeichnung = Mathe 6b
# Kurzbezeichnung der Lerngruppe (für Stundenplan)
kurzbezeichnung = Mathe 6b
# Abkürzende Bezeichnung der Lerngruppe (für Stundenplan und Navileiste auf kleinen Geräten)
abkuerzung = M 6b
# Anzahl Arbeiten oder Klausuren: 0, 1, 2, ... (0=keine Arbeiten/Klausuren)
schriftlich_anzahl = 3
@@ -92,6 +98,9 @@ bezeichnung = Informatik 9
# Kurzbezeichnung der Lerngruppe (für Stundenplan)
kurzbezeichnung = Info 9
# Abkürzende Bezeichnung der Lerngruppe (für Stundenplan und Navileiste auf kleinen Geräten)
abkuerzung = If 9
# Anzahl Arbeiten oder Klausuren: 0, 1, 2, ... (0=keine Arbeiten/Klausuren)
schriftlich_anzahl = 2
@@ -122,6 +131,9 @@ bezeichnung = Informatik EF
# Kurzbezeichnung der Lerngruppe (für Stundenplan)
kurzbezeichnung = Info EF
# Abkürzende Bezeichnung der Lerngruppe (für Stundenplan und Navileiste auf kleinen Geräten)
abkuerzung = If EF
# Anzahl Arbeiten oder Klausuren: 0, 1, 2, ... (0=keine Arbeiten/Klausuren)
schriftlich_anzahl = 2

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,8 +1,8 @@
| St. | Montag | Dienstag | Mittwoch | Donnerstag | Freitag |
| :------: | :----------: | :----------: | :----------: | :----------: | :----------: |
| 1.<br>2. | [klasse-5a] | [klasse-6b] | | | |
| 3.<br>4. | [klasse-6b] | [kurs-if-ef] | [klasse-5a] | | |
| 1.<br>2. | [klasse-5a] | | | [klasse-5a] | [klasse-6b] |
| 3.<br>4. | [klasse-6b] | [kurs-if-ef] | [klasse-5a] | [klasse-6b] | |
| 5.<br>6. | [kurs-if-9] | [[VERT]] | [kurs-if-ef] | | |
| 7. | | | | | |
| 8.<br>9. | | [kurs-if-9] | | | |

View File

@@ -6,6 +6,6 @@
margin-bottom: 0.25cm;
}
@import url("devices/css/general.css");
@import url("devices/css/large.css");
@import url("devices/css/color.css");

View File

@@ -6,6 +6,6 @@
margin-bottom: 0.25cm;
}
@import url("devices/css/general.css");
@import url("devices/css/large.css");
@import url("devices/css/color.css");

View File

@@ -6,6 +6,6 @@
margin-bottom: 0.25cm;
}
@import url("devices/css/general.css");
@import url("devices/css/large.css");
@import url("devices/css/color.css");

View File

@@ -1,9 +1,15 @@
[Navigation]
# Lerngruppenbezeichnung in der Navileiste (Zeilenumbruch vermeiden): kurz, normal
# Bezeichnungen in Navigation (Zeilenumbruch vermeiden): normal, kurz, abgekuerzt
bezeichnung = normal
[Namen]
# Schülernamen in Tabellen in Langform ("Hans Müller") oder Kurzform ("Hans M."): lang, kurz
form = lang
[Korrekturbogen]
# Anzahl der Aufgaben in der Korrekturtabelle: 1, 2, 3, ...
@@ -15,6 +21,9 @@ anzahl_aufgaben = 6
# Anzahl der SoMi-Noten-Spalten
anzahl_noten = 16
# kompakte Darstellung: ja, nein
kompakt = nein
[Hausaufgaben]

View File

@@ -1,321 +0,0 @@
/* Schrift überall */
h1, th, td, h1 {
font-family: Helvetica;
font-weight: lighter;
}
th, td {
font-size: 140%;
}
th {
font-weight: 500;
}
/* Primäre und sekundäre Navigationsleiste */
p.kn, p.hn {
width: 100%;
padding-left: 0pt;
padding-top: 1.5pt;
padding-bottom: 4pt;
border-bottom: 1.5px solid black;
}
p.hn {
text-align: center;
}
.kn-part, .hn-part {
vertical-align: middle;
}
p.kn a, p.hn a {
color: black;
text-decoration: none;
}
.kn-current, .hn-current {
color: black;
font-weight: 900;
text-decoration: underline;
}
p.kn img.icon, p.hn img.icon {
width: 16pt;
height: 16pt;
padding-left: 0pt;
padding-right: 0pt;
}
p.kn-headline {
padding-top: 5pt;
padding-bottom: -15pt;
font-size: 175%;
}
/* Alle Tabellen */
table, tr, td {
border: 0.3px solid black;
}
th, td {
padding-top: 2.75pt;
padding-bottom: -1.25pt;
padding-left: 2pt;
vertical-align: middle;
text-align: left;
}
th.nr, td.nr {
width: 5.5%;
text-align: right;
padding-right: 2pt;
vertical-align: middle;
}
th.name, td.name {
width: 30%;
vertical-align: middle;
border-right: 1px solid black;
}
tr.header, tr.muster {
border-bottom: 1px solid black;
}
/* Startseite inkl. Stundenplan */
h1.start {
margin-top: 60pt;
font-size: 200%;
margin-bottom: 10pt;
text-align: center;
}
table.timetable {
border: none;
width: 100%;
}
table.timetable tr {
border: none;
}
table.timetable a {
text-decoration: none;
color: black;
}
th.stunde, td.stunde {
width: 7.5%;
text-align: center;
border: 0.3px solid black;
border-right: 1px solid black;
}
th.tag, td.tag {
width: 18.5%;
text-align: center;
border: 0.3px solid black;
}
table.timetable th.stunde, th.tag {
border-bottom: 1px solid black;
}
table.timetable div {
padding-top: 4pt;
padding-bottom: -3pt;
padding-left: 2pt;
padding-right: 2pt;
margin-left: 0pt;
margin-right: 2pt;
border: 0.3px solid black;
}
table.timetable td.tag {
padding-top: 3pt;
padding-bottom: 1pt;
}
table.timetable td.stunde {
padding-top: 5pt;
padding-bottom: 1pt;
}
/* Übersichtstabelle */
table.overview th.nr, th.name, th.endnote {
vertical-align: bottom;
}
.overview th.note, .overview td.note {
border-left: 0.3px solid black;
border-right: none;
}
.overview td.line, .overview th.line {
border-left: 1px solid black;
border-right: none;
}
th.hj, td.hj {
width: 8%;
border-left: 1px solid black;
border-right: 1px solid black;
vertical-align: bottom;
text-align: center;
padding-left: 0pt;
}
th.schr, th.somi {
width: 30%;
}
th.schr_cell, th.somi_cell {
text-align: center;
padding-left: 0pt;
}
table.overview a {
color: black;
text-decoration: underline;
}
th.endnote, td.endnote {
width: 8%;
text-align: center;
padding-left: 0pt;
border-left: 1px solid black;
}
/* Korrektur-Tabelle */
table.korrektur td {
vertical-align: middle;
}
th.korrektur, td.korrektur {
width: 10%;
text-align: center;
padding-left: 0pt;
}
th.summe, td.summe, th.aknote, td.aknote {
width: 10%;
text-align: center;
padding-left: 0pt;
}
th.summe, td.summe {
border-left: 1px solid black;
}
tr.muster {
border-top: 1px solid black;
border-bottom: 1px solid black;
}
table.raster {
-pdf-keep-with-next: true;
}
table.raster td.first {
width: 8%;
}
table.raster td {
text-align: center;
padding-right: 1pt;
}
table.raster tr.line {
border-bottom: 1px solid black;
}
table.raster tr {
height: 25pt;
}
/* SoMi-Tabelle */
table.somi th {
vertical-align: bottom;
}
table.somi td {
vertical-align: middle;
}
table.somi tr.header {
height: 30pt;
}
table.somi tr.secretheader {
height: 30pt;
}
th.somi, td.somi, th.schr, td.schr {
width: 4.75%;
text-align: center;
padding-left: 0pt;
}
th.sominote, td.sominote {
width: 7.5%;
text-align: center;
padding-left: 0pt;
}
th.sominote, td.sominote {
border-left: 1px solid black;
}
/* Check-Tabelle */
table.check th {
height: 40pt;
vertical-align: bottom;
}
table.check td {
vertical-align: middle;
}
th.check, td.check {
width: 8%;
}
/* HA-Tabelle */
th.ha, td.ha {
width: 8%;
}
th.ha {
border-left: none;
border-right: none;
}
/* Geburtstagstabelle */
td.geb, th.geb {
width: 20%;
padding-left: 0pt;
text-align: center;
}
td.age {
width: 7.5%;
padding-left: 0pt;
text-align: center;
}
td.eightteen {
background: lightgrey;
}
td.home {
width: 40%;
}
/* Halbjahresübersicht */
table.halbjahr {
border: none;
}
table.halbjahr tr {
border: none;
}
th.kw, th.kwsmall, th.kw_sessions, th.kw_content {
border: 0.3px solid black;
border-bottom: 1px solid black;
}
th.kw, td.kw {
width: 7%;
text-align: right;
padding-right: 2pt;
vertical-align: middle;
}
th.kw {
text-align: center;
}
th.kwsmall, td.kwsmall {
font-size: 8.5pt;
}
th.kw_sessions, td.kw_sessions {
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: 75%;
}
/* Footer mit Projektlink */
div.footer {
width: 60%;
font-size: 90%;
margin-top: 15pt;
text-align: center;
font-style: italic;
}
div.footer a {
color: black;
}

View File

@@ -1,18 +0,0 @@
/* Primäre Navileiste: aktuell ohne Schattierung */
.n1, .n2, .n3, .n4, .n5, .n6, .n7, .n8 {
}
/* Überschrift unter sekundärer Kurs-Navileiste: aktuell ohne Schattierung */
.h1, .h2, .h3, .h4, .h5, .h6, .h7, .h8 {
}
/* Stundenplan: Links einheitlich grau schattiert */
.t1, .t2, .t3, .t4, .t5, .t6, .t7, .t8 {
background-color: #f2f2f2;
}

View File

@@ -6,7 +6,7 @@
margin-bottom: 0.25cm;
}
@import url("devices/css/general.css");
@import url("devices/css/large.css");
@import url("devices/css/color.css");

View File

@@ -6,7 +6,7 @@
margin-bottom: 0.25cm;
}
@import url("devices/css/general.css");
@import url("devices/css/large.css");
@import url("devices/css/color.css");

View File

@@ -6,7 +6,7 @@
margin-bottom: 0.25cm;
}
@import url("devices/css/general.css");
@import url("devices/css/large.css");
@import url("devices/css/color.css");

View File

@@ -1,9 +1,15 @@
[Navigation]
# Lerngruppenbezeichnung in der Navileiste (Zeilenumbruch vermeiden): kurz, normal
# Bezeichnungen in Navigation (Zeilenumbruch vermeiden): normal, kurz, abgekuerzt
bezeichnung = kurz
[Namen]
# Schülernamen in Tabellen in Langform ("Hans Müller") oder Kurzform ("Hans M."): lang, kurz
form = lang
[Korrekturbogen]
# Anzahl der Aufgaben in der Korrekturtabelle: 1, 2, 3, ...
@@ -15,6 +21,9 @@ anzahl_aufgaben = 5
# Anzahl der SoMi-Noten-Spalten
anzahl_noten = 14
# kompakte Darstellung: ja, nein
kompakt = nein
[Hausaufgaben]

View File

@@ -6,6 +6,6 @@
margin-bottom: 0.25cm;
}
@import url("devices/css/general.css");
@import url("devices/css/large.css");
@import url("devices/css/sw.css");
@import url("devices/css/blackwhite.css");

View File

@@ -6,6 +6,6 @@
margin-bottom: 0.25cm;
}
@import url("devices/css/general.css");
@import url("devices/css/large.css");
@import url("devices/css/sw.css");
@import url("devices/css/blackwhite.css");

View File

@@ -6,6 +6,6 @@
margin-bottom: 0.25cm;
}
@import url("devices/css/general.css");
@import url("devices/css/large.css");
@import url("devices/css/sw.css");
@import url("devices/css/blackwhite.css");

View File

@@ -1,9 +1,15 @@
[Navigation]
# Lerngruppenbezeichnung in der Navileiste (Zeilenumbruch vermeiden): kurz, normal
# Bezeichnungen in Navigation (Zeilenumbruch vermeiden): normal, kurz, abgekuerzt
bezeichnung = kurz
[Namen]
# Schülernamen in Tabellen in Langform ("Hans Müller") oder Kurzform ("Hans M."): lang, kurz
form = lang
[Korrekturbogen]
# Anzahl der Aufgaben in der Korrekturtabelle: 1, 2, 3, ...
@@ -15,6 +21,9 @@ anzahl_aufgaben = 5
# Anzahl der SoMi-Noten-Spalten
anzahl_noten = 12
# kompakte Darstellung: ja, nein
kompakt = nein
[Hausaufgaben]

View File

@@ -1 +0,0 @@
<svg width="80" height="80" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" transform="rotate(0 0 0)"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.0016 2.00098C12.4158 2.00098 12.7516 2.33676 12.7516 2.75098V3.53801C16.5416 3.9143 19.5016 7.11197 19.5016 11.001V14.115L20.1938 15.9609C20.7454 17.4319 19.6581 19.001 18.0871 19.001H15.0628C15.0287 20.6631 13.6701 21.9995 11.9998 21.9995C10.3295 21.9995 8.97089 20.6631 8.93682 19.001H5.9161C4.34514 19.001 3.25776 17.4319 3.80936 15.9609L4.5016 14.115V11.001C4.5016 7.11197 7.46161 3.9143 11.2516 3.53801V2.75098C11.2516 2.33676 11.5874 2.00098 12.0016 2.00098ZM10.4375 19.001C10.471 19.8339 11.1573 20.4995 11.9998 20.4995C12.8423 20.4995 13.5286 19.8339 13.5622 19.001H10.4375ZM6.0016 11.001C6.0016 7.68727 8.68789 5.00098 12.0016 5.00098C15.3153 5.00098 18.0016 7.68727 18.0016 11.001V14.1168C18.0016 14.2955 18.0337 14.4727 18.0965 14.64L18.7893 16.4876C18.9732 16.9779 18.6108 17.501 18.0871 17.501H5.9161C5.39244 17.501 5.02998 16.9779 5.21385 16.4876L5.90673 14.64C5.96946 14.4727 6.0016 14.2955 6.0016 14.1168V11.001Z" fill="#000000"/></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1 +0,0 @@
<svg width="80" height="80" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" transform="rotate(0 0 0)"><path d="M15.5071 10.5245C15.8 10.2316 15.8 9.75674 15.5071 9.46384C15.2142 9.17095 14.7393 9.17095 14.4464 9.46384L10.9649 12.9454L9.55359 11.5341C9.2607 11.2412 8.78582 11.2412 8.49293 11.5341C8.20004 11.827 8.20004 12.3019 8.49294 12.5947L10.4346 14.5364C10.7275 14.8293 11.2023 14.8292 11.4952 14.5364L15.5071 10.5245Z" fill="#000000"/><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2ZM3.5 12C3.5 7.30558 7.30558 3.5 12 3.5C16.6944 3.5 20.5 7.30558 20.5 12C20.5 16.6944 16.6944 20.5 12 20.5C7.30558 20.5 3.5 16.6944 3.5 12Z" fill="#000000"/></svg>

Before

Width:  |  Height:  |  Size: 784 B

View File

@@ -1 +0,0 @@
<svg width="80" height="80" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" transform="rotate(0 0 0)"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.50002 12.0957C2.50002 6.849 6.75332 2.5957 12 2.5957C17.2467 2.5957 21.5 6.849 21.5 12.0957C21.5 17.3424 17.2467 21.5957 12 21.5957H3.25002C2.94668 21.5957 2.6732 21.413 2.55711 21.1327C2.44103 20.8525 2.50519 20.5299 2.71969 20.3154L4.77303 18.262C3.35633 16.603 2.50002 14.4488 2.50002 12.0957ZM12 4.0957C7.58174 4.0957 4.00002 7.67742 4.00002 12.0957C4.00002 14.305 4.89463 16.304 6.34317 17.7526C6.48382 17.8932 6.56284 18.084 6.56284 18.2829C6.56284 18.4818 6.48382 18.6726 6.34317 18.8132L5.06068 20.0957H12C16.4183 20.0957 20 16.514 20 12.0957C20 7.67742 16.4183 4.0957 12 4.0957Z" fill="#000000"/></svg>

Before

Width:  |  Height:  |  Size: 784 B

View File

@@ -108,6 +108,12 @@ except KeyError:
print('Der Schlüssel "csvtrenner" existiert nicht im allgemeinen Bereich der Input-Datei!')
exit(0)
try:
namen_kurzlang = config["Namen"]["form"]
except KeyError:
print('Der Schlüssel Namen oder "form" existiert nicht in der Device-Datei!')
exit(0)
# 5. Baue die Ausgabe aus den einzelnen Bestandteilen zusammen
@@ -141,12 +147,13 @@ for datei in dateien:
print('Der Schlüssel "bezeichnung" fehlt im Bereich "'+kursid+'" der Input-Datei!')
exit(0)
# CSV Datei mit Schülernamen einlesen und für Geburtstag aufbereiten
# CSV Datei mit Schülernamen einlesen und aufbereiten
csvdaten = open(datei, encoding="utf8")
csvdatenReader = csv.reader(csvdaten, delimiter=csv_trenner)
linecount = 0
namen = []
namen2 = []
gebdaten = []
gebdaten_all = True
@@ -158,7 +165,14 @@ for datei in dateien:
nachname = row[0]
vorname = row[1]
name = nachname + ", " +vorname
if (namen_kurzlang=="lang"):
name = nachname + ", " +vorname
else:
name = vorname + " " + nachname[0] + "."
name2 = vorname + " " + nachname
namen2.append(name2)
namen.append(name)
if (gebdaten_all):
@@ -201,7 +215,10 @@ for datei in dateien:
if (len(gebdaten)==0):
print(' - Geburtstagsliste wird weggelassen.')
else:
body = body + birthday.erstelleGeburtstagsBogen(kursid, klassekurs_name, lerngruppen, path, namen, gebdaten, config, inputs, kurs_inputs)
if (namen_kurzlang=="lang"):
body = body + birthday.erstelleGeburtstagsBogen(kursid, klassekurs_name, lerngruppen, path, namen, gebdaten, config, inputs, kurs_inputs)
else:
body = body + birthday.erstelleGeburtstagsBogen(kursid, klassekurs_name, lerngruppen, path, namen2, gebdaten, config, inputs, kurs_inputs)
# Planungsseite für das Halbjahr zusammenbauen
body = body + halbjahr.erstelleHalbjahresuebersicht(kursid, klassekurs_name, lerngruppen, path, namen, gebdaten, config, inputs, kurs_inputs)

View File

@@ -11,7 +11,7 @@ def erstelleGeburtstagsBogen(kursid, klassekurs_name, dateien, path, namen, gebd
# Sortierung nach Geburtsmonat für Geburtstagsliste
gebmonat = []
for geb in gebdaten:
parts = re.split("\.", geb)
parts = re.split("\\.", geb)
day = parts[0]
if (len(day)==1):
day = '0'+day
@@ -27,15 +27,26 @@ def erstelleGeburtstagsBogen(kursid, klassekurs_name, dateien, path, namen, gebd
zschuljahr = int(schuljahr)
halbjahr = allg["halbjahr"]
try:
namen_kurzlang = config["Namen"]["form"]
except KeyError:
print('Der Schlüssel Namen oder "form" existiert nicht in der Device-Datei!')
exit(0)
if (namen_kurzlang=="lang"):
beschriftung_name = "Name, Vorname"
else:
beschriftung_name = "Vorname Nachname"
table += '<a name="'+klassekurs_name+'Birthday"></a>'
table += header.erstelleKursnavigation(kursid, 'Geburtstagsliste', 'gebtag', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += '<table class="home" repeat="1">'
table += '<table class="birthday" repeat="1">'
table += '<tr class="header">'
table += '<th class="nr">Nr</th>'
table += '<th class="name">Name, Vorname</th>'
table += '<th class="name">'+beschriftung_name+'</th>'
table += '<th class="geb">Geburtstag</th>'
table += '<th class="age">Alter</th>'
table += '<th class="home"></th>'

View File

@@ -17,6 +17,17 @@ def erstelleCheckliste(kursid, klassekurs_name, dateien, path, namen, gebdaten,
check_anzahl = int(config["Checkliste"]["anzahl_checks"])
try:
namen_kurzlang = config["Namen"]["form"]
except KeyError:
print('Der Schlüssel Namen oder "form" existiert nicht in der Device-Datei!')
exit(0)
if (namen_kurzlang=="lang"):
beschriftung_name = "Name, Vorname"
else:
beschriftung_name = "Vorname N."
for no in range(check_seiten):
if (no==0):
@@ -32,7 +43,7 @@ def erstelleCheckliste(kursid, klassekurs_name, dateien, path, namen, gebdaten,
table += '<table class="'+css+'" repeat="1">'
table += '<tr class="header"><th class="nr">Nr</th><th class="name">Name, Vorname</th>'
table += '<tr class="header"><th class="nr">Nr</th><th class="name">'+beschriftung_name+'</th>'
for i in range(check_anzahl):
table += '<th class="'+css+'"></th>'
table += '</tr>'

View File

@@ -19,6 +19,17 @@ def erstelleHABogen(kursid, klassekurs_name, dateien, path, namen, gebdaten, con
print('Der Schlüssel "ha_zeilen" existiert nicht für die Lerngruppe in der Input-Datei!')
exit(0)
try:
namen_kurzlang = config["Namen"]["form"]
except KeyError:
print('Der Schlüssel Namen oder "form" existiert nicht in der Device-Datei!')
exit(0)
if (namen_kurzlang=="lang"):
beschriftung_name = "Name, Vorname"
else:
beschriftung_name = "Vorname N."
offset = 0
if (halbjahr=='2'):
offset = 2
@@ -31,7 +42,7 @@ def erstelleHABogen(kursid, klassekurs_name, dateien, path, namen, gebdaten, con
table += '<table class="'+css+'" repeat="1">'
table += '<tr class="header"><th class="nr">Nr</th><th class="name">Name, Vorname</th>'
table += '<tr class="header"><th class="nr">Nr</th><th class="name">'+beschriftung_name+'</th>'
for i in range(ha_anzahl):
table += '<th class="'+css+'"></th>'
table += '</tr>'

View File

@@ -24,7 +24,7 @@ def erstelleHalbjahresuebersicht(kursid, klassekurs_name, dateien, path, namen,
table += '<a name="'+klassekurs_name+'Halbjahr"></a>'
table += header.erstelleKursnavigation(kursid, 'Planung des Halbjahrs', 'halbjahr', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += header.erstelleKursnavigation(kursid, 'Planung Halbjahr', 'halbjahr', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
css = 'halbjahr'
@@ -39,16 +39,25 @@ 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="kw'+extrakw+'">'+str(count)+'</td>'
zusatz = ""
if (str(count+1) in ferien):
zusatz = ' class="trenner"'
table += '<tr'+zusatz+'><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="kw'+extrakw+'">'+str(count)+'</td>'
zusatz = ""
if (str(count+1) in ferien):
zusatz = ' class="trenner"'
table += '<tr'+zusatz+'><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="kw'+extrakw+'">'+str(count)+'</td>'
zusatz = ""
if (str(count+1) in ferien):
zusatz = ' class="trenner"'
table += '<tr'+zusatz+'><td class="kw'+extrakw+'">'+str(count)+'</td>'
table += '<td class="kw_sessions"></td><td class="kw_content"></td></tr>'
table += '</table>'

View File

@@ -36,10 +36,12 @@ def erstelleHauptnavigation(lerngruppen, path, config, inputs):
klassekurs_aktuell = kurs_inputs_aktuell["bezeichnung"]
if (bezeichnung=='kurz'):
klassekurs_print = kurs_inputs_aktuell["kurzbezeichnung"]
elif (bezeichnung=='abgekuerzt'):
klassekurs_print = kurs_inputs_aktuell["abkuerzung"]
else:
klassekurs_print = kurs_inputs_aktuell["bezeichnung"]
except KeyError:
print('Der Schlüssel "(kurz)bezeichnung" fehlt im Bereich "'+kursid+'" der Input-Datei!')
print('Der Schlüssel "bezeichnung" o.ä. fehlt im Bereich "'+kursid+'" der Input-Datei!')
exit(0)
myclass = ' n'+str(count) # Navileisten-CSS nX
@@ -65,19 +67,31 @@ def erstelleKursnavigation(kursid, line, current, klassekurs_name, gebdaten, ler
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:
navi = ""
navi = ""
# Link zur Startseite, falls keine Navileiste
navi += '<span class="kn-part"><a href="#Home">&nbsp;<img class="icon" src="img/chevron-up-circle.svg"/>zurück</a></span>&nbsp;&nbsp;&nbsp;'
try:
bezeichnung = config["Navigation"]["bezeichnung"]
except KeyError:
print('Der Schlüssel Navigation oder "kurzbezeichnung" existiert nicht in der Device-Datei!')
exit(0)
# Link zur Startseite
if (bezeichnung=='abgekuerzt'):
navi += '<span class="kn-part"><a href="#Home">&nbsp;<img class="icon" src="img/chevron-up-circle.svg"/></a></span>&nbsp;&nbsp;&nbsp;&nbsp;'
else:
navi += '<span class="kn-part"><a href="#Home">&nbsp;<img class="icon" src="img/chevron-up-circle.svg"/>zurück</a></span>&nbsp;&nbsp;&nbsp;&nbsp;'
# Notenübersicht
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>'
if (bezeichnung=='abgekuerzt'):
if (current=='übersicht'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/user-multiple-4-current.svg"/>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Overview">&nbsp;<img class="icon" src="img/user-multiple-4.svg"/></a>&nbsp;</span>'
else:
if (current=='übersicht'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/user-multiple-4-current.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"])
@@ -89,47 +103,84 @@ def erstelleKursnavigation(kursid, line, current, klassekurs_name, gebdaten, ler
if (halbjahr=='2'):
offset = schr_anzahl
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>'
if (bezeichnung=='abgekuerzt'):
if (current=='korrektur'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/pen-to-square-current.svg"/>&nbsp;</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"/></a>&nbsp;</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>'
if (current=='korrektur'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/pen-to-square-current.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
if (current=='somi'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/message-3-text.svg"/><span class="kn-current">mündlich</span></span>'
if (bezeichnung=='abgekuerzt'):
if (current=='somi'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/message-3-text-current.svg"/>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'SoMiQ'+str(offset+1)+'">&nbsp;<img class="icon" src="img/message-3-text.svg"/></a>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'SoMiQ'+str(offset+1)+'">&nbsp;<img class="icon" src="img/message-3-text.svg"/>mündlich</a></span>'
if (current=='somi'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/message-3-text-current.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/message-3-text.svg"/>mündlich</a></span>'
# HA
ha_zeilen = int(kurs_inputs["ha_zeilen"])
if (ha_zeilen>0):
if (current=='ha'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/home-2.svg"/><span class="kn-current">Haus</span></span>'
if (bezeichnung=='abgekuerzt'):
if (current=='ha'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/home-2-current.svg"/>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'HA">&nbsp;<img class="icon" src="img/home-2.svg"/></a>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'HA">&nbsp;<img class="icon" src="img/home-2.svg"/>Haus</a></span>'
if (current=='ha'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/home-2-current.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/home-2.svg"/>Haus</a></span>'
# Checklisten
if (current=='check'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/check-square-2.svg"/><span class="kn-current">Check</span></span>'
if (bezeichnung=='abgekuerzt'):
if (current=='check'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/check-square-2-current.svg"/>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Check">&nbsp;<img class="icon" src="img/check-square-2.svg"/></a>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Check">&nbsp;<img class="icon" src="img/check-square-2.svg"/>Check</a></span>'
if (current=='check'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/check-square-2-current.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-square-2.svg"/>Check</a></span>'
# Geburtstagsseite
if (len(gebdaten)>0):
if (current=='gebtag'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/balloons.svg"/><span class="kn-current">Gebtag</a></span>'
if (bezeichnung=='abgekuerzt'):
if (current=='gebtag'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/balloons-current.svg"/>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Birthday">&nbsp;<img class="icon" src="img/balloons.svg"/></a>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Birthday">&nbsp;<img class="icon" src="img/balloons.svg"/>Gebtag</a></span>'
if (current=='gebtag'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/balloons-current.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/balloons.svg"/>Gebtag</a></span>'
# Halbjahresseite
if (current=='halbjahr'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/calendar-days.svg"/><span class="kn-current">Plan</span></span>'
if (bezeichnung=='abgekuerzt'):
if (current=='halbjahr'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/calendar-days-current.svg"/>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Halbjahr">&nbsp;<img class="icon" src="img/calendar-days.svg"/></a>&nbsp;</span>'
else:
navi += '<span class="kn-part"><a href="#'+klassekurs_name+'Halbjahr">&nbsp;<img class="icon" src="img/calendar-days.svg"/>Plan</a></span>'
if (current=='halbjahr'):
navi += '<span class="kn-part">&nbsp;<img class="icon" src="img/calendar-days-current.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>'
navileiste = '<p class="kn">'+navi+'</p>'

View File

@@ -25,6 +25,19 @@ def erstelleKorrekturbogen(kursid, klassekurs_name, dateien, path, namen, gebdat
print('Der Schlüssel Allgemein oder "device" existiert nicht in der Input-Datei!')
exit(0)
try:
namen_kurzlang = config["Namen"]["form"]
except KeyError:
print('Der Schlüssel Namen oder "form" existiert nicht in der Device-Datei!')
exit(0)
if (namen_kurzlang=="lang"):
beschriftung_name = "Name, Vorname"
beschriftung_summe = "Summe"
else:
beschriftung_name = "Vorname N."
beschriftung_summe = ""
aufgaben_anzahl = int(config["Korrekturbogen"]["anzahl_aufgaben"])
offset = 0
@@ -41,10 +54,10 @@ def erstelleKorrekturbogen(kursid, klassekurs_name, dateien, path, namen, gebdat
table += '<table class="korrektur" repeat="1">'
table += '<tr class="header"><th class="nr">Nr</th><th class="name">Name, Vorname</th>'
table += '<tr class="header"><th class="nr">Nr</th><th class="name">'+beschriftung_name+'</th>'
for i in range(aufgaben_anzahl):
table += '<th class="korrektur">A. '+str(i+1)+'</th>'
table += '<th class="summe">Summe</th><th class="aknote">Note</th>'
table += '<th class="summe">'+beschriftung_summe+'</th><th class="aknote">Note</th>'
table += '</tr>'
table += '<tr class="muster"><td class="nr"></td><td class="name">Musterlösung</td>'

View File

@@ -19,6 +19,18 @@ def erstelleSoMiBogen(kursid, klassekurs_name, dateien, path, namen, gebdaten, c
exit(0)
noten_anzahl = int(config["SoMiNoten"]["anzahl_noten"])
kompakt = config["SoMiNoten"]["kompakt"]
try:
namen_kurzlang = config["Namen"]["form"]
except KeyError:
print('Der Schlüssel Namen oder "form" existiert nicht in der Device-Datei!')
exit(0)
if (namen_kurzlang=="lang"):
beschriftung_name = "Name, Vorname"
else:
beschriftung_name = "Vorname N."
offset = 0
if (halbjahr=='2'):
@@ -37,7 +49,10 @@ def erstelleSoMiBogen(kursid, klassekurs_name, dateien, path, namen, gebdaten, c
table += header.erstelleKursnavigation(kursid, line, 'somi', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
table += '<table class="somi" repeat="'+str(somi_zeilen)+'">'
if (kompakt=="ja"):
table += '<table class="somi">'
else:
table += '<table class="somi" repeat="'+str(somi_zeilen)+'">'
rowspan = ''
if somi_zeilen>1:
@@ -51,14 +66,18 @@ def erstelleSoMiBogen(kursid, klassekurs_name, dateien, path, namen, gebdaten, c
table += '<tr'+myclass+'>'
if zeile==0:
table += '<th class="nr"'+rowspan+'>Nr</th>'
table += '<th class="name"'+rowspan+'>Name, Vorname</th>'
if (kompakt!="ja"):
table += '<th class="nr"'+rowspan+'>Nr</th>'
table += '<th class="name"'+rowspan+'>'+beschriftung_name+'</th>'
for i in range(noten_anzahl):
table += '<th class="somi">&nbsp;</th>'
if zeile==0:
table += '<th class="sominote"'+rowspan+'>Note</th>'
if (kompakt=="ja"):
table += '<th class="sominote"'+rowspan+'></th>'
else:
table += '<th class="sominote"'+rowspan+'>Note</th>'
table += '</tr>'
@@ -72,7 +91,8 @@ def erstelleSoMiBogen(kursid, klassekurs_name, dateien, path, namen, gebdaten, c
table += '<tr>'
if zeile==0:
table += '<td class="nr"'+rowspan+'>'+str(count)+'</td>'
if (kompakt!="ja"):
table += '<td class="nr"'+rowspan+'>'+str(count)+'</td>'
table += '<td class="name"'+rowspan+'>'+name+'</td>'
for i in range(noten_anzahl):

View File

@@ -5,7 +5,7 @@ import header
import re
def erstelleStartseite(lerngruppen, path,config, inputs):
def erstelleStartseite(lerngruppen, path, config, inputs):
table = ''
@@ -75,14 +75,32 @@ def erstelleStartseite(lerngruppen, path,config, inputs):
exit(0)
try:
klassekurs_aktuell = kurs_inputs_aktuell["bezeichnung"]
klassekurs_aktuell_kurz = kurs_inputs_aktuell["kurzbezeichnung"]
bezeichnung = config["Navigation"]["bezeichnung"]
except KeyError:
print('Der Schlüssel "bezeichnung" fehlt im Bereich "'+kursid+'" der Input-Datei!')
print('Der Schlüssel Navigation oder "kurzbezeichnung" existiert nicht in der Device-Datei!')
exit(0)
html = re.sub('\\['+kursid+'\\](.+)?<br>','<div class="'+mycss+'"><a href="#'+klassekurs_aktuell+'">'+klassekurs_aktuell_kurz+'</a>\\1</div>',html)
html = re.sub('\\['+kursid+'\\](.+)?</td>','<div class="'+mycss+'"><a href="#'+klassekurs_aktuell+'">'+klassekurs_aktuell_kurz+'</a>\\1</div></td>',html)
try:
klassekurs_aktuell = kurs_inputs_aktuell["bezeichnung"]
if (bezeichnung=='kurz'):
klassekurs_print = kurs_inputs_aktuell["kurzbezeichnung"]
elif (bezeichnung=='abgekuerzt'):
klassekurs_print = kurs_inputs_aktuell["abkuerzung"]
else:
klassekurs_print = kurs_inputs_aktuell["bezeichnung"]
except KeyError:
print('Der Schlüssel "bezeichnung" o.ä. fehlt im Bereich "'+kursid+'" der Input-Datei!')
exit(0)
if (bezeichnung=='abgekuerzt'):
html = re.sub('Montag','Mo',html)
html = re.sub('Dienstag','Di',html)
html = re.sub('Mittwoch','Mi',html)
html = re.sub('Donnerstag','Do',html)
html = re.sub('Freitag','Fr',html)
html = re.sub('\\['+kursid+'\\](.+)?<br>','<div class="'+mycss+'"><a href="#'+klassekurs_aktuell+'">'+klassekurs_print+'</a>\\1</div>',html)
html = re.sub('\\['+kursid+'\\](.+)?</td>','<div class="'+mycss+'"><a href="#'+klassekurs_aktuell+'">'+klassekurs_print+'</a>\\1</div></td>',html)
html = re.sub('\\[\\[(.+)?\\]\\](.+)?<br>','<div class="t-empty">\\1 \\2</div>',html)
html = re.sub('\\[\\[(.+)?\\]\\](.+)?</td>','<div class="t-empty">\\1 \\2</div></td>',html)

View File

@@ -18,6 +18,17 @@ def erstelleUebersicht(kursid, klassekurs_name, dateien, path, namen, gebdaten,
if (kurs_inputs["halbjahresnote"]=='ja'):
halbjahresnote = True
try:
namen_kurzlang = config["Namen"]["form"]
except KeyError:
print('Der Schlüssel Namen oder "form" existiert nicht in der Device-Datei!')
exit(0)
if (namen_kurzlang=="lang"):
beschriftung_name = "Name, Vorname"
else:
beschriftung_name = "Vorname N."
table += header.erstelleKursnavigation(kursid, 'Übersicht', 'übersicht', klassekurs_name, gebdaten, dateien, path, config, inputs, kurs_inputs)
schr_bez = kurs_inputs["schriftlich_bez"]
@@ -26,7 +37,7 @@ def erstelleUebersicht(kursid, klassekurs_name, dateien, path, namen, gebdaten,
table += '<table class="overview" repeat="1">'
table += '<tr><th class="nr" rowspan="2">Nr</th><th class="name" rowspan="2">Name, Vorname</th>'
table += '<tr><th class="nr" rowspan="2">Nr</th><th class="name" rowspan="2">'+beschriftung_name+'</th>'
if (halbjahr=='2' and halbjahresnote):
table += '<th class="hj" rowspan="2">Hj.</th>'