From e2e56ac5af290b60ea01037e58e8bc00545c021c Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 20 Aug 2026 11:32:24 +0200 Subject: feat(render): Roman week numbers and date spans, as data The ordo booklet's week header repeated the month name on every week even though the heading above already established it -- pure noise. Replace it with a Roman week number plus the span of dates the week covers, e.g. "Hebdomada I (Ian 1-2)", following the project's own rule that a presentation choice is data, not code. lang/{la,en}.ini gain a [month_abbr] section (three-letter month abbreviations); Lang.month_abbr follows Lang.month's exact shape, including the out-of-range and miss-returns-the-key contracts. The coverage test now fails loudly if an abbreviation goes missing, the same as [month] already does. Every week object in the view gains num_roman (Roman numeral, num stays as the arabic original -- Roman is a presentation choice, not an engine change), first_dom/last_dom (the day-of-month of the week's first and last IN-MONTH days, padding excluded), month_abbr (resolved through Lang.month_abbr), and single_day (true when the week holds exactly one in-month day). single_day is a flag, not a preformatted span string: the engine is logic-less and cannot itself decide between "Ian 1" and "Ian 1-2", so a template makes that call from the flag instead -- the same "shape the data, not the template" discipline in_month and last already follow. Weeks are built per month with padding only at the two ends, so a week's in-month days never cross a month boundary -- verified, not assumed: every week always has at least one real day since no month is shorter than a single week. Covered by three new View tests, including a real single-day-week witness (January 2027's own trailing week is a lone Sunday, the 31st). --- test/test_lang.ml | 3 +++ 1 file changed, 3 insertions(+) (limited to 'test/test_lang.ml') diff --git a/test/test_lang.ml b/test/test_lang.ml index b54e85b..c9b7f1a 100644 --- a/test/test_lang.ml +++ b/test/test_lang.ml @@ -14,6 +14,8 @@ let sample = monday = Feria II\n\ [month]\n\ 1 = Ianuarius\n\ + [month_abbr]\n\ + 1 = Ian\n\ [season]\n\ lent = Quadragesima\n\ [rank]\n\ @@ -34,6 +36,7 @@ let test_lookups () = (L.celebration t "ef-lent-3-monday"); Alcotest.(check string) "weekday 0 is Sunday" "Dominica" (L.weekday t 0); Alcotest.(check string) "month 1" "Ianuarius" (L.month t 1); + Alcotest.(check string) "month_abbr 1" "Ian" (L.month_abbr t 1); Alcotest.(check string) "season" "Quadragesima" (L.season t "lent"); Alcotest.(check string) "rank" "I classis" (L.rank t "class-1"); Alcotest.(check string) "colour" "albus" (L.colour t "white"); -- cgit v1.3