83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package pdfrender
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// SanitizeFilename removes or replaces characters that are problematic in filenames
|
|
func SanitizeFilename(name string) string {
|
|
// Replace umlauts
|
|
replacements := map[string]string{
|
|
"ä": "ae", "Ä": "Ae",
|
|
"ö": "oe", "Ö": "Oe",
|
|
"ü": "ue", "Ü": "Ue",
|
|
"ß": "ss",
|
|
}
|
|
|
|
result := name
|
|
for old, new := range replacements {
|
|
result = strings.ReplaceAll(result, old, new)
|
|
}
|
|
|
|
// Replace problematic characters with underscore
|
|
reg := regexp.MustCompile(`[^a-zA-Z0-9_.-]+`)
|
|
result = reg.ReplaceAllString(result, "_")
|
|
|
|
// Remove consecutive underscores
|
|
reg = regexp.MustCompile(`_+`)
|
|
result = reg.ReplaceAllString(result, "_")
|
|
|
|
// Trim underscores from start and end
|
|
result = strings.Trim(result, "_")
|
|
|
|
return result
|
|
}
|
|
|
|
// GenerateExportFilename creates a filename from character name and timestamp
|
|
func GenerateExportFilename(charName string, timestamp time.Time) string {
|
|
sanitizedName := SanitizeFilename(charName)
|
|
timeStr := timestamp.Format("20060102_150405")
|
|
return sanitizedName + "_" + timeStr + ".pdf"
|
|
}
|
|
|
|
// EnsureExportTempDir creates the export temp directory if it doesn't exist
|
|
func EnsureExportTempDir(dir string) error {
|
|
return os.MkdirAll(dir, 0755)
|
|
}
|
|
|
|
// CleanupOldFiles removes files older than maxAge from the directory
|
|
// Returns the number of files deleted
|
|
func CleanupOldFiles(dir string, maxAge time.Duration) (int, error) {
|
|
entries, err := os.ReadDir(dir)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
count := 0
|
|
cutoff := time.Now().Add(-maxAge)
|
|
|
|
for _, entry := range entries {
|
|
if entry.IsDir() {
|
|
continue
|
|
}
|
|
|
|
filePath := filepath.Join(dir, entry.Name())
|
|
info, err := entry.Info()
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
if info.ModTime().Before(cutoff) {
|
|
if err := os.Remove(filePath); err == nil {
|
|
count++
|
|
}
|
|
}
|
|
}
|
|
|
|
return count, nil
|
|
}
|