diff --git a/server/pruef-handy-teamdogi.mjs b/server/pruef-handy-teamdogi.mjs index 229a97c6..39e5b3b3 100644 --- a/server/pruef-handy-teamdogi.mjs +++ b/server/pruef-handy-teamdogi.mjs @@ -316,12 +316,39 @@ const messen = () => { /* NUR-FUER-VORLESEPROGRAMME IST KEIN FEHLER. Solche Elemente sind absichtlich 1 px groß und weggeschnitten -- sie als „zu klein" zu melden wäre ein Fehlalarm, der die echten Funde zudeckt. */ - const nurVorlesen = (e) => { + /* WER IN EINEM ABGEKLEMMTEN KASTEN SITZT, IST SELBST ABGEKLEMMT + (geschaerft 29.09.2026). + + Gemeldet wurde `a.zurueck „Team Dogi…" 0 statt 82px` auf + notizen.html. Das ist kein Mangel, sondern Absicht: Auf schmalen + Schirmen setzt start.css `.kopfleiste .marke__text` auf 1x1 + Pixel mit `clip-path: inset(50%)` -- das uebliche Muster fuer + „bleibt fuer Vorleseprogramme, verschwindet fuer das Auge". + Daneben steht der Grund: Der Text steht auf jeder Seite zwei + Zeilen tiefer noch einmal als Ueberschrift. + + Die Erkennung sah nur das Element SELBST an. Der Link darin ist + 0 Pixel breit, aber eine Zeile hoch -- also fiel er durch beide + Bedingungen und wurde gemeldet. Sie steigt jetzt die Kette der + Vorfahren hoch. + + DAS MACHT DIE REGEL SCHAERFER, NICHT LAXER: Ausgenommen wird + nur, was in einem nachweislich abgeklemmten Kasten sitzt. Ein + Name, der in einer normalen Kopfzeile auf null gequetscht wird + -- der echte Fund vom 20.09. -- hat keinen solchen Vorfahren + und wird weiter gemeldet. */ + const abgeklemmt = (e) => { const st = getComputedStyle(e); const r = e.getBoundingClientRect(); return (r.width <= 2 && r.height <= 2) || st.clipPath === "inset(50%)" || st.clip === "rect(0px, 0px, 0px, 0px)"; }; + const nurVorlesen = (e) => { + for (let k = e; k && k !== document.body; k = k.parentElement) { + if (abgeklemmt(k)) return true; + } + return false; + }; const alle = [...document.querySelectorAll("body *")]; const bedienbar = [...document.querySelectorAll(BEDIENBAR)] @@ -785,6 +812,35 @@ melde("\n --- Gegenprobe (beide Fehler MÜSSEN gefunden werden) ---"); stumm.textContent = "o"; stumm.style.cssText = "width:8px;height:8px;pointer-events:none"; document.body.append(stumm); + + /* ---- UND DIE AUSNAHME VOM 29.09.2026 ------------------------- + (c) Zerquetschter Text IN einem abgeklemmten Kasten -- darf + NICHT gemeldet werden. So steht der Markentext in der + Kopfleiste auf schmalen Schirmen: 1x1 Pixel mit + `clip-path: inset(50%)`, damit er fuer Vorleseprogramme + bleibt und fuer das Auge verschwindet. + (d) DERSELBE TEXT OHNE ABGEKLEMMTEN KASTEN -- muss gemeldet + werden. Ohne dieses Paar waere die neue Ausnahme nicht + geprueft, sondern nur behauptet: Eine Regel, die enger + misst, kann zu eng sein, und dann faellt echter Schaden + durch. */ + const huelle = document.createElement("div"); + huelle.style.cssText = "position:absolute;width:1px;height:1px;" + + "overflow:hidden;clip-path:inset(50%);white-space:nowrap"; + const leise = document.createElement("span"); + leise.id = "gp-leise"; + leise.textContent = "Nur fuer Vorleseprogramme, nicht fuers Auge"; + huelle.append(leise); + document.body.append(huelle); + + const eng = document.createElement("div"); + eng.style.cssText = "width:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"; + const laut = document.createElement("span"); + laut.id = "gp-laut"; + laut.textContent = "Dieser Name ist wirklich zerquetscht worden"; + laut.style.cssText = "display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"; + eng.append(laut); + document.body.append(eng); }); const g = await seite.evaluate(messen); const ok1 = g.ueberstand.length > 0; @@ -794,12 +850,19 @@ melde("\n --- Gegenprobe (beide Fehler MÜSSEN gefunden werden) ---"); der stumme Knopf. */ const ok3 = !g.ueberstand.some((x) => /9\d\dpx/.test(x)); const ok4 = !g.klein.some((x) => /\b8×8\b/.test(x)); + /* Das Paar vom 29.09.: der abgeklemmte Text darf NICHT auftauchen, + der daneben MUSS. Nur beides zusammen beweist, dass die neue + Ausnahme genau greift und nicht weiter. */ + const ok5 = g.zerquetscht.some((x) => /gp-laut/.test(x)); + const ok6 = !g.zerquetscht.some((x) => /gp-leise/.test(x)); melde(` ${ok1 ? "ok " : "FEHL"} ein zu breites Element wird gemeldet (${g.ueberstand.join(", ") || "nichts"})`); melde(` ${ok2 ? "ok " : "FEHL"} ein zu kleiner Knopf wird gemeldet (${g.klein.join(", ") || "nichts"})`); melde(` ${ok3 ? "ok " : "FEHL"} was in einem rollenden Kasten steht, NICHT`); melde(` ${ok4 ? "ok " : "FEHL"} was keine Klicks annimmt, auch NICHT`); - if (!ok1 || !ok2) { fehler += 1; probleme.push("GEGENPROBE VERSAGT — die Messung findet nichts mehr"); } - if (!ok3 || !ok4) { fehler += 1; probleme.push("GEGENPROBE VERSAGT — die Messung meldet Absicht als Fehler"); } + melde(` ${ok5 ? "ok " : "FEHL"} zerquetschter Text wird gemeldet (${g.zerquetscht.join(", ") || "nichts"})`); + melde(` ${ok6 ? "ok " : "FEHL"} was nur fuer Vorleseprogramme dasteht, NICHT`); + if (!ok1 || !ok2 || !ok5) { fehler += 1; probleme.push("GEGENPROBE VERSAGT — die Messung findet nichts mehr"); } + if (!ok3 || !ok4 || !ok6) { fehler += 1; probleme.push("GEGENPROBE VERSAGT — die Messung meldet Absicht als Fehler"); } await kontext.close(); }