Commit 5c4be1b
authored
fix(engine): let the keepWithNext lookahead see keepTogether (#464)
* fix(engine): let the keepWithNext lookahead see keepTogether
Two pagination rules disagreed. keepWithNext decides by asking whether the
heading plus the FIRST LINE of the next block fits the remaining page. A
keepTogether block has no first line to break after — it relocates whole.
leadingUnitHeight measured the first line anyway, the lookahead concluded
it fit and left the heading in place, and compileNode then moved the
entire block. The heading was stranded by the very rule meant to protect
it.
leadingUnitHeight now returns the whole outer height for a node whose
keep-together request will be honoured. The condition mirrors keepWhole in
compileNode, so a block taller than the page — whose request the compiler
ignores — keeps being estimated by its first slice, which is what lets a
heading above a page-spanning paragraph or table still relocate.
The method needed the page's inner height to make that test; it takes it
as a parameter rather than the CompilerState, so a measurement helper
stays free of the mutable page cursor.
Reproduced before fixing: at 300x400 with 20pt margins and a 200pt body,
the heading stranded for every filler height from 120 to 210pt, and never
once when the same body could split. The new test sweeps that range rather
than sampling it — a single sample passes against the old compiler for
most filler heights. It fails on the unfixed engine at filler=120 and
passes on the fixed one; the other three cases hold in both directions, so
they guard the behaviour this change must not alter.
* test(engine): make the page-spanning case actually exercise keepWithNext
The page-spanning test pinned a 300pt filler, where the body's first line
still fits under the header. Both land on the same page whether or not
anything relocates them, so the assertion held against an engine with no
keepWithNext at all — it proved nothing about the branch it names.
It now builds at 310pt, inside the window where the rule decides the
outcome, and asserts both directions: glued with the opt-in, stranded
without it. Removing the page-height guard from the fix — the mutation
this test exists to catch — turns it red, where the 300pt version passed.
The best-effort boundary test asserts an absence and so reads the same as
"the opt-in was never applied". It cannot fail for the right reason on its
own; its javadoc now says that rather than implying more coverage than it
carries.
* test(engine): cover the nested keep-together block, correct the changelog scope
The lookahead recurses into a wrapper's first child, and nothing checked that
the page height reaches that frame: hand the recursive call a bogus height and
every existing test stayed green. Only a page-spanning nested child tells
"estimate the whole block" apart from "estimate its first slice", so the
page-spanning case now runs in both flat and nested form off one helper.
That nested shape is what keepEntriesTogether() builds — a plain timeline
wrapper whose entries are the atomic ones — so it is a combination users can
reach, not a synthetic one.
The changelog named surfaces that do not opt into keepTogether: no template
preset calls it, and neither does the markdown renderer. Narrowed to what the
code supports, with the one shipped opt-in named.1 parent 843a9bd commit 5c4be1b
3 files changed
Lines changed: 313 additions & 3 deletions
File tree
- core/src/main/java/com/demcha/compose/document/layout
- qa/src/test/java/com/demcha/compose/document/dsl
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
6 | 21 | | |
7 | 22 | | |
8 | 23 | | |
| |||
Lines changed: 20 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
327 | 327 | | |
328 | 328 | | |
329 | 329 | | |
330 | | - | |
| 330 | + | |
| 331 | + | |
331 | 332 | | |
332 | 333 | | |
333 | 334 | | |
| |||
1045 | 1046 | | |
1046 | 1047 | | |
1047 | 1048 | | |
| 1049 | + | |
| 1050 | + | |
1048 | 1051 | | |
1049 | 1052 | | |
1050 | | - | |
| 1053 | + | |
| 1054 | + | |
1051 | 1055 | | |
1052 | 1056 | | |
1053 | 1057 | | |
1054 | 1058 | | |
1055 | 1059 | | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + | |
| 1071 | + | |
1056 | 1072 | | |
1057 | 1073 | | |
1058 | 1074 | | |
| |||
1065 | 1081 | | |
1066 | 1082 | | |
1067 | 1083 | | |
1068 | | - | |
| 1084 | + | |
| 1085 | + | |
1069 | 1086 | | |
1070 | 1087 | | |
1071 | 1088 | | |
| |||
Lines changed: 278 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
0 commit comments