summaryrefslogtreecommitdiff
path: root/lib/rites/rite_ef
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-11 13:26:15 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-11 13:26:15 +0200
commitabff8e648d3ee5ac3840e16fbec3e94fce352205 (patch)
tree683ddf5870b1a7ce7dee0299ab506f9ce773315c /lib/rites/rite_ef
parent3c3e84a6ebd4d2a9bcd81410d4a2e5c2fa51005d (diff)
downloadcolitur-abff8e648d3ee5ac3840e16fbec3e94fce352205.tar.gz
colitur-abff8e648d3ee5ac3840e16fbec3e94fce352205.zip
rite(ef): named temporal days, vigils and the Nativity octave
The I-class feasts of the Lord (RG 91 entries 1-3), the Nativity, Ascension and Pentecost vigils (RG 28-34), and the days within the Octave of the Nativity (RG 64-70). Christ the King is the last Sunday of October per the 1960 calendar, not the OF's last Sunday before Advent. Rogation Wednesday coincides with the Ascension vigil; with no precedence framework until Plan 3, temporal emits the higher-ranked vigil.
Diffstat (limited to 'lib/rites/rite_ef')
-rw-r--r--lib/rites/rite_ef/temporal_ef.ml50
-rw-r--r--lib/rites/rite_ef/temporal_ef.mli8
2 files changed, 58 insertions, 0 deletions
diff --git a/lib/rites/rite_ef/temporal_ef.ml b/lib/rites/rite_ef/temporal_ef.ml
index c975316..9560940 100644
--- a/lib/rites/rite_ef/temporal_ef.ml
+++ b/lib/rites/rite_ef/temporal_ef.ml
@@ -46,3 +46,53 @@ let season d =
else if before d easter then Passiontide (* RG 75; Holy Saturday included *)
else if Date.compare d paschal_end <= 0 then Paschaltide (* RG 76 *)
else Time_after_pentecost (* RG 77 *)
+
+(* Last Sunday of October, per the 1960 calendar -- NOT the OF's last Sunday
+ before Advent. Register ยง6 flags this for primary-source confirmation. *)
+let christ_the_king y = sunday_on_or_before (mk y 10 31)
+
+let same a b = Date.compare a b = 0
+
+(* Named temporal days: the I-class feasts of the Lord (RG 91 entries 1-3), the
+ vigils (RG 28-34, RG 91 entries 5 and 9) and the days within the Octave of
+ the Nativity (RG 64-70, RG 91 entry 17).
+
+ Returns (season, slug, colour, rank, week). *)
+let named d =
+ let y = Date.year d in
+ let easter = Computus.gregorian_easter y in
+ let off n = Date.add_days easter n in
+ let m = Date.month d and dd = Date.day d in
+ if m = 12 && dd = 25 then Some (Christmastide, "ef-nativity", Colour.White, Class1, None)
+ else if m = 12 && dd = 24 then
+ (* RG 91 entry 5: the Vigil of the Nativity is I class. lectio has no slug
+ for it, so this key has no lectionary entry until Plan 3 fills it. *)
+ Some (Advent, "ef-nativity-vigil", Colour.Violet, Class1, None)
+ else if m = 12 && (dd = 29 || dd = 30 || dd = 31) then
+ (* Days within the Octave of the Nativity; 26-28 Dec are Stephen, John and
+ the Innocents, hence sanctoral (Plan 3). Colitur slugs -- lectionary gap. *)
+ Some (Christmastide, Printf.sprintf "ef-nativity-octave-day-%d" (dd - 24), Colour.White, Class2, None)
+ else if m = 1 && dd = 1 then Some (Christmastide, "ef-circumcision", Colour.White, Class1, None)
+ else if m = 1 && dd = 6 then Some (Christmastide, "ef-epiphany", Colour.White, Class1, None)
+ else if same d (off (-46)) then Some (Lent, "ef-ash-wednesday", Colour.Violet, Class1, None)
+ else if same d (off (-14)) then Some (Passiontide, "ef-passion-sunday", Colour.Violet, Class1, Some 1)
+ else if same d (off (-7)) then Some (Passiontide, "ef-palm-sunday", Colour.Violet, Class1, Some 2)
+ else if same d easter then Some (Paschaltide, "ef-easter-sunday", Colour.White, Class1, Some 1)
+ else if same d (off 7) then Some (Paschaltide, "ef-low-sunday", Colour.White, Class1, Some 2)
+ else if same d (off 38) then
+ (* RG 91 entry 21: II-class vigil. It is also Rogation Wednesday; with no
+ precedence framework until Plan 3, temporal emits the higher-ranked
+ vigil and the Rogation commemoration waits for RG 108-111. *)
+ Some (Paschaltide, "ef-ascension-vigil", Colour.White, Class2, None)
+ else if same d (off 39) then Some (Paschaltide, "ef-ascension", Colour.White, Class1, None)
+ else if same d (off 48) then
+ Some (Paschaltide, "ef-pentecost-vigil", Colour.Red, Class1, None) (* RG 91 entry 9 *)
+ else if same d (off 49) then Some (Paschaltide, "ef-pentecost", Colour.Red, Class1, None)
+ else if same d (off 56) then Some (Time_after_pentecost, "ef-trinity", Colour.White, Class1, Some 1)
+ else if same d (off 60) then
+ Some (Time_after_pentecost, "ef-corpus-christi", Colour.White, Class1, None)
+ else if same d (off 68) then
+ Some (Time_after_pentecost, "ef-sacred-heart", Colour.White, Class1, None)
+ else if same d (christ_the_king y) then
+ Some (Time_after_pentecost, "ef-christ-the-king", Colour.White, Class1, None)
+ else None
diff --git a/lib/rites/rite_ef/temporal_ef.mli b/lib/rites/rite_ef/temporal_ef.mli
index 7ee75e5..0a9656a 100644
--- a/lib/rites/rite_ef/temporal_ef.mli
+++ b/lib/rites/rite_ef/temporal_ef.mli
@@ -10,3 +10,11 @@ val advent_start : int -> Date.t
val year_start : int -> Date.t
val season : Date.t -> Vocab_ef.season
+
+(** Last Sunday of October, per the 1960 calendar. *)
+val christ_the_king : int -> Date.t
+
+(** The named temporal days: I-class feasts of the Lord, vigils, and days within
+ the Octave of the Nativity. Returns (season, slug, colour, rank, week). *)
+val named :
+ Date.t -> (Vocab_ef.season * string * Colour.t * Vocab_ef.rank * int option) option