Ja, da gab es noch einiges was nicht passte. Ich hatte mir noch nicht vollständig dein Formular angesehen und dachte, es gäbe immer zwei Liednamen und wenn nur ein Lied angezeigt wird, nimmt man input-liedname-1 aber das war ein Irrtum.
Zitat
Langsam werden es soviele verschachtelte Funktionen und viel zu viel Nice to have
Das hat man häufig, vor allem wenn es hunderte von Zeilen sind oder noch mehr. Deshalb habe ich versucht, das ganze wieder ein wenig zu straffen und die Prüfung, ob die Eingabe für das Lied OK ist, in die Funktion liedHolen hinein genommen. Die sieht dann so aus:
Zitat
function liedHolen(sel) {
inputLied = document.querySelector(sel);
// Zunächst prüfen wir ob die Eingabe das richtige Format hat:
// Am Anfang eine Nummer, dann ": " und danach beliebig viele Zeichen
// als Name
if (inputLied.value.match(/\d+: .+/)) {
// Das Format passt, wir zerlegen die Eingabe in Nummer und Name
const splitted = inputLied.value.split(': ');
// und geben das Objekt mit diesen Werte zurück, die Eingabe ist OK
return { nr: splitted[0], name: splitted[1], invalid: false };
}
// Die Eingabe ist nicht OK, wir geben für Nummer und Name jeweils ''
// zurück uns setzen invalid auf true
return { nr: '', name: '', invalid: true };
}
Alles anzeigen
Die Auswertung wird dann wesentlich einfacher und sieht für ein Lied so aus:
if (verein === "liednummer1") {
var lied = liedHolen('#input-liedname');
if (lied.invalid) isValid = false;
json = [
{ "text": [148, 5, "MUSIKKAPELLE", "fonts/bahnschrift20", 1, 1] },
{ "text": [148, 26, lied.nr, "fonts/calibrib80", 1, 1] },
{ "text": [148, 97, lied.name, "t0_14b_tf", 1, 1] },
{ "text": [148, 106, "ORT", "fonts/bahnschrift20", 1, 1] }
];
} else if (verein === "liednummer2") {
Das vollständige HTML hänge ich an, ich habe es nur oberflächlich getestet.