screen4: Dogi-Media — bearbeiten, entfernen, von wann bis wann
Filipe, 22.09.2026: "wenn wir in der kategorie material was hochladen
will ich dass die rechte und linke hand es auch bearbeiten und loeschen
koennen. dogfather auch fals es ein fehler gab. ... uebrigens ersetz das
wort material durch Dogi-Media. und mach kategorien welche sind benutzt
welche nicht welche sind noch offen, welche laufen von wan bis wann."
WAS JETZT GEHT
- Rechte Hand, linke Hand und DogFather bearbeiten und entfernen jedes
Stueck, nicht nur ihr eigenes. Bearbeitet wird Text und Zeitfenster,
nicht die Datei: Sonst zeigte dieselbe Nummer etwas anderes als das,
was sich jemand gerade angesehen hat.
- Ein vergebenes Stueck bleibt unberuehrt (409). Wer es genommen hat,
hat sich auf diesen Text verlassen.
- Vier Zustaende, gerechnet statt gespeichert: jetzt frei, kommt noch,
abgelaufen, schon benutzt. Die Kategorieleiste zeigt zu jedem die
Anzahl aus den echten Daten und filtert BEIDE Listen.
- "Material" heisst ueberall "Dogi-Media", der Dateiname bleibt.
DREI FEHLER AUS DEM EIGENEN ENTWURF, ALLE VOR DEM AUSLIEFERN GEMESSEN
1. `tagLokal()` ohne Argument gab "NaN-NaN-NaN" zurueck -- eine
Zeichenkette, die aussieht wie ein Datum. Im Vergleich gewinnt das N
gegen jede Ziffer, also galt JEDES Stueck mit Enddatum vom ersten Tag
an als abgelaufen, und "Kommt noch" gab es nie. Kein Absturz, keine
Meldung. Die drei Kopien der Funktion waren hier auseinandergelaufen;
alle drei haben jetzt die Vorbelegung und werfen bei einer Zahl, die
keine ist.
2. `frageNach` liefert bei einer reinen Rueckfrage `true`, nicht
`{ ok: true }`. Der Entwurf prueft auf `erg?.ok` -- "Entfernen" waere
ein Knopf gewesen, der nichts tut.
3. Drei erfundene Klassennamen (`knopf--leise`, `m-kat__knopf`,
`m-karte__weg-knopf`) statt der vorhandenen des Hauses. Jetzt
`.knopf-still`, `.knopf-still--warn` und die Filterleiste `.filter`.
EIN FUND IM BESTAND, ZWEI WOCHEN ALT
In start.css fehlten an einer Stelle die zwei Zeichen, die einen
Kommentar schliessen. CSS-Kommentare schachteln nicht: Der Block lief
bis zum naechsten Abschluss weiter und verschluckte `.kacheln {`; die
Fehlerbehebung des Browsers nahm danach auch die Regel `.kachel` mit.
In Chromium gemessen, beide Fassungen nacheinander: 738 statt 740
Regeln.
Der Entwurf, der dadurch nie gewirkt hat, ist NICHT wiederhergestellt
worden: Seine Flaeche mischte den Kachelton mit 30/11/3 Prozent ein --
pruef-kachelfarben fiel sofort von 36,5 % auf 4,1 % angekommene Farbe,
und 31 Toene sahen gleich aus. Das ist das Gegenteil dessen, was am
22.09. verlangt war. Er ist geloescht, mit dem Grund daneben. Offen
bleibt eine Frage an Filipe, keine Entscheidung von mir: zu demselben
Entwurf gehoerte ein schmaleres Kachelraster (fuenf bis sechs statt
drei pro Reihe). Das aendert das Aussehen der Startseite sichtbar und
bleibt deshalb, wie es ist.
GEMEINSAME BAUSTEINE AUS DEN SEITENDATEIEN GEHOLT
`.filter` stand Zeichen fuer Zeichen doppelt in dateien.css und
bereich.css, `.feld-hinweis` in aufgaben.css und leistung.css (und die
zwei waren schon auseinandergelaufen). Dogi-Media war jeweils die
dritte Seite, die sie braucht, und laedt keine davon. Derselbe Fehler
wie damals bei .knopf-still und beim Schalter -- jetzt in gate.css
bzw. start.css.
GEPRUEFT
pruef-material 155/0 (von 126, neu: Zeitfenster, Bearbeiten, Entfernen,
Rechte in der Liste und ein Abschnitt am echten Bildschirm mit Browser).
pruef-css-klassen um eine Pruefung erweitert, die genau den
start.css-Fehler findet -- mit sieben Gegenproben, darunter der echte
Fall. pruef-kachelfarben 22/0, pruef-start-ansicht, pruef-struktur,
pruef-meldungen, pruef-zeitraum, pruef-content, pruef-serien 69/0.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -693,5 +693,154 @@ console.log("\n=== module.css: die Modulliste steht siebenmal — und überall g
|
||||
`die zweite Wand laedt ihr Haus zuletzt (${wandBl.length} Stilvorlagen)`);
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
IST DAS CSS UEBERHAUPT HEIL? (22.09.2026)
|
||||
=========================================================================
|
||||
|
||||
ENTSTANDEN AUS EINEM ECHTEN FEHLER, der zwei Wochen live stand.
|
||||
|
||||
In start.css fehlten an einer Stelle die zwei Zeichen, die einen
|
||||
Kommentar schliessen:
|
||||
|
||||
...
|
||||
der Inhalt darin angeordnet ist.
|
||||
=====================================================
|
||||
<- hier gehoerte `*` `/` hin
|
||||
.kacheln {
|
||||
|
||||
CSS-Kommentare schachteln NICHT. Der Block lief deshalb weiter bis
|
||||
zum naechsten Abschluss -- und der stand mitten in `.kacheln`.
|
||||
Verschluckt wurde damit die oeffnende Klammer. Die Fehlerbehebung
|
||||
des Browsers hat danach auch noch die FOLGENDE Regel mitgenommen,
|
||||
weil sie deren Rumpf als Block einer ungueltigen Auswahl las.
|
||||
|
||||
Gemessen in Chromium, beide Fassungen nacheinander: 738 statt 740
|
||||
Regeln. Sichtbar war es als Kachelreihe mit drei Spalten zu 413 px
|
||||
statt fuenf zu 243 px.
|
||||
|
||||
WARUM ES NIEMANDEM AUFFIEL: Eine aeltere `.kacheln`-Regel weiter
|
||||
oben sprang ein. Die Seite sah nicht kaputt aus -- nur anders als
|
||||
gemeint. Das ist die gefaehrlichste Sorte: Es gibt nichts zu melden,
|
||||
keinen Fehler in der Konsole, keinen roten Haken. Nur eine Seite,
|
||||
die etwas anderes zeigt als das, was im Quelltext steht.
|
||||
|
||||
WAS HIER GEMESSEN WIRD -- und warum gerade das:
|
||||
|
||||
Auf oberster Ebene einer Stilvorlage darf nur dreierlei stehen: eine
|
||||
Auswahl mit ihrem Block, eine At-Regel, und Leerraum. Steht dort
|
||||
eine ANGABE (`gap: 12px;`) oder eine schliessende Klammer ohne ihre
|
||||
oeffnende, dann ist etwas verschluckt worden -- fast immer ein
|
||||
Kommentar ohne Abschluss.
|
||||
|
||||
Das ist strenger als blosses Klammernzaehlen: Eine Klammernprobe ist
|
||||
gruen, solange gleich viele auf- wie zugehen, auch wenn ein
|
||||
Kommentar mittendrin einen ganzen Block gefressen hat.
|
||||
|
||||
Kommentare und Zeichenketten werden dabei genauso ueberlesen, wie
|
||||
der Browser sie ueberliest -- sonst schlaegt die Pruefung bei jedem
|
||||
`/* ... } ... *' + '/` an, und eine Warnung, die immer kommt, ist
|
||||
keine mehr.
|
||||
========================================================================= */
|
||||
console.log("\n=== Ist das CSS ueberhaupt heil? ===");
|
||||
|
||||
/** Alle Formfehler einer Stilvorlage. Leeres Feld = in Ordnung. */
|
||||
function formfehler(text) {
|
||||
const funde = [];
|
||||
const zeileVon = (stelle) => text.slice(0, stelle).split("\n").length;
|
||||
let i = 0, tiefe = 0, puffer = "", pufferAb = 0;
|
||||
|
||||
while (i < text.length) {
|
||||
const c = text[i];
|
||||
|
||||
if (c === "/" && text[i + 1] === "*") {
|
||||
const auf = i;
|
||||
i += 2;
|
||||
while (i < text.length && !(text[i] === "*" && text[i + 1] === "/")) i++;
|
||||
if (i >= text.length) {
|
||||
funde.push({ zeile: zeileVon(auf), was: "ein Kommentar wird nie geschlossen" });
|
||||
break;
|
||||
}
|
||||
i += 2;
|
||||
continue;
|
||||
}
|
||||
if (c === '"' || c === "'") {
|
||||
const q = c; i++;
|
||||
while (i < text.length && text[i] !== q) { if (text[i] === "\\") i++; i++; }
|
||||
i++; continue;
|
||||
}
|
||||
|
||||
if (tiefe === 0) {
|
||||
if (c === "{") { tiefe = 1; puffer = ""; pufferAb = i + 1; i++; continue; }
|
||||
if (c === ";") {
|
||||
/* `@import url(...);` und Geschwister duerfen auf oberster
|
||||
Ebene mit einem Strichpunkt enden. Alles andere nicht. */
|
||||
if (!puffer.trim().startsWith("@")) {
|
||||
funde.push({
|
||||
zeile: zeileVon(pufferAb),
|
||||
was: "eine Angabe steht ausserhalb jeder Regel",
|
||||
beleg: puffer.trim().slice(0, 70).replace(/\s+/g, " "),
|
||||
});
|
||||
}
|
||||
puffer = ""; pufferAb = i + 1; i++; continue;
|
||||
}
|
||||
if (c === "}") {
|
||||
funde.push({ zeile: zeileVon(i), was: "eine schliessende Klammer ohne oeffnende" });
|
||||
puffer = ""; pufferAb = i + 1; i++; continue;
|
||||
}
|
||||
puffer += c; i++; continue;
|
||||
}
|
||||
|
||||
if (c === "{") tiefe++;
|
||||
else if (c === "}") tiefe--;
|
||||
if (tiefe === 0) { puffer = ""; pufferAb = i + 1; }
|
||||
i++;
|
||||
}
|
||||
|
||||
if (tiefe !== 0) {
|
||||
funde.push({ zeile: "Ende", was: `${tiefe} Regel(n) werden nie geschlossen` });
|
||||
}
|
||||
return funde;
|
||||
}
|
||||
|
||||
{
|
||||
const css = readdirSync(join(WS, "assets", "css")).filter((n) => n.endsWith(".css"));
|
||||
/* DRITTER AUSGANG: Ohne Dateien misst die Pruefung nichts, und "0
|
||||
Fehler" waere dann ein gruener Haken fuer gar nichts. */
|
||||
ok(css.length > 20, `${css.length} Stilvorlagen gefunden`);
|
||||
|
||||
const kaputt = [];
|
||||
for (const name of css) {
|
||||
const funde = formfehler(readFileSync(join(WS, "assets", "css", name), "utf8"));
|
||||
for (const f of funde) {
|
||||
kaputt.push(`${name}:${f.zeile} — ${f.was}` + (f.beleg ? ` ("${f.beleg}")` : ""));
|
||||
}
|
||||
}
|
||||
ok(kaputt.length === 0 && css.length > 20,
|
||||
kaputt.length
|
||||
? `${kaputt.length} Stelle(n), an denen CSS still verloren geht:\n `
|
||||
+ kaputt.join("\n ")
|
||||
: `keine Stilvorlage verliert still eine Regel (${css.length} geprueft)`);
|
||||
|
||||
/* GEGENPROBEN: Die Pruefung muss beides koennen -- anschlagen und
|
||||
schweigen. Der vorletzte Fall ist der echte von start.css,
|
||||
Zeichen fuer Zeichen nachgebaut. */
|
||||
const proben = [
|
||||
["gesundes CSS", ".a{b:c} /* } *" + "/ .d[e=';']{f:g}", false],
|
||||
["@import mit Strichpunkt", "@import url(x.css); .a{b:c}", false],
|
||||
["Kommentar ohne Abschluss", ".a{b:c} /* geht nie zu", true],
|
||||
["Angabe ausserhalb jeder Regel", "gap: 12px; .a{b:c}", true],
|
||||
["schliessende Klammer zu viel", ".a{b:c}}", true],
|
||||
["Regel ohne Abschluss", ".a{b:c", true],
|
||||
["der Fall aus start.css", "/* Titel\n ====\n\n.kacheln {\n /* innen *" + "/\n"
|
||||
+ " gap: 12px;\n}\n\n.kachel { color: red; }", true],
|
||||
];
|
||||
const daneben = proben.filter(([, text, soll]) => (formfehler(text).length > 0) !== soll);
|
||||
ok(daneben.length === 0 && proben.length === 7,
|
||||
daneben.length
|
||||
? `Gegenprobe daneben bei: ${daneben.map((p) => p[0]).join(", ")}`
|
||||
: `Gegenprobe: alle ${proben.length} Faelle richtig eingeordnet `
|
||||
+ `(darunter der echte aus start.css)`);
|
||||
}
|
||||
|
||||
console.log(`\n${fehler === 0 ? "ALLES IN ORDNUNG" : `${fehler} FEHLER`}`);
|
||||
process.exit(fehler ? 1 : 0);
|
||||
|
||||
Reference in New Issue
Block a user