diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-12 00:05:57 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-12 00:05:57 +0200 |
| commit | 4624441d0bc9c1f28dea54606ab7999041d4b323 (patch) | |
| tree | af9b9308c70fb5df6888990e7780e6e951d76644 | |
| parent | 21dab521d6bfe8e4e7d04f761c11754059339ba2 (diff) | |
| download | colitur-4624441d0bc9c1f28dea54606ab7999041d4b323.tar.gz colitur-4624441d0bc9c1f28dea54606ab7999041d4b323.zip | |
data(ef): bootstrap the 1962 sanctoral from lectio
Convert lectio's tridentine-calendar.ini (322 entries) into
data/ef/sanctoral.sexp via a validating OCaml converter, tools/
bootstrap_sanctoral.ml, rather than a hand-written script: every field is
built through Slug.of_string, Colour.of_string and Vocab_ef.rank_of_string,
so the emitted sexp is valid by construction.
Two conversion decisions, both documented rather than buried:
- subject defaults to Subject.Saint, overriding Celebration.make's kernel
default of Subject.Temporal, for the 316 entries with no explicit class;
- rank = commemoration maps to status = Commemoration_only with an inferred
Class3 (not a citation -- it is what the 1960 reform reduced most simple
feasts from), recorded as an open item in the rules register for the
oracle to adjudicate.
Every celebration is tagged layer = Precedence_ef.universal_layer, the
provenance id RG 91's band classifier reads to tell the universal calendar
from proper/indult data.
The generated file carries a provenance header: source path, its SHA-256,
and the UTC conversion date, so re-bootstrapping against a newer lectio is
reproducible and diffable. Output is byte-identical across runs.
test/test_sanctoral_ef.ml loads the file through Layer.load and checks the
counts independently derived from the source INI (322 entries, 114
Commemoration_only, 12 Class1, no Subject.Temporal, every date resolves in
a leap year), plus two named spot-checks against the INI's own text -- one
entry with an explicit class field, one commemoration -- so a passing count
cannot hide the wrong 322 entries having been converted.
| -rw-r--r-- | data/ef/sanctoral.sexp | 2644 | ||||
| -rw-r--r-- | test/dune | 1 | ||||
| -rw-r--r-- | test/test_colitur.ml | 2 | ||||
| -rw-r--r-- | test/test_sanctoral_ef.ml | 115 | ||||
| -rw-r--r-- | tools/bootstrap_sanctoral.ml | 235 | ||||
| -rw-r--r-- | tools/dune | 10 |
6 files changed, 3006 insertions, 1 deletions
diff --git a/data/ef/sanctoral.sexp b/data/ef/sanctoral.sexp new file mode 100644 index 0000000..1ff9577 --- /dev/null +++ b/data/ef/sanctoral.sexp @@ -0,0 +1,2644 @@ +; data/ef/sanctoral.sexp -- EF (1962) universal sanctoral (General Roman +; Calendar), bootstrapped from lectio (sibling project; see CLAUDE.md). +; Generator: tools/bootstrap_sanctoral.ml -- do not hand-edit; re-run the +; generator against a newer lectio and commit the diff instead. +; +; Source: ../lectio/internal/caldata/tridentine-calendar.ini +; SHA-256: 6a25e6349cae576a10b27c2cdddbfa35905753d4b1e0bc19463dc848f65b94a8 +; Converted (UTC): 2026-08-11 +; 322 entries (208 feast, 114 commemoration-only). Regenerate with: +; eval $(opam env) && dune exec tools/bootstrap_sanctoral.exe -- ../lectio/internal/caldata/tridentine-calendar.ini data/ef/sanctoral.sexp +((id ef-universal) (name "EF (1962) universal sanctoral") + (entries + (((date (Fixed (month 8) (day 18))) + (cel + ((slug agapitus) + (names + ((en "St. Agapitus") + (pl "\197\155w. Agapita, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 5))) + (cel + ((slug agatha) + (names + ((en "St. Agatha") + (pl "\197\155w. Agaty, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 21))) + (cel + ((slug agnes) + (names + ((en "St. Agnes") + (pl "\197\155w. Agnieszki, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 15))) + (cel + ((slug albert-the-great) + (names + ((en "St. Albert the Great") + (pl + "\197\155w. Alberta Wielkiego, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 17))) + (cel + ((slug alexis) + (names ((en "St. Alexis") (pl "\197\155w. Aleksego, Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 1))) + (cel + ((slug all-saints) + (names + ((en "All Saints") + (pl + "Uroczysto\197\155\196\135 Wszystkich \197\154wi\196\153tych"))) + (rank Class1) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 21))) + (cel + ((slug aloysius-gongzaga) + (names + ((en "St. Aloysius Gongzaga") + (pl "\197\155w. Alojzego Gonzagi, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 2))) + (cel + ((slug alphonsus-liguori) + (names + ((en "St. Alphonsus Liguori") + (pl + "\197\155w. Alfonsa Marii Liguori, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 7))) + (cel + ((slug ambrose) + (names + ((en "St. Ambrose") + (pl + "\197\155w. Ambro\197\188ego, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 30))) + (cel + ((slug andrew) + (names + ((en "St. Andrew") (pl "\197\155w. Andrzeja, Aposto\197\130a"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 10))) + (cel + ((slug andrew-avellino) + (names + ((en "St. Andrew Avellino") + (pl "\197\155w. Andrzeja z Avellino, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 4))) + (cel + ((slug andrew-corsini) + (names + ((en "St. Andrew Corsini") + (pl "\197\155w. Andrzeja Corsini, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 1))) + (cel + ((slug angela-merici) + (names + ((en "St. Angela Merici") + (pl "\197\155w. Anieli Merici, Dziewicy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 17))) + (cel + ((slug anicetus) + (names + ((en "St. Anicetus") + (pl "\197\155w. Aniceta, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 26))) + (cel + ((slug anne-mother-of-the-blessed-virgin) + (names + ((en "St. Anne, Mother of the Blessed Virgin") + (pl "\197\155w. Anny, Matki N. M. P."))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 25))) + (cel + ((slug annunciation-of-the-blessed-virgin-mary) + (names + ((en "Annunciation of the Blessed Virgin Mary") + (pl "Zwiastowanie N. M. P."))) + (rank Class1) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 21))) + (cel + ((slug anselm) + (names + ((en "St. Anselm") + (pl + "\197\155w. Anzelma, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 17))) + (cel + ((slug anthony) + (names ((en "St. Anthony") (pl "\197\155w. Antoniego, Opata"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 23))) + (cel + ((slug anthony-mary-claret) + (names + ((en "St. Anthony Mary Claret") + (pl "\197\155w. Antoniego Marii Claret, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 5))) + (cel + ((slug anthony-mary-zaccariah) + (names + ((en "St. Anthony Mary Zaccariah") + (pl "\197\155w. Antoniego Marii Zaccaria, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 13))) + (cel + ((slug anthony-of-padua) + (names + ((en "St. Anthony of Padua") + (pl + "\197\155w. Antoniego z Padwy, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 10))) + (cel + ((slug antoninus) + (names + ((en "St. Antoninus") + (pl "\197\155w. Antonina, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 23))) + (cel + ((slug apollinaris) + (names + ((en "St. Apollinaris") + (pl "\197\155w. Apolinarego, Biskupa i M\196\153czennika"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 9))) + (cel + ((slug appollonia) + (names + ((en "St. Appollonia") + (pl "\197\155w. Apolonii, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 15))) + (cel + ((slug assumption-of-the-blessed-virgin-mary) + (names + ((en "Assumption of the Blessed Virgin Mary") + (pl "Wniebowzi\196\153cie N. M. P."))) + (rank Class1) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 2))) + (cel + ((slug athanasius) + (names + ((en "St. Athanasius") + (pl + "\197\155w. Atanazego, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 28))) + (cel + ((slug augustine) + (names + ((en "St. Augustine") + (pl + "\197\155w. Augustyna, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 28))) + (cel + ((slug augustine-of-canterbury) + (names + ((en "St. Augustine of Canterbury") + (pl "\197\155w. Augustyna z Canterbury, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 11))) + (cel + ((slug barnabas) + (names + ((en "St. Barnabas") + (pl "\197\155w. Barnaby, Aposto\197\130a"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 24))) + (cel + ((slug bartholomew) + (names + ((en "St. Bartholomew") + (pl "\197\155w. Bart\197\130omieja, Aposto\197\130a"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 14))) + (cel + ((slug basil-the-great) + (names + ((en "St. Basil the Great") + (pl + "\197\155w. Bazylego Wielkiego, Wyznawcy, Biskupa i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 12))) + (cel + ((slug basilidus) + (names + ((en "St. Basilidus") + (pl + "\197\155\197\155. Bazylidesa, Cyryna, Nabora i Nazariusza, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 27))) + (cel + ((slug bede-the-venerable) + (names + ((en "St. Bede the Venerable") + (pl + "\197\155w. Bedy Czcigodnego, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 29))) + (cel + ((slug beheading-of-st-john-the-baptist) + (names + ((en "Beheading of St. John the Baptist") + (pl "\197\154ci\196\153cie \197\154w. Jana Chrzciciela"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 21))) + (cel + ((slug benedict) + (names ((en "St. Benedict") (pl "\197\155w. Benedykta, Opata"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 20))) + (cel + ((slug bernard-of-clairvaux) + (names + ((en "St. Bernard of Clairvaux") + (pl + "\197\155w. Bernarda, Opata i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 20))) + (cel + ((slug bernardine-of-siena) + (names + ((en "St. Bernardine of Siena") + (pl "\197\155w. Bernardyna ze Sieny, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 3))) + (cel + ((slug blaise) + (names + ((en "St. Blaise") + (pl + "\197\155w. B\197\130a\197\188eja, Biskupa i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 14))) + (cel + ((slug bonaventure) + (names + ((en "St. Bonaventure") + (pl + "\197\155w. Bonawentury, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 5))) + (cel + ((slug boniface) + (names + ((en "St. Boniface") + (pl "\197\155w. Bonifacego, Biskupa i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 8))) + (cel + ((slug bridget-of-sweden) + (names + ((en "St. Bridget of Sweden") (pl "\197\155w. Brygidy, Wdowy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 6))) + (cel + ((slug bruno) + (names ((en "St. Bruno") (pl "\197\155w. Brunona, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 7))) + (cel + ((slug cajetan) + (names ((en "St. Cajetan") (pl "\197\155w. Kajetana, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 14))) + (cel + ((slug callistus-i) + (names + ((en "St. Callistus I") + (pl + "\197\155w. Kaliksta, papie\197\188a i m\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 18))) + (cel + ((slug camillus-de-lellis) + (names + ((en "Camillus de Lellis") (pl "\197\155w. Kamila de Lellis"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 19))) + (cel + ((slug canute-martyr) + (names + ((en "St. Canute, Martyr") + (pl "\197\155w. Kanuta, Kr\195\179la i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 4))) + (cel + ((slug casimir) + (names + ((en "St. Casimir") (pl "\197\155w. Kazimierza, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 25))) + (cel + ((slug catherine-of-alexandria) + (names + ((en "St. Catherine of Alexandria") + (pl "\197\155w. Katarzyny, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 30))) + (cel + ((slug catherine-of-siena) + (names + ((en "St. Catherine of Siena") + (pl "\197\155w. Katarzyny Siene\197\132skiej, Dziewicy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 22))) + (cel + ((slug cecilia) + (names + ((en "St. Cecilia") + (pl "\197\155w. Cecylii, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 22))) + (cel + ((slug chair-of-st-peter) + (names + ((en "Chair of St. Peter") + (pl "Katedry \197\155w. Piotra Aposto\197\130a"))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 4))) + (cel + ((slug charles-borromeo) + (names + ((en "St. Charles Borromeo") + (pl "\197\155w. Karola Boromeusza, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 24))) + (cel + ((slug christina) + (names + ((en "St. Christina") + (pl "\197\155w. Krystyny, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 25))) + (cel + ((slug christopher) + (names + ((en "St. Christopher") + (pl "\197\155w. Krzysztofa, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 24))) + (cel + ((slug chrysogonus) + (names + ((en "St. Chrysogonus") + (pl "\197\155w. Chryzogona, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 12))) + (cel + ((slug clare) + (names ((en "St. Clare") (pl "\197\155w. Klary, Dziewicy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 23))) + (cel + ((slug clement-i) + (names + ((en "St. Clement I") + (pl + "\197\155w. Klemensa I, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 2))) + (cel + ((slug commemoration-of-all-souls) + (names + ((en "Commemoration of All Souls") + (pl "Dzie\197\132 Zaduszny"))) + (rank Class1) (status Feast) (colour Black) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 13))) + (cel + ((slug commemoration-of-the-baptism-of-the-lord) + (names + ((en "Commemoration of the Baptism of the Lord") + (pl "Wspomnienie Chrztu Pa\197\132skiego"))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 25))) + (cel + ((slug conversion-of-st-paul) + (names + ((en "Conversion of St. Paul") + (pl + "Nawr\195\179cenie \197\155w. Paw\197\130a, Aposto\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 8))) + (cel + ((slug cyriacus-largus-and-smaragdus-martyrs) + (names + ((en "Ss. Cyriacus, Largus and Smaragdus, Martyrs") + (pl + "\197\155\197\155. Cyriaka, Larga i Szmaragda, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 9))) + (cel + ((slug cyril-of-alexandria) + (names + ((en "St. Cyril of Alexandria") + (pl + "\197\155w. Cyryla Aleksandryjskiego, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 18))) + (cel + ((slug cyril-of-jerusalem) + (names + ((en "St. Cyril of Jerusalem") + (pl + "\197\155w. Cyryla Jerozolimskiego, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 11))) + (cel + ((slug damasus-i) + (names + ((en "St. Damasus I") + (pl "\197\155w. Damazego, Papie\197\188a i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 29))) + (cel + ((slug dedication-of-st-michael-the-archangel) + (names + ((en "Dedication of St. Michael the Archangel") + (pl + "\197\154wi\196\153tego Micha\197\130a Archanio\197\130a"))) + (rank Class1) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 9))) + (cel + ((slug dedication-of-the-archbasilica-of-our-holy-savior) + (names + ((en "Dedication of the Archbasilica of Our Holy Savior") + (pl + "Rocznica Konsekracji Bazyliki Naj\197\155wi\196\153tszego Zbawiciela na Lateranie"))) + (rank Class2) (status Feast) (colour White) (subject Lord) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 5))) + (cel + ((slug dedication-of-the-basilica-of-st-mary-major) + (names + ((en "Dedication of the Basilica of St. Mary Major") + (pl "Rocznica Konsekracji N. M. P. \197\154nie\197\188nej"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 18))) + (cel + ((slug dedication-of-the-basilicas-of-sts-peter-paul) + (names + ((en "Dedication of the Basilicas of Sts. Peter & Paul") + (pl + "Rocznica Konsekracji Bazylik \197\154wi\196\153tych Aposto\197\130\195\179w Piotra i Paw\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 13))) + (cel + ((slug didacus) + (names ((en "St. Didacus") (pl "\197\155w. Dydaka, Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 9))) + (cel + ((slug dionysius-and-companions) + (names + ((en "St. Dionysius and companions") + (pl "\197\155\197\155. Dionizego, Rustyka i Eleuteriusza"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 4))) + (cel + ((slug dominic) + (names ((en "St. Dominic") (pl "\197\155w. Dominika, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 7))) + (cel + ((slug donatus) + (names + ((en "St. Donatus") + (pl "\197\155w. Donata, Biskupa i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 6))) + (cel + ((slug dorothy) + (names + ((en "St. Dorothy") + (pl "\197\155w. Doroty, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 13))) + (cel + ((slug edward) + (names + ((en "St. Edward") + (pl "\197\155w. Edwarda, kr\195\179la i wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 26))) + (cel + ((slug eleutherius) + (names + ((en "S. Eleutherius") + (pl + "\197\155w. Eleuteriusza, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 19))) + (cel + ((slug elizabeth-of-hungary) + (names + ((en "St. Elizabeth of Hungary") + (pl "\197\155w. El\197\188biety, Wdowy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 8))) + (cel + ((slug elizabeth-of-portugal) + (names + ((en "St. Elizabeth of Portugal") + (pl "\197\155w. El\197\188biety, Kr\195\179lowej i Wdowy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 23))) + (cel + ((slug emerentiana) + (names + ((en "St. Emerentiana") + (pl "\197\155w. Emercjanny, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 18))) + (cel + ((slug ephrem-of-syria) + (names + ((en "St. Ephrem of Syria") + (pl + "\197\155w. Efrema, Diakona, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 16))) + (cel + ((slug eusebius) + (names + ((en "St. Eusebius") + (pl "\197\155w. Euzebiusza, Biskupa i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 14))) + (cel + ((slug exaltation-of-the-holy-cross) + (names + ((en "Exaltation of the Holy Cross") + (pl + "Podwy\197\188szenia \197\154wi\196\153tego Krzy\197\188a"))) + (rank Class2) (status Feast) (colour Red) (subject Lord) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 14))) + (cel + ((slug felicis) + (names + ((en "S. Felicis") + (pl "\197\155w. Feliksa, Kap\197\130ana i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 29))) + (cel + ((slug felicis-simplicii-faustini-et-beatricis) + (names + ((en "Ss. Felicis, Simplicii, Faustini et Beatricis") + (pl + "\197\155\197\155. Feliksa, Symplicjusza, Faustyna i Beatryczy, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 23))) + (cel + ((slug felicity) + (names + ((en "St. Felicity") + (pl "\197\155w. Felicyty, M\196\153czennicy"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 30))) + (cel + ((slug felix-i) + (names + ((en "St. Felix I") + (pl + "\197\155w. Feliksa I, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 20))) + (cel + ((slug felix-of-valois) + (names + ((en "St. Felix of Valois") + (pl "\197\155w. Feliksa Walezego, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 24))) + (cel + ((slug fidelis-of-sigmaringen) + (names + ((en "St. Fidelis of Sigmaringen") + (pl "\197\155w. Fidelisa z Sigmaringen, M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 10))) + (cel + ((slug forty-holy-martyrs-of-sebaste) + (names + ((en "Forty Holy Martyrs of Sebaste") + (pl + "\197\155\197\155. Czterdziestu M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 8))) + (cel + ((slug four-holy-crowned-martyrs) + (names + ((en "Four Holy Crowned Martyrs") + (pl + "\197\154wi\196\153tych Czterech Ukoronowanych M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 9))) + (cel + ((slug frances-rome) + (names + ((en "St. Frances Rome") + (pl "\197\155w. Franciszki Rzymianki, Wdowy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 10))) + (cel + ((slug francis-borgia) + (names + ((en "St. Francis Borgia") + (pl "\197\155w. Franciszka Borgiasza, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 4))) + (cel + ((slug francis-caracciolo) + (names + ((en "St. Francis Caracciolo") + (pl "\197\155w. Franciszka Caracciolo, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 29))) + (cel + ((slug francis-de-sales) + (names + ((en "St. Francis de Sales") + (pl + "\197\155w. Franciszka Salezego, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 4))) + (cel + ((slug francis-of-assisi) + (names + ((en "St. Francis of Assisi") + (pl "\197\155w. Franciszka, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 2))) + (cel + ((slug francis-of-paola) + (names + ((en "St. Francis of Paola") + (pl "\197\155w. Franciszka z Pauli, Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 3))) + (cel + ((slug francis-xavier) + (names + ((en "St. Francis Xavier") + (pl "\197\155w. Franciszka Ksawerego, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 27))) + (cel + ((slug gabriel-of-our-lady-of-sorrows) + (names + ((en "St. Gabriel of Our Lady of Sorrows") + (pl "\197\155w. Gabriela od Matki Bo\197\188ej Bolesnej"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 24))) + (cel + ((slug gabriel-the-archangel) + (names + ((en "St. Gabriel the Archangel") + (pl "\197\155w. Gabriela Archanio\197\130a"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 23))) + (cel + ((slug george) + (names + ((en "St. George") + (pl "\197\155w. Jerzego, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 16))) + (cel + ((slug gertrude-the-great) + (names + ((en "St. Gertrude the Great") + (pl "\197\155w. Gertrudy, Dziewicy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 1))) + (cel + ((slug giles) + (names ((en "St. Giles") (pl "\197\155w. Idziego, Opata"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 10))) + (cel + ((slug gordiano-and-epimacho) + (names + ((en "St. Gordiano and Epimacho") + (pl + "\197\155\197\155. Gordiana i Epimacha, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 9))) + (cel + ((slug gorgonius) + (names + ((en "St. Gorgonius") + (pl "\197\155w. Gorgoniusza, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 17))) + (cel + ((slug gregory-barbarigo) + (names + ((en "St. Gregory Barbarigo") + (pl "\197\155w. Grzegorza Barbarigo, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 9))) + (cel + ((slug gregory-of-nazianzen) + (names + ((en "St. Gregory of Nazianzen") + (pl + "\197\155w. Grzegorza z Nazjanzu, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 12))) + (cel + ((slug gregory-the-great) + (names + ((en "St. Gregory the Great") + (pl + "\197\155w. Grzegorza Wielkiego, Papie\197\188a, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 17))) + (cel + ((slug gregory-the-wonderworker) + (names + ((en "St. Gregory the Wonderworker") + (pl + "\197\155w. Grzegorza Cudotw\195\179rcy, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 25))) + (cel + ((slug gregory-vii) + (names + ((en "St. Gregory VII") + (pl "\197\155w. Grzegorza VII, Papie\197\188a i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 8))) + (cel + ((slug hadriani) + (names + ((en "S. Hadriani") + (pl "\197\155w. Hadriana, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 16))) + (cel + ((slug hedwig) + (names ((en "St. Hedwig") (pl "\197\155w. Jadwigi, Wdowy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 15))) + (cel + ((slug henry-the-emperor) + (names + ((en "St. Henry the Emperor") + (pl "\197\155w. Henryka, Cesarza i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 13))) + (cel + ((slug hermenegild) + (names + ((en "St. Hermenegild") + (pl "\197\155w. Hermenegilda, M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 28))) + (cel + ((slug hermes) + (names + ((en "St. Hermes") + (pl "\197\155w. Hermesa, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 21))) + (cel + ((slug hilarion) + (names ((en "St. Hilarion") (pl "\197\155w. Hilariona, Opata"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 14))) + (cel + ((slug hilary) + (names + ((en "St. Hilary") + (pl + "\197\155w. Hilarego, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 2))) + (cel + ((slug holy-guardian-angels) + (names + ((en "Holy Guardian Angels") + (pl + "\197\154wi\196\153tych Anio\197\130\195\179w Str\195\179\197\188\195\179w"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 28))) + (cel + ((slug holy-innocents) + (names + ((en "Holy Innocents") + (pl "\197\154wi\196\153tych M\197\130odziank\195\179w"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 1))) + (cel + ((slug holy-machabees) + (names + ((en "Holy Machabees") + (pl "Siedmiu Braci Machabejskich, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 17))) + (cel + ((slug hyacinth) + (names ((en "St. Hyacinth") (pl "\197\155w. Jacka, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 11))) + (cel + ((slug hyginus-pope-and-martyr) + (names + ((en "St. Hyginus Pope and Martyr") + (pl "\197\155w. Hygina, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 31))) + (cel + ((slug ignatius-loyola) + (names + ((en "St. Ignatius Loyola") + (pl "\197\155w. Ignacego Loyoli, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 1))) + (cel + ((slug ignatius-of-antioch) + (names + ((en "St. Ignatius of Antioch") + (pl "\197\155w. Ignacego, Biskupa i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 8))) + (cel + ((slug immaculate-conception-of-the-blessed-virgin-mary) + (names + ((en "Immaculate Conception of the Blessed Virgin Mary") + (pl "Niepokalane Pocz\196\153cie N. M. P."))) + (rank Class1) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 22))) + (cel + ((slug immaculate-heart-of-mary) + (names + ((en "Immaculate Heart of Mary") + (pl "Uroczysto\197\155\196\135 Niepokalanego Serca N. M. P."))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 30))) + (cel + ((slug in-commemoratione-sancti-pauli-apostoli) + (names + ((en "In Commemoratione Sancti Pauli Apostoli") + (pl "Wspomnienie \197\155w. Paw\197\130a, Aposto\197\130a"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 3))) + (cel + ((slug irenaeus) + (names + ((en "St. Irenaeus") + (pl "\197\155w. Ireneusza, Biskupa i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 4))) + (cel + ((slug isidore-of-seville) + (names + ((en "St. Isidore of Seville") + (pl + "\197\155w. Izydora, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 25))) + (cel + ((slug james-the-greater) + (names + ((en "St. James the Greater") + (pl "\197\155w. Jakuba, Aposto\197\130a"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 21))) + (cel + ((slug jane-frances-de-chantal) + (names + ((en "St. Jane Frances de Chantal") + (pl + "\197\155w. Joanny Franciszki Fr\195\169miot de Chantal, Wdowy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 19))) + (cel + ((slug januarius-companions) + (names + ((en "St. Januarius & Companions") + (pl + "\197\155w. Januarego i Towarzyszy, M\196\153czennik\195\179w"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 30))) + (cel + ((slug jerome) + (names + ((en "St. Jerome") + (pl + "\197\155w. Hieronima, Kap\197\130ana, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 20))) + (cel + ((slug jerome-emiliani) + (names + ((en "St. Jerome Emiliani") + (pl "\197\155w. Hieronima Emiliani, Wyznawcy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 16))) + (cel + ((slug joachim-father-of-the-blessed-virgin) + (names + ((en "St. Joachim, Father of the Blessed Virgin") + (pl "\197\155w. Joachima, Ojca N. M. P."))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 15))) + (cel + ((slug john-baptist-de-la-salle) + (names + ((en "St. John Baptist de la Salle") + (pl "\197\155w. Jana Chrzciciela de la Salle, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 31))) + (cel + ((slug john-bosco) + (names + ((en "St. John Bosco") (pl "\197\155w. Jana Bosco, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 20))) + (cel + ((slug john-cantius) + (names + ((en "St. John Cantius") + (pl "\197\155w. Jana Kantego, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 27))) + (cel + ((slug john-chrysostom) + (names + ((en "St. John Chrysostom") + (pl + "\197\155w. Jana Chryzostoma, Wyznawcy, Biskupa i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 27))) + (cel + ((slug john-damascene) + (names + ((en "St. John Damascene") + (pl + "\197\155w. Jana Damasce\197\132skiego, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 19))) + (cel + ((slug john-eudes) + (names + ((en "St. John Eudes") (pl "\197\155w. Jana Eudes, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 12))) + (cel + ((slug john-gualbert) + (names + ((en "St. John Gualbert") + (pl "\197\155w. Jana Gwalberta, Opata"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 27))) + (cel + ((slug john-i) + (names + ((en "St. John I") + (pl "\197\155w. Jana I, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 9))) + (cel + ((slug john-leonardi) + (names + ((en "St. John Leonardi") + (pl "\197\155w. Jana Leonardi, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 8))) + (cel + ((slug john-mary-vianney) + (names + ((en "St. John Mary Vianney") + (pl "\197\155w. Jana Marii Vianney, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 28))) + (cel + ((slug john-of-capistrano) + (names + ((en "St. John of Capistrano") + (pl "\197\155w. Jana Kapistrana, Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 8))) + (cel + ((slug john-of-god) + (names + ((en "St. John of God") + (pl "\197\155w. Jana Bo\197\188ego, Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 8))) + (cel + ((slug john-of-matha) + (names + ((en "St. John of Matha") + (pl "\197\155w. Jana z Maty, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 12))) + (cel + ((slug john-of-san-fecundo) + (names + ((en "St. John of San Fecundo") + (pl "\197\155w. Jana z Facundo, Wyznawcy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 24))) + (cel + ((slug john-of-the-cross) + (names + ((en "St. John of the Cross") + (pl + "\197\155w. Jana od Krzy\197\188a, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 27))) + (cel + ((slug john-the-evangelist) + (names + ((en "St. John the Evangelist") + (pl "\197\155w. Jana, Aposto\197\130a i Ewangelisty"))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 14))) + (cel + ((slug josaphat) + (names + ((en "St. Josaphat") + (pl "\197\155w. Jozafata, Biskupa i M\196\153czennika"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 27))) + (cel + ((slug joseph-calasance) + (names + ((en "St. Joseph Calasance") + (pl "\197\155w. J\195\179zefa Kalasantego, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 18))) + (cel + ((slug joseph-of-cupertino) + (names + ((en "St. Joseph of Cupertino") + (pl "\197\155w. J\195\179zefa z Kupertynu, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 19))) + (cel + ((slug joseph-spouse-of-the-bl-virgin-mary) + (names + ((en "St. Joseph, Spouse of the Bl. Virgin Mary") + (pl "\197\155w. J\195\179zefa, Oblubie\197\132ca N. M. P."))) + (rank Class1) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 1))) + (cel + ((slug joseph-the-workman) + (names + ((en "St. Joseph the Workman") + (pl + "\197\155w. J\195\179zefa Robotnika, Oblubie\197\132ca N. M. P"))) + (rank Class1) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 19))) + (cel + ((slug julia-of-falconieri) + (names + ((en "St. Julia of Falconieri") + (pl "\197\155w. Juliany Falconieri, Dziewicy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 14))) + (cel + ((slug justin) + (names + ((en "St. Justin") + (pl "\197\155w. Justyna, M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 21))) + (cel + ((slug laurence-of-brindisi) + (names + ((en "St. Laurence of Brindisi") + (pl + "\197\155w. Wawrzy\197\132ca z Brindisi, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 10))) + (cel + ((slug lawrence) + (names ((en "St. Lawrence") (pl "\197\155w. Wawrzy\197\132ca"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 5))) + (cel + ((slug lawrence-justinian) + (names + ((en "St. Lawrence Justinian") + (pl + "\197\155w. Wawrzy\197\132ca Justiniani, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 11))) + (cel + ((slug leo-the-great) + (names + ((en "St. Leo the Great") + (pl + "\197\155w. Leona Wielkiego, Papie\197\188a, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 23))) + (cel + ((slug liborii) + (names + ((en "S. Liborii") + (pl "\197\155w. Liboriusza, Biskupa i Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 23))) + (cel + ((slug linus) + (names + ((en "St. Linus") + (pl "\197\155w. Linusa, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 25))) + (cel + ((slug louis-ix) + (names + ((en "St. Louis IX") + (pl "\197\155w. Ludwika, Kr\195\179la i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 4))) + (cel + ((slug lucius) + (names + ((en "St. Lucius") + (pl + "\197\155w. Lucjusza I, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 13))) + (cel + ((slug lucy) + (names + ((en "St. Lucy") + (pl "\197\155w. \197\129ucji, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 18))) + (cel + ((slug luke-the-evangelist) + (names + ((en "St. Luke the Evangelist") + (pl "\197\155w. \197\129ukasza, Ewangelisty"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 16))) + (cel + ((slug marcellus-i) + (names + ((en "St. Marcellus I") + (pl + "\197\155w. Marcelego I, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 18))) + (cel + ((slug marcus-and-marcellianus) + (names + ((en "Ss. Marcus and Marcellianus") + (pl + "\197\155\197\155. Marka i Marcelina, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 20))) + (cel + ((slug margaret) + (names + ((en "St. Margaret") + (pl + "\197\155w. Ma\197\130gorzaty, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 17))) + (cel + ((slug margaret-mary-alacoque) + (names + ((en "St. Margaret Mary Alacoque") + (pl "\197\155w. Ma\197\130gorzaty Marii Alacoque, Dziewicy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 10))) + (cel + ((slug margaret-of-scotland) + (names + ((en "St. Margaret of Scotland") + (pl + "\197\155w. Ma\197\130gorzaty, Kr\195\179lowej Szkockiej, Wdowy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 25))) + (cel + ((slug mark) + (names ((en "St. Mark") (pl "\197\155w. Marka Ewangelisty"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 7))) + (cel + ((slug mark-i) + (names + ((en "St. Mark I") + (pl "\197\155w. Marka I, Papie\197\188a i Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 29))) + (cel + ((slug martha) + (names ((en "St. Martha") (pl "\197\155w. Marty, Dziewicy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 12))) + (cel + ((slug martin-i) + (names + ((en "St. Martin I") + (pl + "\197\155w. Marcina I, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 11))) + (cel + ((slug martin-of-tours) + (names + ((en "St. Martin of Tours") + (pl "\197\155w. Marcina, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 30))) + (cel + ((slug martina) + (names + ((en "St. Martina") + (pl "\197\155w. Martyny, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 22))) + (cel + ((slug mary-magdalene) + (names + ((en "St. Mary Magdalene") + (pl "\197\155w. Marii Magdaleny, Pokutnicy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 29))) + (cel + ((slug mary-magdalene-de-pazzi) + (names + ((en "St. Mary Magdalene de Pazzi") + (pl "\197\155w. Marii Magdaleny Pazzi, Dziewicy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 11))) + (cel + ((slug maternity-of-the-blessed-virgin-mary) + (names + ((en "Maternity of the Blessed Virgin Mary") + (pl "Macierzy\197\132stwa N. M. P."))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 21))) + (cel + ((slug matthew) + (names + ((en "St. Matthew") + (pl "\197\155w. Mateusza, Aposto\197\130a i Ewangelisty"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 24))) + (cel + ((slug matthias) + (names + ((en "St. Matthias") (pl "\197\155w. Macieja Aposto\197\130a"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 15))) + (cel + ((slug maur-abbot) + (names ((en "St. Maur, Abbot") (pl "\197\155w. Maura, Opata"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 22))) + (cel + ((slug maurice-and-companions-martyrs) + (names + ((en "St. Maurice and Companions, Martyrs") + (pl + "\197\155\197\155. Maurycego i Towarzyszy, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 10))) + (cel + ((slug melchiades) + (names + ((en "St. Melchiades") + (pl + "\197\155w. Melchiadesa, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 11))) + (cel + ((slug menna) + (names + ((en "St. Menna") (pl "\197\155w. Mennasa, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 4))) + (cel + ((slug monica) + (names ((en "St. Monica") (pl "\197\155w. Moniki, Wdowy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 12))) + (cel + ((slug most-holy-name-of-mary) + (names + ((en "Most Holy Name of Mary") + (pl "Naj\197\155wi\196\153tszego Imienia Maryi"))) + (rank Class3) (status Feast) (colour White) (subject Lord) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 12))) + (cel + ((slug naboris-et-felicis) + (names + ((en "Ss. Naboris et Felicis") + (pl + "\197\155\197\155. Nabora i Feliksa, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 24))) + (cel + ((slug nativity-of-st-john-the-baptist) + (names + ((en "Nativity of St. John the Baptist") + (pl "Narodzenie \197\154w. Jana Chrzciciela"))) + (rank Class1) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 8))) + (cel + ((slug nativity-of-the-blessed-virgin-mary) + (names + ((en "Nativity of the Blessed Virgin Mary") + (pl "Narodzenie N. M. P."))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 6))) + (cel + ((slug nicholas) + (names + ((en "St. Nicholas") + (pl "\197\155w. Miko\197\130aja, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 10))) + (cel + ((slug nicholas-of-tolentino) + (names + ((en "St. Nicholas of Tolentino") + (pl "\197\155w. Miko\197\130aja z Tolentynu, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 15))) + (cel + ((slug nicomedes) + (names + ((en "S. Nicomedes") + (pl "\197\155w. Nikomedesa, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 6))) + (cel + ((slug norbert) + (names + ((en "St. Norbert") + (pl "\197\155w. Norberta, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 11))) + (cel + ((slug our-lady-of-lourdes) + (names + ((en "Our Lady of Lourdes") + (pl + "Objawienie si\196\153 N. M. P. Niepokalanie Pocz\196\153tej w Lourdes"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 16))) + (cel + ((slug our-lady-of-mt-carmel) + (names + ((en "Our Lady of Mt. Carmel") + (pl "Wspomnienie N. M. P. z G\195\179ry Karmelu"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 24))) + (cel + ((slug our-lady-of-ransom) + (names + ((en "Our Lady of Ransom") + (pl "N. M. P. od Wykupu Je\197\132c\195\179w"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 7))) + (cel + ((slug our-lady-of-the-rosary) + (names + ((en "Our Lady of the Rosary") + (pl "N. M. P. R\195\179\197\188a\197\132cowej"))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 27))) + (cel + ((slug pantaleon) + (names + ((en "St. Pantaleon") + (pl "\197\155w. Pantaleona, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 17))) + (cel + ((slug paschal-baylon) + (names + ((en "St. Paschal Baylon") + (pl "\197\155w. Paschalisa Baylon, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 17))) + (cel + ((slug patrick) + (names + ((en "St. Patrick") + (pl "\197\155w. Patryka, Biskupa i Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 22))) + (cel + ((slug paul) + (names ((en "St. Paul") (pl "\197\155w. Paw\197\130a"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 28))) + (cel + ((slug paul-of-the-cross) + (names + ((en "St. Paul of the Cross") + (pl "\197\155w. Paw\197\130a od Krzy\197\188a, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 15))) + (cel + ((slug paul-the-first-hermit) + (names + ((en "St. Paul, the First Hermit") + (pl + "\197\155w. Paw\197\130a, Pierwszego Pustelnika, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 22))) + (cel + ((slug paulinus-of-nola) + (names + ((en "St. Paulinus of Nola") + (pl "\197\155w. Paulina, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 25))) + (cel + ((slug peter) + (names + ((en "St. Peter") (pl "\197\155w. Piotra, Aposto\197\130a"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 27))) + (cel + ((slug peter-canisius) + (names + ((en "St. Peter Canisius") + (pl + "\197\155w. Piotra Kanizjusza, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 19))) + (cel + ((slug peter-celestine) + (names + ((en "St. Peter Celestine") + (pl "\197\155w. Piotra Celestyna, Papie\197\188a i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 4))) + (cel + ((slug peter-chrysologus) + (names + ((en "St. Peter Chrysologus") + (pl + "\197\155w. Piotra Chryzologa, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 23))) + (cel + ((slug peter-damien) + (names + ((en "St. Peter Damien") + (pl + "\197\155w. Piotra Damiana, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 28))) + (cel + ((slug peter-nolasco) + (names + ((en "St. Peter Nolasco") + (pl "\197\155w. Piotra Nolasco, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 19))) + (cel + ((slug peter-of-alcantara) + (names + ((en "St. Peter of Alcantara") + (pl "\197\155w. Piotra z Alkantary, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 26))) + (cel + ((slug peter-of-alexandria) + (names + ((en "St. Peter of Alexandria") + (pl + "\197\155w. Piotra z Aleksandrii, Biskupa i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 29))) + (cel + ((slug peter-of-verona) + (names + ((en "St. Peter of Verona") + (pl "\197\155w. Piotra z Werony, M\196\153czenika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 31))) + (cel + ((slug petronilla) + (names + ((en "St. Petronilla") (pl "\197\155w. Petroneli, Dziewicy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 23))) + (cel + ((slug philip-benizi) + (names + ((en "St. Philip Benizi") + (pl "\197\155w. Filipa Benicjusza, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 26))) + (cel + ((slug philip-neri) + (names + ((en "St. Philip Neri") + (pl "\197\155w. Filipa Nereusza, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 11))) + (cel + ((slug pius-i) + (names + ((en "St. Pius I") + (pl "\197\155w. Piusa I, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 5))) + (cel + ((slug pius-v) + (names + ((en "St. Pius V") + (pl "\197\155w. Piusa V, Papie\197\188a i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 3))) + (cel + ((slug pius-x) + (names + ((en "St. Pius X") + (pl "\197\155w. Piusa X, Papie\197\188a i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 5))) + (cel + ((slug placid-companions) + (names + ((en "St. Placid & Companions") + (pl + "\197\155\197\155. Placyda i Towarzyszy, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 26))) + (cel + ((slug polycarp) + (names + ((en "St. Polycarp") + (pl "\197\155w. Polikarpa, Biskupa i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 19))) + (cel + ((slug pontian) + (names + ((en "St. Pontian") + (pl + "\197\155w. Poncjana, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 6))) + (cel + ((slug pope-sixtus-ii-felicissimus-and-agapitus-martyrs) + (names + ((en "Pope Sixtus II, Felicissimus and Agapitus, Martyrs") + (pl + "\197\155\197\155. Sykstusa II, Papie\197\188a, Felicysyma i Agapita, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 21))) + (cel + ((slug praxedis-virginis) + (names + ((en "St. Praxedis Virginis") + (pl "\197\155w. Praksedy, Dziewicy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 1))) + (cel + ((slug precious-blood-of-our-lord-jesus-christ) + (names + ((en "The Precious Blood of Our Lord Jesus Christ") + (pl + "Uroczysto\197\155\196\135 Najdro\197\188szej Krwi Pana Naszego Jezusa Chrystusa"))) + (rank Class1) (status Feast) (colour Red) (subject Lord) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 21))) + (cel + ((slug presentation-of-the-blessed-virgin-mary) + (names + ((en "Presentation of the Blessed Virgin Mary") + (pl "Ofiarowanie N. M. P."))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 18))) + (cel + ((slug prisca) + (names ((en "St. Prisca") (pl "\197\155w. Pryski, Dziewicy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 2))) + (cel + ((slug processus-and-martinian) + (names + ((en "SS. Processus and Martinian") + (pl + "\197\155\197\155. Procesa i Martyniana, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 19))) + (cel + ((slug pudentiana-virginis) + (names + ((en "St. Pudentiana Virginis") + (pl "\197\155w. Pudencjany, Dziewicy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 2))) + (cel + ((slug purification-of-the-blessed-virgin-mary) + (names + ((en "Purification of the Blessed Virgin Mary") + (pl "Oczyszczenie N. M. P."))) + (rank Class2) (status Feast) (colour White) (subject Lord) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 31))) + (cel + ((slug queenship-of-the-blessed-virgin-mary) + (names + ((en "Queenship of the Blessed Virgin Mary") + (pl "N. M. P. Kr\195\179lowej"))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 24))) + (cel + ((slug raphael-the-archangel) + (names + ((en "St. Raphael the Archangel") + (pl "\197\155w. Rafa\197\130a Archanio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 31))) + (cel + ((slug raymond-nonnatus) + (names + ((en "St. Raymond Nonnatus") + (pl "\197\155w. Rajmunda Nonnata, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 23))) + (cel + ((slug raymond-of-pe-afort) + (names + ((en "St. Raymond of Pe\195\177afort") + (pl "\197\155w. Rajmunda z Pennafort, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 1))) + (cel + ((slug remigius) + (names + ((en "St. Remigius") + (pl "\197\155w. Remigiusza, Biskupa i Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 13))) + (cel + ((slug robert-bellarmine) + (names + ((en "St. Robert Bellarmine") + (pl + "\197\155w. Roberta Bellarmina, Biskupa, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 9))) + (cel + ((slug romanus) + (names + ((en "St. Romanus") + (pl "\197\155w. Romana, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 7))) + (cel + ((slug romuald) + (names ((en "St. Romuald") (pl "\197\155w. Romualda, Opata"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 30))) + (cel + ((slug rose-of-lima) + (names + ((en "St. Rose of Lima") + (pl "\197\155w. R\195\179\197\188y z Limy, Dziewicy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 5))) + (cel + ((slug sabbas) + (names ((en "St. Sabbas") (pl "\197\155w. Saby, Opata"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 29))) + (cel + ((slug sabina) + (names + ((en "St. Sabina") (pl "\197\155w. Sabiny, M\196\153czennicy"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 29))) + (cel + ((slug saturninus) + (names + ((en "St. Saturninus") + (pl "\197\155w. Saturnina, M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 10))) + (cel + ((slug scholastica) + (names ((en "St. Scholastica") (pl "\197\155w. Scholastyki"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 8))) + (cel + ((slug sergio-baccho-marcello-and-apulejo-martyrs) + (names + ((en "Ss. Sergio, Baccho, Marcello and Apulejo Martyrs") + (pl + "\197\155\197\155. Sergiusza, Bachusa, Marcelego i Apulejusza"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 10))) + (cel + ((slug seven-holy-brothers-and-sts-rufina-secunda) + (names + ((en "Seven Holy Brothers and Sts. Rufina & Secunda") + (pl + "Siedmiu Braci M\196\153czennik\195\179w oraz \197\154\197\155. Rufiny i Sekundy, Dziewic i M\196\153czennic"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 12))) + (cel + ((slug seven-holy-servite-founders) + (names + ((en "Seven Holy Servite Founders") + (pl + "Siedmiu Za\197\130o\197\188ycieli Zakonu Serwit\195\179w N. M. P., Wyznawc\195\179w"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 15))) + (cel + ((slug seven-sorrows-of-the-blessed-virgin-mary) + (names + ((en "Seven Sorrows of the Blessed Virgin Mary") + (pl "Siedmiu Bole\197\155ci N. M. P."))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 20))) + (cel + ((slug silverius) + (names + ((en "St. Silverius") + (pl + "\197\155w. Sylweriusza, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 31))) + (cel + ((slug silvester) + (names + ((en "St. Silvester") + (pl "\197\155w. Sylwestra I, papie\197\188a i wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 18))) + (cel + ((slug simeon) + (names + ((en "St. Simeon") + (pl "\197\155w. Symeona, Biskupa i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 7))) + (cel + ((slug stanislaus) + (names + ((en "St. Stanislaus") + (pl + "\197\155w. Stanis\197\130awa, Biskupa i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 26))) + (cel + ((slug stephen) + (names + ((en "St. Stephen") + (pl "\197\155w. Szczepana, Pierwszego M\196\153czennika"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 2))) + (cel + ((slug stephen-i-pope-and-martyr) + (names + ((en "St. Stephen I, Pope and Martyr") + (pl + "\197\155w. Stefana I, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 2))) + (cel + ((slug stephen-of-hungary) + (names + ((en "St. Stephen of Hungary") + (pl "\197\155w. Stefana, Kr\195\179la i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 17))) + (cel + ((slug stigmata-of-st-francis) + (names + ((en "Stigmata of St. Francis") + (pl "Stygmat\195\179w \197\155w. Franciszka, Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 30))) + (cel + ((slug sts-abdon-sennen) + (names + ((en "Sts. Abdon & Sennen") + (pl + "\197\155\197\155. Abdona i Sennena, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 3))) + (cel + ((slug sts-alexander-companions) + (names + ((en "Sts. Alexander & Companions") + (pl + "\197\155\197\155. Aleksandra i Towarzyszy, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 25))) + (cel + ((slug sts-chrysanthus-daria) + (names + ((en "Sts. Chrysanthus & Daria") + (pl + "\197\155\197\155. Chryzanta i Darii, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 26))) + (cel + ((slug sts-cletus-marcellinus) + (names + ((en "Sts. Cletus & Marcellinus") + (pl + "\197\155\197\155. Kleta i Marcelina, Papie\197\188y i M\196\153czennik\195\179w"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 16))) + (cel + ((slug sts-cornelius-cyprian) + (names + ((en "Sts. Cornelius & Cyprian") + (pl + "\197\155w. Korneliusza, Papie\197\188a i Cypriana, M\196\153czennik\195\179w"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 27))) + (cel + ((slug sts-cosmas-damian) + (names + ((en "Sts. Cosmas & Damian") + (pl "\197\155w. Kosmy i Damiana, M\196\153czennik\195\179w"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 26))) + (cel + ((slug sts-cyprian-justina) + (names + ((en "Sts. Cyprian & Justina") + (pl + "\197\155\197\155. Cypriana i Justyny, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 7))) + (cel + ((slug sts-cyril-methodius) + (names + ((en "Sts. Cyril & Methodius") + (pl + "\197\155\197\155. Cyryla i Metodego, Biskup\195\179w i Wyznawc\195\179w"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 16))) + (cel + ((slug sts-euphemia-lucy-and-geminianus) + (names + ((en "Sts. Euphemia, Lucy and Geminianus") + (pl + "\197\155\197\155. Eufemii, \197\129ucji i Geminiana, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 20))) + (cel + ((slug sts-eustace-companions) + (names + ((en "Sts. Eustace & Companions") + (pl + "\197\155w. Eustachego i Towarzyszy, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 20))) + (cel + ((slug sts-fabian-sebastian) + (names + ((en "Sts. Fabian & Sebastian") + (pl + "\197\155\197\155. Fabiana, Papie\197\188a i Sebastiana, M\196\153czennik\195\179w"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 15))) + (cel + ((slug sts-faustinus-jovita) + (names + ((en "Sts. Faustinus & Jovita") + (pl + "\197\155\197\155. Faustyna i Jowity, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 6))) + (cel + ((slug sts-felicitas-perpetua) + (names + ((en "Sts. Felicitas & Perpetua") + (pl + "\197\155\197\155. Perpetui i Felicyty, M\196\153czennic"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 30))) + (cel + ((slug sts-felix-and-adauctus) + (names + ((en "Sts. Felix and Adauctus") + (pl + "\197\155\197\155. Feliksa i Adaukta, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 19))) + (cel + ((slug sts-gervasius-and-protasius) + (names + ((en "Sts. Gervasius and Protasius") + (pl + "\197\155\197\155. Gerwazego i Protazego, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 13))) + (cel + ((slug sts-hippolytus-cassian) + (names + ((en "Sts. Hippolytus & Cassian") + (pl + "\197\155\197\155. Hipolita i Kasjana, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 26))) + (cel + ((slug sts-john-paul) + (names + ((en "Sts. John & Paul") + (pl + "\197\155\197\155. Jana i Paw\197\130a, M\196\153czennik\195\179w"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 2))) + (cel + ((slug sts-marcellinus-peter-erasmus) + (names + ((en "Sts. Marcellinus, Peter, & Erasmus") + (pl + "\197\155\197\155. Marcelina i Piotra, M\196\153czennik\195\179w oraz Erazma, Biskupa"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 19))) + (cel + ((slug sts-marius-martha-audifax-abachum) + (names + ((en "Sts. Marius, Martha, Audifax & Abachum") + (pl + "\197\155\197\155. Mariusza, Marty, Audifaksa i Abachuma"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 28))) + (cel + ((slug sts-nazarius-celsus-st-victor-i-st-innocent-i) + (names + ((en "Sts. Nazarius & Celsus, St. Victor I & St. Innocent I") + (pl + "\197\155\197\155. Nazariusza i Celsa, M\196\153czennik\195\179w, Wiktora I, Papie\197\188a i M\196\153czennika, oraz Innocentego I, Papie\197\188a i Wyznawcy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 12))) + (cel + ((slug sts-nereus-achilleus-domitilla-pancras) + (names + ((en "Sts. Nereus, Achilleus, Domitilla, & Pancras") + (pl + "\197\154wi\196\153tych Nereusza, Achillesa, Domicylli i Pankracego, M\196\153czennik\195\179w"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 29))) + (cel + ((slug sts-peter-paul) + (names + ((en "Sts. Peter & Paul") + (pl + "\197\154wi\196\153tych Piotra i Paw\197\130a, Aposto\197\130\195\179w"))) + (rank Class1) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 11))) + (cel + ((slug sts-philip-james) + (names + ((en "Sts. Philip & James") + (pl + "\197\154wi\196\153tych Filipa i Jakuba, Aposto\197\130\195\179w"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 9))) + (cel + ((slug sts-primus-felicianus) + (names + ((en "Sts. Primus & Felicianus") + (pl + "\197\155\197\155. Pryma i Felicjana, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 11))) + (cel + ((slug sts-protus-hyacinth) + (names + ((en "Sts. Protus & Hyacinth") + (pl "\197\155w. Prota i Jacka, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 28))) + (cel + ((slug sts-simon-jude) + (names + ((en "Sts. Simon & Jude") + (pl + "\197\154wi\196\153tych Szymona i Judy Tadeusza, Aposto\197\130\195\179w"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 22))) + (cel + ((slug sts-soter-caius) + (names + ((en "Sts. Soter & Caius") + (pl + "\197\155\197\155. Sotera i Kajusa, Papie\197\188y i M\196\153czennik\195\179w"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 11))) + (cel + ((slug sts-tiburtius-susanna) + (names + ((en "Sts. Tiburtius & Susanna") + (pl + "\197\155\197\155. Tyburcjusza i Zuzanny, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 14))) + (cel + ((slug sts-tiburtius-valerian-et-maximus-martyrs) + (names + ((en "Sts. Tiburtius, Valerian et Maximus, Martyrs") + (pl + "\197\155\197\155. Tyburcjusza, Waleriana i Maksyma, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 22))) + (cel + ((slug sts-timothy-hippolytus-and-symphorianus-martyrs) + (names + ((en "Sts. Timothy, Hippolytus and Symphorianus, Martyrs") + (pl + "\197\155\197\155. Tymoteusza, Hipolita i Symforiana, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 10))) + (cel + ((slug sts-tryphonis-respicii-et-nymphae) + (names + ((en "Sts. Tryphonis, Respicii, et Nymphae") + (pl + "\197\155\197\155. Tryfona, Respicjusza i Nimfy, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 22))) + (cel + ((slug sts-vincent-anastasius) + (names + ((en "Sts. Vincent & Anastasius") + (pl + "\197\155\197\155. Wincentego i Anastazego, M\196\153czennik\195\179w"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 4))) + (cel + ((slug sts-vitalis-and-agricola-martyrs) + (names + ((en "Sts. Vitalis and Agricola, Martyrs") + (pl + "\197\155\197\155. Witalisa i Agrykoli, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 11) (day 26))) + (cel + ((slug sylvester) + (names ((en "St. Sylvester") (pl "\197\155w. Sylwestra, Opata"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 18))) + (cel + ((slug symphorosa-and-sons) + (names + ((en "Ss. Symphorosa and sons") + (pl "\197\155\197\155. Symforozy i Siedmiu Jej Syn\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 5))) + (cel + ((slug telesphorus-pope-and-martyr) + (names + ((en "St. Telesphorus Pope and Martyr") + (pl + "\197\155w. Telesfora, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 15))) + (cel + ((slug teresa-of-avila) + (names + ((en "St. Teresa of Avila") + (pl "\197\155w. Teresy z Avili, Dziewicy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 23))) + (cel + ((slug thecla) + (names + ((en "St. Thecla") + (pl "\197\155w. Tekli, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 3))) + (cel + ((slug theresa-of-the-infant-jesus) + (names + ((en "St. Theresa of the Infant Jesus") + (pl "\197\155w. Teresy od Dzieci\196\133tka Jezus, Dziewicy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 21))) + (cel + ((slug thomas) + (names + ((en "St. Thomas") (pl "\197\155w. Tomasza, Aposto\197\130a"))) + (rank Class2) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 3) (day 7))) + (cel + ((slug thomas-aquinas) + (names + ((en "St. Thomas Aquinas") + (pl + "\197\155w. Tomasza z Akwinu, Wyznawcy i Doktora Ko\197\155cio\197\130a"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 29))) + (cel + ((slug thomas-becket) + (names + ((en "St. Thomas Becket") + (pl + "\197\155w. Tomasza z Canterbury, Biskupa i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 22))) + (cel + ((slug thomas-of-villanova) + (names + ((en "St. Thomas of Villanova") + (pl "\197\155w. Tomasza z Villanueva, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 1) (day 24))) + (cel + ((slug timothy) + (names + ((en "St. Timothy") + (pl "\197\155w. Tymoteusza, Biskupa i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 6))) + (cel + ((slug titus) + (names + ((en "St. Titus") (pl "\197\155w. Tytusa, Biskupa i Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 6))) + (cel + ((slug transfiguration-of-our-lord) + (names + ((en "Transfiguration of Our Lord") + (pl "Przemienienie Pa\197\132skie"))) + (rank Class2) (status Feast) (colour White) (subject Lord) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 1))) + (cel + ((slug twelve-holy-brothers-martyrs) + (names + ((en "Twelve Holy Brothers, Martyrs") + (pl + "\197\155\197\155. Dwunastu Braci, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 16))) + (cel + ((slug ubaldus) + (names + ((en "St. Ubaldus") + (pl "\197\155w. Ubalda, Biskupa i Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 25))) + (cel + ((slug urban-pope-and-martyr) + (names + ((en "St. Urban, Pope and Martyr") + (pl + "\197\155w. Urbana I, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 10) (day 21))) + (cel + ((slug ursula-and-companions) + (names + ((en "St. Ursula and Companions") + (pl + "\197\155\197\155. Urszuli i Towarzyszek, Dziewic i M\196\153czennic"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 2) (day 14))) + (cel + ((slug valentine) + (names + ((en "St. Valentine") + (pl + "\197\155w. Walentego, Kap\197\130ana i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 5) (day 18))) + (cel + ((slug venantius) + (names + ((en "St. Venantius") + (pl "\197\155w. Wenancjusza, M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 24))) + (cel + ((slug vigil-of-christmas) + (names + ((en "Vigil of Christmas") + (pl "Wigilia Bo\197\188ego Narodzenia"))) + (rank Class1) (status Feast) (colour Violet) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 9))) + (cel + ((slug vigil-of-st-lawrence) + (names + ((en "Vigil of St. Lawrence") + (pl "Wigilia \197\155w. Wawrzy\197\132ca, M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 28))) + (cel + ((slug vigil-of-sts-peter-paul) + (names + ((en "Vigil of Sts. Peter & Paul") + (pl + "Wigilia \197\155\197\155. Aposto\197\130\195\179w Piotra i Paw\197\130a"))) + (rank Class2) (status Feast) (colour Violet) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 14))) + (cel + ((slug vigil-of-the-assumption) + (names + ((en "Vigil of the Assumption") + (pl "Wigilia Wniebowzi\196\153cia N. M. P."))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 23))) + (cel + ((slug vigil-of-the-nativity-of-st-john-the-baptist) + (names + ((en "Vigil of the Nativity of St. John the Baptist") + (pl "Wigilia Narodzenia \197\154w. Jana Chrzciciela"))) + (rank Class2) (status Feast) (colour Violet) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 19))) + (cel + ((slug vincent-de-paul) + (names + ((en "St. Vincent de Paul") + (pl "\197\155w. Wincentego a Paulo, Wyznawcy"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 4) (day 5))) + (cel + ((slug vincent-ferrer) + (names + ((en "St. Vincent Ferrer") + (pl "\197\155w. Wincentego Fereriusza, Wyznawcy"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 7) (day 2))) + (cel + ((slug visitation-of-the-blessed-virgin-mary) + (names + ((en "Visitation of the Blessed Virgin Mary") + (pl "Nawiedzenia N. M. P."))) + (rank Class2) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 15))) + (cel + ((slug vitus) + (names + ((en "St. Vitus") + (pl + "\197\155\197\155. Wita, Modesta i Krescencji, M\196\153czennik\195\179w"))) + (rank Class3) (status Commemoration_only) (colour White) + (subject Saint) (citations ()) (layer ef-universal)))) + ((date (Fixed (month 12) (day 2))) + (cel + ((slug vivian) + (names + ((en "St. Vivian") + (pl "\197\155w. Bibiany, Dziewicy i M\196\153czennicy"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 9) (day 28))) + (cel + ((slug wenceslaus) + (names + ((en "St. Wenceslaus") + (pl + "\197\155w. Wac\197\130awa, Ksi\196\153cia i M\196\153czennika"))) + (rank Class3) (status Feast) (colour Red) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 6) (day 25))) + (cel + ((slug william) + (names ((en "St. William") (pl "\197\155w. Wilhelma, Opata"))) + (rank Class3) (status Feast) (colour White) (subject Saint) + (citations ()) (layer ef-universal)))) + ((date (Fixed (month 8) (day 26))) + (cel + ((slug zephyrinus) + (names + ((en "St. Zephyrinus") + (pl + "\197\155w. Zefiryna, Papie\197\188a i M\196\153czennika"))) + (rank Class3) (status Commemoration_only) (colour Red) + (subject Saint) (citations ()) (layer ef-universal))))))) @@ -1,6 +1,7 @@ (test (name test_colitur) (libraries colitur_kernel rite_ef alcotest qcheck qcheck-alcotest sexplib) + (deps ../data/ef/sanctoral.sexp) (preprocess (pps ppx_sexp_conv))) diff --git a/test/test_colitur.ml b/test/test_colitur.ml index a9cacd2..ba82fcd 100644 --- a/test/test_colitur.ml +++ b/test/test_colitur.ml @@ -3,4 +3,4 @@ let () = Alcotest.run "colitur" [ Test_date.suite; Test_computus.suite; Test_colour.suite; Test_slug.suite; Test_names.suite; Test_overlay.suite; Test_temporal_ef.suite; Test_validate.suite; Test_precedence.suite; - Test_calendar.suite; Test_precedence_ef.suite ] + Test_calendar.suite; Test_precedence_ef.suite; Test_sanctoral_ef.suite ] diff --git a/test/test_sanctoral_ef.ml b/test/test_sanctoral_ef.ml new file mode 100644 index 0000000..8fb178f --- /dev/null +++ b/test/test_sanctoral_ef.ml @@ -0,0 +1,115 @@ +(* Loads the bootstrapped data/ef/sanctoral.sexp (Task 10, tools/ + bootstrap_sanctoral.ml) through Layer.load and checks it against counts + independently derived from the source INI itself (grep -c '^\[', + grep '^rank' | sort | uniq -c -- see the task report), plus two named + spot-checks against the INI's own text so a passing count can't hide the + wrong 322 entries having been converted (task brief's "live hazard"). *) + +module L = Colitur_kernel.Layer +module Cel = Colitur_kernel.Celebration +module S = Colitur_kernel.Slug +module DS = Colitur_kernel.Date_spec +module Col = Colitur_kernel.Colour +module Sub = Colitur_kernel.Subject +module Lang = Colitur_kernel.Lang +module Names = Colitur_kernel.Names +module V = Rite_ef.Vocab_ef +module PE = Rite_ef.Precedence_ef + +(* Relative to this test's own build directory (_build/default/test/); made + available there because test/dune declares it as a dep of the test + stanza. *) +let path = "../data/ef/sanctoral.sexp" + +let load () = + match L.load V.rank_of_sexp path with + | Ok l -> l + | Error e -> Alcotest.failf "%s: failed to load: %s" path e + +let mkdate m d = match DS.fixed ~month:m ~day:d with Ok t -> t | Error e -> failwith e + +let test_load_and_counts () = + let l = load () in + Alcotest.(check int) "322 entries" 322 (List.length l.L.entries); + let commemoration_only = + List.filter (fun e -> e.L.cel.Cel.status = Cel.Commemoration_only) l.L.entries + in + Alcotest.(check int) "114 Commemoration_only" 114 (List.length commemoration_only); + let class1 = List.filter (fun e -> e.L.cel.Cel.rank = V.Class1) l.L.entries in + Alcotest.(check int) "12 Class1" 12 (List.length class1); + let temporal_subjects = List.filter (fun e -> e.L.cel.Cel.subject = Sub.Temporal) l.L.entries in + Alcotest.(check int) "no Subject.Temporal" 0 (List.length temporal_subjects); + (* Every slug already had to pass Slug.of_string during load (Slug.t_of_sexp + is the validating parser -- an invalid slug would have failed the whole + Layer.load with Error, never landing here silently). Re-checking is + still worth doing explicitly, rather than resting entirely on "load + didn't error", so a future loader change that weakens that guarantee + has a test that would catch it directly. *) + List.iter + (fun e -> + match S.of_string (S.to_string e.L.cel.Cel.slug) with + | Ok _ -> () + | Error msg -> Alcotest.failf "slug %s failed re-validation: %s" (S.to_string e.L.cel.Cel.slug) msg) + l.L.entries; + (* All 322 dates are Date_spec.Fixed month/day pairs constructed via + Date_spec.fixed, which already rejects an out-of-range day for that + month against the LEAP-year maximum -- so every one must resolve in a + leap year (2028: divisible by 4, not by 100). *) + List.iter + (fun e -> + match DS.resolve e.L.date ~year:2028 with + | Some _ -> () + | None -> Alcotest.failf "slug %s: date does not resolve in leap year 2028" (S.to_string e.L.cel.Cel.slug)) + l.L.entries + +let find l slug = + match L.find l (S.of_string_exn slug) with + | Some e -> e + | None -> Alcotest.failf "slug %s not found in %s" slug path + +(* Named spot-check 1: one of the 6 entries carrying an explicit `class` + field in the source (INI lines: date=02-02, rank=class-2, colour=white, + class=lord, name.en/name.pl as below). Exercises decision 1's non-default + branch -- an entry where subject must NOT fall back to Saint. *) +let test_spot_check_explicit_class () = + let l = load () in + let e = find l "purification-of-the-blessed-virgin-mary" in + let cel = e.L.cel in + Alcotest.(check bool) "date 02-02" true (e.L.date = mkdate 2 2); + Alcotest.(check bool) "rank Class2" true (cel.Cel.rank = V.Class2); + Alcotest.(check bool) "status Feast" true (cel.Cel.status = Cel.Feast); + Alcotest.(check bool) "colour White" true (cel.Cel.colour = Col.White); + Alcotest.(check bool) "subject Lord (from class = lord)" true (cel.Cel.subject = Sub.Lord); + Alcotest.(check (option string)) "name.en" (Some "Purification of the Blessed Virgin Mary") + (Names.find cel.Cel.names (Lang.of_string_exn "en")); + Alcotest.(check (option string)) "name.pl" (Some "Oczyszczenie N. M. P.") + (Names.find cel.Cel.names (Lang.of_string_exn "pl")); + Alcotest.(check string) "layer tagged universal (Precedence_ef.universal_layer)" PE.universal_layer + cel.Cel.layer + +(* Named spot-check 2: a `rank = commemoration` entry (INI lines: date=01-14, + rank=commemoration, colour=white, no class, name.en/name.pl as below). + Exercises decision 2 (Commemoration_only + inferred Class3) AND decision + 1's default branch (no class field -> Saint) on the SAME entry. *) +let test_spot_check_commemoration () = + let l = load () in + let e = find l "maur-abbot" in + let cel = e.L.cel in + Alcotest.(check bool) "date 01-15" true (e.L.date = mkdate 1 15); + Alcotest.(check bool) "rank inferred Class3" true (cel.Cel.rank = V.Class3); + Alcotest.(check bool) "status Commemoration_only" true (cel.Cel.status = Cel.Commemoration_only); + Alcotest.(check bool) "colour White" true (cel.Cel.colour = Col.White); + Alcotest.(check bool) "subject defaults to Saint (no class field)" true (cel.Cel.subject = Sub.Saint); + Alcotest.(check (option string)) "name.en" (Some "St. Maur, Abbot") + (Names.find cel.Cel.names (Lang.of_string_exn "en")); + Alcotest.(check (option string)) "name.pl" (Some "św. Maura, Opata") + (Names.find cel.Cel.names (Lang.of_string_exn "pl")) + +let suite = + ( "Sanctoral_ef (data/ef/sanctoral.sexp)", + [ Alcotest.test_case "load succeeds and counts match the source INI" `Quick + test_load_and_counts; + Alcotest.test_case "spot-check: explicit class = lord (Purification of the BVM)" `Quick + test_spot_check_explicit_class; + Alcotest.test_case "spot-check: rank = commemoration (St. Maur, Abbot)" `Quick + test_spot_check_commemoration ] ) diff --git a/tools/bootstrap_sanctoral.ml b/tools/bootstrap_sanctoral.ml new file mode 100644 index 0000000..19adc0b --- /dev/null +++ b/tools/bootstrap_sanctoral.ml @@ -0,0 +1,235 @@ +(* Bootstraps data/ef/sanctoral.sexp from lectio's tridentine-calendar.ini + (spec §4, docs/superpowers/specs/2026-08-11-colitur-plan3-resolution- + engine-design.md). A documented one-shot under tools/, not part of the + kernel: reading someone else's INI needs a reader, which does not + contradict "no hand-written parser" -- that rule is about colitur's own + format (S-expressions, parsed by sexplib/ppx_sexp_conv, never by hand). + + Every field is built through the kernel's own validating constructors + (Slug.of_string, Colour.of_string, Vocab_ef.rank_of_string, ...), so the + emitted sexp is valid by construction: a bad slug or an unknown rank fails + the bootstrap here, not a later Layer.load. + + Usage: dune exec tools/bootstrap_sanctoral.exe -- [source.ini] [dest.sexp] + Defaults assume the sibling checkout layout documented in CLAUDE.md + (~/git/projects/lectio next to ~/git/projects/colitur) and a run from the + colitur repo root. *) + +module Cel = Colitur_kernel.Celebration +module Slug = Colitur_kernel.Slug +module Colour = Colitur_kernel.Colour +module Subject = Colitur_kernel.Subject +module Names = Colitur_kernel.Names +module Lang = Colitur_kernel.Lang +module DS = Colitur_kernel.Date_spec +module Layer = Colitur_kernel.Layer +module V = Rite_ef.Vocab_ef +module PE = Rite_ef.Precedence_ef + +let default_source = "../lectio/internal/caldata/tridentine-calendar.ini" +let default_dest = "data/ef/sanctoral.sexp" + +(* Fails loudly and stops, per the brief: a source shape the mapping does not + cover must never fall back to a silent default. *) +let die fmt = Printf.ksprintf (fun s -> prerr_endline ("bootstrap_sanctoral: " ^ s); exit 1) fmt + +(* --- A minimal INI reader for lectio's format only ------------------------ + + Not a general INI library: comment lines start with ';', section headers + are "[name]", and every other non-blank line is "key = value" with the + value running to end of line (verified against the actual source file -- + no embedded '=', quotes, or trailing whitespace in any value; see the + task report). This is a reader for someone else's format, not colitur's + own -- see the module comment above. *) + +type section = { name : string; fields : (string * string) list } + +let parse_ini path = + if not (Sys.file_exists path) then die "source file not found: %s" path; + let ic = open_in path in + Fun.protect + ~finally:(fun () -> close_in_noerr ic) + (fun () -> + let sections = ref [] in + let cur_name = ref None in + let cur_fields = ref [] in + let flush () = + match !cur_name with + | Some n -> sections := { name = n; fields = List.rev !cur_fields } :: !sections + | None -> () + in + (try + while true do + let raw = input_line ic in + let line = String.trim raw in + if line = "" || line.[0] = ';' then () + else if line.[0] = '[' && line.[String.length line - 1] = ']' then begin + flush (); + cur_name := Some (String.sub line 1 (String.length line - 2)); + cur_fields := [] + end + else + match String.index_opt line '=' with + | None -> die "%s: unparseable line (no '='): %S" path line + | Some i -> + let key = String.trim (String.sub line 0 i) in + let value = String.trim (String.sub line (i + 1) (String.length line - i - 1)) in + cur_fields := (key, value) :: !cur_fields + done + with End_of_file -> ()); + flush (); + List.rev !sections) + +(* --- Field-level mapping (spec §4.2) --------------------------------------- *) + +let field sec key = + match List.assoc_opt key sec.fields with + | Some v -> v + | None -> die "section [%s]: missing required field %S" sec.name key + +let field_opt sec key = List.assoc_opt key sec.fields + +let parse_slug sec = + match Slug.of_string sec.name with + | Ok s -> s + | Error e -> die "section [%s]: invalid slug: %s" sec.name e + +(* All 322 entries use plain MM-DD (spec §4.1); anything else is a date form + the mapping does not cover. *) +let parse_date sec = + let raw = field sec "date" in + match String.split_on_char '-' raw with + | [ mm; dd ] when String.length mm = 2 && String.length dd = 2 -> ( + match (int_of_string_opt mm, int_of_string_opt dd) with + | Some month, Some day -> ( + match DS.fixed ~month ~day with + | Ok d -> d + | Error e -> die "section [%s]: date %S: %s" sec.name raw e) + | _ -> die "section [%s]: date %S is not numeric MM-DD" sec.name raw) + | _ -> die "section [%s]: unsupported date form %S -- only MM-DD is mapped" sec.name raw + +(* rank = class-1..4 -> (Class1..4, Feast); rank = commemoration -> + (Class3, Commemoration_only) -- decision 2 in the task brief and spec + §4.3: the source gives no rank for a bare commemoration, but RG 111 orders + admitted commemorations by dignity, so one is needed. Class3 is a + documented INFERENCE (it is what the 1960 reform reduced most simple + feasts from), not an RG citation -- see docs/research/rules-register.md + §6 and Celebration.status's own doc comment for why status, not rank, + carries "can this ever be observed". *) +let parse_rank_status sec = + let raw = field sec "rank" in + if raw = "commemoration" then (V.Class3, Cel.Commemoration_only) + else + match V.rank_of_string raw with + | Some r -> (r, Cel.Feast) + | None -> die "section [%s]: unknown rank %S" sec.name raw + +(* Sanctoral colours are white, red, violet, black only (spec §4.1) -- green + and rose belong to the temporal cycle. Colour.of_string's domain is wider + (it also names green/rose), so this rejects them explicitly rather than + passing through a colour that would be a modelling error if it ever + appeared in sanctoral data. *) +let parse_colour sec = + let raw = field sec "colour" in + match Colour.of_string raw with + | Some (Colour.White | Colour.Red | Colour.Violet | Colour.Black as c) -> c + | Some (Colour.Green | Colour.Rose) -> + die "section [%s]: colour %S is temporal-only, unexpected in sanctoral data" sec.name raw + | None -> die "section [%s]: unknown colour %S" sec.name raw + +(* class = lord|bvm|saint -> Subject.t; absent -> Subject.Saint (decision 1: + Celebration.make's kernel default is Subject.Temporal, correct for the + temporal cycle and wrong for every sanctoral entry -- overridden here, + never left to the default). Only 6 of 322 entries carry an explicit + class in the source, and all 6 are "lord" as of this bootstrap; bvm/saint + are mapped in case a future lectio update adds one, but "temporal" is + rejected -- no sanctoral entry is the temporal cycle's own office. *) +let parse_subject sec = + match field_opt sec "class" with + | None -> Subject.Saint + | Some raw -> ( + match Subject.of_string raw with + | Some Subject.Temporal -> + die "section [%s]: class %S maps to Subject.Temporal, invalid for sanctoral data" sec.name + raw + | Some s -> s + | None -> die "section [%s]: unknown class %S" sec.name raw) + +let parse_names sec = + let en = field sec "name.en" in + let pl = field sec "name.pl" in + Names.of_list [ (Lang.of_string_exn "en", en); (Lang.of_string_exn "pl", pl) ] + +(* reading.* is deliberately ignored -- Plan 4's lectionary bootstrap. *) +let convert_entry sec : V.rank Layer.entry = + let slug = parse_slug sec in + let date = parse_date sec in + let rank, status = parse_rank_status sec in + let colour = parse_colour sec in + let subject = parse_subject sec in + let names = parse_names sec in + (* PE.universal_layer, NOT lectio's own "tridentine" layer id and NOT the + Celebration.make default "temporal": Precedence_ef.band reads + Celebration.t.layer to classify RG 91 entries 11/16/24 (universal) vs + 12/19/23 (proper) vs 13/20 (indult, PE.indult_prefix). Every entry here + is the General Roman Calendar's own universal sanctoral, so all 322 get + the same provenance tag. *) + { Layer.date; cel = Cel.make ~slug ~names ~rank ~status ~colour ~subject ~citations:[] + ~layer:PE.universal_layer () } + +(* --- Provenance (spec §4.5) ------------------------------------------------ *) + +let sha256_of_file path = + let cmd = Printf.sprintf "sha256sum %s" (Filename.quote path) in + let ic = Unix.open_process_in cmd in + let line = try input_line ic with End_of_file -> die "sha256sum produced no output for %s" path in + (match Unix.close_process_in ic with + | Unix.WEXITED 0 -> () + | _ -> die "sha256sum failed for %s" path); + match String.index_opt line ' ' with + | Some i -> String.sub line 0 i + | None -> die "unexpected sha256sum output: %S" line + +let today () = + let tm = Unix.gmtime (Unix.time ()) in + Printf.sprintf "%04d-%02d-%02d" (tm.Unix.tm_year + 1900) (tm.Unix.tm_mon + 1) tm.Unix.tm_mday + +(* --- Main ------------------------------------------------------------------ *) + +let () = + let source = if Array.length Sys.argv > 1 then Sys.argv.(1) else default_source in + let dest = if Array.length Sys.argv > 2 then Sys.argv.(2) else default_dest in + let sections = parse_ini source in + if not (List.exists (fun s -> s.name = "layer") sections) then + die "%s: missing the [layer] header section" source; + let entry_sections = List.filter (fun s -> s.name <> "layer") sections in + let entries = List.map convert_entry entry_sections in + let layer = Layer.of_entries ~id:PE.universal_layer ~name:"EF (1962) universal sanctoral" entries in + let sha = sha256_of_file source in + let feasts = List.length (List.filter (fun e -> e.Layer.cel.Cel.status = Cel.Feast) entries) in + let comms = List.length entries - feasts in + let header = + Printf.sprintf + {|; data/ef/sanctoral.sexp -- EF (1962) universal sanctoral (General Roman +; Calendar), bootstrapped from lectio (sibling project; see CLAUDE.md). +; Generator: tools/bootstrap_sanctoral.ml -- do not hand-edit; re-run the +; generator against a newer lectio and commit the diff instead. +; +; Source: %s +; SHA-256: %s +; Converted (UTC): %s +; %d entries (%d feast, %d commemoration-only). Regenerate with: +; eval $(opam env) && dune exec tools/bootstrap_sanctoral.exe -- %s %s +|} + source sha (today ()) (List.length entries) feasts comms source dest + in + let body = Sexplib.Sexp.to_string_hum ~indent:2 (Layer.sexp_of_t V.sexp_of_rank layer) in + let oc = open_out dest in + Fun.protect + ~finally:(fun () -> close_out_noerr oc) + (fun () -> + output_string oc header; + output_string oc body; + output_string oc "\n"); + Printf.printf "bootstrap_sanctoral: wrote %d entries (%d feast, %d commemoration-only) to %s\n" + (List.length entries) feasts comms dest diff --git a/tools/dune b/tools/dune new file mode 100644 index 0000000..d53cd01 --- /dev/null +++ b/tools/dune @@ -0,0 +1,10 @@ +; A documented one-shot, not part of the build's normal product (spec §4.5): +; converts lectio's tridentine-calendar.ini into data/ef/sanctoral.sexp. Run +; via `dune exec tools/bootstrap_sanctoral.exe -- <source.ini> <dest.sexp>`. +; `unix` is the OCaml distribution's bundled library (already in the switch, +; not a new opam dependency) -- used only here, never by the kernel, to shell +; out to `sha256sum` for the provenance header; the kernel itself never reads +; the environment or a clock. +(executable + (name bootstrap_sanctoral) + (libraries colitur_kernel rite_ef unix sexplib)) |
