From 5828571fa31a0480838d1ede210002ab50768c64 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 19 Aug 2026 08:27:22 +0200 Subject: feat(render): the view model Shapes a civil year of resolved days into the value a template renders against. This layer is why the engine can stay logic-less: a month grid needs leading blank cells, week bucketing and an in-month test, and a logic-less template can compute none of it. Both weeks and days are offered at every level -- the booklet walks days, the grid walks weeks -- so the two artefacts cannot drift. Colours are six booleans, not hex: hex bakes a presentation policy into the engine, and LaTeX, groff and HTML each want a different colour expression. Asserted: exactly one of the six is true on every day of a whole year, so a template keying off them can never get none or two. Padding cells carry every field a real day carries, empty, so a template never hits a missing key mid-grid. --- lib/render/view.mli | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 lib/render/view.mli (limited to 'lib/render/view.mli') diff --git a/lib/render/view.mli b/lib/render/view.mli new file mode 100644 index 0000000..fb48590 --- /dev/null +++ b/lib/render/view.mli @@ -0,0 +1,24 @@ +(** Shapes a civil year of resolved days into the value a template renders + against (spec section 4). + + This layer exists because a month grid needs leading blank cells, week + bucketing and an "is this cell in the current month" test, and a logic-less + template can compute none of it. Shaping the data here keeps the engine + logic-less AND makes the grid template trivial. The view model IS the design. + + Both [weeks] and [days] are offered at every level: the booklet walks + [days], the grid walks [weeks]. One model, two artefacts, no second code + path that could drift. + + Colours are exposed as six booleans rather than a hex string: hex would bake + a presentation policy into the engine, and LaTeX, groff and HTML each want a + different colour expression. Exactly one of the six is true on every day. *) + +val of_days : + vocab:('s, 'r) Colitur_kernel.Vocab.t -> + rite:string -> + year:int -> + ('s, 'r) Colitur_kernel.Liturgical_day.t list -> + Template.value +(** [of_days ~vocab ~rite ~year days] where [days] is one civil year, 1 January + to 31 December, in order. Pure and total. *) -- cgit v1.3