summaryrefslogtreecommitdiff
path: root/internal/utils.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/utils.go')
-rw-r--r--internal/utils.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/internal/utils.go b/internal/utils.go
new file mode 100644
index 0000000..779b95a
--- /dev/null
+++ b/internal/utils.go
@@ -0,0 +1,43 @@
+package internal
+
+import (
+ "crypto/md5"
+ "encoding/hex"
+ "fmt"
+ "time"
+)
+
+// GenerateCardID creates a unique ID for a card based on timestamp and Bulgarian word
+// Format: epochMillis_md5(word)[:8]
+func GenerateCardID(bulgarianWord string) string {
+ // Get current timestamp in milliseconds
+ now := time.Now()
+ epochMillis := now.UnixNano() / 1000000
+
+ // Calculate MD5 hash of the word
+ hash := md5.Sum([]byte(bulgarianWord))
+ hashStr := hex.EncodeToString(hash[:])[:8] // Use first 8 chars of MD5
+
+ // Combine timestamp and hash
+ return fmt.Sprintf("%d_%s", epochMillis, hashStr)
+}
+
+// SanitizeFilename creates a safe filename from a string
+func SanitizeFilename(s string) string {
+ result := ""
+ for _, r := range s {
+ if isAlphaNumeric(r) || r == '-' || r == '_' {
+ result += string(r)
+ } else {
+ result += "_"
+ }
+ }
+ return result
+}
+
+// isAlphaNumeric checks if a rune is alphanumeric
+func isAlphaNumeric(r rune) bool {
+ return (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') ||
+ (r >= '0' && r <= '9') || (r >= 'а' && r <= 'я') ||
+ (r >= 'А' && r <= 'Я')
+} \ No newline at end of file