diff --git a/server/mess-seiteninhalt.mjs b/server/mess-seiteninhalt.mjs index 2857568a..a54ae415 100644 --- a/server/mess-seiteninhalt.mjs +++ b/server/mess-seiteninhalt.mjs @@ -85,6 +85,36 @@ seite.on("pageerror", (e) => konsole.push("ABSTURZ: " + e.message.slice(0, 160)) await seite.goto(`${BASIS}/workspace/${SEITE}`, { waitUntil: "networkidle" }); await seite.waitForTimeout(1500); +/* Mit SUCHE= wird EIN Element genau vermessen -- Kasten, + Darstellungsart, Umbruchregeln und die Kette darueber. */ +if (process.env.SUCHE) { + const s = await seite.evaluate((suche) => { + const e = [...document.querySelectorAll("*")].find( + (x) => x.children.length === 0 && (x.textContent || "").trim().startsWith(suche)); + if (!e) return null; + const r = e.getBoundingClientRect(); + const st = getComputedStyle(e); + const kette = []; + for (let p2 = e.parentElement; p2 && kette.length < 5; p2 = p2.parentElement) { + const pr = p2.getBoundingClientRect(); + const ps = getComputedStyle(p2); + kette.push(`${p2.tagName.toLowerCase()}.${String(p2.className).split(" ")[0]} ` + + `${Math.round(pr.width)}x${Math.round(pr.height)} ` + + `display:${ps.display} overflow:${ps.overflow} min-width:${ps.minWidth}`); + } + return { + text: (e.textContent || "").trim().slice(0, 30), + kasten: `${Math.round(r.width)}x${Math.round(r.height)} bei ${Math.round(r.left)},${Math.round(r.top)}`, + scroll: `${e.scrollWidth} / client ${e.clientWidth}`, + display: st.display, umbruch: st.overflowWrap, weiss: st.whiteSpace, + schrift: st.fontSize, richtung: st.writingMode, + kette, + }; + }, process.env.SUCHE); + console.log("=== " + process.env.SUCHE + " ==="); + console.log(s ? JSON.stringify(s, null, 2) : "NICHT GEFUNDEN"); +} + const fund = await seite.evaluate(() => ({ text: (document.body.innerText || "").trim(), laenge: (document.body.innerText || "").trim().length, diff --git a/server/pruef-handy.mjs b/server/pruef-handy.mjs index ee3ebdc9..48951cfe 100644 --- a/server/pruef-handy.mjs +++ b/server/pruef-handy.mjs @@ -220,9 +220,48 @@ const messen = () => ({ if (st.display === "none" || st.visibility === "hidden") return false; if (st.textOverflow === "ellipsis") return false; if (st.overflow === "hidden" && st.whiteSpace === "nowrap") return false; + /* ==== NUR WO DIE MESSUNG UEBERHAUPT ETWAS BEDEUTET (25.09.2026) + + `scrollWidth` und `clientWidth` gibt es nur fuer Elemente mit + einem eigenen Kasten. Bei `display: inline` liefert Chromium + fuer `clientWidth` glatt NULL -- und damit ist jeder Text + breiter als sein Kasten. + + GEMELDET WURDE dadurch auf team.html: „Mara" (18>0), „Noch + niemand zugeteilt" (14>0), „Patrick-Maximilian" (18>15). Alle + drei stehen vollstaendig da; sie sind nur inline gesetzt. + + Ein Inline-Element SCHNEIDET auch nichts ab -- es bricht um. + Abgeschnitten wird es erst durch einen Vorfahren mit + `overflow: hidden`, und dann greift die Zeile darueber. + + DER RICHTIGE UMGANG MIT EINER UNGUELTIGEN MESSUNG ist, sie + nicht zu machen -- nicht, ihr Ergebnis zu glauben. */ + if (st.display === "inline") return false; + /* ==== UND WAS FUERS AUGE WEGGENOMMEN IST (25.09.2026) ======== + + Fuer Vorleseprogramme steht auf mehreren Seiten Text da, den + man nicht sieht: ein echtes `