summaryrefslogtreecommitdiff
path: root/bin/main.ml
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-20 22:11:17 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-20 22:11:17 +0200
commit1988d350242b47aa52aa07904c495e7e2c0eba82 (patch)
tree463254012c555da51aa976dbe350415070b80a63 /bin/main.ml
parent2d8942e08edcbe5430f97270bdb1233e287600ee (diff)
downloadcolitur-1988d350242b47aa52aa07904c495e7e2c0eba82.tar.gz
colitur-1988d350242b47aa52aa07904c495e7e2c0eba82.zip
fix: audit findings — parser strictness, name ambiguity, and errors
Found by auditing the shipped program rather than the diff. The parser accepted OCaml integer-literal syntax, so "Luke 1_1:5" read as chapter ELEVEN and "+5" as 5 -- a typo silently becoming a different chapter, reachable through any user overlay. Numbers are now plain digits and positive, and a descending range is rejected: 1:20-10 is always a transcription error. No shipped citation changed. FOUR PAIRS OF DIFFERENT BOOKS SHARED A FULL TITLE. 1 and 2 Corinthians both rendered "Epistola ad Corinthios", as did Thessalonians, Timothy and Peter -- 108 citations in 2027 alone that a reader cannot resolve to a book. This is the Kings defect fixed earlier and not generalised. The titles now carry their volume numeral, marked CONSTRUCTED, and a test asserts no two books share a name -- while allowing the case where two ids ARE the same book under different numbering, which a tradition relates. Spec section 8.5 is now delivered rather than merely recorded. Shipped styles did not re-parse their own output: 32 of 52 Latin abbreviations and 49 of 52 full titles failed, so a citation copied from colitur's own output into an overlay was passed through untouched and printed in the wrong language, silently. Every shipped name is registered as a spelling and split_book learned multi-word titles by longest-token match. Now 0 of 52 fail beyond the same-book aliases. Overlay errors were written for a compiler author: they named an OCaml source file the reader does not have and buried the useful token. The existing five-path rewriter is replaced by a generic one, applied to every load path rather than one, so "rank: is not one of the allowed values (at Class9)" replaces the raw Of_sexp_error dump. Also: the new-overlay scaffold documented citations and layer without showing them, and its comment implied the wrong nesting -- the single easiest thing to get wrong; error messages echoed whole file lines, copying an unrelated file's contents into stderr when a flag pointed at one; and config --show validated partway down its table, exiting 2 after writing five rows to stdout.
Diffstat (limited to 'bin/main.ml')
-rw-r--r--bin/main.ml31
1 files changed, 28 insertions, 3 deletions
diff --git a/bin/main.ml b/bin/main.ml
index acf8859..b1d9cac 100644
--- a/bin/main.ml
+++ b/bin/main.ml
@@ -1942,6 +1942,20 @@ let lang_check path =
it via [load_lang]). *)
let config_show ~lang_flag ~template_flag ~format_flag ~overlays_flag ~sigla_style_flag ~sigla_book_flag
~sigla_tradition_flag config =
+ (* VALIDATE BEFORE PRINTING ANYTHING. A usage error used to surface
+ halfway down the table, so `config --show --sigla-book bogus` exited 2
+ having already written five rows to stdout -- a caller redirecting
+ stdout to a file got a truncated, plausible-looking report alongside a
+ non-zero status. Nothing is emitted now until every value is known good. *)
+ let sigla_book_check, _ =
+ Colitur_naming.Config.resolve ~flag:sigla_book_flag
+ ~config:(Colitur_naming.Config.sigla_book config) ~default:"abbr"
+ in
+ if sigla_book_check <> "full" && sigla_book_check <> "abbr" then begin
+ Printf.eprintf "colitur: unknown --sigla-book %S (want \"full\" or \"abbr\")\n"
+ sigla_book_check;
+ exit 2
+ end;
let cpath = config_path () in
Printf.printf "config file: %s (%s)\n" cpath
(if cpath <> "" && Sys.file_exists cpath then "exists" else "not found");
@@ -1996,8 +2010,13 @@ let new_overlay_template =
; universal entry -- by naming its slug.
((id my-parish)
(directives
- ; A fixed-date local feast. `citations` and `layer` may be omitted: they
- ; default to empty and to this overlay's own id.
+ ; A fixed-date local feast, with its own Mass readings.
+ ;
+ ; NOTE WHERE `citations` AND `layer` GO: inside `cel`, beside `rank` and
+ ; `colour` -- NOT beside `date`. Both may be omitted, defaulting to no
+ ; readings and to this overlay's own id. This example shows them in
+ ; place because the nesting is the single easiest thing to get wrong,
+ ; and getting it wrong is what `unknown field(s): citations` means.
((Add
((date (Fixed (month 5) (day 20)))
(cel
@@ -2007,7 +2026,13 @@ let new_overlay_template =
; status: Feast | Commemoration_only
; colour: White | Red | Violet | Green | Black | Rose
; subject: Lord | Bvm | Saint | Temporal
- (rank Class3) (status Feast) (colour White) (subject Saint)))))
+ (rank Class3) (status Feast) (colour White) (subject Saint)
+ ; part: First | Gospel. The reference is a citation, never
+ ; scripture text -- colitur ships no Bible.
+ (citations
+ (((part First) (reference "Wis 7:7-14"))
+ ((part Gospel) (reference "Matt 5:13-19"))))
+ (layer my-parish)))))
; A MOVABLE feast: the first Sunday of October. `nth` may be negative to
; count from the end of the month (-1 is the last).
(Add