diff options
Diffstat (limited to 'lib/rites/rite_ef/lectionary_ef.ml')
| -rw-r--r-- | lib/rites/rite_ef/lectionary_ef.ml | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/lib/rites/rite_ef/lectionary_ef.ml b/lib/rites/rite_ef/lectionary_ef.ml index 329faff..216c2c4 100644 --- a/lib/rites/rite_ef/lectionary_ef.ml +++ b/lib/rites/rite_ef/lectionary_ef.ml @@ -141,6 +141,94 @@ let days_since_sunday : Date.weekday -> int = function | Date.Fri -> 5 | Date.Sat -> 6 +(* ---- The votive Mass of Our Lady on Saturday (RG 309(a)) ---- + + RG 78 gives the OFFICE: "In sabbatis, in quibus occurrit Officium de feria + IV classis, fit de sancta Maria in sabbato" -- and Temporal_ef has built + that since the ef-bvm-saturday task, white and IV class. What it did NOT + build is WHICH MASS is said, so the day observed Our Lady and then read the + feria's own Epistle and Gospel: white, IV class, de sancta Maria, and + Colossians on the parable of the weeds. That is test_oracle.ml's own M26 + shape 1. + + RG 309(a) (LT.txt:2445-2447) is the rule: "in Ecclesia universa, Missae quae + pro sancta Maria in sabbato, IUXTA TEMPORUM DIVERSITATEM, in Missali + assignantur" -- the Masses the Missal assigns according to the diversity of + SEASONS. It prints five, each under its own season heading (the "Missae de + sancta Maria in sabbato" section, scan1.txt:42982-43290): + + I TEMPORE ADVENTUS + II A NATIVITATE DOMINI USQUE AD PURIFICATIONEM + III A DIE 3 FEBRUARII USQUE AD FERIAM IV HEBDOMADAE SANCTAE + IV TEMPORE PASCHALI + V A FESTO SS. TRINITATIS USQUE AD SABBATUM ANTE DOMINICAM I ADVENTUS + + THE MISSAL'S RANGES ARE NOT THIS RITE'S SEASONS, and that looked like the + hard part: II ends at the Purification, mid-season; III runs from a civil + date to a movable one, spanning four of the eight seasons. But measured + against what a IV-class Saturday can actually BE, it collapses to a + seasonal mapping plus one date test: + + - Mass II vs III splits at 2/3 February, inside Time_after_epiphany. That + is the ONLY boundary needing a date, and it is a fixed civil one. + - III's end (Feria IV of Holy Week) and IV's start (Paschaltide) leave the + Triduum unassigned -- UNREACHABLE: Holy Saturday is I class, so no + IV-class Saturday exists there. + - IV's end and V's start (Trinity) leave Pentecost week unassigned -- + ALSO UNREACHABLE, and verified rather than assumed: colitur puts + Pentecost week in Paschaltide and its Saturday is [ef-pentecost-ember-sat], + an Ember Saturday, never IV class. Time_after_pentecost then begins + exactly at Trinity Sunday, which is exactly where Mass V begins. + + So no Easter arithmetic is needed here at all. Both gaps are covered by + dedicated tests rather than left to inference. + + CITATION WITNESSES, stated because they differ: Masses II-V were each + confirmed twice, against the scan AND against a live missalemeum capture of + 2038 which names them ("II Mass of the B. V. M.", "III Mass...", and so + on). Mass I rests on the SCAN ALONE -- no oracle year to hand has an Advent + Saturday carrying this office, so its two citations have one witness where + the others have two. *) +let bvm_saturday_citations season ~month ~day = + let cite first gospel = + [ { Citation.part = Citation.First; reference = first }; + { Citation.part = Citation.Gospel; reference = gospel } ] + in + match (season : Vocab_ef.season) with + (* I -- Tempore Adventus. Isai. 7, 10-15 (scan1.txt:43008-43009) / + Luc. 1, 26-38 (scan1.txt:42998-42999). *) + | Vocab_ef.Advent -> cite "Isa 7:10-15" "Luke 1:26-38" + (* II -- A Nativitate Domini usque ad Purificationem. Tit. 3, 4-7 + (scan1.txt:43056-43057) / Luc. 2, 15-20 (scan1.txt:43096-43097). *) + | Vocab_ef.Christmastide -> cite "Titus 3:4-7" "Luke 2:15-20" + | Vocab_ef.Time_after_epiphany when month = 1 || (month = 2 && day <= 2) -> + cite "Titus 3:4-7" "Luke 2:15-20" + (* III -- A die 3 februarii usque ad feriam IV Hebdomadae Sanctae. + Eccli. 24, 14-16 (scan1.txt:43121-43122) / Luc. 11, 27-28 + (scan1.txt:43165-43166). *) + | Vocab_ef.Time_after_epiphany | Vocab_ef.Septuagesima | Vocab_ef.Lent | Vocab_ef.Passiontide -> + cite "Ecclus 24:14-16" "Luke 11:27-28" + (* IV -- Tempore paschali. Eccli. 24, 14-16 (scan1.txt:43177-43178) / + Io. 19, 25-27 (scan1.txt:43202-43203). *) + | Vocab_ef.Paschaltide -> cite "Ecclus 24:14-16" "John 19:25-27" + (* V -- A festo Ss. Trinitatis usque ad sabbatum ante dominicam I Adventus. + Eccli. 24, 14-16 (scan1.txt:43224-43226) / Luc. 11, 27-28 + (scan1.txt:43250-43252). *) + | Vocab_ef.Time_after_pentecost -> cite "Ecclus 24:14-16" "Luke 11:27-28" + +(* The office is identified STRUCTURALLY, never off the slug -- it deliberately + reuses the ordinary ferial slug (ef-bvm-saturday task: a bespoke one would + have broken Validate's own slug-uniqueness-per-year invariant, since the + office recurs many times a year). Three conditions, all necessary: [Bvm] + subject, IV class, and a Saturday. A Marian FEAST on a Saturday carries + [Bvm] too, but has its own citations and so is answered by step 1 long + before reaching here; the rank and weekday tests close the gap anyway. *) +let is_bvm_saturday_office (observed : Vocab_ef.rank Celebration.t) + (temporal : (Vocab_ef.season, Vocab_ef.rank) Temporal.t) = + observed.Celebration.subject = Subject.Bvm + && observed.Celebration.rank = Vocab_ef.Class4 + && temporal.Temporal.weekday = Date.Sat + let readings ~lectionary ~commons ~observed ~temporal ~date ~temporal_at = match observed.Celebration.citations with | _ :: _ as cs -> cs @@ -241,6 +329,17 @@ let readings ~lectionary ~commons ~observed ~temporal ~date ~temporal_at = with | Some cs -> cs | None -> ( + (* The votive Mass of Our Lady on Saturday (RG 309(a)) runs HERE: + after the proper (step 1) and the Common (step 4), which answer + for a saint who beat the feria, and BEFORE the temporal slug + lookup -- which is exactly what used to answer, with the feria's + own Mass, on a day whose office is Our Lady's. Placing it later + would be dead code; placing it earlier would let it outrank a + real saint's proper. *) + if is_bvm_saturday_office observed temporal then + bvm_saturday_citations temporal.Temporal.season ~month:(Date.month date) + ~day:(Date.day date) + else match Lectionary.find lectionary temporal.Temporal.office.Celebration.slug with | Some cs -> cs | None -> ( |
