From 91cc3de0b21075dc8d7c435030bd77f1aa95abac Mon Sep 17 00:00:00 2001 From: airmang <38392618+airmang@users.noreply.github.com> Date: Sat, 3 Oct 2026 04:08:16 +0900 Subject: [PATCH] fix(layout): lay an empty line below a top-and-bottom object beside floating ones A paragraph holding no text, an object placed top and bottom from its top and, beside it, objects in front of or behind the text had its empty line on the object's top, taking no room. Hancom sets that line below the object at full width, as for a space or a label, whether the floating object is placed on the paper or from the paragraph, in front of the text or behind it: in the body and in table cells, where such a paragraph was unsupported without caches. With the top-and-bottom object alone, the line stays on its top. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 10 ++++-- src/hwpx/layout/pages.py | 32 ++++++++++++------ ...aragraph_picture_and_a_picture_behind.hwpx | Bin 0 -> 8552 bytes .../pages_empty_paragraph_table_alone.hwpx | Bin 0 -> 8087 bytes ...ph_table_and_a_picture_behind_from_it.hwpx | Bin 0 -> 8697 bytes ...ble_and_a_picture_behind_on_the_paper.hwpx | Bin 0 -> 8716 bytes ...aragraph_table_and_a_picture_in_front.hwpx | Bin 0 -> 8695 bytes tests/test_layout_page_estimate.py | 22 ++++++------ 8 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 tests/fixtures/hancom_saved/pages_empty_paragraph_picture_and_a_picture_behind.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_empty_paragraph_table_alone.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_empty_paragraph_table_and_a_picture_behind_from_it.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_empty_paragraph_table_and_a_picture_behind_on_the_paper.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_empty_paragraph_table_and_a_picture_in_front.hwpx diff --git a/CHANGELOG.md b/CHANGELOG.md index e16c84ec..9cae9b4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,8 +53,14 @@ - 쪽 수 추정(실험, `estimate_pages`)이 줄 캐시 없는 표 칸에서 글자처럼 둔 표 옆에 글 앞·뒤로 둔 개체가 있는 문단을 지원 밖(`a nested table`)으로 두던 것을 고친다. - 그런 개체는 자리를 차지하지 않으므로, 그 문단은 표 혼자인 문단처럼 표 높이의 한 줄이다. - - 위아래로 둔 표 옆에 그런 개체가 있으면 한/글은 빈 줄을 표 아래에 둔다(표 둘일 때처럼). 이것은 전처럼 캐시 - 없이는 지원 밖이다. + - 위아래로 둔 표 옆에 그런 개체가 있으면 한/글은 빈 줄을 표 아래에 둔다(표 둘일 때처럼). 이제 캐시 없이도 + 따른다(아래 항목). +- 쪽 수 추정(실험, `estimate_pages`)이 글 없는 문단에 문단 위에서 위아래로 둔 개체(표·그림)와 글 앞·뒤로 둔 + 개체가 함께 있을 때, 빈 줄을 위아래 개체의 윗선에 두던 것을 고친다. + - 한/글은 공백이나 머리표가 있을 때처럼 빈 줄을 그 개체 아래에 전체 폭으로 둔다. 뜬 개체가 종이 기준이든 문단 + 기준이든, 글 앞이든 뒤든 같다. + - 위아래 개체만 있으면 전처럼 윗선에 폭 0이다. + - 본문과 표 칸 모두 그렇다. 표 칸에서는 전에 캐시 없이 지원 밖(`a nested table`)이었다. - 쪽 수 추정(실험, `estimate_pages`)이 글자처럼 둔 개체 하나와 공백·줄 바꿈만 있는 문단을 언제나 한 줄로 세던 것을 고친다. - 한/글은 개체 바로 뒤 공백 둘을 여백을 넘어도 그 줄에 두고, 그다음 공백이 여백이나 그 너머에서 시작하면 diff --git a/src/hwpx/layout/pages.py b/src/hwpx/layout/pages.py index e9fdd496..ff81f213 100644 --- a/src/hwpx/layout/pages.py +++ b/src/hwpx/layout/pages.py @@ -1419,11 +1419,12 @@ def _placed_from(paragraph: Any) -> bool: def _object_before_text(runs: list[Any], headed: bool = False) -> Any: """The object placed top and bottom from its paragraph's top (a table, picture or drawing) that is all the - runs hold but text after it -- a space is text, and so is the bullet or number of a *headed* paragraph -- - or ``None``.""" + runs hold but text after it -- a space is text, and so is the bullet or number of a *headed* paragraph or + an object in front of or behind the text beside it (see :func:`_beside_floating`) -- or ``None``.""" - objects = [child for run in runs for child in run if _local(child) in _OBJECTS] - if len(objects) != 1 or not _placed_top_and_bottom(objects[0]) or not (_run_text(runs) or headed): + objects = [child for run in runs for child in run if _local(child) in _OBJECTS and not _floating(child)] + if len(objects) != 1 or not _placed_top_and_bottom(objects[0]) \ + or not (_run_text(runs) or headed or _beside_floating(runs)): return None for child in (child for run in runs for child in run): if child is objects[0]: @@ -1433,6 +1434,14 @@ def _object_before_text(runs: list[Any], headed: bool = False) -> Any: return None +def _beside_floating(runs: list[Any]) -> bool: + """Whether the runs hold an object in front of or behind the text: beside an object placed top and bottom + from the paragraph's top in a paragraph of no text, it sends the paragraph's empty line below that object, + as the whole width, as a space or a label does.""" + + return any(_local(child) in _OBJECTS and _floating(child) for run in runs for child in run) + + def _table_on_its_own(paragraph: Any) -> bool: """Whether a cell paragraph holds no text, not even a space, and nothing but one table placed top and bottom from its top (Hancom sets the empty line below two of them, not beside them, and so with an object @@ -1446,11 +1455,11 @@ def _table_on_its_own(paragraph: Any) -> bool: def _table_before_text(runs: list[Any]) -> Any: """The table placed top and bottom from its paragraph's top that is all the runs hold but text after it - (text, a space being enough), or ``None``.""" + (text, a space being enough, or an object in front of or behind the text beside it), or ``None``.""" - objects = [child for run in runs for child in run if _local(child) in _OBJECTS] + objects = [child for run in runs for child in run if _local(child) in _OBJECTS and not _floating(child)] if len(objects) != 1 or _local(objects[0]) != "tbl" or not _placed_top_and_bottom(objects[0]) \ - or not _run_text(runs): + or not (_run_text(runs) or _beside_floating(runs)): return None for child in (child for run in runs for child in run): if child is objects[0]: @@ -1748,8 +1757,10 @@ def _inline_content(measure: _Measure, paragraph: Any, runs: list[Any], anchored def _anchored_object(objects: list[Any], text: str, column: int, headed: bool = False) -> Any: """The one object not set as a character of a paragraph of text (a space is text, and so is the bullet or - number label of a *headed* paragraph: its line goes below the object) or of objects set as characters that - is placed top and bottom from the paragraph's top (offset 0), or ``None``.""" + number label of a *headed* paragraph: its line goes below the object; *headed* is also set for an empty + paragraph holding an object in front of or behind the text beside it, its empty line going below the object + as the whole width) or of objects set as characters that is placed top and bottom from the paragraph's top + (offset 0), or ``None``.""" placed = [obj for obj in objects if obj.find(f"{HP}pos").get("treatAsChar") != "1"] if len(placed) != 1 or not (text or headed or len(objects) > 1): @@ -1875,7 +1886,8 @@ def _paragraph(measure: _Measure, page: _Page, paragraph: Any, wrap: _Wrap | Non text = _run_text(runs) shape = measure.shape(paragraph.get("paraPrIDRef")) headed = bool(objects) and not text and measure.headed(paragraph) # its label is text too - anchored = _anchored_object(objects, text, page.column_width, headed) + beside = bool(objects) and not text and _beside_floating(runs) # its empty line goes below the object + anchored = _anchored_object(objects, text, page.column_width, headed or beside) marks = _marks(runs) and not _cached_metrics(paragraph) # to lay out like characters if marks: if anchored is not None or wrap is not None or square is not None: diff --git a/tests/fixtures/hancom_saved/pages_empty_paragraph_picture_and_a_picture_behind.hwpx b/tests/fixtures/hancom_saved/pages_empty_paragraph_picture_and_a_picture_behind.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..2e4a8e34d1c9dfbe962bdfdf777bdecddcdeef4c GIT binary patch literal 8552 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 SLI40Z^6P{2N$6B}cmEIj^Fez6 literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_empty_paragraph_table_and_a_picture_behind_from_it.hwpx b/tests/fixtures/hancom_saved/pages_empty_paragraph_table_and_a_picture_behind_from_it.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..6bf36b2e7ef66f78cf511494e61a099066c134d0 GIT binary patch literal 8697 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_empty_paragraph_table_and_a_picture_behind_on_the_paper.hwpx b/tests/fixtures/hancom_saved/pages_empty_paragraph_table_and_a_picture_behind_on_the_paper.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..775ce46cee0eb39c07314fb31e3958fb3f63f54b GIT binary patch literal 8716 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 None: _assert_like_hancom(estimate_pages(_with_empty_runs_in_cells(data)), data, HANCOM_PAGES[name]) -def test_a_cell_table_placed_top_and_bottom_beside_a_floating_object_is_not_followed_without_caches() -> None: - # A cell paragraph holding a table placed top and bottom from its top and a rectangle behind the text: - # Hancom sets the paragraph's empty line below the table (as below two such tables), not beside it. With - # the caches the estimate follows the cell's lines; without them it does not. - data = (FIXTURES / "pages_cell_table_top_and_bottom_and_a_drawing_behind_the_text.hwpx").read_bytes() - - _assert_like_hancom(estimate_pages(data), data, 1) - assert estimate_pages(_without_caches(data)).unsupported == ("section 0: a nested table",) - - @pytest.mark.parametrize( ("fixture", "pages"), [