summaryrefslogtreecommitdiff
path: root/internal/batch
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-01-21 21:43:40 +0200
committerPaul Buetow <paul@buetow.org>2026-01-21 21:43:40 +0200
commit8a4b935792c50101cf65b36e44f376c90c2d08c1 (patch)
tree2a8288e935fe89738fbc1243253bb638dc2620a8 /internal/batch
parent2bd22f79f739136a7d30cf156979e2f2b23b7c65 (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.go95
-rw-r--r--internal/batch/processor_test.go70
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},
},
},
}