/* ===================================================================== buehne-festschreiben.mjs — die Szene gehört in die HTML (07.10.2026) ===================================================================== WAS GEMESSEN WURDE, BEVOR ES DIESES WERKZEUG GAB: `pruef-tempo-workspace` meldete zwei Seiten über der Grenze von 900 KB (uebersicht.html 959 KB, bereich.html?b=live 1094 KB). Die Prüfung sagt seit heute auch, WORAN es liegt, und die Antwort war eindeutig: 281 KB buehne-studio-breit.webp 262 KB buehne-portal-breit.webp ZWEI Bühnenbilder auf einer Seite, die nur eines zeigt. Der Grund steht in start.css: `body.start::before` trägt als Rückfall das Studio-Bild, und `kopf.js` setzt `data-buehne` erst, nachdem die Seite steht. Bis dahin hat der Browser den Rückfall längst geholt. Das betrifft nicht eine Seite, sondern 43 von 45: Nur material.html und teamlage.html schreiben ihre Szene fest -- und zwar mit genau dieser Begründung, die dort schon steht („steht hier fest und nicht im Skript"). --------------------------------------------------------------------- WAS DIESES WERKZEUG TUT Es liest die Zuordnung „Seite -> Szene" aus bereiche.js -- der Stelle, an der sie ohnehin gepflegt wird -- und schreibt sie als `data-buehne` in das -Element der jeweiligen Seite. DIE ZWEITE STELLE IST KEIN WIDERSPRUCH ZUR HAUSREGEL, solange sie nicht auseinanderlaufen kann: `pruef-buehnen-fest.mjs` hält beide gegeneinander und wird rot, sobald sich eine ändert. Eine Abschrift mit Wächter ist etwas anderes als eine Abschrift. NICHT BETROFFEN ist bereich.html: Dort hängt die Szene am `?b=`-Parameter (vier verschiedene), sie kann also nicht fest im Dokument stehen. Diese eine Seite holt weiterhin zuerst den Rückfall -- dafür bleibt der Rückfall auch stehen. AUFRUF: node tools/buehne-festschreiben.mjs [--probe] ===================================================================== */ import { readFileSync, writeFileSync, existsSync } from "node:fs"; import { join, dirname } from "node:path"; import { fileURLToPath } from "node:url"; const HIER = dirname(fileURLToPath(import.meta.url)); const WURZEL = join(HIER, ".."); const SEITEN = join(WURZEL, "workspace"); const nurProbe = process.argv.includes("--probe"); /* Die Zuordnung kommt aus bereiche.js. Gelesen wird mit einem Muster und nicht per Import: Die Datei ist für den Browser gebaut (IIFE, kein Export), und ein Modul daraus zu machen wäre ein Umbau am Lieferstand für ein Werkzeug. */ const quelle = readFileSync(join(SEITEN, "assets", "js", "bereiche.js"), "utf8"); const zuordnung = new Map(); for (const m of quelle.matchAll(/ziel:\s*'([^']+)'\s*,\s*szene:\s*'([^']+)'/g)) { const [, ziel, szene] = m; /* Seiten mit Fragezeichen hängen am Parameter -- siehe oben. */ if (ziel.includes("?")) continue; const vorhanden = zuordnung.get(ziel); if (vorhanden && vorhanden !== szene) { console.log(` !! ${ziel}: zwei Szenen (${vorhanden} und ${szene}) -- übersprungen`); zuordnung.set(ziel, null); continue; } if (!vorhanden) zuordnung.set(ziel, szene); } let gesetzt = 0, schonDa = 0, fehlt = 0; for (const [datei, szene] of zuordnung) { if (!szene) continue; const pfad = join(SEITEN, datei); if (!existsSync(pfad)) { console.log(` ?? ${datei} gibt es nicht`); fehlt++; continue; } let text = readFileSync(pfad, "utf8"); const body = text.match(/]*)>/); if (!body) { console.log(` ?? ${datei}: kein `); fehlt++; continue; } if (/data-buehne="/.test(body[1])) { schonDa++; continue; } const neu = ``; text = text.replace(body[0], neu); if (!nurProbe) writeFileSync(pfad, text); console.log(` ${nurProbe ? "waere" : "gesetzt"}: ${datei.padEnd(22)} ${szene}`); gesetzt++; } console.log(`\n${gesetzt} gesetzt, ${schonDa} standen schon fest, ${fehlt} nicht möglich` + (nurProbe ? " (nur Probe, nichts geschrieben)" : ""));