diff options
| author | Paul Buetow <paul@buetow.org> | 2025-07-21 23:22:38 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-07-21 23:22:38 +0300 |
| commit | bc1c6e76d5a6ef2623d26d277473c459dd699f81 (patch) | |
| tree | 3bc0c7b4b730d50fb15ae38458037fe2f8ac4b2f /internal/batch/processor.go | |
| parent | a43d503533f301db43af412167fda26364542e27 (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.go | 33 |
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, }) } } |
