aboutsummaryrefslogtreecommitdiff
path: root/internal/calendar/calendar.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/calendar/calendar.go')
-rw-r--r--internal/calendar/calendar.go44
1 files changed, 41 insertions, 3 deletions
diff --git a/internal/calendar/calendar.go b/internal/calendar/calendar.go
index 98dec43..e0f5217 100644
--- a/internal/calendar/calendar.go
+++ b/internal/calendar/calendar.go
@@ -6,11 +6,49 @@ import (
"time"
)
-// Compute returns the Ordinary Form liturgical day for date under the given
-// Selection, with the ordered layer stack supplying celebrations. It is pure
-// and total: any valid Gregorian date yields a LiturgicalDay.
+// Compute returns the liturgical day for date under the given Selection, with
+// the ordered layer stack supplying celebrations. It is pure and total: any
+// valid Gregorian date yields a LiturgicalDay. Selection.Form "old" computes the
+// Extraordinary Form (1962); anything else computes the Ordinary Form.
func Compute(date time.Time, sel Selection, layers []Layer) LiturgicalDay {
date = date.UTC().Truncate(24 * time.Hour)
+ if sel.Form == "old" {
+ return computeEF(date, sel, layers)
+ }
+ return computeOF(date, sel, layers)
+}
+
+// computeEF computes the Extraordinary Form (1962) day.
+func computeEF(date time.Time, sel Selection, layers []Layer) LiturgicalDay {
+ td := temporalEF(date)
+ merged := mergeLayers(layers)
+ cands := []candidate{{Cel: td.Cel, Temporal: true, Season: td.Season}}
+ for slug, rc := range merged {
+ cel := buildCelebration(slug, rc)
+ when, ok := celebrationDate(cel, date.Year(), sel)
+ if !ok {
+ continue
+ }
+ if sameDay(when, date) {
+ cands = append(cands, candidate{Cel: cel, Temporal: false, Season: td.Season})
+ }
+ }
+ obs, others := pickEF(cands)
+ day := LiturgicalDay{
+ Date: date, Season: td.Season, Week: td.Week, Weekday: date.Weekday(),
+ Observed: obs.Cel, Colour: colourOf(obs, td), ObservedBand: precedenceEF(obs),
+ }
+ for _, o := range others {
+ if o.Temporal {
+ continue
+ }
+ day.Others = append(day.Others, o.Cel)
+ }
+ return day
+}
+
+// computeOF computes the Ordinary Form day.
+func computeOF(date time.Time, sel Selection, layers []Layer) LiturgicalDay {
td := temporal(date, sel)
merged := mergeLayers(layers)