aboutsummaryrefslogtreecommitdiff
path: root/internal/calendar/temporal_ef.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/calendar/temporal_ef.go')
-rw-r--r--internal/calendar/temporal_ef.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/internal/calendar/temporal_ef.go b/internal/calendar/temporal_ef.go
index 6828f35..0cd4b41 100644
--- a/internal/calendar/temporal_ef.go
+++ b/internal/calendar/temporal_ef.go
@@ -159,6 +159,23 @@ func temporalEF(date time.Time) temporalDay {
return efCel(Christmas, "ef-nativity", White, RankClass1, 0)
case date.Month() == time.January && date.Day() == 1:
return efCel(Christmas, "ef-circumcision", White, RankClass1, 0)
+ // RG 17(a): "festum Ss.mi Nominis Iesu, celebrandum dominica quae occurrit
+ // a die 2 ad 5 ianuarii, secus die 2 ianuarii" -- the Most Holy Name of
+ // Jesus is kept on the Sunday falling 2-5 January, and when no Sunday falls
+ // in that window, on 2 January instead.
+ //
+ // The fallback is not decoration: the window is four days wide, so in
+ // roughly three years in seven no Sunday lands in it and 2 January carries
+ // the feast. Without the fallback lectio simply had no Holy Name office at
+ // all in those years.
+ //
+ // Placed before the Epiphany case below and after the Circumcision above,
+ // so 1 January keeps its own feast and 6 January keeps Epiphany.
+ case date.Month() == time.January && date.Day() >= 2 && date.Day() <= 5 &&
+ date.Weekday() == time.Sunday:
+ return efCel(Christmas, "ef-holy-name-sunday", White, RankClass2, 0)
+ case date.Month() == time.January && date.Day() == 2 && !sundayFallsJan2to5(y):
+ return efCel(Christmas, "ef-holy-name", White, RankClass2, 0)
case date.Month() == time.January && date.Day() == 6:
// Christmas, not TimeAfterEpiphany: RG 72 puts Epiphany INSIDE Christmas
// Time, which runs to 13 January. The slug is unchanged.
@@ -330,6 +347,19 @@ func temporalEF(date time.Time) temporalDay {
return efCel(season, "ef-"+string(slugSeason)+"-"+strconv.Itoa(week)+"-"+weekdayLower(date), col, rank, week)
}
+// sundayFallsJan2to5 reports whether any Sunday falls in RG 17(a)'s own window,
+// 2 to 5 January inclusive. When one does the Holy Name is kept on it; when
+// none does the feast falls back to 2 January, which is what "secus die 2
+// ianuarii" provides for.
+func sundayFallsJan2to5(y int) bool {
+ for day := 2; day <= 5; day++ {
+ if time.Date(y, time.January, day, 0, 0, 0, 0, time.UTC).Weekday() == time.Sunday {
+ return true
+ }
+ }
+ return false
+}
+
// firstSundayAfterEpiphany returns the first Sunday strictly after 6 January
// of year y -- the anchor the weeks after Epiphany are numbered from. When
// Epiphany itself falls on a Sunday the next one is meant, which is why the