Files
dogfather-universe/aktion-detail.html
T
DogFatherGitandClaude Opus 5 1afb38258c Anfuehrungszeichen: drei Loecher in meiner eigenen Wache
Die zweite Sitzung hat in den Praesentationen des Vaults 83 Stellen
gefunden — und damit auf Loecher in MEINER Wache gezeigt. Ich habe
sie nachgemessen, alle drei waren echt.

LOCH 1 — SIE SAH NUR `server/workspace-*.js`

Also ausgerechnet nicht `workspace.js`, die groesste Datei des
Hauses. Der weitere Filter fand dort sofort drei Stellen:

    workspace.js:3404  Kanal „Chat-Moderation"     (Protokoll)
    workspace.js:3422  „${titel}" -> ${haus}       (Protokoll)
    workspace.js:3304  „${… || "ohne Titel"}"      (siehe Loch 3)

Das ist heute der DRITTE Fall von „die Wache kennt nur die halbe
Menge" — nach pruef-struktur (sah nur die Pruefdateien, nicht die
Anwendung) und pruef-fingermass (sah keine variable Breite).

LOCH 2 — IHR AUSDRUCK GILT JE ZEILE

Ein `„`, das erst in der naechsten Zeile mit einem geraden `"`
schliesst, fiel durch. Gemessen: drei echte Faelle, zwei davon
sichtbarer Seitentext.

    workspace/leistung.html       „nicht / zugeordnet"
    workspace/leistung.html       „Backstage-Tabelle / einfuegen"
    workspace/assets/js/ampel.js  „noch ' + 'verbessern"

Beim letzten laeuft das Zitat ueber eine Zeichenketten-Verkettung.

Neue Regel ohne Fehlalarme: erst alle RICHTIG geschlossenen Paare
entfernen (auch mehrzeilig), dann die einzeilig falschen (die meldet
die alte Regel). Was danach noch ein `„` hat und binnen drei Zeilen
ein gerades `"`, ist ein Fund. Ausgenommen bleibt das Zeichen ALS
WERT — in `content: "„";` und in den Sprachtabellen ist das `„` der
Inhalt und das `"` die Begrenzung.

LOCH 3 — EINE AUSNAHME, DIE EINEN FUND VERSCHLUCKT HAT

Gefunden durch die ZAHL, nicht durch den Blick: Der weitere Filter
liess die Ausnahmen von 12 auf 13 steigen. Die dreizehnte war

    `… „${zeile[titelSpalte] || "ohne Titel"}"`

Der Ausdruck blieb am `"` von `"ohne Titel"` haengen; als Inhalt kam
`${zeile[titelSpalte] || ` heraus, das endet auf ein Leerzeichen,
und damit galt „der Satz geht in der naechsten Zeile weiter". Das
echte Schlusszeichen stand hinter dem `}` und war gerade.

Dass die Ausnahmen gezaehlt UND genannt werden, hat ihn gefunden.
Genau dafuer steht die Zeile dort.

Behoben an der Wurzel: Anfuehrungszeichen innerhalb einer Einsetzung
`${…}` werden vorher durch X ersetzt, bei gleicher Laenge und
gleichen Zeilenumbruechen. Das nimmt einer ganzen Sorte
Fehlklassifizierung die Grundlage — die Ausnahmen fielen danach von
13 auf 11.

UND EIN VIERTES, BEIM MESSEN AUFGEFALLEN

`„Van-Van”` in assets/js/data-modis.js schliesst mit U+201D, dem
ENGLISCHEN Zeichen. Zweimal, beide Male in einer DEUTSCHEN Zeile
(`de:` und `"de-CH":`) — nicht einmal eine Uebersetzung, in der es
richtig waere. Eigene Regel dafuer, die keine Ausnahme braucht: Wer
mit `„` oeffnet, schliesst deutsch; in fremdsprachigen Zeilen steht
gar kein `„` am Anfang.

DIE AUSNAHMEZAHL IST JETZT STRENG. Sie stand auf „hoechstens 12" —
damit waere der Anstieg auf 13 nicht aufgefallen. Jetzt genau 11,
wie bei den Grundlinien in pruef-fingermass.

GEPRUEFT: pruef-struktur 68 -> 75 Pruefungen, 0 Fehler. Dazu
leistung-optik 59/0, ampel 47/0, treff 85/0, modi-verborgen 87/0 —
die Seiten, deren Text ich angefasst habe. Steuerzeichen: 830
Dateien, keines. Beide Stempel gesetzt.

Sechs echte Stellen berichtigt, vier neue Gegenproben.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-01 19:28:38 +02:00

114 lines
5.1 KiB
HTML

