diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-19 15:29:33 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-19 15:29:33 +0200 |
| commit | 6d367ab8e90f6e713d262a7f19fb908b28d4796a (patch) | |
| tree | f5377f426ebe5ba32b7a8532850eafc9c103b9f9 /bin/main.ml | |
| parent | 92559825f9ad3e0f751d2c2022ffe000f23358ef (diff) | |
| download | colitur-6d367ab8e90f6e713d262a7f19fb908b28d4796a.tar.gz colitur-6d367ab8e90f6e713d262a7f19fb908b28d4796a.zip | |
feat(render): names reach the view and every emitter
The view's name is now the RESOLVED display string and slug is untouched,
so machine formats carry both -- a script keeps the stable key, a human
reads the name.
name is a plain string, not a lang-keyed object. That removes the
shadowing hazard outright: a dotted {{name.la}} used to fall back
WHOLESALE to the enclosing month's name.la and print Ianuarius on every
unnamed day, which is how a printed booklet came to show the month where
the feast belonged.
weekday, season, rank and colour all gain localised companions, because a
calendar in a language needs more than feast names, and templates gain a
term vocabulary so fixed strings need no template edit to translate.
Asserted over a whole year: no day renders its slug as its name.
Beyond the brief's own code sample:
- comm_value's own name is now resolved through the same lang.celebration
table too (not only the observed day's), because Task 8's own ordo
template interpolates a plain {{name}} inside {{#comms}} -- an Obj there
would render silently blank. A commemoration slug without Latin
coverage still degrades to the slug, same as everywhere else in this
system; that is a lang/la.ini DATA gap (113 of 327 sanctoral slugs,
measured), not a regression this task introduced.
- bin/main.ml's emit/table/publish call sites needed ~lang to compile at
all, which is collateral from the of_days signature change, not this
task's own file list. Rather than pass Lang.raw and ship the very
slug-as-name defect this branch exists to fix, they load the shipped
Latin table by the same probe order data_dir() already uses -- a
deliberate, commented BRIDGE that Task 6 replaces wholesale with real
--lang/--raw/config resolution. bin/dune gained colitur_naming
accordingly.
- test/cli.t needed two related fixes to stay green: the CSV header/row
example, and a table/LaTeX escaping demonstration that relied on the
kernel's own English name for Sts Peter & Paul -- gone from the view
now that name resolves through lang tables only, and the Missal's own
Latin spells the feast with et, never an ampersand. Escaping itself is
still proved live on 2035 data in test_emit.ml.
- Both schemas gained the new day/week/top-level keys (season_name,
weekday, rank_name, colour_name, term, weekday_headings, month_num,
month_name), not only the name shape change; schema/colitur-v1.xsd
verified against real emitted XML via xmllint (make check-schema).
Render/golden's 9 cases (the shipped ordo/grid templates, all six
flavours) now fail as expected: their old {{name.la}} / {{#name}}...
idiom finds nothing on a plain string. That is Tasks 8/9's own scope to
rewrite, per the plan's own pre-flight conflict scan -- not fixed here,
and not silently pinned by regenerating goldens off broken output.
495 tests run (490 + 5 new), 486 pass; the 9 failures are exactly
Render/golden's ordo/grid cases.
Diffstat (limited to 'bin/main.ml')
| -rw-r--r-- | bin/main.ml | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/bin/main.ml b/bin/main.ml index 6f64582..b2eef28 100644 --- a/bin/main.ml +++ b/bin/main.ml @@ -131,6 +131,41 @@ let data_dir () = end | _ -> if has_data installed then installed else build_tree +(* TEMPORARY BRIDGE (naming-and-config Task 5): [View.of_days] now takes + [~lang], but real CLI flag/config resolution (--lang, --raw, + Colitur_naming.Config) is Task 6's own scope, not this one's. Rather than + leave `emit`/`table`/`publish` showing bare slugs as their "resolved + name" -- which is precisely the defect this whole branch exists to fix -- + this loads the shipped Latin table by default, using EXACTLY the probe + order [data_dir] above already uses (installed prefix, then the build + tree), so an installed binary finds its language file the same way it + finds its calendar data. Task 6 replaces this wholesale with + `--lang`/`--raw`/config resolution and per-command defaults; nothing + here is meant to survive that task unchanged. A missing or malformed + language file degrades to [Lang.raw] (name = slug) rather than crashing + the CLI -- Task 6 is what makes that case a proper, reported error. *) +let lang_dir () = + let prefix = Filename.dirname (Filename.dirname Sys.executable_name) in + let installed = List.fold_left Filename.concat prefix [ "share"; "colitur"; "lang" ] in + if Sys.file_exists (Filename.concat installed "la.ini") then installed + else Filename.concat prefix "lang" + +let default_lang = + lazy + (let path = Filename.concat (lang_dir ()) "la.ini" in + match open_in_bin path with + | exception Sys_error _ -> Colitur_naming.Lang.raw + | ic -> ( + match + Fun.protect ~finally:(fun () -> close_in_noerr ic) (fun () -> + really_input_string ic (in_channel_length ic)) + with + | exception Sys_error _ -> Colitur_naming.Lang.raw + | text -> ( + match Colitur_naming.Lang.of_string text with + | Ok t -> t + | Error _ -> Colitur_naming.Lang.raw))) + (* Loads the universal sanctoral layer and applies the one hand-authored overlay over it (data/ef/adjustments.sexp -- see that file's own header): [Overlay.apply]'s diagnostics are never silently dropped (Overlay.mli), @@ -428,7 +463,7 @@ let emit_report ~format ~overlays ~dtstamp ~from_y ~to_y = for y = from_y to to_y do let days = resolved_year_days ~overlays y in let v = - Colitur_render.View.of_days ~vocab:Rite_ef.Vocab_ef.vocab ~rite:"ef" ~year:y days + Colitur_render.View.of_days ~lang:(Lazy.force default_lang) ~vocab:Rite_ef.Vocab_ef.vocab ~rite:"ef" ~year:y days in match format with | "csv" -> @@ -538,7 +573,7 @@ let table_report ~template ~flavour_opt ~overlays y = exit 2 | Ok src -> ( let days = resolved_year_days ~overlays y in - let v = Colitur_render.View.of_days ~vocab:Rite_ef.Vocab_ef.vocab ~rite:"ef" ~year:y days in + let v = Colitur_render.View.of_days ~lang:(Lazy.force default_lang) ~vocab:Rite_ef.Vocab_ef.vocab ~rite:"ef" ~year:y days in match Colitur_render.Template.render_string ~flavour src v with | Error e -> (* The template is user input; a parse failure is reported with the @@ -757,7 +792,7 @@ let publish_report ~from_y ~to_y ~out ~overlays ~dtstamp ~prune = in for y = from_y to to_y do let days = resolved_year_days ~overlays y in - let v = Colitur_render.View.of_days ~vocab:Rite_ef.Vocab_ef.vocab ~rite:"ef" ~year:y days in + let v = Colitur_render.View.of_days ~lang:(Lazy.force default_lang) ~vocab:Rite_ef.Vocab_ef.vocab ~rite:"ef" ~year:y days in let ys = string_of_int y in emit ("ef/" ^ ys ^ ".json") (Colitur_render.Emit_json.year v); emit ("ef/" ^ ys ^ ".csv") (Colitur_render.Emit_csv.year v); @@ -770,7 +805,7 @@ let publish_report ~from_y ~to_y ~out ~overlays ~dtstamp ~prune = (fun d -> let iso = D.to_iso8601 d.Colitur_kernel.Liturgical_day.date in let mm = String.sub iso 5 2 and dd = String.sub iso 8 2 in - let one = Colitur_render.View.of_days ~vocab:Rite_ef.Vocab_ef.vocab ~rite:"ef" ~year:y [ d ] in + let one = Colitur_render.View.of_days ~lang:(Lazy.force default_lang) ~vocab:Rite_ef.Vocab_ef.vocab ~rite:"ef" ~year:y [ d ] in emit (Printf.sprintf "ef/%s/%s/%s.json" ys mm dd) (Colitur_render.Emit_json.year one)) days done; |
