From ce61a650181726e3275bec4a1a93eb333bbf949c Mon Sep 17 00:00:00 2001 From: airmang <38392618+airmang@users.noreply.github.com> Date: Thu, 1 Oct 2026 06:15:15 +0900 Subject: [PATCH] fix(layout): follow a table offset down from a line at a page end A table flowing top and bottom, offset down from the first line of a paragraph of text: when that line does not fit above the page's foot it goes on to the next page with its table, which flows the offset below it there; when the line fits but the table's top falls past the foot, or its first row moved row by row does not fit under it, the table starts at the next page's top while the paragraph's lines go on under its line, below the table on the pages it takes. All three were not followed. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 6 ++++ src/hwpx/layout/pages.py | 32 ++++++++++++++++-- ...offset_down_from_a_line_past_the_foot.hwpx | Bin 0 -> 9003 bytes ...fset_down_its_first_row_past_the_foot.hwpx | Bin 0 -> 9011 bytes ...ble_offset_down_its_top_past_the_foot.hwpx | Bin 0 -> 8993 bytes tests/test_layout_page_estimate.py | 6 ++++ 6 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 tests/fixtures/hancom_saved/pages_table_offset_down_from_a_line_past_the_foot.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_offset_down_its_first_row_past_the_foot.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_offset_down_its_top_past_the_foot.hwpx diff --git a/CHANGELOG.md b/CHANGELOG.md index d39635e4..e12672f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -245,6 +245,12 @@ ### 고침 +- 쪽 수 추정(실험, `estimate_pages`)이 글 문단의 첫 줄에서 아래로 띄운 흐르는 위아래 표를 쪽 끝에서도 따른다. + - 그 줄이 쪽 바닥 위에 들어가지 않으면 줄과 표가 함께 다음 쪽으로 가고, 표는 거기서 띄운 만큼 아래에서 흐른다. + - 줄은 들어가는데 표 윗선이 바닥을 넘거나, 행 단위로 옮기는(TABLE) 표의 첫 행이 들어가지 않으면, 표만 다음 쪽 맨 + 위에서 시작한다. 문단의 글은 그 줄 아래로 이어지고, 표가 차지하는 쪽에서는 표 아래로 간다. + - 전에는 모두 지원 밖(`a top-and-bottom table offset down from a line at a page end`)이었다. 첫 줄이 아닌 줄에서 + 띄운 표는 전처럼 지원 밖이다. - FormFit(과 줄 캐시 없는 문단의 쪽 수 추정)이 글머리표·문단 번호·개요 번호가 붙은 문단의 줄을 표지 없이 나누던 것을 고친다. 이제 표지 폭과 너비 조정(`widthAdjust`), 본문과의 간격(`textOffset`: 표지 글자 크기의 %나 HWPUNIT)만큼 첫 줄이 좁아진다. 자동 내어 쓰기(`autoIndent`)면 둘째 줄부터도 좁아지고, 문단의 들여쓰기는 diff --git a/src/hwpx/layout/pages.py b/src/hwpx/layout/pages.py index c62e8ecf..b89ced87 100644 --- a/src/hwpx/layout/pages.py +++ b/src/hwpx/layout/pages.py @@ -47,7 +47,10 @@ offset down, it stands that much lower, and the first line reaching it (in that paragraph or the ones after) and the lines after come below it -- a table flowing with the text flows from there over the page end, and that line goes below its end (so does the line of a paragraph holding only - another such table, which then flows from there); a flowing table alone in its paragraph starts + another such table, which then flows from there); offset down from a paragraph's first line that + does not fit above the page's foot, it goes on to the next page with the line, and one whose top + falls past the foot, or whose first row moved row by row does not fit under it, starts at the next + page's top while the paragraph's lines go on under its line; a flowing table alone in its paragraph starts its offset below the paragraph's top, above the paragraph's spacing before (one offset up starts there), and the next paragraph goes below the table's end or below the paragraph's line and its own spacing before, whichever is lower; @@ -1914,10 +1917,16 @@ def _banded(self, index: int, paras: list[_Para], para: _Para, start: int) -> No return if para.band is not None: band, table = para.band, para.band.table + if not band.line and self.last_vp is not None and start + para.height(0) > self.body: + start = self._next_frame(para, 0, True) # the line goes on to the next page, its table with it top = start + para.span(0, band.line) + band.offset - if start + para.span(0, band.line) + para.height(band.line) > self.body \ - or top + table.above >= self.body or _starts_later(table, top + table.above, self.body): + if start + para.span(0, band.line) + para.height(band.line) > self.body: raise _Unsupported("a top-and-bottom table offset down from a line at a page end") + if top + table.above >= self.body or _starts_later(table, top + table.above, self.body): + if band.line: + raise _Unsupported("a top-and-bottom table offset down from a line at a page end") + self._band_on_next_page(index, paras, para, table, top, start, broke) + return frame, end = _flow_table(table, self.frame, top + table.above, self.body) self._clear_of_paper(self.frame, frame) self.table_end = max(self.table_end, frame) @@ -1952,6 +1961,23 @@ def _banded(self, index: int, paras: list[_Para], para: _Para, start: int) -> No if self._lay(index, paras, tail, end, False): self.last_vp, self.last_pitch, self.pending_next = self.out[-1][1], tail.advance(tail.lines - 1), para.next + def _band_on_next_page(self, index: int, paras: list[_Para], para: _Para, table: _FlowTable, top: int, + start: int, broke: bool) -> None: + """A table offset down from a paragraph's first line whose top falls past the page's foot, or whose first + row (moved row by row) does not fit under it: it starts at the next page's top, and the paragraph's lines + go on under its line, on the pages the table takes below the table.""" + + frame, end = _flow_table(table, self.frame, top + table.above, self.body) + self._clear_of_paper(self.frame + 1, frame) + taken = range(self.frame + 1, frame + 1) + if frame == self.frame or any(page in self.reserved for page in taken): + raise _Unsupported("a top-and-bottom table offset down from a line at a page end") + self.reserved.update(dict.fromkeys(taken, self.body)) + self.reserved[frame] = end + table.below + self.table_end = max(self.table_end, frame) + if self._lay(index, paras, para, start, broke): + self.last_vp, self.last_pitch, self.pending_next = self.out[-1][1], para.advance(para.lines - 1), para.next + def _clear_of_paper(self, first: int, last: int, top: int = 0, end: int | None = None) -> None: """A table from its anchor line's *top* in frame *first* to *end* in frame *last* (the whole frames without them) reaching the band of an object placed on the paper or the page, or starting right diff --git a/tests/fixtures/hancom_saved/pages_table_offset_down_from_a_line_past_the_foot.hwpx b/tests/fixtures/hancom_saved/pages_table_offset_down_from_a_line_past_the_foot.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..321b6466a2d44678e3b1f77031ea1a8c9f9f4005 GIT binary patch literal 9003 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 me(ILOD^14Jh&A!Y{?QIG-a{e?sa2XXcg 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_table_offset_down_its_top_past_the_foot.hwpx b/tests/fixtures/hancom_saved/pages_table_offset_down_its_top_past_the_foot.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..68eac0295c1e93ac70258b4496309ef70b27a78e GIT binary patch literal 8993 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 z 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 Y>&kM7&{+ru1{M1EhR#WGRKH695BhKKeE