aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-07-23 12:44:59 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-07-23 12:44:59 +0200
commit4273441011c9e29c2d7c387fc008d0b7b82f33d8 (patch)
treecbda84e1892c346c784bb9b6a81796b1ccab8626 /internal
parentab71c67414666800f19fdd3f6515f15c90cb822e (diff)
downloadlectio-4273441011c9e29c2d7c387fc008d0b7b82f33d8.tar.gz
lectio-4273441011c9e29c2d7c387fc008d0b7b82f33d8.zip
bible: canonical books + alias resolution
Diffstat (limited to 'internal')
-rw-r--r--internal/bible/books.go114
-rw-r--r--internal/bible/books_test.go26
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")
+ }
+}