From 8bf14493b5cc5bcdb0209ba68ef267f0a72cbefe Mon Sep 17 00:00:00 2001 From: airmang <38392618+airmang@users.noreply.github.com> Date: Thu, 1 Oct 2026 15:10:43 +0900 Subject: [PATCH 1/3] feat(layout): page estimate for an object on the paper over some of the columns An object placed top and bottom on the paper in columns of equal width keeps the lines out of its band only in the columns it reaches over (from the paper's left, centre or right, outer margins included); the other columns run past it. Such an object narrower than the text was unsupported. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 4 + src/hwpx/layout/pages.py | 75 ++++++++++++------ ...n_paper_400_narrower_than_two_columns.hwpx | Bin 0 -> 9244 bytes ...ctangle_on_paper_over_the_left_column.hwpx | Bin 0 -> 9230 bytes ...tangle_on_paper_over_the_right_column.hwpx | Bin 0 -> 9215 bytes ...ngle_on_paper_partly_over_two_columns.hwpx | Bin 0 -> 9231 bytes ...n_paper_400_narrower_than_two_columns.hwpx | Bin 0 -> 9333 bytes tests/test_layout_page_estimate.py | 7 ++ 8 files changed, 61 insertions(+), 25 deletions(-) create mode 100644 tests/fixtures/hancom_saved/pages_rectangle_on_paper_400_narrower_than_two_columns.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_rectangle_on_paper_over_the_left_column.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_rectangle_on_paper_over_the_right_column.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_rectangle_on_paper_partly_over_two_columns.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_on_paper_400_narrower_than_two_columns.hwpx diff --git a/CHANGELOG.md b/CHANGELOG.md index b2443654..7abec394 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ ### 고침 +- 쪽 수 추정(실험, `estimate_pages`)이 같은 폭의 여러 단 쪽에서 종이 기준으로 둔 위아래 배치 개체가 본문 너비를 + 다 덮지 않으면 지원 밖(`objects placed on the paper`)으로 두던 것을 고친다. 한/글은 개체가 가로로 걸치는 + 단에서만 줄을 개체 아래로 보내고, 걸치지 않는 단의 줄은 개체가 없을 때 자리에 둔다. 이제 종이의 왼쪽·가운데· + 오른쪽을 기준으로 둔 개체는 바깥 여백까지 쳐서 걸치는 단마다 그렇게 놓는다. - 쪽 수 추정(실험, `estimate_pages`)이 띠가 본문 아래 끝을 넘는 어울림(SQUARE) 개체를, 그 문단과 곁 문단이 줄 캐시를 가질 때 받는다. - 한/글은 이런 개체만 다음 쪽 맨 위로 보낸다. 개체는 줄 높이를 차지하지 않으므로 캐시를 가진 줄은 캐시 자리에 diff --git a/src/hwpx/layout/pages.py b/src/hwpx/layout/pages.py index b0d5ffbf..d9244de2 100644 --- a/src/hwpx/layout/pages.py +++ b/src/hwpx/layout/pages.py @@ -36,8 +36,9 @@ without it, wherever it stands; one placed top and bottom from the top or the bottom of the paper or of the page (its body) keeps every line of its page out of its band (a line reaching it, in any paragraph on that page, goes below it -- on to the next page when the band reaches the body's - foot -- and the lines after follow; with several columns, in each of them when it covers the - text's whole width), and so does one wrapped square there that leaves less than a line's room + foot -- and the lines after follow; with several columns of equal width, in each column it + reaches over from the paper's left, centre or right, the others running past it), and so does one + wrapped square there that leaves less than a line's room (1440) on either side of it across the text; one that leaves more (in one column) changes nothing when no line, table or object of its page reaches its band, and is not followed otherwise. An object anchored at the top of a paragraph's first line that such a band pushes down stands right @@ -884,9 +885,9 @@ class _Para: #: the line the object laid out around the text (the caller's) stands on wrap_anchor: int = 0 band: _Band | None = None - #: (top, bottom) in the body of an object anchored here and placed on the paper or the page, and whether - #: it leaves a line's room beside it (see :func:`_paper_band`) - paper: tuple[int, int, bool] | None = None + #: (top, bottom) in the body of an object anchored here and placed on the paper or the page, whether it + #: leaves a line's room beside it and the columns it reaches over (see :func:`_paper_band`) + paper: tuple[int, int, bool, tuple[int, ...]] | None = None #: in columns of unequal width, a paragraph without a layout cache: its text, to break again reflow: _Reflow | None = None #: holding nothing, in a section hiding a page's first empty lines (see :meth:`_Paginator._paragraph`) @@ -955,6 +956,7 @@ class _Page: widths: tuple[int, ...] = () # then each column's width paper_height: int = 0 hide_empty: bool = False # hp:visibility@hideFirstEmptyLine: a page's first empty lines are hidden + gap: int = 0 # between columns of equal width def _page(section: Any) -> _Page: @@ -965,17 +967,17 @@ def _page(section: Any) -> _Page: width, height = _drawn_page_size(int(page.get("width", 0)), int(page.get("height", 0)), page.get("landscape")) body = height - sum(int(margin.get(key, 0)) for key in ("top", "bottom", "header", "footer")) text_width = width - sum(int(margin.get(key, 0)) for key in ("left", "right", "gutter")) - columns, column_width, widths = _columns(section, text_width) + columns, column_width, widths, gap = _columns(section, text_width) visibility = next(section.iter(f"{HP}visibility"), None) return _Page(body, column_width, columns, int(margin.get("top", 0)) + int(margin.get("header", 0)), int(margin.get("left", 0)) + int(margin.get("gutter", 0)), text_width, width, bool(widths), widths, height, - visibility is not None and visibility.get("hideFirstEmptyLine") in ("1", "true")) + visibility is not None and visibility.get("hideFirstEmptyLine") in ("1", "true"), gap) -def _columns(section: Any, text_width: int) -> tuple[int, int, tuple[int, ...]]: - """(count, width, widths): the section's columns, their width (the narrowest when they differ) and, - when they differ, each one's.""" +def _columns(section: Any, text_width: int) -> tuple[int, int, tuple[int, ...], int]: + """(count, width, widths, gap): the section's columns, their width (the narrowest when they differ), + when they differ each one's, and when they do not the gap between them.""" # Column settings in a cell or a text box (an hp:subList) belong to that list, not the section. settings = [cols for cols in section.iter(f"{HP}colPr") if not _in_sub_list(cols)] @@ -983,16 +985,16 @@ def _columns(section: Any, text_width: int) -> tuple[int, int, tuple[int, ...]]: raise _Unsupported("the columns change inside the section") count = int(settings[0].get("colCount", "1")) if settings else 1 if count <= 1: - return 1, text_width, () + return 1, text_width, (), 0 if settings[0].get("sameSz") != "1": # each column takes its share of the width with the gaps (hp:colSz), sizes = settings[0].findall(f"{HP}colSz") # rounded total = sum(int(size.get("width", 0)) + int(size.get("gap", 0)) for size in sizes) if len(sizes) != count or total <= 0: raise _Unsupported("columns of unequal width") widths = tuple((2 * int(size.get("width", 0)) * text_width + total) // (2 * total) for size in sizes) - return count, min(widths), widths + return count, min(widths), widths, 0 gap = int(settings[0].get("sameGap", 0)) - return count, (text_width - (count - 1) * gap) // count // 4 * 4, () + return count, (text_width - (count - 1) * gap) // count // 4 * 4, (), gap def _in_sub_list(element: Any) -> bool: @@ -1123,10 +1125,11 @@ def _on_paper(obj: Any) -> bool: and pos.get("vertRelTo") in ("PAPER", "PAGE") and pos.get("vertAlign", "TOP") in ("TOP", "BOTTOM")) -def _paper_band(measure: _Measure, page: _Page, paragraph: Any) -> tuple[int, int, bool] | None: - """(top, bottom) in the body of the object of *paragraph* placed on the paper, if any, and whether it - is wrapped square leaving a line's room beside it: Hancom sets the text reaching it beside it, which is - not followed, and the text above or below it as if it were not there.""" +def _paper_band(measure: _Measure, page: _Page, paragraph: Any) -> tuple[int, int, bool, tuple[int, ...]] | None: + """(top, bottom) in the body of the object of *paragraph* placed on the paper, if any, whether it is + wrapped square leaving a line's room beside it (Hancom sets the text reaching it beside it, which is + not followed, and the text above or below it as if it were not there), and the columns it keeps the + lines out of.""" placed = [child for run in paragraph.findall(f"{HP}run") for child in run if _local(child) in _OBJECTS and _on_paper(child)] @@ -1134,7 +1137,9 @@ def _paper_band(measure: _Measure, page: _Page, paragraph: Any) -> tuple[int, in return None square = placed[0].get("textWrap") == "SQUARE" # no line beside it: less than a line's room on each side across = _across_the_text(placed[0], page, _MIN_SIDE - 1 if square else 0) - if len(placed) > 1 or (page.columns > 1 and not across): + columns = tuple(range(page.columns)) if across or page.columns == 1 else () if square \ + else _columns_reached(placed[0], page) + if len(placed) > 1 or not columns: raise _Unsupported("objects placed on the paper") obj = placed[0] tall = _extent(obj, "height") @@ -1146,20 +1151,40 @@ def _paper_band(measure: _Measure, page: _Page, paragraph: Any) -> tuple[int, in top = offset if pos.get("vertAlign", "TOP") == "TOP" else page.body - offset - tall else: # from the paper's top or bottom top = (offset if pos.get("vertAlign", "TOP") == "TOP" else page.paper_height - offset - tall) - page.top - return top, top + tall, square and not across + return top, top + tall, square and not across, columns def _across_the_text(obj: Any, page: _Page, slack: int = 0) -> bool: """Whether an object placed from the paper's left covers the text's whole width (every column), but for *slack* on either side.""" + left = _paper_left(obj, page) + return left is not None and left <= page.left + slack \ + and left + _extent(obj, "width") >= page.left + page.text_width - slack + + +def _columns_reached(obj: Any, page: _Page) -> tuple[int, ...]: + """The columns of equal width that an object placed from the paper's left reaches over, its outer margins + included.""" + + left = _paper_left(obj, page) + if left is None or page.unequal: + return () + right = left + _extent(obj, "width") + starts = [page.left + index * (page.column_width + page.gap) for index in range(page.columns)] + return tuple(index for index, start in enumerate(starts) if left < start + page.column_width and right > start) + + +def _paper_left(obj: Any, page: _Page) -> int | None: + """How far right of the paper's left edge an object placed from the paper's left, centre or right stands; + ``None`` for one placed otherwise.""" + pos = obj.find(f"{HP}pos") if pos.get("horzRelTo") != "PAPER": - return False + return None width, offset = _extent(obj, "width"), int(pos.get("horzOffset", 0)) - left = {"LEFT": offset, "CENTER": (page.paper_width - width) // 2 + offset, + return {"LEFT": offset, "CENTER": (page.paper_width - width) // 2 + offset, "RIGHT": page.paper_width - width - offset}.get(pos.get("horzAlign", "LEFT")) - return left is not None and left <= page.left + slack and left + width >= page.left + page.text_width - slack def _floating(obj: Any) -> bool: @@ -2343,10 +2368,10 @@ def _lay_section(measure: _Measure, section: Any) -> _SectionLayout: firsts.append(firsts[-1] + count) placed: dict[int, list[tuple[int, int]]] = {} beside: dict[int, list[tuple[int, int]]] = {} - for index, (top, bottom, room) in paper.items(): # on every column of the page + for index, (top, bottom, room, columns) in paper.items(): # on the columns of the page it reaches over first = paginator.out[firsts[index]][0] // page.columns * page.columns - for frame in range(first, first + page.columns): - (beside if room else placed).setdefault(frame, []).append((top, bottom)) + for column in columns: + (beside if room else placed).setdefault(first + column, []).append((top, bottom)) if placed == bands and beside == sides: break bands, sides = placed, beside diff --git a/tests/fixtures/hancom_saved/pages_rectangle_on_paper_400_narrower_than_two_columns.hwpx b/tests/fixtures/hancom_saved/pages_rectangle_on_paper_400_narrower_than_two_columns.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..50c191c0a684e0b3d652b650a22cfae12a66e000 GIT binary patch literal 9244 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_rectangle_on_paper_over_the_left_column.hwpx b/tests/fixtures/hancom_saved/pages_rectangle_on_paper_over_the_left_column.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..9cf6dcd384deca7e64b9f83f8053c4c522a03c9d GIT binary patch literal 9230 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_rectangle_on_paper_over_the_right_column.hwpx b/tests/fixtures/hancom_saved/pages_rectangle_on_paper_over_the_right_column.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..b8031df08d7d8bdbc1ea8cc94171286cd9323f5a GIT binary patch literal 9215 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 TtPmXB6WG@SW|M3vA8Y>)W&m9W literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_rectangle_on_paper_partly_over_two_columns.hwpx b/tests/fixtures/hancom_saved/pages_rectangle_on_paper_partly_over_two_columns.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..bef6dbe5dc0db4fd6f5d00a508377ae2e2e31fa9 GIT binary patch literal 9231 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 jpS}AZj2W8WFn;grTB@kdmzuX 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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 b8e34ae4..7c48c5aa 100644 --- a/tests/test_layout_page_estimate.py +++ b/tests/test_layout_page_estimate.py @@ -253,6 +253,13 @@ "pages_table_on_paper_pushes_a_later_line": 1, # a table 40000 below it: a line of a later paragraph "pages_rectangle_on_paper_across_two_columns": 2, # across both columns, anchored in the second: # the lines of both columns go below it + "pages_rectangle_on_paper_over_the_left_column": 2, # 15000 wide over the first of two columns: its + # lines go below it, the second's start at the top + "pages_rectangle_on_paper_over_the_right_column": 2, # over the second only + "pages_rectangle_on_paper_partly_over_two_columns": 2, # 30000 wide, centred: partly over each, the + # lines of both go below it + "pages_rectangle_on_paper_400_narrower_than_two_columns": 2, # 400 narrower than the text, centred + "pages_table_on_paper_400_narrower_than_two_columns": 2, # a table so "pages_rectangle_on_page_5000_below_its_top": 2, # top and bottom 5000 below the body's top "pages_rectangle_on_page_5000_above_its_foot": 2, # 5000 above the body's foot: the lines reaching it # go below it From dc50791d24a89d07739d5955d7d4207b3dfd511c Mon Sep 17 00:00:00 2001 From: airmang <38392618+airmang@users.noreply.github.com> Date: Thu, 1 Oct 2026 15:13:36 +0900 Subject: [PATCH 2/3] test(layout): an object on the paper over the middle of three columns, at a column's edge, anchored in a later column Co-Authored-By: Claude Opus 5.5 --- ...gle_on_paper_100_into_the_second_column.hwpx | Bin 0 -> 9243 bytes ...angle_on_paper_ending_in_the_column_gap.hwpx | Bin 0 -> 9236 bytes ...per_over_the_left_column_from_the_right.hwpx | Bin 0 -> 9701 bytes ..._paper_over_the_middle_of_three_columns.hwpx | Bin 0 -> 10124 bytes tests/test_layout_page_estimate.py | 5 +++++ 5 files changed, 5 insertions(+) create mode 100644 tests/fixtures/hancom_saved/pages_rectangle_on_paper_100_into_the_second_column.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_rectangle_on_paper_ending_in_the_column_gap.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_rectangle_on_paper_over_the_left_column_from_the_right.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_rectangle_on_paper_over_the_middle_of_three_columns.hwpx diff --git a/tests/fixtures/hancom_saved/pages_rectangle_on_paper_100_into_the_second_column.hwpx b/tests/fixtures/hancom_saved/pages_rectangle_on_paper_100_into_the_second_column.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..24878ea741bbdf82c70eb2b3c7ff154652b8e192 GIT binary patch literal 9243 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 CzF+46 literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_rectangle_on_paper_over_the_left_column_from_the_right.hwpx b/tests/fixtures/hancom_saved/pages_rectangle_on_paper_over_the_left_column_from_the_right.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..9152a181ed2b12b33fb328b41cdba5c9b87e7049 GIT binary patch literal 9701 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 F{|8re9-aUI literal 0 HcmV?d00001 diff --git a/tests/test_layout_page_estimate.py b/tests/test_layout_page_estimate.py index 7c48c5aa..285d6e7d 100644 --- a/tests/test_layout_page_estimate.py +++ b/tests/test_layout_page_estimate.py @@ -260,6 +260,11 @@ # lines of both go below it "pages_rectangle_on_paper_400_narrower_than_two_columns": 2, # 400 narrower than the text, centred "pages_table_on_paper_400_narrower_than_two_columns": 2, # a table so + "pages_rectangle_on_paper_over_the_left_column_from_the_right": 2, # anchored in the second column + "pages_rectangle_on_paper_over_the_middle_of_three_columns": 2, # the middle one of three only + "pages_rectangle_on_paper_100_into_the_second_column": 2, # its right edge 100 into the second: both + "pages_rectangle_on_paper_ending_in_the_column_gap": 2, # its right edge 100 short of the second, in + # the gap: the first only "pages_rectangle_on_page_5000_below_its_top": 2, # top and bottom 5000 below the body's top "pages_rectangle_on_page_5000_above_its_foot": 2, # 5000 above the body's foot: the lines reaching it # go below it From bc0c5d9ac8f8834cf5a712673a819b57842631a7 Mon Sep 17 00:00:00 2001 From: airmang <38392618+airmang@users.noreply.github.com> Date: Thu, 1 Oct 2026 21:04:53 +0900 Subject: [PATCH 3/3] test(layout): _columns also gives the gap between columns of equal width Co-Authored-By: Claude Opus 5.5 --- tests/test_layout_page_estimate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_layout_page_estimate.py b/tests/test_layout_page_estimate.py index 285d6e7d..a235d4a9 100644 --- a/tests/test_layout_page_estimate.py +++ b/tests/test_layout_page_estimate.py @@ -557,7 +557,7 @@ def test_columns_of_unequal_width_take_their_share_of_the_text_width_rounded() - with zipfile.ZipFile(FIXTURES / "pages_columns_unequal_three.hwpx") as package: section = etree.fromstring(package.read("Contents/section0.xml")) - assert page_layout._columns(section, 42520) == (3, 8502, (8502, 15875, 15878)) + assert page_layout._columns(section, 42520) == (3, 8502, (8502, 15875, 15878), 0) # no gap: unequal widths assert {int(seg.get("horzsize")) for seg in section.iter(f"{HP}lineseg")} == {8502, 15875, 15878}