Files
dogfather-universe/tools/workspace-stempel.mjs
T
DogFatherGitandClaude Opus 5 d0ac8ee8d1 Das Logo: aus dem Fleck wird wieder ein Hund
Filipe: "kannst du bitte das logo wenn man es installiert auf pc oder
handy und oben rechts in der leiste noch perfektionnieren."

Beide Stellen hatten denselben Fehler, und er war derselbe wie an
mehreren Stellen davor: Der Husky lag als MASKE auf einer Farbflaeche.
Von einer Maske zaehlt nur der Alphakanal, und die Vorlage ist rundum
freigestellt -- uebrig blieb eine geschlossene Flaeche in Hundeform.
Kein Auge, keine Schnauze, kein Ohrinneres. Ein Fleck.

Jetzt liegt an beiden Stellen dieselbe Zeichnung im Mischmodus "screen"
ueber einer stahlblauen Silhouette: Schwarz laesst das Fell dunkel,
Weiss hebt Gesicht, Ohren und Auge heraus. Gleiche Farben, gleicher
Daempfer (.88) -- ein Zeichen, zwei Orte.

App-Symbol ausserdem:
- Die Chili lief mit ihrem Stiel quer ueber den Fang. Sie ist jetzt
  gespiegelt, kleiner und liegt hinter dem Hals.
- Der Hals endete in einer geraden Kante (die Vorlage ist unten
  angeschnitten). Eine zweite Maske blendet ihn aus, statt ihn
  abzuschneiden.
- Der Grund war matschig: Rot und Blau trafen sich diagonal genau dort,
  wo der Kopf steht. Jetzt kaltes Licht oben, warmes unten.
- Unter 64 px faellt die Gesichtszeichnung weg, die Chili aber NICHT --
  klein erkennt man ein Zeichen zuerst an der Farbe.
- Alle Masse haengen an einer Zahl (Groesse der Gruppe), nicht an sechs.

Kopfleiste ausserdem:
- Die Chili links hatte einen BLAUEN Schein -- aus der Zeit, als dort
  der Husky stand. Der Schein ist nie mitgewandert. Jetzt warm.
- `filter` ersetzt, es ergaenzt nicht: Beim Ueberfahren wurde der Schein
  geloescht und das Zeichen dabei flacher statt heller. Behoben.

Damit die Aenderung auch ankommt:
- Der Stempel gilt jetzt auch fuer die App-Symbole und fuer das
  Manifest. Bilder werden einen Tag zwischengespeichert, das Symbol der
  INSTALLIERTEN App gar nicht neu geholt -- ohne Stempel haette niemand
  das neue Zeichen gesehen.
- pruef-zwischenspeicher prueft das (18 -> 21 Pruefungen).

Werkzeuge:
- tools/ausschnitt.mjs (neu): schneidet aus einem Bildschirmfoto ein
  Stueck heraus und vergroessert die PNG-Datei. Noetig, weil eine
  Vergroesserung per CSS-transform den Browser NEU rechnen laesst --
  ich habe damit 264 px beurteilt und geglaubt, es seien 22, und daraus
  den falschen Schluss gezogen, ein Gesicht trage bei 22 px nicht.
- tools/ansicht.mjs: AUSSCHNITT=<selektor> nimmt nur ein Element auf.
- workspace-symbol.mjs: SYMBOL_ZIEL lenkt die Ausgabe um (Entwuerfe
  ansehen, ohne die sechs echten Dateien zu ueberschreiben), und zwei
  Gegenproben pruefen jetzt, dass Gesicht und Chili wirklich zu sehen
  sind -- die alte Pruefung sagte nur "es steht etwas drauf" und haette
  den Fleck anstandslos durchgewunken.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 18:24:20 +02:00

114 lines
4.6 KiB
JavaScript

