diff options
| author | Paul Buetow <paul@buetow.org> | 2026-01-21 21:43:40 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-01-21 21:43:40 +0200 |
| commit | 8a4b935792c50101cf65b36e44f376c90c2d08c1 (patch) | |
| tree | 2a8288e935fe89738fbc1243253bb638dc2620a8 /internal/batch | |
| parent | 2bd22f79f739136a7d30cf156979e2f2b23b7c65 (diff) | |
improve: better audio player UI and debugging for bg-bg cards
- Add debug logging to navigation.go to diagnose audio file loading issues
Prints paths being checked and whether files are found
- Improve AudioPlayer UI for Bulgarian-Bulgarian cards:
- Add labels showing 'Front' and 'Back' for bg-bg audio buttons
- Labels only show when audio files are actually loaded
- Better visual distinction between the two playable audios
- Reorganized button layout with VBox for cleaner appearance
- Track bg-bg state in AudioPlayer (isBgBg field)
- Automatically set when back audio file is loaded
- Used to determine when to show labels
This makes it clearer that Bulgarian-Bulgarian cards have two independently
playable audio outputs, and helps debug why audio isn't being loaded.
Diffstat (limited to 'internal/batch')
| -rw-r--r-- | internal/batch/processor.go | 95 | ||||
| -rw-r--r-- | internal/batch/processor_test.go | 70 |
2 files changed, 112 insertions, 53 deletions
diff --git a/internal/batch/processor.go b/internal/batch/processor.go index 0b20179..6867c3c 100644 --- a/internal/batch/processor.go +++ b/internal/batch/processor.go @@ -4,6 +4,8 @@ import ( "fmt" "os" "strings" + + "codeberg.org/snonux/totalrecall/internal" ) // WordEntry represents a word with optional translation @@ -12,6 +14,8 @@ type WordEntry struct { Translation string // NeedsTranslation indicates if translation from English to Bulgarian is needed NeedsTranslation bool + // CardType indicates whether this is en-bg or bg-bg card + CardType internal.CardType } // ReadBatchFile reads words from a file and returns WordEntry slice @@ -19,6 +23,7 @@ type WordEntry struct { // - Bulgarian word only: "ябълка" (will be translated to English) // - With translation: "ябълка = apple" (both provided, no translation needed) // - English only: "= apple" (will be translated to Bulgarian) +// - Bulgarian-Bulgarian: "word1 == definition" (bg-bg card, double equals) func ReadBatchFile(filename string) ([]WordEntry, error) { content, err := os.ReadFile(filename) if err != nil { @@ -30,42 +35,72 @@ func ReadBatchFile(filename string) ([]WordEntry, error) { for _, line := range splitLines(lines) { if line = trimSpace(line); line != "" { - // 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 == "" && 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, - NeedsTranslation: false, - }) - } - // Ignore lines with empty English part + entry := parseBatchLine(line) + if entry != nil { + entries = append(entries, *entry) + } + } + } + + return entries, nil +} + +// parseBatchLine parses a single batch file line and returns the appropriate WordEntry +func parseBatchLine(line string) *WordEntry { + // Check for Bulgarian-Bulgarian format first (double equals ==) + if strings.Contains(line, "==") { + parts := strings.SplitN(line, "==", 2) + if len(parts) == 2 { + bulgarian1 := strings.TrimSpace(parts[0]) + bulgarian2 := strings.TrimSpace(parts[1]) + + if bulgarian1 != "" && bulgarian2 != "" { + return &WordEntry{ + Bulgarian: bulgarian1, + Translation: bulgarian2, + NeedsTranslation: false, + CardType: internal.CardTypeBgBg, } - } else { - // Just a Bulgarian word - needs translation to English - entries = append(entries, WordEntry{ - Bulgarian: line, - Translation: "", + } + } + return nil + } + + // Check for English-Bulgarian format (single equals =) + 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 == "" && english != "" { + // Format: "= ENGLISH" - need to translate English to Bulgarian + return &WordEntry{ + Bulgarian: "", + Translation: english, + NeedsTranslation: true, + CardType: internal.CardTypeEnBg, + } + } else if bulgarian != "" && english != "" { + // Format: "BULGARIAN = ENGLISH" - both provided + return &WordEntry{ + Bulgarian: bulgarian, + Translation: english, NeedsTranslation: false, - }) + CardType: internal.CardTypeEnBg, + } } } + return nil } - return entries, nil + // Just a Bulgarian word - needs translation to English + return &WordEntry{ + Bulgarian: line, + Translation: "", + NeedsTranslation: false, + CardType: internal.CardTypeEnBg, + } } // splitLines splits a string by newlines diff --git a/internal/batch/processor_test.go b/internal/batch/processor_test.go index fd9065b..fc4f7b0 100644 --- a/internal/batch/processor_test.go +++ b/internal/batch/processor_test.go @@ -5,6 +5,8 @@ import ( "path/filepath" "reflect" "testing" + + "codeberg.org/snonux/totalrecall/internal" ) func TestReadBatchFile(t *testing.T) { @@ -30,9 +32,9 @@ func TestReadBatchFile(t *testing.T) { котка = cat куче = dog`, want: []WordEntry{ - {Bulgarian: "ябълка", Translation: "apple", NeedsTranslation: false}, - {Bulgarian: "котка", Translation: "cat", NeedsTranslation: false}, - {Bulgarian: "куче", Translation: "dog", NeedsTranslation: false}, + {Bulgarian: "ябълка", Translation: "apple", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "котка", Translation: "cat", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "куче", Translation: "dog", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, }, }, { @@ -42,10 +44,10 @@ func TestReadBatchFile(t *testing.T) { куче хляб = bread`, want: []WordEntry{ - {Bulgarian: "ябълка", Translation: "", NeedsTranslation: false}, - {Bulgarian: "котка", Translation: "cat", NeedsTranslation: false}, - {Bulgarian: "куче", Translation: "", NeedsTranslation: false}, - {Bulgarian: "хляб", Translation: "bread", NeedsTranslation: false}, + {Bulgarian: "ябълка", Translation: "", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "котка", Translation: "cat", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "куче", Translation: "", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "хляб", Translation: "bread", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, }, }, { @@ -59,25 +61,25 @@ func TestReadBatchFile(t *testing.T) { `, want: []WordEntry{ - {Bulgarian: "ябълка", Translation: "", NeedsTranslation: false}, - {Bulgarian: "котка", Translation: "cat", NeedsTranslation: false}, - {Bulgarian: "куче", Translation: "", NeedsTranslation: false}, + {Bulgarian: "ябълка", Translation: "", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "котка", Translation: "cat", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "куче", Translation: "", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, }, }, { name: "windows line endings", fileContent: "ябълка\r\nкотка = cat\r\nкуче", want: []WordEntry{ - {Bulgarian: "ябълка", Translation: "", NeedsTranslation: false}, - {Bulgarian: "котка", Translation: "cat", NeedsTranslation: false}, - {Bulgarian: "куче", Translation: "", NeedsTranslation: false}, + {Bulgarian: "ябълка", Translation: "", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "котка", Translation: "cat", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "куче", Translation: "", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, }, }, { name: "multiple equals signs", fileContent: `test = word = with = equals`, want: []WordEntry{ - {Bulgarian: "test", Translation: "word = with = equals", NeedsTranslation: false}, + {Bulgarian: "test", Translation: "word = with = equals", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, }, }, { @@ -86,9 +88,9 @@ func TestReadBatchFile(t *testing.T) { = cat = dog`, want: []WordEntry{ - {Bulgarian: "", Translation: "apple", NeedsTranslation: true}, - {Bulgarian: "", Translation: "cat", NeedsTranslation: true}, - {Bulgarian: "", Translation: "dog", NeedsTranslation: true}, + {Bulgarian: "", Translation: "apple", NeedsTranslation: true, CardType: internal.CardTypeEnBg}, + {Bulgarian: "", Translation: "cat", NeedsTranslation: true, CardType: internal.CardTypeEnBg}, + {Bulgarian: "", Translation: "dog", NeedsTranslation: true, CardType: internal.CardTypeEnBg}, }, }, { @@ -100,12 +102,34 @@ func TestReadBatchFile(t *testing.T) { = table стол`, want: []WordEntry{ - {Bulgarian: "ябълка", Translation: "", NeedsTranslation: false}, - {Bulgarian: "котка", Translation: "cat", NeedsTranslation: false}, - {Bulgarian: "", Translation: "dog", NeedsTranslation: true}, - {Bulgarian: "хляб", Translation: "bread", NeedsTranslation: false}, - {Bulgarian: "", Translation: "table", NeedsTranslation: true}, - {Bulgarian: "стол", Translation: "", NeedsTranslation: false}, + {Bulgarian: "ябълка", Translation: "", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "котка", Translation: "cat", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "", Translation: "dog", NeedsTranslation: true, CardType: internal.CardTypeEnBg}, + {Bulgarian: "хляб", Translation: "bread", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "", Translation: "table", NeedsTranslation: true, CardType: internal.CardTypeEnBg}, + {Bulgarian: "стол", Translation: "", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + }, + }, + { + name: "bulgarian-bulgarian format with double equals", + fileContent: `ябълка == плод +котка == домашно животно`, + want: []WordEntry{ + {Bulgarian: "ябълка", Translation: "плод", NeedsTranslation: false, CardType: internal.CardTypeBgBg}, + {Bulgarian: "котка", Translation: "домашно животно", NeedsTranslation: false, CardType: internal.CardTypeBgBg}, + }, + }, + { + name: "mixed en-bg and bg-bg formats", + fileContent: `ябълка = apple +котка == домашно животно +куче = dog +вода == течност`, + want: []WordEntry{ + {Bulgarian: "ябълка", Translation: "apple", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "котка", Translation: "домашно животно", NeedsTranslation: false, CardType: internal.CardTypeBgBg}, + {Bulgarian: "куче", Translation: "dog", NeedsTranslation: false, CardType: internal.CardTypeEnBg}, + {Bulgarian: "вода", Translation: "течност", NeedsTranslation: false, CardType: internal.CardTypeBgBg}, }, }, } |
