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`. --> - - + + - +