summaryrefslogtreecommitdiff
path: root/internal/batch/processor.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-07-21 23:22:38 +0300
committerPaul Buetow <paul@buetow.org>2025-07-21 23:22:38 +0300
commitbc1c6e76d5a6ef2623d26d277473c459dd699f81 (patch)
tree3bc0c7b4b730d50fb15ae38458037fe2f8ac4b2f /internal/batch/processor.go
parenta43d503533f301db43af412167fda26364542e27 (diff)
feat: Enhanced bulk import, archive functionality, and export improvements
## Bulk Import Enhancements - Added support for three flexible batch file formats: - `BULGARIAN = ENGLISH` - Both provided, no translation needed - `= ENGLISH` - Only English provided, auto-translated to Bulgarian - `BULGARIAN` - Only Bulgarian provided, auto-translated to English - Implemented smart file checking to skip already processed words - Check all required files (word.txt, translation.txt, phonetic.txt, audio/image files and their attribution/metadata) - Added batch processing summary with statistics ## Archive Functionality - Renamed --clear flag to --archive for clarity - Archive cards directory to ~/.local/state/totalrecall/archive/cards-TIMESTAMP - Added archive button to GUI toolbar with folder icon - Archive confirmation dialog supports keyboard shortcuts (y/n/c/ESC) ## Export Improvements - Anki exports now show full file path in output - Changed default export location to home directory (~) for both CLI and GUI - Auto-adjust image size to 1024x1024 when DALL-E 3 is selected ## Other Improvements - Added TranslateEnglishToBulgarian method for reverse translation - Enhanced batch processing with better error handling and progress reporting - Improved file integrity checking for complete word processing 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <noreply@opencode.ai>
Diffstat (limited to 'internal/batch/processor.go')
-rw-r--r--internal/batch/processor.go33
1 files changed, 24 insertions, 9 deletions
diff --git a/internal/batch/processor.go b/internal/batch/processor.go
index 75a38aa..0b20179 100644
--- a/internal/batch/processor.go
+++ b/internal/batch/processor.go
@@ -10,12 +10,15 @@ import (
type WordEntry struct {
Bulgarian string
Translation string
+ // NeedsTranslation indicates if translation from English to Bulgarian is needed
+ NeedsTranslation bool
}
// ReadBatchFile reads words from a file and returns WordEntry slice
// Supports formats:
-// - Bulgarian word only: "ябълка"
-// - With translation: "ябълка = apple"
+// - Bulgarian word only: "ябълка" (will be translated to English)
+// - With translation: "ябълка = apple" (both provided, no translation needed)
+// - English only: "= apple" (will be translated to Bulgarian)
func ReadBatchFile(filename string) ([]WordEntry, error) {
content, err := os.ReadFile(filename)
if err != nil {
@@ -27,24 +30,36 @@ func ReadBatchFile(filename string) ([]WordEntry, error) {
for _, line := range splitLines(lines) {
if line = trimSpace(line); line != "" {
- // Check if line contains '=' for bulgarian = english format
+ // Check if line contains '=' for translation format
if strings.Contains(line, "=") {
parts := strings.SplitN(line, "=", 2)
if len(parts) == 2 {
bulgarian := strings.TrimSpace(parts[0])
english := strings.TrimSpace(parts[1])
- if bulgarian != "" {
+
+ if bulgarian == "" && english != "" {
+ // Format: "= ENGLISH" - need to translate English to Bulgarian
+ entries = append(entries, WordEntry{
+ Bulgarian: "", // Will be filled by translation
+ Translation: english,
+ NeedsTranslation: true,
+ })
+ } else if bulgarian != "" && english != "" {
+ // Format: "BULGARIAN = ENGLISH" - both provided
entries = append(entries, WordEntry{
- Bulgarian: bulgarian,
- Translation: english,
+ Bulgarian: bulgarian,
+ Translation: english,
+ NeedsTranslation: false,
})
}
+ // Ignore lines with empty English part
}
} else {
- // Just a bulgarian word
+ // Just a Bulgarian word - needs translation to English
entries = append(entries, WordEntry{
- Bulgarian: line,
- Translation: "",
+ Bulgarian: line,
+ Translation: "",
+ NeedsTranslation: false,
})
}
}