From cd3b1e5b2fab8075303c064ba33996a0250cd6a6 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 18 Jul 2025 19:31:44 +0300 Subject: fix: use timestamp+hash naming for directories in CLI to match GUI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Updated CLI code to use internal.GenerateCardID() for directory names - Changed file naming to match GUI: word.txt, translation.txt, audio.mp3, image.jpg/png - Created internal/utils.go with shared GenerateCardID and SanitizeFilename functions - Fixed all references to use the new naming system consistently - Ensures both CLI and GUI use the same directory and file naming convention 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- internal/utils.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 internal/utils.go (limited to 'internal/utils.go') 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 -- cgit v1.2.3