diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-20 11:09:18 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-20 11:09:18 +0200 |
| commit | c00bf135defe69eb303f4bcf32ae862f65c01178 (patch) | |
| tree | fea8a088c40e366bc902d991ddf826d2b9b81a0d /test/test_view.ml | |
| parent | 1935f40c156563c134f87093bf6ec8da1cf4fc46 (diff) | |
| download | colitur-c00bf135defe69eb303f4bcf32ae862f65c01178.tar.gz colitur-c00bf135defe69eb303f4bcf32ae862f65c01178.zip | |
feat(templates): the ordo booklet flows continuously, not one week per page
One week per page filled roughly the top third of every A5 page and
cost 65 pages for a year that needed far fewer -- the original
requirement, reversed here: a full 7-day week already occupies most
of an A5 page even at reduced type, so the real saving was always in
the year's many SHORT boundary weeks (a month's first/last week is
rarely a full seven days), not in packing two full weeks together.
lib/render/view.ml gains a [first] field on every week object (true
on a month's own first week, the same 'cheap flag beats invented
template logic' call [last] already made for grid rows) -- there is
still no {{../}} parent-path syntax for a template to test this any
other way.
ordo.tex: the per-week \clearpage is gone. Every week keeps its
existing small header line; the month's own first week additionally
prints a large, ruled banner. \needspace (a template-local LaTeX
dependency, not one of the frozen OCaml deps) keeps a header from
being stranded alone at a page's bottom -- and a real, separate bug
surfaced building it: \label placed BEFORE \needspace captured the
OLD page number when \needspace went on to force a break, producing
a step-stale \pageref in the TOC (fixed by moving \label after both
needspace checks). The day box itself is tightened (rank/colour
folded onto the same line as the citations -- an A5 box is far wider
than tall, so this fits even Holy Week's longest citations with room
to spare) so a second week routinely shares a page with the first.
Measured result: 65 -> 53 pages, two pdflatex passes still settle the
TOC, zero orphaned headers, zero overfull boxes.
ordo.typ: the per-week #pagebreak is gone; #show heading's own
block gains sticky:true, Typst's built-in answer to what ordo.tex
needs \needspace for. The month banner needed its OWN sticky:true,
found live: without it a banner could sit alone at a page's bottom
with the entire month pushed to the next page -- not caught by a
check for an orphaned HEADING, since the banner is plain markup, not
one. Measured result: 65 -> 27 pages (Typst's own page-fill packs
tighter than ordo.tex's needspace-driven approach), one compile pass,
zero orphans.
The five non-paginated flavours (ms/html/md/adoc/txt) never had a
forced page break to remove -- they mainly needed the same header
treatment for structural consistency: a week-level header nested
under each month's existing one, walking months>weeks>days (the
week's own padded, in-month-guarded day list) in place of the old
months>days flat loop. Verified against groff, asciidoctor and an
HTML parser -- zero warnings.
Goldens regenerated through the Test_view.view_of path
test_render_golden.ml itself uses, not the CLI (whose --lang default
would have pinned output the tests never produce).
Diffstat (limited to 'test/test_view.ml')
| -rw-r--r-- | test/test_view.ml | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/test/test_view.ml b/test/test_view.ml index e8de6a0..24e1d85 100644 --- a/test/test_view.ml +++ b/test/test_view.ml @@ -94,6 +94,24 @@ let test_weeks_flatten_to_days () = own real) (as_list (get [ "months" ] v)) +(* Defect 2 (the continuous ordo booklet): [first] is true on exactly one + week per month -- the first -- so a template can print a strong, + standalone month banner at that point instead of every week's own header + looking identical. *) +let test_first_week_flag () = + let v = view_of 2027 in + List.iter + (fun m -> + let weeks = as_list (get [ "weeks" ] m) in + match weeks with + | [] -> Alcotest.fail "a month with no weeks at all" + | first :: rest -> + Alcotest.(check bool) "first week flagged" true (as_bool (get [ "first" ] first)); + List.iter + (fun w -> Alcotest.(check bool) "later week not flagged" false (as_bool (get [ "first" ] w))) + rest) + (as_list (get [ "months" ] v)) + let test_padding_cells_are_flagged () = let v = view_of 2027 in let jan = List.hd (as_list (get [ "months" ] v)) in @@ -207,6 +225,7 @@ let suite = [ Alcotest.test_case "year shape" `Quick test_year_shape; Alcotest.test_case "weeks flatten to days" `Quick test_weeks_flatten_to_days; Alcotest.test_case "padding cells flagged" `Quick test_padding_cells_are_flagged; + Alcotest.test_case "first week flagged" `Quick test_first_week_flag; Alcotest.test_case "padding and real days share key set" `Quick test_padding_and_real_share_key_set; Alcotest.test_case "no day shows a slug" `Quick test_no_day_shows_a_slug; Alcotest.test_case "slug unchanged by naming" `Quick test_slug_is_unchanged_by_naming; |