/* =====================================================================
workspace-stempel.mjs — Versionsstempel an die Workspace-Dateien.
WARUM ES DAS GIBT:
Cloudflare speichert JS und CSS vier Stunden im Browser -- es
ueberschreibt damit das "no-cache", das der Server korrekt schickt.
Nach einem Deploy sah man deshalb bis zu vier Stunden lang die ALTE
Oberflaeche, obwohl der Server laengst die neue auslieferte. Genau so
ist es passiert: eine neue Kachel war live, aber nicht sichtbar.
Die HTML-Seiten kommen dagegen immer frisch an (no-cache, DYNAMIC).
Deshalb genuegt es, in der HTML einen Stempel an die Adressen zu
haengen: Neue Seite -> neue Adresse -> Cloudflare kennt sie nicht ->
frische Datei. Ohne Cloudflare-Einstellung, ohne Zutun von aussen.
Der Stempel ist die Minute des Aufrufs. Er wird bei jedem Lauf neu
gesetzt, auch wenn schon einer dasteht.
AUFRUF: node tools/workspace-stempel.mjs
Gehoert vor jeden Deploy, der JS oder CSS im Workspace anfasst.
===================================================================== */
import { readdirSync, readFileSync, writeFileSync } from "node:fs";
import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url";
const HIER = dirname(fileURLToPath(import.meta.url));
const ORDNER = join(HIER, "..", "workspace");
const d = new Date();
const p = (n) => String(n).padStart(2, "0");
const STEMPEL = `${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}${p(d.getHours())}${p(d.getMinutes())}`;
/* Trifft href="assets/..." und src="assets/..." -- mit oder ohne
vorhandenen Stempel, damit wiederholte Laeufe nicht anhaengen. */
const MUSTER = /(href|src)="(assets\/(?:css|js)\/[A-Za-z0-9._-]+)(?:\?v=\d+)?"/g;
/* ZWEITES MUSTER: DIE APP-SYMBOLE (09.09.2026).
Sie stehen mit absolutem Pfad in der Seite (`/assets/img/app-symbole/…`)
und fielen deshalb durch das Muster oben durch. Der Server gibt Bildern
einen Tag Haltbarkeit -- ein neu gezeichnetes Symbol war damit bis zu
24 Stunden lang unsichtbar, obwohl es ausgeliefert wurde. Genau die
Luecke, die der Stempel eigentlich schliessen soll, nur fuer Bilder
statt fuer Stilvorlagen.
Die Reiter-Kennung und das Apple-Symbol bekommen deshalb denselben
Stempel wie alles andere. Dass es DERSELBE ist, ist wichtig: Die
Pruefung `pruef-zwischenspeicher` verlangt genau einen Stempel im
ganzen Haus, und eine zweite Zahl waere sofort rot. */
const MUSTER_SYMBOL =
/(href)="(\/assets\/img\/app-symbole\/[A-Za-z0-9._-]+)(?:\?v=\d+)?"/g;
let dateien = 0;
let stellen = 0;
for (const name of readdirSync(ORDNER)) {
if (!name.endsWith(".html")) continue;
const pfad = join(ORDNER, name);
const alt = readFileSync(pfad, "utf8");
let n = 0;
const neu = alt
.replace(MUSTER, (_, was, datei) => {
n += 1;
return `${was}="${datei}?v=${STEMPEL}"`;
})
.replace(MUSTER_SYMBOL, (_, was, datei) => {
n += 1;
return `${was}="${datei}?v=${STEMPEL}"`;
});
if (neu !== alt) {
writeFileSync(pfad, neu);
dateien += 1;
stellen += n;
console.log(` ${name.padEnd(20)} ${n} Verweise`);
}
}
/* DAS MANIFEST GEHOERT DAZU (09.09.2026).
Aus ihm holt sich das Betriebssystem das Symbol der installierten App.
Ohne Stempel zeigen Android und Windows nach einer Neuzeichnung
weiter das alte Bild -- die Adresse hat sich ja nicht geaendert, und
ein einmal installiertes Symbol wird nicht von sich aus nachgeladen.
Das Manifest selbst wird ohne Haltbarkeit ausgeliefert, kommt also
frisch an; nur die Adressen darin waren starr.
Derselbe Stempel wie in den Seiten -- `pruef-zwischenspeicher`
verlangt im ganzen Haus genau eine Zahl und wuerde eine zweite sofort
melden. */
const MANIFEST = join(ORDNER, "app.webmanifest");
const MUSTER_MANIFEST =
/("src":\s*")(\/assets\/img\/app-symbole\/[A-Za-z0-9._-]+)(?:\?v=\d+)?(")/g;
{
const alt = readFileSync(MANIFEST, "utf8");
let n = 0;
const neu = alt.replace(MUSTER_MANIFEST, (_, vor, datei, nach) => {
n += 1;
return `${vor}${datei}?v=${STEMPEL}${nach}`;
});
/* Findet das Muster nichts, ist das ein FEHLER und kein Achselzucken:
Dann hat jemand das Manifest umgebaut, und ab da laeuft das Symbol
still auf dem alten Stand weiter. */
if (n === 0) {
console.error("FEHLER: im Manifest keine Symboladresse gefunden -- Muster pruefen.");
process.exit(1);
}
if (neu !== alt) { writeFileSync(MANIFEST, neu); dateien += 1; stellen += n; }
console.log(` app.webmanifest ${n} Verweise`);
}
console.log(`\nStempel ${STEMPEL} auf ${stellen} Verweise in ${dateien} Dateien gesetzt.`);
if (!dateien) console.log("Nichts geaendert -- stimmt das Muster noch?");