diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-07-23 12:44:59 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-07-23 12:44:59 +0200 |
| commit | 4273441011c9e29c2d7c387fc008d0b7b82f33d8 (patch) | |
| tree | cbda84e1892c346c784bb9b6a81796b1ccab8626 /internal/bible | |
| parent | ab71c67414666800f19fdd3f6515f15c90cb822e (diff) | |
| download | lectio-4273441011c9e29c2d7c387fc008d0b7b82f33d8.tar.gz lectio-4273441011c9e29c2d7c387fc008d0b7b82f33d8.zip | |
bible: canonical books + alias resolution
Diffstat (limited to 'internal/bible')
| -rw-r--r-- | internal/bible/books.go | 114 | ||||
| -rw-r--r-- | internal/bible/books_test.go | 26 |
2 files changed, 140 insertions, 0 deletions
diff --git a/internal/bible/books.go b/internal/bible/books.go new file mode 100644 index 0000000..045509a --- /dev/null +++ b/internal/bible/books.go @@ -0,0 +1,114 @@ +package bible + +import "strings" + +// canonical English book names, in corpus form. +// aliasSeed maps a canonical name to its accepted aliases (Polish abbrev, Polish +// full name, English abbrev). Ported verbatim from offline_readings book_aliases.py. +var aliasSeed = map[string][]string{ + "Genesis": {"Rdz", "Rodzaju", "Gen"}, + "Exodus": {"Wj", "Wyjścia", "Ex", "Exod"}, + "Leviticus": {"Kpł", "Kapłańska", "Lev"}, + "Numbers": {"Lb", "Liczb", "Num"}, + "Deuteronomy": {"Pwt", "Powtórzonego Prawa", "Deut"}, + "Joshua": {"Joz", "Jozuego", "Jozue"}, + "Judges": {"Sdz", "Sędziów"}, + "Ruth": {"Rt", "Rut"}, + "1 Samuel": {"1 Sm", "1 Samuela"}, + "2 Samuel": {"2 Sm", "2 Samuela"}, + "1 Kings": {"1 Krl", "1 Królewska"}, + "2 Kings": {"2 Krl", "2 Królewska"}, + "1 Chronicles": {"1 Krn", "1 Kronik"}, + "2 Chronicles": {"2 Krn", "2 Kronik"}, + "Ezra": {"Ezd", "Ezdrasza"}, + "Nehemiah": {"Ne", "Nehemiasza"}, + "Tobit": {"Tb", "Tobiasza"}, + "Judith": {"Jdt", "Judyty"}, + "Esther": {"Est", "Estery"}, + "Job": {"Hi", "Hioba"}, + "Psalms": {"Ps", "Psalm", "Psalmy", "Psalmów"}, + "Proverbs": {"Prz", "Przysłów", "Przypowieści"}, + "Ecclesiastes": {"Koh", "Koheleta", "Eklezjastes"}, + "Song of Solomon": {"Pnp", "Pieśń nad Pieśniami", "Pnp"}, + "Wisdom": {"Mdr", "Mądrości", "Księga Mądrości"}, + "Sirach": {"Syr", "Syracha", "Eklezjastyk", "Mądrość Syracha"}, + "Isaiah": {"Iz", "Izajasza"}, + "Jeremiah": {"Jr", "Jeremiasza"}, + "Lamentations": {"Lm", "Lamentacje", "Treny"}, + "Baruch": {"Ba", "Barucha"}, + "Ezekiel": {"Ez", "Ezechiela"}, + "Daniel": {"Dn", "Daniela"}, + "Hosea": {"Oz", "Ozeasza"}, + "Joel": {"Jl", "Joela"}, + "Amos": {"Am", "Amosa"}, + "Obadiah": {"Ab", "Abdiasza"}, + "Jonah": {"Jon", "Jonasza"}, + "Micah": {"Mi", "Micheasza"}, + "Nahum": {"Na", "Nahuma"}, + "Habakkuk": {"Ha", "Habakuka"}, + "Zephaniah": {"So", "Sofoniasza"}, + "Haggai": {"Ag", "Aggeusza"}, + "Zechariah": {"Za", "Zachariasza"}, + "Malachi": {"Ml", "Malachiasza"}, + "1 Maccabees": {"1 Mch", "1 Machabejska", "1 Mach"}, + "2 Maccabees": {"2 Mch", "2 Machabejska", "2 Mach"}, + "Matthew": {"Mt", "Mateusza", "Mateusz"}, + "Mark": {"Mk", "Marka", "Marek"}, + "Luke": {"Łk", "Łukasza", "Łukasz"}, + "John": {"J", "Jan", "Jana"}, + "The Acts": {"Dz", "Dzieje", "Dzieje Apostolskie", "Acts"}, + "Romans": {"Rz", "Rzymian"}, + "1 Corinthians": {"1 Kor", "1 Koryntian"}, + "2 Corinthians": {"2 Kor", "2 Koryntian"}, + "Galatians": {"Ga", "Galatów", "Galacjan"}, + "Ephesians": {"Ef", "Efezjan"}, + "Philippians": {"Flp", "Filipian"}, + "Colossians": {"Kol", "Kolosan"}, + "1 Thessalonians": {"1 Tes", "1 Tesaloniczan"}, + "2 Thessalonians": {"2 Tes", "2 Tesaloniczan"}, + "1 Timothy": {"1 Tm", "1 Tymoteusza"}, + "2 Timothy": {"2 Tm", "2 Tymoteusza"}, + "Titus": {"Tt", "Tytusa"}, + "Philemon": {"Flm", "Filemona"}, + "Hebrews": {"Hbr", "Hebrajczyków", "Żydów"}, + "James": {"Jk", "Jakuba"}, + "1 Peter": {"1 P", "1 Piotra"}, + "2 Peter": {"2 P", "2 Piotra"}, + "1 John": {"1 J", "1 Jana"}, + "2 John": {"2 J", "2 Jana"}, + "3 John": {"3 J", "3 Jana"}, + "Jude": {"Jud", "Judy"}, + "Revelation": {"Ap", "Apokalipsa", "Objawienie"}, +} + +var aliasMap map[string]string // lowercased alias -> canonical +var canonical []string // canonical names for prefix matching + +func init() { + aliasMap = map[string]string{} + seen := map[string]bool{} + for name, aliases := range aliasSeed { + canonical = append(canonical, name) + for _, a := range append([]string{name}, aliases...) { + k := strings.ToLower(a) + if !seen[k] { + seen[k] = true + aliasMap[k] = name + } + } + } +} + +// ResolveBook maps an English name/prefix or a Polish alias to a canonical book. +func ResolveBook(query string) (string, bool) { + q := strings.ToLower(strings.TrimSpace(query)) + if c, ok := aliasMap[q]; ok { // exact alias/name + return c, true + } + for _, name := range canonical { // canonical prefix, len>=2 + if len(q) >= 2 && strings.HasPrefix(strings.ToLower(name), q) { + return name, true + } + } + return "", false +} diff --git a/internal/bible/books_test.go b/internal/bible/books_test.go new file mode 100644 index 0000000..43a67cf --- /dev/null +++ b/internal/bible/books_test.go @@ -0,0 +1,26 @@ +package bible + +import "testing" + +func TestResolveBook(t *testing.T) { + cases := []struct{ in, want string }{ + {"John", "John"}, + {"Joh", "John"}, // English prefix + {"J", "John"}, // Polish abbrev — NOT Joshua + {"Łk", "Luke"}, + {"1 Kor", "1 Corinthians"}, + {"Jana", "John"}, + {"Rodzaju", "Genesis"}, + {"Mdr", "Wisdom"}, + {"Pnp", "Song of Solomon"}, + {"Dz", "The Acts"}, + } + for _, c := range cases { + if got, ok := ResolveBook(c.in); !ok || got != c.want { + t.Errorf("ResolveBook(%q)=%q,%v want %q", c.in, got, ok, c.want) + } + } + if _, ok := ResolveBook("Nonsense"); ok { + t.Error("ResolveBook(Nonsense) should fail") + } +} |
