diff --git a/server/pruef-reaktion.mjs b/server/pruef-reaktion.mjs
index f60d70d9..c411803e 100644
--- a/server/pruef-reaktion.mjs
+++ b/server/pruef-reaktion.mjs
@@ -1651,27 +1651,61 @@ melde("=== 18. Die Regieleiste ===");
diese Pruefung -- sie war gruen und wertlos.
Jetzt zaehlt JEDE Regel, in deren Auswahl `.saal` vorkommt. */
- const zeilen = [...css.matchAll(/\{|\}/g)].length >= 0
- ? [...css.replace(/\/\*[\s\S]*?\*\//g, " ")
- .matchAll(/([^{}]*\.saal[^{}]*)\{([^}]*)\}/g)]
- .filter((m) => /grid-template-rows/.test(m[2]))
- : [];
- ok(zeilen.length === 1,
- zeilen.length === 1
- ? `genau eine Regel bestimmt die Zeilen des Saals (${zeilen[0][1].trim()})`
- : `${zeilen.length} Regeln bestimmen die Zeilen des Saals -- `
- + `eine davon wird irgendwo ignoriert: `
- + zeilen.map((m) => m[1].trim()).join(" / "));
- /* GEGENPROBE: Die Pruefung muss eine zweite Regel auch dann
- finden, wenn sie nicht am Zeilenanfang steht -- genau daran ist
- sie gescheitert. */
+ /* ==== NICHT „WIE VIELE", SONDERN „WIE VIELE ZEILEN" ==========
+
+ Diese Pruefung zaehlte Regeln: „genau eine darf die Zeilen des
+ Saals setzen." Das war die Faustregel zum Befund -- aber nicht
+ die Frage, um die es geht. Eine zweite FASSUNG (Handy,
+ aufgeklappte Regie) ist richtig und noetig; sie setzt die
+ Zeilen neu UND verteilt die Kinder neu. Der Fehler war eine
+ zweite ANGABE, die die Zeilenzahl VERKLEINERT und die Kinder
+ stehen laesst: Der Buehnenmodus gab dem Saal eine Zeile,
+ waehrend `#teil-live` auf Zeile 2 genagelt war -- Leinwand null
+ Pixel hoch.
+
+ Also: Jede Regel, deren Gegenstand der Saal IST, muss gleich
+ viele Zeilen setzen. Regeln, die nur zufaellig `.saal` im
+ Vorfahrenpfad haben (`.saal … .pult { … }`), zaehlen nicht --
+ sie beantworten eine andere Frage. */
+ /* `[^{}]*` FUER DEN RUMPF UND NICHT `[^}]*` -- der Unterschied
+ ist ein Blindfleck: Mit `[^}]*` verschluckt der Rumpf die
+ oeffnende Klammer eines `@media`, und jede Regel INNERHALB
+ eines Medienblocks faellt aus der Pruefung. Gemessen: Sie
+ meldete „alle 1 Fassungen", obwohl zwei dastanden. Ein Fehler
+ im Medienblock -- und genau dort steht die Handyansicht --
+ waere unbemerkt durchgegangen. */
+ const saalRegeln = (text) => [...text.replace(/\/\*[\s\S]*?\*\//g, " ")
+ .matchAll(/([^{}]+)\{([^{}]*)\}/g)]
+ .filter((m) => /grid-template-rows/.test(m[2]))
+ /* Der GEGENSTAND einer Auswahl ist ihr letzter Teil. Bei
+ `.saal .pult` ist das `.pult` -- und dessen Zeilen gehen den
+ Saal nichts an. */
+ .filter((m) => {
+ const teile = m[1].trim().split(/\s+|>/).filter(Boolean);
+ return /\.saal/.test(teile[teile.length - 1] || "");
+ })
+ .map((m) => ({
+ wahl: m[1].trim(),
+ zeilen: (m[2].match(/grid-template-rows:\s*([^;]+)/) || [, ""])[1]
+ .trim().split(/\s+(?![^(]*\))/).filter(Boolean).length,
+ }));
+
+ const saal = saalRegeln(css);
+ const zahlen = [...new Set(saal.map((x) => x.zeilen))];
+ ok(saal.length >= 1 && zahlen.length === 1,
+ zahlen.length === 1
+ ? `alle ${saal.length} Fassungen des Saals haben ${zahlen[0]} Zeilen`
+ : `UNGLEICH VIELE ZEILEN: ` + saal.map((x) => `${x.wahl} → ${x.zeilen}`).join(" / "));
+
+ /* GEGENPROBE: Eine eingeschobene Fassung mit WENIGER Zeilen muss
+ auffallen -- genau die war der Buehnenmodus, und genau die hat
+ die alte Pruefung nicht gesehen. */
{
- const erfunden = 'body[data-nur="probe"] .saal { grid-template-rows: 1fr; }';
- const mit = [...(css + erfunden).replace(/\/\*[\s\S]*?\*\//g, " ")
- .matchAll(/([^{}]*\.saal[^{}]*)\{([^}]*)\}/g)]
- .filter((m) => /grid-template-rows/.test(m[2]));
- ok(mit.length === 2,
- `Gegenprobe: eine eingeschobene zweite Regel faellt auf (${mit.length})`);
+ const erfunden = 'body[data-nur="probe"] .saal { grid-template-rows: minmax(0, 1fr); }';
+ const mit = saalRegeln(css + erfunden);
+ ok([...new Set(mit.map((x) => x.zeilen))].length === 2,
+ `Gegenprobe: eine Fassung mit weniger Zeilen faellt auf `
+ + `(${[...new Set(mit.map((x) => x.zeilen))].join(" und ")})`);
}
/* ---- UND SIE GEHOERT NUR DENEN, DIE SENDEN ---- */
@@ -1946,15 +1980,22 @@ melde("=== 20. Regieplatz und Bildschirm ===");
}
/* ---- LINKS, RECHTS UND EINE LEISTE UNTEN ---- */
- ok(/laeuft sendung[\s\S]{0,60}laeuft bereit[\s\S]{0,60}leiste leiste/.test(regeln),
- "der Regieplatz hat links, rechts und eine Leiste unten");
+ ok(/laeuft sendung[\s\S]{0,60}laeuft bereit/.test(regeln),
+ "der Regieplatz hat links und rechts eine Kachel");
+ /* ==== UND DIE REGIE STEHT LINKS NEBEN DEM VIDEO ==============
+ Filipe: „anstatt alles nur unten zu haben wieso nicht rechts
+ und links noch ausnutzen um mehr ueberblick zu haben." */
+ ok(/"pult kino"/.test(regeln) && /"transport transport"/.test(regeln),
+ "aufgeklappt steht die Regie links, das Video daneben, der Transport unten");
+ ok(/:has\(\.pult\[data-auf="ja"\]\)/.test(regeln),
+ "und zugeklappt bleibt sie die schmale Leiste von vorher");
/* ==== ES MUESSEN KACHELN SEIN UND KEINE SPALTEN ==============
Filipe hat die erste Fassung zerrissen: „ich wollte was hoch
professionelles wo rechts links und unten kacheln sind wo alles
drin ist." Zwei Spalten mit einer Trennlinie sind eine Teilung,
keine Gliederung -- und das sieht man einer CSS-Regel an:
Rahmen, eigener Grund, ein Kopf. */
- const kachel = regeln.match(/\.regiekachel \{[^}]*\}/);
+ const kachel = regeln.match(/\.regiekachel \{[^{}]*\}/);
ok(!!kachel && /border:/.test(kachel[0]) && /background:/.test(kachel[0]),
"eine Regiekachel hat Rahmen und eigenen Grund");
ok((html.match(/class="regiekachel/g) || []).length >= 3,
@@ -1967,17 +2008,35 @@ melde("=== 20. Regieplatz und Bildschirm ===");
"die linke Kachel hat ein Vorschaubild");
ok(/laufbild-leer/.test(js) && /trag rechts eine YouTube-Adresse ein/.test(html),
"und ohne Video sagt sie, was zu tun ist");
- const platz = [...regeln.matchAll(/([^{}]*\.regieplatz[^{}]*)\{([^}]*)\}/g)]
+ /* ==== JEDE FASSUNG BRAUCHT ALLE DREI KACHELN ================
+ Auch hier zaehlte die Pruefung Regeln -- und meldete einen
+ Fehler, sobald eine dritte Fassung dazukam (schmale Spalte
+ neben dem Video). Die Zahl der Fassungen ist aber nicht die
+ Frage. Die Frage ist, ob eine davon eine Kachel VERGISST: Dann
+ verschwindet sie in genau dieser Ansicht, und gemerkt haette
+ es niemand. */
+ const platz = [...regeln.matchAll(/([^{}]*\.regieplatz[^{}]*)\{([^{}]*)\}/g)]
.filter((m) => /grid-template-areas/.test(m[2]));
- /* ZWEI REGELN FUER DIESELBE FRAGE SIND DIE GARANTIE, DASS EINE
- FALSCH GEWINNT -- heute schon viermal passiert. Die Handyansicht
- darf die Bereiche neu setzen; deshalb zwei, nicht eine. */
- ok(platz.length === 2,
- `${platz.length} Regeln ordnen den Regieplatz (Rechner und Handy)`);
+ ok(platz.length >= 2, `${platz.length} Fassungen ordnen den Regieplatz`);
+ const ohneKachel = platz.filter((m) => !["laeuft", "sendung", "bereit"]
+ .every((x) => m[2].includes(x)));
+ ok(ohneKachel.length === 0,
+ ohneKachel.length
+ ? `EINE FASSUNG VERGISST EINE KACHEL: ${ohneKachel.map((m) => m[1].trim()).join(" / ")}`
+ : "und jede davon nennt alle drei Kacheln");
/* Die Leiste traegt den ganzen Transport -- und zwar in EINER. */
- const iLeiste = html.indexOf('class="transport"');
- const iEnde = html.indexOf("", iLeiste);
+ /* ==== DER TRANSPORT LIEGT UNTER DEM SAAL, NICHT IM REGISTER
+ Er lag im Register „Sendung" und war damit weg, sobald jemand
+ auf „Ton" oder „Spenden" ging. Der Play-Knopf ist aber der
+ eine, den man mitten in einer Sendung blind treffen muss. */
+ const iPultEnde = html.indexOf('id="transport"');
+ ok(iPultEnde > html.indexOf('id="pult"'),
+ "der Transport steht hinter dem Pult");
+ ok(iPultEnde < html.indexOf(""),
+ "und noch im Saal -- nicht in einem Register");
+ const iLeiste = html.indexOf('id="transport"');
+ const iEnde = html.indexOf("", iLeiste);
const inLeiste = html.slice(iLeiste, iEnde);
for (const k of ["v-band", "v-zeit", "v-zurueck", "v-spiel", "v-vor", "v-naechstes", "tempo"]) {
ok(inLeiste.includes(`id="${k}"`), `„${k}" liegt in der Transportleiste`);
diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html
index 315f1cda..5db7bc16 100644
--- a/workspace/anruf-probe.html
+++ b/workspace/anruf-probe.html
@@ -16,8 +16,8 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
-
-
+
+
-
+