summaryrefslogtreecommitdiff
path: root/lib/naming/lang.mli
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-20 11:32:24 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-20 11:32:24 +0200
commite2e56ac5af290b60ea01037e58e8bc00545c021c (patch)
tree6346f4ee62809323e8fb0f9041b28e35787d9828 /lib/naming/lang.mli
parentc30a35e1da315f2a44e5b53c714bdcf4d8992d2c (diff)
downloadcolitur-e2e56ac5af290b60ea01037e58e8bc00545c021c.tar.gz
colitur-e2e56ac5af290b60ea01037e58e8bc00545c021c.zip
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).
Diffstat (limited to 'lib/naming/lang.mli')
-rw-r--r--lib/naming/lang.mli7
1 files changed, 7 insertions, 0 deletions
diff --git a/lib/naming/lang.mli b/lib/naming/lang.mli
index 4d7f82f..34a6d5d 100644
--- a/lib/naming/lang.mli
+++ b/lib/naming/lang.mli
@@ -61,6 +61,13 @@ val weekday : t -> int -> string
(** [month t n], 1 = January. Out-of-range [n] returns [string_of_int n]. *)
val month : t -> int -> string
+(** [month_abbr t n], 1 = January, e.g. ["Ian"]/["Jan"]. Same shape as
+ {!month}: out-of-range [n] returns [string_of_int n], and a miss falls
+ back through the chain to [string_of_int n] as well, never to [month]'s
+ own full name -- an abbreviation is its own vocabulary, not a truncation
+ of another lookup. *)
+val month_abbr : t -> int -> string
+
(** Every (section-qualified key, value) pair, sorted. Used by [lang --dump] and
[lang --check]. Keys are qualified as e.g. ["celebration.ef-epiphany"]. *)
val keys : t -> (string * string) list