diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-07-28 00:47:16 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-07-28 00:47:16 +0200 |
| commit | e829b48b08c683d9dcef5e4b9502c1c42bc895f1 (patch) | |
| tree | 63afd5857a2a98e476a6d7e8fc10b25056b905eb /internal/caldata/readings.go | |
| parent | 6c320f88cc5659233001894614e39265ca4e6363 (diff) | |
| download | lectio-e829b48b08c683d9dcef5e4b9502c1c42bc895f1.tar.gz lectio-e829b48b08c683d9dcef5e4b9502c1c42bc895f1.zip | |
feat(of): full sanctoral calendar + weekday/memorial readings
Populate the OF General Roman Calendar sanctoral and extend the OF readings to
weekdays and sanctoral days.
Sanctoral calendar (roman-calendar.ini: 29 -> 202 celebrations):
- scripts/gen-sanctoral.go generates it from calapi.inadiutorium.cz (authoritative
General Roman Calendar) -- English name/rank/colour from general-en, Latin from
general-la, Polish from niedziela DayInfo (obligatory celebrations). Fixed dates
the temporal engine already computes are excluded. VALIDATED: my engine's
observed rank agrees with calapi on all 86 obligatory sanctoral days of 2026
(0 mismatches).
Precedence fix (precedence.go): an optional memorial no longer displaces the
weekday as the DEFAULT observed celebration (it sorts below the ferial, shown as
an option) -- matching the General Roman Calendar / calapi.
Readings (of-lectionary.ini: 254 -> 1018 entries) via genlect-of.go:
- Weekday (ferial) 2-year cycle I/II, keyed <ferial-slug>-<WeekdayCycle>, harvested
from niedziela over 2020-2025 (multiple years per cycle; retry-on-failure so a
glitch year never poisons a key; only TRUE ferials + optional-memorial days,
where niedziela shows the ferial).
- Obligatory memorials keyed by their OWN slug (niedziela shows their proper, e.g.
Barnabas -> Acts 11, or the ferial for memorials without a proper) -- never
miskeyed to a ferial position.
- caldata.Readings: OF resolves slug+SundayCycle | slug+WeekdayCycle, else a
memorial falls back to the day's ferial readings.
- Source-glitch normalisation (1J->1 J, PnP->Pnp).
books.ini: canonical names "Song of Solomon" and "The Acts" added as their own
[en] forms (ToEnglishRef emits the canonical; it must resolve). Fixes ~32
cross-chapter Song-of-Songs/Acts citations.
Coverage: 359/365 days of 2026 render (98.4%); 6 residual ferial positions never a
true-ferial in 2020-2025. EF sanctoral and OF psalm renumbering still pending.
Diffstat (limited to 'internal/caldata/readings.go')
| -rw-r--r-- | internal/caldata/readings.go | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/internal/caldata/readings.go b/internal/caldata/readings.go index 2810026..49109f5 100644 --- a/internal/caldata/readings.go +++ b/internal/caldata/readings.go @@ -19,14 +19,37 @@ func Readings(sel calendar.Selection, layers []calendar.Layer, date time.Time, d if len(rs) > 0 { return rs } - // temporal table: EF by slug, OF by slug+cycle. - key := day.Observed.Slug - if sel.Form != "old" && day.SundayCycle != "" { - key = day.Observed.Slug + "-" + day.SundayCycle + // temporal table: EF by bare slug; OF by slug+cycle. Sundays & solemnities + // use the 3-year Sunday cycle (A/B/C); ferial weekdays use the 2-year + // weekday cycle (I/II). Sunday-slugs and weekday-slugs are disjoint, so + // trying both cycle suffixes is unambiguous. + if sel.Form == "old" { + if r := TemporalReadings("old", day.Observed.Slug); len(r) > 0 { + return r + } + } else { + for _, cyc := range []string{day.SundayCycle, day.WeekdayCycle} { + if cyc == "" { + continue + } + if r := TemporalReadings("new", day.Observed.Slug+"-"+cyc); len(r) > 0 { + return r + } + } } - if r := TemporalReadings(sel.Form, key); len(r) > 0 { - return r + // OF: a sanctoral memorial / optional memorial with no proper readings of its + // own reads the FERIAL (weekday) readings of the day -- the ordinary OF rule. + // Compute the pure temporal (no sanctoral) to get the day's ferial slug. + if sel.Form != "old" && day.Observed.Layer != "temporal" && + day.WeekdayCycle != "" && date.Weekday() != time.Sunday { + temp := calendar.Compute(date, sel, nil) + if temp.Observed.Layer == "temporal" { + if r := TemporalReadings("new", temp.Observed.Slug+"-"+day.WeekdayCycle); len(r) > 0 { + return r + } + } } + // EF: a green-season weekday with no proper Mass repeats the preceding Sunday. if sel.Form == "old" && day.Observed.Layer == "temporal" && date.Weekday() != time.Sunday { sun := date.AddDate(0, 0, -int(date.Weekday())) // preceding Sunday (Sunday = 0) sd := calendar.Compute(sun, sel, layers) |
