diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-07-28 08:32:35 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-07-28 08:32:35 +0200 |
| commit | d3b7f41c7a823bda6b7bafae3a156348c4ce687f (patch) | |
| tree | e08f0d74b0c42bcae65247f7d0868d9d5105e7b0 | |
| parent | 1f694889f767dedd84f60d8e0cbccf201c2d123f (diff) | |
| download | lectio-d3b7f41c7a823bda6b7bafae3a156348c4ce687f.tar.gz lectio-d3b7f41c7a823bda6b7bafae3a156348c4ce687f.zip | |
fix(of): recover season-commemorated saints + correct Irenaeus rank
Audit of the OF sanctoral vs calapi's full celebration list (2026-2028) found
saints that calapi only ever shows as 'commemoration' in a privileged season
(Lent, late Advent, the Christmas octave) were dropped by the generator, and
'first-year-wins' froze a stale rank.
- gen-sanctoral.go: map calapi 'commemoration' -> optional memorial; keep the
HIGHEST rank per saint across an expanded 2025-2029 reference span (so a saint
is seen at its true rank on an ordinary weekday, e.g. Polycarp as a memorial
when Feb 23 falls in Ordinary Time).
- Recovers 15 saints: Polycarp, Perpetua & Felicity, John of God, Frances of
Rome, Patrick, Cyril of Jerusalem, Turibius, Isidore, Vincent Ferrer, Peter
Canisius, John of Kanty, Thomas Becket, Sylvester I, and others (197->212).
- Corrects St Irenaeus (June 28) optional -> obligatory memorial (2022 change).
Verified vs calapi per-day 2026-2028: remaining diffs are only the 3 skipped
movable memorials and name-phrasing of temporal days.
| -rw-r--r-- | internal/caldata/roman-calendar.ini | 246 | ||||
| -rw-r--r-- | scripts/gen-sanctoral.go | 47 |
2 files changed, 225 insertions, 68 deletions
diff --git a/internal/caldata/roman-calendar.ini b/internal/caldata/roman-calendar.ini index a11655c..63fd703 100644 --- a/internal/caldata/roman-calendar.ini +++ b/internal/caldata/roman-calendar.ini @@ -61,21 +61,21 @@ name.en = Saint Anthony of Egypt, abbot name.pl = św. Antoniego, opata name.la = S. Antonii, abbatis -[fabian-pope-and-martyr] +[sebastian-martyr] date = 01-20 rank = optional class = saint colour = red -name.en = Saint Fabian, pope and martyr -name.la = S. Fabiani, papae et martyris +name.en = Saint Sebastian, martyr +name.la = S. Sebastiani, martyris -[sebastian-martyr] +[fabian-pope-and-martyr] date = 01-20 rank = optional class = saint colour = red -name.en = Saint Sebastian, martyr -name.la = S. Sebastiani, martyris +name.en = Saint Fabian, pope and martyr +name.la = S. Fabiani, papae et martyris [agnes-virgin-and-martyr] date = 01-21 @@ -255,6 +255,14 @@ name.en = Chair of Saint Peter, apostle name.pl = katedry św. Piotra Apostoła name.la = Cathedrae S. Petri, apostoli +[polycarp-bishop-and-martyr] +date = 02-23 +rank = memorial +class = saint +colour = red +name.en = Saint Polycarp, bishop and martyr +name.la = S. Polycarpi, episcopi et martyris + [casimir] date = 03-04 rank = optional @@ -263,6 +271,46 @@ colour = white name.en = Saint Casimir name.la = S. Casimiri +[saints-perpetua-and-felicity-martyrs] +date = 03-07 +rank = optional +class = saint +colour = violet +name.en = Saints Perpetua and Felicity, martyrs +name.la = Ss. Perpetuae et Felicitatis, martyrum + +[john-of-god-religious] +date = 03-08 +rank = optional +class = saint +colour = violet +name.en = Saint John of God, religious +name.la = S. Ioannis a Deo, religiosi + +[frances-of-rome-religious] +date = 03-09 +rank = optional +class = saint +colour = violet +name.en = Saint Frances of Rome, religious +name.la = S. Franciscae Romanae, religiosae + +[patrick-bishop] +date = 03-17 +rank = optional +class = saint +colour = violet +name.en = Saint Patrick, bishop +name.la = S. Patricii, episcopi + +[cyril-of-jerusalem-bishop-and-doctor] +date = 03-18 +rank = optional +class = saint +colour = violet +name.en = Saint Cyril of Jerusalem, bishop and doctor +name.la = S. Cyrilli Hierosolymitani, episcopi et Ecclesiae doctoris + [joseph-husband-of-the-blessed-virgin-mary] date = 03-19 rank = solemnity @@ -272,6 +320,14 @@ name.en = Saint Joseph Husband of the Blessed Virgin Mary name.pl = św. Józefa, Oblubieńca Najświętszej Maryi Panny name.la = S. IOSEPH, SPONSI B. M. V. +[turibius-of-mogrovejo-bishop] +date = 03-23 +rank = optional +class = saint +colour = violet +name.en = Saint Turibius of Mogrovejo, bishop +name.la = S. Turibii de Mongrovejo, episcopi + [annunciation-of-the-lord] date = 03-25 rank = solemnity @@ -281,6 +337,30 @@ name.en = Annunciation of the Lord name.pl = Zwiastowania Pańskiego name.la = IN ANNUNTIATIONE DOMINI +[francis-of-paola-hermit] +date = 04-02 +rank = optional +class = saint +colour = violet +name.en = Saint Francis of Paola, hermit +name.la = S. Francisci de Paola, eremitae + +[isidore-bishop-and-doctor-of-the-church] +date = 04-04 +rank = optional +class = saint +colour = violet +name.en = Saint Isidore, bishop and doctor of the Church +name.la = S. Isidori, episcopi et Ecclesiae doctoris + +[vincent-ferrer-priest] +date = 04-05 +rank = optional +class = saint +colour = violet +name.en = Saint Vincent Ferrer, priest +name.la = S. Vincentii Ferrer, presbyteri + [john-baptist-de-la-salle-priest] date = 04-07 rank = memorial @@ -289,6 +369,14 @@ colour = white name.en = Saint John Baptist de la Salle, priest name.la = S. Ioannis Baptistae de la Salle, presbyteri +[stanislaus-bishop-and-martyr] +date = 04-11 +rank = memorial +class = saint +colour = red +name.en = Saint Stanislaus, bishop and martyr +name.la = S. Stanislai, episcopi et martyris + [martin-i-pope-and-martyr] date = 04-13 rank = optional @@ -305,21 +393,21 @@ colour = white name.en = Saint Anselm of Canterbury, bishop and doctor of the Church name.la = S. Anselmi, episcopi et Ecclesiae doctoris -[george-martyr] +[adalbert-bishop-and-martyr] date = 04-23 rank = optional class = saint colour = red -name.en = Saint George, martyr -name.la = S. Georgii, martyris +name.en = Saint Adalbert, bishop and martyr +name.la = S. Adalberti, episcopi et martyris -[adalbert-bishop-and-martyr] +[george-martyr] date = 04-23 rank = optional class = saint colour = red -name.en = Saint Adalbert, bishop and martyr -name.la = S. Adalberti, episcopi et martyris +name.en = Saint George, martyr +name.la = S. Georgii, martyris [fidelis-of-sigmaringen-priest-and-martyr] date = 04-24 @@ -396,21 +484,21 @@ name.en = Saints Philip and James, Apostles name.pl = Najświętszej Maryi Panny, Królowej Polski name.la = Ss. Philippi et Iacobi, apostolorum -[pancras-martyr] +[saints-nereus-and-achilleus-martyrs] date = 05-12 rank = optional class = saint colour = red -name.en = Saint Pancras, martyr -name.la = S. Pancratii, martyris +name.en = Saints Nereus and Achilleus, martyrs +name.la = Ss. Nerei et Achillei, martyrum -[saints-nereus-and-achilleus-martyrs] +[pancras-martyr] date = 05-12 rank = optional class = saint colour = red -name.en = Saints Nereus and Achilleus, martyrs -name.la = Ss. Nerei et Achillei, martyrum +name.en = Saint Pancras, martyr +name.la = S. Pancratii, martyris [our-lady-of-fatima] date = 05-13 @@ -461,14 +549,6 @@ colour = white name.en = Saint Rita of Cascia name.la = S. Ritae de Cascia, religiosae -[mary-magdalene-de-pazzi-virgin] -date = 05-25 -rank = optional -class = saint -colour = white -name.en = Saint Mary Magdalene de Pazzi, virgin -name.la = S. Mariae Magdalenae de' Pazzi, virginis - [bede-the-venerable-priest-and-doctor] date = 05-25 rank = optional @@ -485,6 +565,14 @@ colour = white name.en = Saint Gregory VII, pope name.la = S. Gregorii VII, papae +[mary-magdalene-de-pazzi-virgin] +date = 05-25 +rank = optional +class = saint +colour = white +name.en = Saint Mary Magdalene de Pazzi, virgin +name.la = S. Mariae Magdalenae de' Pazzi, virginis + [philip-neri-priest] date = 05-26 rank = memorial @@ -631,7 +719,7 @@ name.la = S. Cyrilli Alexandrini, episcopi et Ecclesiae doctoris [irenaeus-bishop-and-martyr] date = 06-28 -rank = optional +rank = memorial class = saint colour = red name.en = Saint Irenaeus, bishop and martyr @@ -872,14 +960,6 @@ name.en = Transfiguration of the Lord name.pl = Przemienienia Pańskiego name.la = IN TRANSFIGURATIONE DOMINI -[cajetan-priest] -date = 08-07 -rank = optional -class = saint -colour = white -name.en = Saint Cajetan, priest -name.la = S. Caietani, presbyteri - [sixtus-ii-pope-and-companions-martyrs] date = 08-07 rank = optional @@ -888,6 +968,14 @@ colour = red name.en = Saint Sixtus II, pope, and companions, martyrs name.la = Ss. Xysti, papae, et sociorum, martyrum +[cajetan-priest] +date = 08-07 +rank = optional +class = saint +colour = white +name.en = Saint Cajetan, priest +name.la = S. Caietani, presbyteri + [dominic-priest] date = 08-08 rank = memorial @@ -1186,21 +1274,21 @@ name.en = Saint Vincent de Paul, priest name.pl = św. Wincentego à Paulo, prezbitera name.la = S. Vincentii de Paul, presbyteri -[saints-lawrence-ruiz-and-companions-martyrs] +[wenceslaus-martyr] date = 09-28 rank = optional class = saint colour = red -name.en = Saints Lawrence Ruiz and companions, martyrs -name.la = S. Laurentii Ruiz et sociorum, martyrum +name.en = Saint Wenceslaus, martyr +name.la = S. Venceslai, martyris -[wenceslaus-martyr] +[saints-lawrence-ruiz-and-companions-martyrs] date = 09-28 rank = optional class = saint colour = red -name.en = Saint Wenceslaus, martyr -name.la = S. Venceslai, martyris +name.en = Saints Lawrence Ruiz and companions, martyrs +name.la = S. Laurentii Ruiz et sociorum, martyrum [saints-michael-gabriel-and-raphael-archangels] date = 09-29 @@ -1264,14 +1352,6 @@ name.en = Our Lady of the Rosary name.pl = Najświętszej Maryi Panny Różańcowej name.la = B. Mariae Virginis a Rosario -[denis-and-companions-martyrs] -date = 10-09 -rank = optional -class = saint -colour = red -name.en = Saint Denis and companions, martyrs -name.la = Ss. Dionysii, episcopi, et sociorum, martyrum - [john-leonardi-priest] date = 10-09 rank = optional @@ -1280,6 +1360,14 @@ colour = white name.en = Saint John Leonardi, priest name.la = S. Ioannis Leonardi, presbyteri +[denis-and-companions-martyrs] +date = 10-09 +rank = optional +class = saint +colour = red +name.en = Saint Denis and companions, martyrs +name.la = Ss. Dionysii, episcopi, et sociorum, martyrum + [john-xxiii-pope] date = 10-11 rank = optional @@ -1465,21 +1553,21 @@ colour = white name.en = Saint Albert the Great, bishop and doctor name.la = S. Alberti Magni, episcopi et Ecclesiae doctoris -[gertrude-the-great-virgin] +[margaret-of-scotland] date = 11-16 rank = optional class = saint colour = white -name.en = Saint Gertrude the Great, virgin -name.la = S. Gertrudis, virginis +name.en = Saint Margaret of Scotland +name.la = S. Margaritae Scotiae -[margaret-of-scotland] +[gertrude-the-great-virgin] date = 11-16 rank = optional class = saint colour = white -name.en = Saint Margaret of Scotland -name.la = S. Margaritae Scotiae +name.en = Saint Gertrude the Great, virgin +name.la = S. Gertrudis, virginis [elizabeth-of-hungary-religious] date = 11-17 @@ -1516,14 +1604,6 @@ name.en = Saint Cecilia, virgin and martyr name.pl = św. Cecylii, dziewicy i męczennicy name.la = S. Caeciliae, virginis et martyris -[columban-religious] -date = 11-23 -rank = optional -class = saint -colour = white -name.en = Saint Columban, religious -name.la = S. Columbani, abbatis - [clement-i-pope-and-martyr] date = 11-23 rank = optional @@ -1532,6 +1612,14 @@ colour = red name.en = Saint Clement I, pope and martyr name.la = S. Clementis I, papae et martyris +[columban-religious] +date = 11-23 +rank = optional +class = saint +colour = white +name.en = Saint Columban, religious +name.la = S. Columbani, abbatis + [andrew-dung-lac-and-his-companions-martyrs] date = 11-24 rank = memorial @@ -1640,6 +1728,22 @@ colour = white name.en = Saint John of the Cross, priest and doctor name.la = S. Ioannis a Cruce, presbyteri et Ecclesiae doctoris +[peter-canisius-priest-and-doctor] +date = 12-21 +rank = optional +class = saint +colour = violet +name.en = Saint Peter Canisius, priest and doctor +name.la = S. Petri Canisii, presbyteri et Ecclesiae doctoris + +[john-of-kanty-priest] +date = 12-23 +rank = optional +class = saint +colour = violet +name.en = Saint John of Kanty, priest +name.la = S. Ioannis de Kęty, presbyteri + [stephen-the-first-martyr] date = 12-26 rank = feast @@ -1665,3 +1769,19 @@ class = saint colour = red name.en = Holy Innocents, martyrs name.la = Ss. Innocentium, martyrum + +[thomas-becket-bishop-and-martyr] +date = 12-29 +rank = optional +class = saint +colour = white +name.en = Saint Thomas Becket, bishop and martyr +name.la = S. Thomae Becket, episcopi et martyris + +[sylvester-i-pope] +date = 12-31 +rank = optional +class = saint +colour = white +name.en = Saint Sylvester I, pope +name.la = S. Silvestri I, papae diff --git a/scripts/gen-sanctoral.go b/scripts/gen-sanctoral.go index 6d81d66..db2e490 100644 --- a/scripts/gen-sanctoral.go +++ b/scripts/gen-sanctoral.go @@ -61,11 +61,32 @@ func fetchMonth(cal string, y, m int) ([]calDay, error) { } var ( - rankMap = map[string]calendar.Rank{"solemnity": calendar.RankSolemnity, "feast": calendar.RankFeast, "memorial": calendar.RankMemorial, "optional memorial": calendar.RankOptional} + // "commemoration" is calapi's rank for a saint reduced to a commemoration by a + // privileged season (Lent, late Advent, the Christmas octave). Such a saint is + // never the observed day, so it maps to an optional memorial for lectio; its + // true (higher) rank is recovered from a year where its date is an ordinary + // weekday (see rankBand + the highest-rank-wins merge below). + rankMap = map[string]calendar.Rank{"solemnity": calendar.RankSolemnity, "feast": calendar.RankFeast, "memorial": calendar.RankMemorial, "optional memorial": calendar.RankOptional, "commemoration": calendar.RankOptional} slugStripRe = regexp.MustCompile(`[^a-z0-9]+`) plPrefixRe = regexp.MustCompile(`^(?:Uroczystość|Święto|Wspomnienie(?: obowiązkowe)?)\s+`) ) +// rankBand orders OF ranks for the highest-rank-wins merge (higher = higher rank). +func rankBand(r calendar.Rank) int { + switch r { + case calendar.RankSolemnity: + return 5 + case calendar.RankFeast: + return 4 + case calendar.RankMemorial: + return 3 + case calendar.RankOptional: + return 2 + default: + return 0 + } +} + func slugify(title string) string { s := strings.ToLower(title) s = strings.NewReplacer("ł", "l", "æ", "ae", "é", "e", "è", "e", "ô", "o", "ç", "c").Replace(s) @@ -121,9 +142,13 @@ func main() { "the-memorial-of-the-blessed-virgin-mary-on-saturday": true, // any free Saturday } - // Reference years: cover every weekday so a saint whose date is a Sunday in - // one year is captured in another. 2025 is past -> niedziela gives pl names. - for _, y := range []int{2025, 2026, 2027} { + // Reference years: enough spread that every fixed date falls on an ordinary + // weekday (not a Sunday, not inside a privileged season) in at least one year, + // so each saint is seen with its true rank. Start at 2025 (past -> niedziela + // gives pl names; also the date of a transferred feast is taken from the first + // year it is observed, and 2025 observes Joseph/Annunciation on their proper + // fixed dates). + for _, y := range []int{2025, 2026, 2027, 2028, 2029} { for m := 1; m <= 12; m++ { en, err := fetchMonth("general-en", y, m) if err != nil { @@ -167,7 +192,19 @@ func main() { if slug == "" || movableSkip[slug] { continue } - if _, seen := entries[slug]; seen { + // Highest-rank-wins: a saint seen as a commemoration in a + // privileged season one year and as its full rank on an ordinary + // weekday another year keeps the higher rank. Date/name/pl are + // kept from the first (proper-date) occurrence; rank/colour/class + // are upgraded. + if cur, seen := entries[slug]; seen { + if rankBand(rk) > rankBand(calendar.Rank(cur.rank)) { + cur.rank = string(rk) + cur.colour = c.Colour + cur.class = classOf(c.Title) + cur.rankNum = c.RankNum + entries[slug] = cur + } continue } laTitle := "" |
