diff options
Diffstat (limited to 'bin')
| -rw-r--r-- | bin/dune | 2 | ||||
| -rw-r--r-- | bin/main.ml | 43 |
2 files changed, 40 insertions, 5 deletions
@@ -6,4 +6,4 @@ ; colitur.opam's frozen depends, only a new library this executable links ; against. Used by Task 12's [mkdir_p] (colitur publish, recursive ; directory creation) and nowhere else. - (libraries colitur_kernel rite_ef colitur_render unix)) + (libraries colitur_kernel rite_ef colitur_render colitur_naming unix)) 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; |
