51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
package pdf
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
"unicode"
|
|
|
|
"golang.org/x/text/unicode/norm"
|
|
)
|
|
|
|
// SanitizeFilename transforme une chaîne Unicode en nom de fichier sûr :
|
|
// - supprime les accents (Clément → Clement)
|
|
// - remplace les espaces par des tirets
|
|
// - supprime les caractères interdits (Windows / Unix)
|
|
// - évite les noms vides
|
|
func SanitizeFilename(input string) string {
|
|
if input == "" {
|
|
return "inconnu"
|
|
}
|
|
|
|
// 1) Normalisation Unicode (NFD) pour séparer lettres + accents
|
|
t := norm.NFD.String(input)
|
|
|
|
// 2) Suppression des marques diacritiques (accents)
|
|
sb := strings.Builder{}
|
|
for _, r := range t {
|
|
if unicode.Is(unicode.Mn, r) {
|
|
continue
|
|
}
|
|
sb.WriteRune(r)
|
|
}
|
|
out := sb.String()
|
|
|
|
// 3) Remplacements simples
|
|
out = strings.ReplaceAll(out, " ", "-")
|
|
out = strings.ReplaceAll(out, "_", "-")
|
|
|
|
// 4) Suppression des caractères interdits dans les noms de fichiers
|
|
// Windows + Unix
|
|
re := regexp.MustCompile(`[<>:"/\\|?*\x00-\x1F]`)
|
|
out = re.ReplaceAllString(out, "")
|
|
|
|
// 5) Nettoyage final
|
|
out = strings.Trim(out, "-.")
|
|
if out == "" {
|
|
return "inconnu"
|
|
}
|
|
|
|
return out
|
|
}
|