From 893513315a5853b2b1bf82d355050a0d8ab05618 Mon Sep 17 00:00:00 2001 From: airmang <38392618+airmang@users.noreply.github.com> Date: Thu, 1 Oct 2026 04:32:30 +0900 Subject: [PATCH] fix(layout): make a table cell reach the foot of a drawing placed in it A picture or drawing placed top and bottom or wrapped square from a cell paragraph that holds no text, not set as a character, makes the cell reach its foot, its outer margins included, and the row grows to hold it; the paragraph's own line stays at its top. It was left out, the row one line tall. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 3 ++ src/hwpx/layout/pages.py | 31 +++++++++++++++++- ...cell_holding_a_drawing_top_and_bottom.hwpx | Bin 0 -> 8625 bytes ...table_cell_holding_a_drawing_500_down.hwpx | Bin 0 -> 8621 bytes ...e_cell_holding_a_drawing_after_a_line.hwpx | Bin 0 -> 8646 bytes ...cell_holding_a_drawing_top_and_bottom.hwpx | Bin 0 -> 8606 bytes ...cell_holding_a_drawing_wrapped_square.hwpx | Bin 0 -> 8628 bytes ...cell_holding_a_picture_top_and_bottom.hwpx | Bin 0 -> 8891 bytes tests/test_layout_page_estimate.py | 8 +++++ 9 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/hancom_saved/pages_table_as_character_cell_holding_a_drawing_top_and_bottom.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_cell_holding_a_drawing_500_down.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_cell_holding_a_drawing_after_a_line.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_cell_holding_a_drawing_top_and_bottom.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_cell_holding_a_drawing_wrapped_square.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_cell_holding_a_picture_top_and_bottom.hwpx diff --git a/CHANGELOG.md b/CHANGELOG.md index d39635e4..3d364013 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -245,6 +245,9 @@ ### 고침 +- 쪽 수 추정(실험, `estimate_pages`)이 표 칸 안에 위아래나 어울림으로 둔 그림·도형의 높이를 행 높이에 넣는다. 글 없는 칸 + 문단에서 문단 위를 기준으로 둔 것(글자처럼 두지 않은 것)이면, 칸이 그 개체의 아래 끝(바깥 여백 포함)까지 온다. 전에는 그 + 개체를 세지 않아 행을 한 줄 높이로 잡았다. - FormFit(과 줄 캐시 없는 문단의 쪽 수 추정)이 글머리표·문단 번호·개요 번호가 붙은 문단의 줄을 표지 없이 나누던 것을 고친다. 이제 표지 폭과 너비 조정(`widthAdjust`), 본문과의 간격(`textOffset`: 표지 글자 크기의 %나 HWPUNIT)만큼 첫 줄이 좁아진다. 자동 내어 쓰기(`autoIndent`)면 둘째 줄부터도 좁아지고, 문단의 들여쓰기는 diff --git a/src/hwpx/layout/pages.py b/src/hwpx/layout/pages.py index c62e8ecf..b842bc87 100644 --- a/src/hwpx/layout/pages.py +++ b/src/hwpx/layout/pages.py @@ -73,7 +73,9 @@ there, spaced like the text, and a row holding one splits between its cell's lines, each as tall as it is; a nested table among text, placed top and bottom or wrapped square is followed through the layout caches of its cell, as tall as Hancom drew it (down to such a table's foot; one placed - up from its paragraph's top stands at that top). A flowing table's rows use + up from its paragraph's top stands at that top). A picture or drawing placed top and bottom or + wrapped square from a cell paragraph holding no text makes the cell reach its foot (outer margins + included). A flowing table's rows use the body only down to just above the page's foot (101 above it, or 2 in a table set not to be adjusted), less the table's bottom outer margin: a row, or a cell line of a row split between its lines, ending lower goes on to the next page (where the table goes on below its top outer margin; @@ -499,9 +501,12 @@ def stack(self, paragraphs: list[Any], width: int, caches: bool) -> tuple[int, i if cached: # the lines Hancom laid out, each as tall as it drew it if pending is not None: height += pending + shape.prev + top = height height += sum(advance for _, advance in cached[:-1]) + cached[-1][0] size, pitch = cached[-1] pending = pitch - size + shape.next + if top + _objects_reach(runs) > height: # an object placed from the paragraph reaches lower + height, pending = top + _objects_reach(runs), shape.next lines += len(cached) continue style = self.style(paragraph.get("paraPrIDRef"), refs, paragraph) @@ -510,8 +515,11 @@ def stack(self, paragraphs: list[Any], width: int, caches: bool) -> tuple[int, i ) if pending is not None: height += pending + shape.prev + top = height height += (count - 1) * pitch + size pending = pitch - size + shape.next + if top + _objects_reach(runs) > height: # an object placed from the paragraph reaches lower + height, pending = top + _objects_reach(runs), shape.next lines += count return height, lines, pitch, size @@ -995,6 +1003,27 @@ def _check_section(section: Any) -> None: raise _Unsupported("section settings (hp:secPr) after the first paragraph") +def _objects_reach(runs: list[Any]) -> int: + """How far below the top of their paragraph in a cell, holding no text, the pictures and drawings placed + from it reach: top and bottom or square, not set as a character, their outer margins included (the cell + holds them, and its row grows to). Tables in a cell are laid out on their own.""" + + reach = 0 + if _run_text(runs).strip(): # text goes on below such an object: not followed here + return reach + for obj in (child for run in runs for child in run): + name, pos = _local(obj), obj.find(f"{HP}pos") + if name not in _OBJECTS or name == "tbl" or pos is None or obj.find(f"{HP}sz") is None \ + or pos.get("treatAsChar") == "1" or obj.get("textWrap") not in ("TOP_AND_BOTTOM", "SQUARE") \ + or pos.get("vertRelTo") != "PARA" or pos.get("vertAlign", "TOP") != "TOP": + continue + offset = int(pos.get("vertOffset", 0)) + if offset >= 1 << 31: # kept unsigned: one placed up + offset -= 1 << 32 + reach = max(reach, offset + _extent(obj, "height")) + return reach + + def _placed_objects(runs: list[Any]) -> list[Any]: """The objects of the runs.""" diff --git a/tests/fixtures/hancom_saved/pages_table_as_character_cell_holding_a_drawing_top_and_bottom.hwpx b/tests/fixtures/hancom_saved/pages_table_as_character_cell_holding_a_drawing_top_and_bottom.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..c24c67dc0188a14220859d759f7769ff3851ddfb GIT binary patch literal 8625 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_table_cell_holding_a_drawing_after_a_line.hwpx b/tests/fixtures/hancom_saved/pages_table_cell_holding_a_drawing_after_a_line.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..991c6b276e56968890bb17dd3182ef1711b65f66 GIT binary patch literal 8646 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 F{{vAeTD<@O literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_table_cell_holding_a_drawing_top_and_bottom.hwpx b/tests/fixtures/hancom_saved/pages_table_cell_holding_a_drawing_top_and_bottom.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..f7ffff6724056f1e32c3b0b654700132496f792b GIT binary patch literal 8606 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 TECc|cKYqO*a}pNiue<*Tb$BDQ literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_table_cell_holding_a_drawing_wrapped_square.hwpx b/tests/fixtures/hancom_saved/pages_table_cell_holding_a_drawing_wrapped_square.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..31f9c0a4a6f5380aa3aadfe879ea800b432742e8 GIT binary patch literal 8628 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 literal 0 HcmV?d00001 diff --git a/tests/test_layout_page_estimate.py b/tests/test_layout_page_estimate.py index 0c3a91a2..d309cb60 100644 --- a/tests/test_layout_page_estimate.py +++ b/tests/test_layout_page_estimate.py @@ -62,6 +62,14 @@ "pages_table_caption_below_ends_100_above_page_foot": 2, # the last row and the caption below end 100 # above the foot: both go on "pages_table_caption_below_ends_101_above_page_foot": 2, # 101 above it: they stay + "pages_table_cell_holding_a_drawing_top_and_bottom": 1, # a cell paragraph holding only a rectangle 10000 + # tall placed top and bottom from it: the row is + # as tall as it with the cell's margins + "pages_table_as_character_cell_holding_a_drawing_top_and_bottom": 1, # in a table set as a character + "pages_table_cell_holding_a_drawing_500_down": 1, # 500 down from the paragraph's top + "pages_table_cell_holding_a_drawing_wrapped_square": 1, # wrapped square, narrow: the line beside it + "pages_table_cell_holding_a_picture_top_and_bottom": 1, # a picture + "pages_table_cell_holding_a_drawing_after_a_line": 1, # in the cell's second paragraph, after a line "pages_table_alone_offset_500": 1, # a flowing table alone in its paragraph, 500 down: it starts there "pages_table_alone_spacing_before_10pt": 1, # its paragraph 10 pt apart: the table above that spacing, # the next paragraph (10 pt apart too) under the table