diff options
Diffstat (limited to 'internal/cli/liturgy.go')
| -rw-r--r-- | internal/cli/liturgy.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/internal/cli/liturgy.go b/internal/cli/liturgy.go new file mode 100644 index 0000000..523531d --- /dev/null +++ b/internal/cli/liturgy.go @@ -0,0 +1,84 @@ +package cli + +import ( + "fmt" + "io" + "strings" + "time" + + "github.com/lukaszkasprzak/lectio/internal/caldata" + "github.com/lukaszkasprzak/lectio/internal/calendar" + "github.com/lukaszkasprzak/lectio/internal/config" +) + +// runLiturgy prints the computed liturgical day for date (default today) using +// the offline calendar engine, and exits. It is the engine's demo/validation +// surface; the daily-readings paths still use the scraper. +func runLiturgy(cfg config.Config, date string, stdout, stderr io.Writer) int { + if date == "" { + date = today() + } + d, err := time.Parse("2006-01-02", date) + if err != nil { + fmt.Fprintf(stderr, "lectio: bad date %q (want YYYY-MM-DD)\n", date) + return 2 + } + day := calendar.Compute(d.UTC(), cfg.Selection(), []calendar.Layer{caldata.Universal()}) + printLiturgicalDay(stdout, cfg, day) + return 0 +} + +func printLiturgicalDay(out io.Writer, cfg config.Config, day calendar.LiturgicalDay) { + fmt.Fprintf(out, "%s %s\n", day.Date.Format("2006-01-02"), day.Weekday.String()) + fmt.Fprintf(out, "season: %s (week %d · Sunday cycle %s · weekday cycle %s)\n", + day.Season, day.Week, day.SundayCycle, day.WeekdayCycle) + fmt.Fprintf(out, "observed: %s [%s · %s]\n", celebrationName(cfg, day.Observed), rankLabel(day.Observed.Rank), day.Colour) + for _, o := range day.Others { + if n := celebrationName(cfg, o); n != "" { + fmt.Fprintf(out, " also: %s [%s]\n", n, rankLabel(o.Rank)) + } + } + for _, m := range day.Observed.Masses { + for _, r := range m.Readings { + label := r.Part + if m.Variant != "" { + label = m.Variant + " " + label + } + fmt.Fprintf(out, " %-16s %s\n", label+":", r.Citation) + } + } +} + +// celebrationName is the celebration's name in the UI language (falling back to +// English, then a humanized slug for temporal days that carry no proper name). +func celebrationName(cfg config.Config, c calendar.Celebration) string { + lang := "en" + if cfg.UILanguage == "pl" { + lang = "pl" + } + if n := c.Name[lang]; n != "" { + return n + } + if n := c.Name["en"]; n != "" { + return n + } + if c.Slug == "" { + return "(feria)" + } + return strings.ReplaceAll(c.Slug, "-", " ") +} + +func rankLabel(r calendar.Rank) string { + switch r { + case calendar.RankSolemnity: + return "solemnity" + case calendar.RankFeast: + return "feast" + case calendar.RankMemorial: + return "memorial" + case calendar.RankOptional: + return "optional memorial" + default: + return "feria" + } +} |
