Compare commits

..
3 Commits
Author SHA1 Message Date
D4rkst3r a99e792194 gitignore: die Arbeitsliste 2026-08-22 23:48:50 +02:00
D4rkst3randClaude Opus 5 a7e9332bad Die Arbeitsliste gehoert nicht ins Repo
fehlende-item-bilder.txt war eine Momentaufnahme fuer den Betreiber und ist
seit der Umbenennung ohnehin ueberholt. Die Datei bleibt lokal liegen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:48:50 +02:00
D4rkst3randClaude Opus 5 a373b962d0 Beim Hochladen bleibt die Schreibweise -- sie war eine stille Verstuemmelung
Der Betreiber setzte in FiveM `inventory:imagepath` auf das Portal, und die
meisten Item-Icons blieben leer. Gemessen:

    WEAPON_COMBATPISTOL.png  -> 404
    weapon_combatpistol.png  -> 200

ox_inventory fragt Item-Bilder unter dem EXAKTEN Item-Namen ab; seine Waffen
heissen WEAPON_*. Der Dienst laeuft auf Linux, dort ist die Schreibweise ein
Unterschied. Zur Gegenprobe die mitgelieferten Bilder von ox_inventory selbst:
113 von 198 sind grossgeschrieben.

Die Ursache lag hier: `zaehmen()` machte beim Hochladen per Fenster jeden
Namen klein -- "vorhersagbar". Fuer die ZEICHEN war das richtig (Leerzeichen,
Klammern, Umlaute haben in einer Adresse nichts verloren), fuer die
SCHREIBWEISE war es nie noetig: checkPath erlaubt [A-Za-z0-9] seit jeher, und
in einer URL ist ein Grossbuchstabe kein Problem.

Also bleibt die Schreibweise jetzt stehen. Umlaute werden weiter ersetzt, nun
in beiden Formen -- sonst wuerde aus "Gruen.png" ein "gr-n.png", dieselbe
stille Verstuemmelung eine Ebene tiefer. Die ENDUNG bleibt klein: daran haengt
nur der Dateityp, und ".PNG" waere eine Adresse, die niemand so tippt.

Dazu 109 vorhandene Bilder umbenannt (ueber moveFile, damit Vorschau und WebP
mitwandern; jede Umbenennung steht im Ereignisprotokoll). Vorher: 0 Kollisionen
im Trockenlauf. Nachher gemessen: WEAPON_COMBATPISTOL 200, und 156 von 226
Items haben ein exakt passendes Bild statt 47.

EIGENER FEHLER, DER DAS VERZOEGERT HAT: mein erster Abgleich verglich beide
Seiten kleingeschrieben und hat damit genau den Unterschied wegnormalisiert,
auf den es ankam -- ich meldete 56 leere Felder statt 174. Eine Pruefung, die
das Falsche misst, ist schlimmer als keine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:48:36 +02:00
2 changed files with 32 additions and 5 deletions
+1
View File
@@ -13,3 +13,4 @@ server/web/
# Die Ablage des Dienstes: Bilder und SQLite. Gehoert ins Volume, nie ins Repo. # Die Ablage des Dienstes: Bilder und SQLite. Gehoert ins Volume, nie ins Repo.
data/ data/
.waechter-basis.json .waechter-basis.json
fehlende-item-bilder.txt
+31 -5
View File
@@ -135,21 +135,47 @@ export function safeFilename(name: string, eindeutig?: string): string {
const roh = punkt > 0 ? name.slice(0, punkt) : name const roh = punkt > 0 ? name.slice(0, punkt) : name
const endung = punkt > 0 ? name.slice(punkt + 1) : '' const endung = punkt > 0 ? name.slice(punkt + 1) : ''
// DIE SCHREIBWEISE BLEIBT, seit dem 22.08.2026.
//
// Hier stand `.toLowerCase()` mit der Begruendung "vorhersagbar". Das war
// fuer die Zeichen richtig und fuer die GROSSSCHREIBUNG falsch, und es hat
// etwas kaputtgemacht, das niemand mit dem Hochladen in Verbindung brachte:
//
// ox_inventory fragt Item-Bilder unter dem EXAKTEN Item-Namen ab. Seine
// Waffen heissen WEAPON_COMBATPISTOL. Der Ordner lag auf einem
// Linux-Wirt, dort ist Gross- und Kleinschreibung ein Unterschied --
// also 404, also leeres Feld im Inventar. Gemessen am 22.08.2026:
// 109 von 226 Items betroffen, und ox_inventory liefert seine eigenen
// Bilder genau deshalb GROSS aus (113 von 198).
//
// Der Grund fuer das Zaehmen bleibt richtig -- Leerzeichen, Klammern und
// Umlaute haben in einer Adresse nichts verloren. Nur die Schreibweise
// gehoerte nie dazu: `checkPath` erlaubt `[A-Za-z0-9]` seit jeher, und in
// einer URL ist ein Grossbuchstabe kein Problem.
//
// Umlaute werden weiterhin ersetzt, jetzt in beiden Schreibweisen -- sonst
// wuerde aus "Gruen.png" ein "gr-n.png", und das waere dieselbe stille
// Verstuemmelung eine Ebene tiefer.
const zaehmen = (s: string) => const zaehmen = (s: string) =>
s s
.toLowerCase()
// Umlaute NICHT einfach wegwerfen: "grün" wuerde sonst zu "grn".
.replace(/ä/g, 'ae') .replace(/ä/g, 'ae')
.replace(/Ä/g, 'Ae')
.replace(/ö/g, 'oe') .replace(/ö/g, 'oe')
.replace(/Ö/g, 'Oe')
.replace(/ü/g, 'ue') .replace(/ü/g, 'ue')
.replace(/Ü/g, 'Ue')
.replace(/ß/g, 'ss') .replace(/ß/g, 'ss')
.replace(/[^a-z0-9._-]+/g, '-') .replace(/[^A-Za-z0-9._-]+/g, '-')
.replace(/-{2,}/g, '-') .replace(/-{2,}/g, '-')
.replace(/^[^a-z0-9]+/, '') .replace(/^[^A-Za-z0-9]+/, '')
.replace(/[-.]+$/, '') .replace(/[-.]+$/, '')
const stamm = zaehmen(roh) const stamm = zaehmen(roh)
const ende = zaehmen(endung) // DIE ENDUNG BLEIBT KLEIN. Am Stamm haengt die Bedeutung -- an der Endung
// haengt nur der Dateityp, und die schreibt alle Welt klein. Wer
// "Bild.PNG" hochlaedt, will kein zweites Format, sondern ein PNG; ein
// ".PNG" waere eine Adresse, die niemand so tippt.
const ende = zaehmen(endung).toLowerCase()
// Bleibt nichts uebrig — etwa bei einem rein kyrillischen Namen —, ist das // Bleibt nichts uebrig — etwa bei einem rein kyrillischen Namen —, ist das
// kein Fehlerfall fuer den Aufrufer: er bekommt einen erzeugten Namen und // kein Fehlerfall fuer den Aufrufer: er bekommt einen erzeugten Namen und