<!DOCTYPE html>
<html lang="de" data-theme="dogfather">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Aktion — DOGFATHER UNIVERSE</title>
<meta name="description" content="Detailansicht einer Aktion oder eines Projekts von Team Dogi." />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/universe-32.png?v=202610011927" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/universe-180.png?v=202610011927" />
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#065f76" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="DOGFATHER UNIVERSE" />
<meta property="og:title" content="Aktion — DOGFATHER UNIVERSE" />
<meta property="og:description" content="Detailansicht einer Aktion oder eines Projekts von Team Dogi." />
<meta property="og:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<meta property="og:url" content="https://dogfather-universe.com/aktion-detail.html" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Aktion — DOGFATHER UNIVERSE" />
<meta name="twitter:description" content="Detailansicht einer Aktion oder eines Projekts von Team Dogi." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=202610011927" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=202610011927" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=202610011927" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=202610011927" />
</head>
<body>
<div id="site-header"></div>
<main>
<section class="hero">
<div class="container">
<span class="eyebrow" data-i18n="ad_eyebrow">Aktionen &amp; Projekte</span>
<h1 id="aktion-title" data-i18n="ad_loading">Aktion wird geladen …</h1>
<p class="lead worlds" id="aktion-summary"></p>
</div>
</section>
<section class="section-tight">
<div class="container grid grid-2" style="align-items:center;">
<div class="img-placeholder" id="aktion-photo" style="aspect-ratio:4/3;" data-i18n="ad_foto_placeholder">Foto folgt</div>
<div id="aktion-body"></div>
</div>
</section>
<section>
<div class="container text-center">
<a class="btn btn-outline" id="aktion-back" data-i18n="ad_back" href="medien-dogfather.html#events">← Zurück zu allen Events</a>
</div>
</section>
</main>
<div id="site-footer"></div>
<script src="assets/js/data-aktionen.js?v=202610011927"></script>
<script src="assets/js/i18n-aktion-detail.js?v=202610011927"></script>
<script src="assets/js/main.js?v=202610011927"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
const params = new URLSearchParams(location.search);
const id = params.get("id");
const aktion = (window.AKTIONEN || []).find((a) => a.id === id);
const titleEl = document.getElementById("aktion-title");
const summaryEl = document.getElementById("aktion-summary");
const bodyEl = document.getElementById("aktion-body");
const photoEl = document.getElementById("aktion-photo");
const backEl = document.getElementById("aktion-back");
const t = (schluessel) => (window.dogiUebersetzen ? window.dogiUebersetzen(schluessel) : schluessel);
if (!aktion) {
// Diese Aktion existiert nicht — Texte kommen (auch bei Sprachwechsel)
// aus dem seiteneigenen i18n-Wörterbuch statt aus data-i18n, weil sie
// per JS gesetzt werden.
titleEl.removeAttribute("data-i18n");
const renderNichtGefunden = () => {
titleEl.textContent = t("ad_notfound_title");
summaryEl.textContent = t("ad_notfound_summary");
bodyEl.innerHTML = `<p>${t("ad_notfound_body")}</p>`;
};
renderNichtGefunden();
document.addEventListener("dogi-sprache-geaendert", renderNichtGefunden);
return;
}
// Zurück-Button zeigt auf die Events-Sektion der passenden Welt
// (jede Aktion gehört zu DogFather/HasiDog/Casper, siehe data-aktionen.js).
const welt = ["dogfather", "hasidog", "casper"].includes(aktion.welt) ? aktion.welt : "dogfather";
if (backEl) backEl.href = `medien-${welt}.html#events`;
// Titel/Zusammenfassung kommen aus data-aktionen.js (nicht Teil dieser
// i18n-Aufgabe) — data-i18n-Attribut entfernen, damit ein Sprachwechsel
// den geladenen Titel nicht wieder mit dem Lade-Platzhalter überschreibt.
titleEl.removeAttribute("data-i18n");
titleEl.textContent = aktion.title;
summaryEl.textContent = aktion.summary;
bodyEl.innerHTML = `
<span class="badge rank-1">${aktion.tag} · ${aktion.status}</span>
${aktion.description.map((p) => `<p>${p}</p>`).join("")}
`;
if (aktion.photo) {
photoEl.outerHTML = `<img src="${aktion.photo}" alt="${aktion.title}" style="border-radius:var(--radius);" />`;
} else {
photoEl.removeAttribute("data-i18n");
const renderFotoKuerze = () => { photoEl.innerHTML = t("ad_foto_kurze"); };
renderFotoKuerze();
document.addEventListener("dogi-sprache-geaendert", renderFotoKuerze);
}
});
</script>
</body>
</html>