From 7b220084cf3951c8cde0582efdfcf628afc64336 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Tue, 28 Jul 2026 12:50:31 +0200 Subject: refactor: remove the niedziela/missalemeum scrapers, bt, traditional_lang The daily view now computes entirely offline (previous commit), so retire the network path and everything that served it: - Delete internal/tradlit (missalemeum) and the niedziela scraper from internal/liturgy (fetch/store/parse + fixtures); keep Section, DayInfo and ExtractCitation. - Remove the "bt" version everywhere (render gatherBT + branches, config, i18n, web form, TUI) and bible.ToEnglishRef (Polish citation converter). A legacy config carrying "bt" migrates to "wuj" on load (config.migrateBT). - Remove the traditional_lang config field and the -g/--lang flag from all three binaries. - Drop the now-dead flags -R/--refresh, -o/--offline, -u/--update, -C/--clean and the harvest/clean commands. - New defaults: versions = wuj,vul,grb,drb; default_version = vul. Update the README (offline-by-design, no harvest/update), help text, and stale niedziela/bt doc comments. Tests updated for the offline reality; go test ./... and go vet ./... are clean, all three binaries build and run offline (OF + EF, compare, web). --- internal/web/render.go | 14 +-- internal/web/render_test.go | 16 +++- internal/web/server.go | 52 ++--------- internal/web/server_test.go | 171 ++++++++++++++--------------------- internal/web/templates/index.html | 4 +- internal/web/templates/settings.html | 7 -- 6 files changed, 95 insertions(+), 169 deletions(-) (limited to 'internal/web') diff --git a/internal/web/render.go b/internal/web/render.go index 2cbf331..3ea52e3 100644 --- a/internal/web/render.go +++ b/internal/web/render.go @@ -191,12 +191,9 @@ func buildColumnViews(secs []liturgy.Section, versions []string, lectionary, lan return views } -// interlinearVersions maps versions through the same bt->wuj substitution -// render.OfflineVersions performs for offline mode: "bt" (niedziela.pl -// paragraph text) carries no verse numbers and cannot interleave, so it is -// dropped, substituting "wuj" (the Polish-language bible version) in its -// place unless "wuj" was already selected. Reuses render.OfflineVersions -// rather than duplicating its two-line transform. +// interlinearVersions maps versions through render.OfflineVersions, which +// substitutes a legacy "bt" with "wuj" (unless "wuj" is already selected). +// Every remaining version is a versified corpus that interleaves cleanly. func interlinearVersions(versions []string) []string { return render.OfflineVersions(versions) } @@ -288,9 +285,8 @@ func webVersionLabel(v, lang string) string { return v } -// readerCorpusVersions are the versions the /reader offers: the four with an -// embedded full-text corpus. "bt" (the niedziela.pl scrape) has no corpus and -// cannot be read chapter-by-chapter. +// readerCorpusVersions are the versions the /reader offers: the four embedded +// full-text corpora. var readerCorpusVersions = []string{"wuj", "vul", "grb", "drb"} // UnionChapters returns the sorted union of chapter numbers a book has across diff --git a/internal/web/render_test.go b/internal/web/render_test.go index c05a83c..39bcc58 100644 --- a/internal/web/render_test.go +++ b/internal/web/render_test.go @@ -80,13 +80,19 @@ func TestThemeCSSGuardRejectsInvalidNames(t *testing.T) { } func TestRenderReadingsEscapesScriptText(t *testing.T) { + // An attacker-controlled version code (?v=... reaches RenderReadings + // unfiltered) flows to render.GatherVersion as both the column label and the + // "(not in %s)" note. RenderReadings must HTML-escape it: it renders through + // html/template, never wrapping untrusted text in template.HTML. + const evil = "" secs := []liturgy.Section{{ - Heading: "Test", - PartID: "pierwsze_czytanie", - Paragraphs: [][]string{{""}}, + Heading: "Ewangelia", + Citation: "J 20, 1. 11-18", + Ref: "John 20:1,11-18", + PartID: "pierwsze_czytanie", }} - html := string(RenderReadings(secs, []string{"bt"}, "new", "horizontal", "pl", liturgy.DayInfo{})) - if strings.Contains(html, "") { + html := string(RenderReadings(secs, []string{evil}, "new", "horizontal", "pl", liturgy.DayInfo{})) + if strings.Contains(html, evil) { t.Errorf("raw