Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a99e792194 | ||
|
|
a7e9332bad | ||
|
|
a373b962d0 |
@@ -13,3 +13,4 @@ server/web/
|
||||
# Die Ablage des Dienstes: Bilder und SQLite. Gehoert ins Volume, nie ins Repo.
|
||||
data/
|
||||
.waechter-basis.json
|
||||
fehlende-item-bilder.txt
|
||||
|
||||
+31
-5
@@ -135,21 +135,47 @@ export function safeFilename(name: string, eindeutig?: string): string {
|
||||
const roh = punkt > 0 ? name.slice(0, punkt) : name
|
||||
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) =>
|
||||
s
|
||||
.toLowerCase()
|
||||
// Umlaute NICHT einfach wegwerfen: "grün" wuerde sonst zu "grn".
|
||||
.replace(/ä/g, 'ae')
|
||||
.replace(/Ä/g, 'Ae')
|
||||
.replace(/ö/g, 'oe')
|
||||
.replace(/Ö/g, 'Oe')
|
||||
.replace(/ü/g, 'ue')
|
||||
.replace(/Ü/g, 'Ue')
|
||||
.replace(/ß/g, 'ss')
|
||||
.replace(/[^a-z0-9._-]+/g, '-')
|
||||
.replace(/[^A-Za-z0-9._-]+/g, '-')
|
||||
.replace(/-{2,}/g, '-')
|
||||
.replace(/^[^a-z0-9]+/, '')
|
||||
.replace(/^[^A-Za-z0-9]+/, '')
|
||||
.replace(/[-.]+$/, '')
|
||||
|
||||
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
|
||||
// kein Fehlerfall fuer den Aufrufer: er bekommt einen erzeugten Namen und
|
||||
|
||||
Reference in New Issue
Block a user