From dbe251f2fd4527cd023d9e5cfccd23b9ae87bba3 Mon Sep 17 00:00:00 2001 From: airmang <38392618+airmang@users.noreply.github.com> Date: Fri, 2 Oct 2026 20:14:26 +0900 Subject: [PATCH] fix(layout): keep rows with vertical text as declared and their tables whole A cell of vertical text (hp:subList@textDirection) was laid out like horizontal text across the cell's width, its lines making the row taller. Hancom lays such lines down the cell's height side by side across it and cuts what does not fit: the row stays as declared. A flowing table holding such a cell does not split over a page end either; it moves to the next page whole, as one set not to split, its anchor's line and the text after it staying on the page before. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 6 ++++ src/hwpx/layout/pages.py | 31 +++++++++++++++--- ..._table_merged_cells_over_the_page_end.hwpx | Bin 0 -> 8990 bytes ...l_cell_in_every_row_over_the_page_end.hwpx | Bin 0 -> 9114 bytes ..._table_vertical_cell_merged_over_rows.hwpx | Bin 0 -> 8069 bytes ...al_cell_of_all_rows_over_the_page_end.hwpx | Bin 0 -> 8823 bytes .../pages_table_vertical_cell_short_text.hwpx | Bin 0 -> 7921 bytes ...le_vertical_cell_text_past_its_height.hwpx | Bin 0 -> 8101 bytes ...ble_vertical_cell_text_past_its_width.hwpx | Bin 0 -> 8185 bytes ...able_vertical_cells_over_the_page_end.hwpx | Bin 0 -> 8928 bytes ...ble_vertical_cells_taller_than_a_page.hwpx | Bin 0 -> 9483 bytes tests/test_layout_page_estimate.py | 29 ++++++++++++++++ 12 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 tests/fixtures/hancom_saved/pages_table_merged_cells_over_the_page_end.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_vertical_cell_in_every_row_over_the_page_end.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_vertical_cell_merged_over_rows.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_vertical_cell_of_all_rows_over_the_page_end.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_vertical_cell_short_text.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_vertical_cell_text_past_its_height.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_vertical_cell_text_past_its_width.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_vertical_cells_over_the_page_end.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_table_vertical_cells_taller_than_a_page.hwpx diff --git a/CHANGELOG.md b/CHANGELOG.md index 013983e2..f7a64443 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ ### 고침 +- 쪽 수 추정(실험, `estimate_pages`)이 세로쓰기 칸(`hp:subList@textDirection="VERTICAL"`)의 글을 가로 글처럼 + 칸 폭에서 나누어 행을 키우던 것을 고친다. + - 한/글은 세로쓰기 칸의 줄을 칸 높이를 따라 세로로 놓고 옆으로 늘어놓는다. 넘치는 글은 잘리고, 행은 선언 + 높이 그대로다. + - 세로쓰기 칸이 있는 흐르는 표는 쪽 끝에서 나뉘지 않고, 나누지 않게 둔 표처럼 통째로 다음 쪽으로 간다. + 기준 문단 줄과 그 뒤 글은 앞 쪽에 남는다. - 쪽 수 추정(실험, `estimate_pages`)이 줄 캐시 없는 표 칸에서 글자처럼 둔 표가 글 사이에 있거나 여럿인 문단을 지원 밖(`a nested table`)으로 두던 것을 고친다. - 이제 본문처럼 그 문단의 줄에 놓는다. 줄은 그 줄의 표와 글 가운데 큰 쪽만큼 높고, 들어가지 않는 표는 다음 diff --git a/src/hwpx/layout/pages.py b/src/hwpx/layout/pages.py index 1ac19211..fea7f2cf 100644 --- a/src/hwpx/layout/pages.py +++ b/src/hwpx/layout/pages.py @@ -887,7 +887,30 @@ def _down(pos: Any) -> int: return 0 if offset < 0 or offset >= 1 << 31 else offset +def _vertical(cell: Any) -> bool: + """Whether *cell* holds vertical text (``hp:subList@textDirection``): Hancom lays its lines down the + cell's height, side by side across it, cuts what does not fit and never makes its row taller.""" + + sub_list = cell.find(f"{HP}subList") + return sub_list is not None and sub_list.get("textDirection", "HORIZONTAL") != "HORIZONTAL" + + +def _page_break(table: Any) -> str: + """How a flowing table goes over a page end (``hp:tbl@pageBreak``): one holding a cell of vertical text + does not split, as if set not to (NONE): it moves to the next page whole.""" + + if any(_vertical(cell) for row in table.findall(f"{HP}tr") for cell in row.findall(f"{HP}tc")): + return "NONE" + return table.get("pageBreak", "CELL") + + def _cell_row(measure: _Measure, table: Any, cell: Any) -> _Row: + if _vertical(cell): # its lines go across it, the row as declared: one block, not split + margins = cell_margins_of(cell, table) + vertical = margins.top + margins.bottom + height = max(int(cell.find(f"{HP}cellSz").get("height", 0)), vertical) + return _Row(height, 1, height - vertical, height - vertical, vertical, cell.get("header") == "1", + first=height - vertical) paragraphs = cell.findall(f"{HP}subList/{HP}p") nested = _holds_table(cell) drawn: tuple[tuple[int, int], ...] = () @@ -1628,7 +1651,7 @@ def _anchor(measure: _Measure, paragraph: Any, runs: list[Any], text: str, obj: top, bottom = (0, 0) if margin is None else (_margin(margin, "top"), _margin(margin, "bottom")) if _local(obj) == "tbl": rows, cells = _table_rows(measure, obj) - table = _FlowTable(rows, obj.get("pageBreak", "CELL"), obj.get("repeatHeader") == "1", (top, bottom), + table = _FlowTable(rows, _page_break(obj), obj.get("repeatHeader") == "1", (top, bottom), tuple(cells), caption=_caption(measure, obj), cut=_spare_cut(obj)) return _Anchor(line, table, 0) return _Anchor(line, None, _drawn_height(obj, measure) + top + bottom) @@ -1656,7 +1679,7 @@ def _object_line( if name == "tbl": rows, cells = _table_rows(measure, obj) offset = int(pos.get("vertOffset", 0)) # one up (a negative offset, kept unsigned) starts at the line - table = _FlowTable(rows, obj.get("pageBreak", "CELL"), obj.get("repeatHeader") == "1", (top, bottom), + table = _FlowTable(rows, _page_break(obj), obj.get("repeatHeader") == "1", (top, bottom), tuple(cells), 0 if offset < 0 or offset >= 1 << 31 else offset, _caption(measure, obj), _spare_cut(obj)) return count, size, pitch, table @@ -1893,7 +1916,7 @@ def _wrapped_paragraph(measure: _Measure, page: _Page, paragraph: Any, rows, cells = _table_rows(measure, pusher) margin = pusher.find(f"{HP}outMargin") ends = (0, 0) if margin is None else (_margin(margin, "top"), _margin(margin, "bottom")) - table = _FlowTable(rows, pusher.get("pageBreak", "CELL"), pusher.get("repeatHeader") == "1", ends, + table = _FlowTable(rows, _page_break(pusher), pusher.get("repeatHeader") == "1", ends, tuple(cells), caption=_caption(measure, pusher), cut=_spare_cut(pusher)) return replace(para, band=_Band(para.wrap_anchor, offset, table)), None top = para.span(0, para.wrap_anchor) + offset @@ -1994,7 +2017,7 @@ def _stack(measure: _Measure, objects: list[Any], column: int, shape: _Shape) -> rows, cells = _table_rows(measure, obj) margin = obj.find(f"{HP}outMargin") ends = (0, 0) if margin is None else (_margin(margin, "top"), _margin(margin, "bottom")) - table = _FlowTable(rows, obj.get("pageBreak", "CELL"), obj.get("repeatHeader") == "1", ends, + table = _FlowTable(rows, _page_break(obj), obj.get("repeatHeader") == "1", ends, tuple(cells), caption=_caption(measure, obj), cut=_spare_cut(obj)) stacked.append(_Stacked(int(pos.get("vertOffset", 0)), left, left + width, height, table)) return tuple(stacked) diff --git a/tests/fixtures/hancom_saved/pages_table_merged_cells_over_the_page_end.hwpx b/tests/fixtures/hancom_saved/pages_table_merged_cells_over_the_page_end.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..748a18f0ecbe0f85e225615a039f87174015fc78 GIT binary patch literal 8990 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 eQvUHh&phz7y{ literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_table_vertical_cell_in_every_row_over_the_page_end.hwpx b/tests/fixtures/hancom_saved/pages_table_vertical_cell_in_every_row_over_the_page_end.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..27862bd6bdccecc67ee12e1b0ddbefce8c5b3342 GIT binary patch literal 9114 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 qY5%7b|KmmeKDz(LfYSW~@qlQ4h}SN{iM8XkH8 literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_table_vertical_cell_merged_over_rows.hwpx b/tests/fixtures/hancom_saved/pages_table_vertical_cell_merged_over_rows.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..7df185aa3d0073392f4427bbf375b2042c7f5783 GIT binary patch literal 8069 zcmZ{J1z1~4^LKD}cL?t8cCp~@v=j{_Sa5d=6nB?m1zJjxA_a=KNNI~haVhTZ&@bHk z{@;6VpZ80i&DpbO=67Z%yE8j8I_gNs#DKp(41n+>Ib|aF&0|A{H)p6b*wfDyY~||e z1huj9gu+~SAwI60{!mw)e=&+Yyu2bs0015v7M#%=?Ct?4=J9oQl9Gl0(En#Z8pzMX z2c!qP*uZR|F80zuLjw@E7?9q>)5^ux$_eHImInHPJ%IGGGExw42^9s9(O*dPa1a*{ z35d5e5aQ|SD#6R^FaCj0qLEs9ANI!Kw)?f>hjp*f9%<~!~X19dqJISwY;3I!SE+=xnUmC zKmp*REdLSfaXxU~f9OXVsPd;!^xAfIP#Z8k{LbFX=}(gX@&I{d{!e|6T4n$QSw1}m zV*>!em4E480p{WfcJcJ!g@CPW!S0W0+&9;T%?*(J;y}Kvm;OZfIwZ4hF_LSjj?fg7 zt7YaXVSHuEfbif-YN^L^G}y9nTB7f=-T=TRSQg_>y0I*x%o_w3y=ezHo1ei;JV7Nd~^9!P(Dm6Tk1N z`$i%d!3(ZAzz6k=Lr+H6#Be{y~MKvm1qdHC>6xEMb+0AvzeZkJ75zXaUXe3 z+EACJ@16cMne6iyQPl6r7?sz7%*usY9>5dh@vyiohbicVP6n2}6IJ%&lQ++QVr|B+ z)ui3Y5sXk=ZuXpq=Tp{4qaMfCIUX`BQ!EzZaBb~dB~)VXBaHP;kOz#;2Yjsp$`}E8 zP#Rk`g^X-B)PlqW_AY*;La0XD#_$=O7{3ygEg#MD3tf<1YCi0p@^^i-6z|9MSgBRI z!DyoeQsIT6N)L98SQ{Fx<*=q=R94YV&o&R6H9Vtw@3bS7XN!FSEpd!d$LyM*V}bF(h|D5)UV!COSsq@B zV_g{-TcdX)sgU~Ci;rqOu-%TtVA0@ceSF#?q-_*)1IS%4u~%(YGecV40j}1{zt_@i zxXEn1DVS|HYa4Zb5w%nw#fnZ|3g=Py139=mS__ z>=j}pY7eIlApL>1%kw;%`YkT%R=Bx??IPv^X~ft;gKGAO4}(~Z!uXziYi>A0$QIRC z!LW*3(E9Z*4>0#s%g)zJs2pXC_+{2bnD?S4r)>{|j3wn)6?1Z=w`or$V{J_v5Hu8@ z%M84KX-TW0d7W5KE`G>1qfE}YOB0EPO3px)-C@~0?m)}Kkdp`9C^IrvsE#Sl znZ4|y36M}XCl^uYLwtLBCsJR`wGD7=4cUy~xMe7_mGE4cI+PQPB~c-l={}!PGeyhY zueZUYP2qpHTiY!)>@pwu?%OjBof!39~}3z|s7G3BSR28W<2lkFce-05%diPdW&!neK3Ai3C>!<&qs zH&3lltbY0_dXzYs3^v3@g=0&-4%M~ zt4wR1ArdB2Y~m-lCFiKKY%sU18eT>6MdiJgU@I!D=u|{2zo?iXlv_nmzvB5E1U#Vq zV%F0CMk2=*Z-tiA4bN+b)^LTUNAkIkVtZ+=)*^#E=L(JEI?ZRVlf-W{k}erN5?ik< zP}=jS{?HFbITK)e`RsIcFvB&~%QIEa_CYr>AZE6b7*DN7{S$e8^?`2UhiD)w!3yo% z0qyv%<#ASxdqnV0sg7by3|pMigi_=4Lt}f_ z_j-GElhHieZ3M!1&aEq@fUM}54)8BS)Sxyu4bjiH%`Ro?$7P?M!zzk%n+@tlL<7@di7)-)w4=ed$+o8rIffD zH1J@>obaqov~pUqk!I3WG$Cp-Z#Toofwce}VCyo5nW_ z_GqNQP9js#y=~*E#K6TN)NAsuphggEEMuI$3ZDR|AkB;KUgRp{{eZGLLC&V+s^=iW zy($@nv84z`LI%R92u__ez54{7_Nrvo8q6joN($$r4WE$26nR7$aM}*rx{k3f zjzMXu1;kOf#ulgZWkZ1{9h!PJ9I@5Uhnn{_eWu&HUD4`l*!WY>q%It z4V4sdYEmAk<=>tkv$0IPk6|BF&EJ1$e=owI(oy~5Ak#ECazDm2IodO)AFKYyr%$K# zYb9If(heJ4MZQx=_wwoP?)>wWUt5vHkZp*thLAHca8l#Edo72x$5x-q%3-q_OHpX` z-+AJRr%WKs4H4HS;RqLI=peh55S7OqVz(r>uPTw?_fF-CGaBZO61(~5KLooWqJt0$_t^}=+*}6u^HLIl0Z6Q6!>)A$m-zk{ zit6mYMg<2TZ~hw9d~5U_vW`t*??GOjE(hX72et8lhV;nm-9dBTlHEk2N54?mHkABH ztQVEdp|cQ$%}^cqtFyCFc+T`V4D4l^88r_| zP$@zjJ@i89gxcIhh}=v;rAZ{ZGa{yT5fG=KM09l8IW^kSxb--irsQmBf$>)(TiV7C z@qS+p=cK4ULFyP0-=Kd*F0MAc(w#99dD0`ICa~hnnni+=g~1b0aq0C%xZ~ZNl!X2g zr6(pRpflcxFrJ0ndEeaol)UmJiS3N~V&?Vb30dVQB|xm5YXSo}QL8S{eCe_5JSR0!cNK-SOFr`Zvzf zRDPkh{?e!CTzD3_f)=Gmoq)cBXu8s6@5+KH+nCnT4k^Fuv-9bthqE2d)u@ZgZwHOr zXhIr0a}Am3nxM{Nxv>V#)`qKXZlWKh8w>?uBr%#AWd-9kZW`hau^?5&(;DM6vKpWc z?#QwLs-h{jqAHT2CgREX&|%HPm4O~mN8&+rF`b;&i=S2)r?7`w$^ns9II5zST$=%> zaFtpr5?Lyeyl~Z8>a&oqn#U0_(GjtYuUg!3`q(o2aJRl%mwxODJ8z%9Rz!sWnzlHC zws=%UJ-IeBPT_*MF9(J%2ftKX-0@y{w|+r{y(q%4OMXZuz(Di!^O#S2jBi-z-}Di1 zk4C0@uH_GWM_}JbGvTL0YgClg(<5jk6!5zL;7u9Y>i-}MJsE~Q3n8NsIY_BASS`K| zx6-(7=`~>>n6L;rWnrTf;zirBPpXc|m-f4GIB6zJ>-@zK9uxd-7e{Q8oLabeT~D{^ zg!KEv`J}}I6@tfe{3e2^<3eIlZ3YBwjxR=p;sGZ~#_xS8FP6<$%B-E3Q|eh|WeTK1 zNW(l3xrzG;@uFfeO!Vp+Q&pyod0%PTRZbU?S~z2Qd)!n3;oP?~ZRJ_2dc zJqDoKSQ5>Na9Vk_!gSX|EYW8BfOO~GOgPsIIlOq82fgx*^h?`oNpM8&UiN}tWCa#id1HLo8`iWU37iH#0kOx0#O~p2IjjwmqVO<~pOs6QT1QJ#P z!6HT

;P|OIJ9Fv<`XEk+UKTZVwaLg|shR$$y6|=3NG#1|POF+#R#>uBrrRnUIc^ zRh1&?Pphoz%4%eq-&=d%4U9I%|NPWXps8ZKl&mo=<9Fwl>?N=Yr7y580Qj7To;KK! z@1Eb#cNHC1MXL4s=1^kP&Wc5whF)4!TkrxDU+B)q6$THjO7P6Qi-I zvBOx|lLYi)ktJi0k#92wT>4O~`q<~vt&g?z_`i!;CFy;9>!d+eL-y@s=qIryesf}h zU=*cR>rn)-dhaDRVM;cWl;8-0Ky2fg@{NM5xeCIN&>ZTWS#{ab8RFL~t$s6ZUUSom zDyB7S7gikB-800gORJ#b@Up6F?c6*PPU&1OdHTLsW}4Xde7j6yET+)`%L1x_JJrbK z1vfj1^d$H!`(eH$5tW!;f0(;fj1j z1)6c8p%r~>%2F z09iUrz+kxRS8$KIaVFQ9aPbYs5CSo7R)nx-ruvPkuZC&-tMp?0Wqg)2L$2feSh8_83Nlh67L+e7Hfq;Nn_BA8 zYj^nq>>|=`yfywdT_FS@-Jqvxm=t`$PZs#JuI;E<)Si%zG?I7Kx6GPQP-l1$`X&%y ze0EApl`1j9kewayktLp47$Vtt;S42Gkz-QQK@z~jBFQT4cD<7XJj*vXhS7>}R}vy% zWFd4N{uqF6&$@r^_GsMn^_6OKXQgKp?#t%xRm5_~cCLaV;EVe^l$E{GB``&=)+7R^ ztv?wE!ydJ(T1S5>Ug5@rZAbNL!Cj#^0CDG(;h7uevp2q@AB5ca{DIcK83a>VuaSWf zDN0u*sq z$;Rhz!B2}<0~rSZKu73FbroK~eOgtAWQSP6i+#dyKR%={8-0IflYD==+m}PMi%z^0LMaS4m7S*oH;z+uyIW z6bibe+a_z5Rm6IpW9W=V=;^;0NZ7VcAt)pwn5i@;)Wu;Um~@m=6n{fdSATo{4*Ml8 z>o3-KA0oN~Hez%eu=QH{b53vv^t}ki8V8TubDz+z;7kN&EHV$@l+>!o3PR$_r`LCh z@~3*tprQt+Cuy44qD|8=Uoume?XY1xM1<4n95+4AcDvG8HQg>{5@aUE#2mtc{S+~3 zEVK(HYpXxOI6iN0CqZ zWdl#|_m?cZneb_2N;sL>xqrftcv1nS0O%8bgOBnd%<@)d)RBJ5@4~ehi=}_PH#9n5neozn zdPOuGoVthy=ci*0kA6x%JhG^kxCQmSB_IxBI_8HmtT zKdDo5wGQKa??O>CsUwcCePkfq%)y%n))P66cQV@kfRCBRox}2`Y%L&Vu$j=0XUMQ) zqmYHC1gMVIn1}H_-HzmlWR>z*;X|(yQzs%{M~cZJ0m{y@@hSg2(Lsl%3{BxMD99~~ zc-|l-$WvzT-WzL7ra`>k?)ji#aTU;-Ul5^j&gaw6$29#?B0V5RV$3P;R1f}awFK{} z6Tl}zVIm5-zS-&aBrcElm-lIZjmyLJ!ncqI*V7Z;W{cpU+v%mHhh6Pv-e0#Ds+Tx| zF5~n3Kbz)~tt>P@_~eWSS5Y1{k+wG>lN)Bg=|drWI((TUrhd%jZguREUPa%=WS!xw zM%u-3?lNth(Nd$U?&z0Vm3gnhGSqdnD4wxP7ez~*LzVech^C^kW{hX>?l1(xGAjx5 zIY_5WWSR&XLvH8S99a+&Pv@3jDeCFLCdC(6hQOeb}rQp^3jbRI@Y~XFAH=YmS^I&nYkO#7P@7odg+47cVyfu`P%aM1$ zA-~WUh}?Nv<1Pm^8SM1!(MG5<7rkKI=|5$i?%nR$dgT0|( zA6^}IZv(KeCy%GE=g)QjM(AOlDb-uzFM4rmsrnx7s~-AsWBU5OEl$szA-)SjKfNwf zr#&t|K3hEY?@brgbX?SM_7jBlTre#X=1|mhx;84+ad@Z}(_MUagcWm^yc0AZuZ;DqjJ$fZ%JzRb2~MpRNu2QI=~CUNNkYBQKs?s5iTk!i|M&mAOqHNa}Iz{QYAm*QJT-MN6b$ zY;5u1_(2XXX{&a3ESa&(!YS&R)b=l?4Z43%mo>9z0Rui&8zgv&9X?%6B?CEbRV@&& z4Lnh71$BX^h}~`N8qSP(x(Jkk)7lkHBl|S#SA*xp; zHdM>wxzF}Us#!a?oA%km;%)@lOA#{IS7y96Gq=CHug0boV`TMWmMrD}DM)Ca7wB9y zeD;bhhi*Fk#;}iSGm6+UmxX@;!^ZJNDpMF=lo;+^La5#T8qY|>Dpt`SdQCL>!*;ig zcYLKoA7m$q%M;4%p$q&yhxv*^V~!W{6m^Xw8VXBt)S%0e(lkD&T@qP(?o^8ElZ_;h zbgU7a<}5(1;2EJeE5CdyIWl9z4s=197!0FdRzF zd{e*5QAdlSeB#~}in(J%?gr*P z30c;2bgG=pQz0rA3UTDMp?Od|%W({SMx?44Z%s9u8bz zF)9QTUiC4H==73&Xl4vJtjA{PhKv3Yj zt{tpdTZ9#_f?Q{>=myER?eNmpgtYZmo0ajjD4secv*d_#YS%$9_=MJvT#niX*0YUG zf~~?VK8nuC{(BA4WiwA8!8hO>y#0SRAl&i<>3(xSzDxOfumksGMzuPyw86j-!MI6wUw-S?JfDrePikPsi+J(Snq4=}3GwO~2-FG6 zC^@ZDR1sIL183Ts*i+pI;w)25gfGp+(<{?nzuSQz8fh9;#Mh~Nqm!#zD8qEFBlZPt z0!rQ@ltcB}t;pnN$`VoD?DLcR7Jl38ia6o0&?{*_H934~E$h2vs}RI#VH%~x`NOf8 z2SQNmQC{q^A;n^U_?96N?>@a31)8)Gs=cS)^J`)*ytEgi2|T|NLtL;`nDYT^#^Z~! z5FM<|>-3=|Yz}0wP3yZhY+-+7kKyW*wl4Z_wZS--pSr=fTok-LMv(utTh3N4P&=@P z=cBzAPEg0}<-7ej|+P@a*!P~zozVQ6kf7{F2g zs*xl2Zlsfasdu~5hNr{N0!R&6!R1j}`JS&-OdU?;M1& literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_table_vertical_cell_of_all_rows_over_the_page_end.hwpx b/tests/fixtures/hancom_saved/pages_table_vertical_cell_of_all_rows_over_the_page_end.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..00f8745522cf739f97b56c120a2737703eb8aee8 GIT binary patch literal 8823 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_table_vertical_cell_text_past_its_width.hwpx b/tests/fixtures/hancom_saved/pages_table_vertical_cell_text_past_its_width.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..326b4c6a61af2bb8addefd2df87aa46cfad26615 GIT binary patch literal 8185 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 Oe0>lx2|{y!_x}L+NLp0@ literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_table_vertical_cells_over_the_page_end.hwpx b/tests/fixtures/hancom_saved/pages_table_vertical_cells_over_the_page_end.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..16ca3fdade266a3b8ab42e1d101f156aa7c75970 GIT binary patch literal 8928 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 U_$-8g@Cg3(hR;bF^uO-@4-Y!j?EnA( literal 0 HcmV?d00001 diff --git a/tests/fixtures/hancom_saved/pages_table_vertical_cells_taller_than_a_page.hwpx b/tests/fixtures/hancom_saved/pages_table_vertical_cells_taller_than_a_page.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..a71a80226cef729b73550a6a708722d180adb55a GIT binary patch literal 9483 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 ARR910 literal 0 HcmV?d00001 diff --git a/tests/test_layout_page_estimate.py b/tests/test_layout_page_estimate.py index 026e15a4..aafe8dd4 100644 --- a/tests/test_layout_page_estimate.py +++ b/tests/test_layout_page_estimate.py @@ -282,6 +282,14 @@ "pages_table_nested_in_table_as_character": 1, # a table in a cell of a table set as a character "pages_table_nested_row_split": 2, # a row holding a table splits after its first line of text "pages_table_nested_row_moved": 2, # none of a row holding a table fits: it goes on whole + # A flowing table whose first column holds vertical text (10 pt, spaced 160%): Hancom lays its lines down + # the cell's height, side by side across it, and cuts what does not fit; the row stays as declared: + "pages_table_vertical_cell_short_text": 1, # three characters in a cell 3000 x 4000: one line + "pages_table_vertical_cell_text_past_its_height": 1, # thirty: ten lines, the row still 4000 tall + "pages_table_vertical_cell_text_past_its_width": 1, # sixty in a cell 1500 wide: twenty lines + "pages_table_vertical_cell_merged_over_rows": 1, # ten in a cell merged over four rows 2000 tall + "pages_table_merged_cells_over_the_page_end": 2, # twenty rows, cells of four merged, horizontal text: + # the table splits at the page end "pages_table_nested_top_and_bottom_alone_then_a_line": 1, # a table placed top and bottom alone in # a cell paragraph, then a line: right # below the table @@ -855,6 +863,27 @@ def test_a_cell_holding_a_table_among_text_or_top_and_bottom_is_as_tall_as_hanco assert estimate_pages(_without_caches(data)).unsupported == ("section 0: a nested table",) +@pytest.mark.parametrize("fixture", ["pages_table_vertical_cells_over_the_page_end", + "pages_table_vertical_cell_of_all_rows_over_the_page_end", + "pages_table_vertical_cell_in_every_row_over_the_page_end", + "pages_table_vertical_cells_taller_than_a_page"]) +def test_a_table_holding_vertical_text_moves_to_the_next_page_whole(fixture: str) -> None: + # pages_table_merged_cells_over_the_page_end with vertical text in its first column (cells of four rows + # merged, one of all twenty, or one in every row), and one of forty rows taller than a page: Hancom does + # not split it but moves it whole to the next page's top (running past the page's foot when taller), the + # anchor's line and the paragraphs after it staying on the first page. + data = (FIXTURES / f"{fixture}.hwpx").read_bytes() + hancom = _hancom_lines(data) + + for document in (data, _without_caches(data)): + estimate = estimate_pages(document) + estimated = [[line.vertpos for line in lines] for lines in estimate.lines] + assert estimate.unsupported == () + assert estimate.pages == 2 + assert [mine for mine, theirs in zip(estimated, hancom) if theirs] == [theirs for theirs in hancom if theirs] + assert {line.page for lines in estimate.lines for line in lines} == {0} + + def test_a_negative_outer_margin_counts_as_none() -> None: # A table over two pages whose outer margins were -500 (kept as unsigned 32-bit numbers): Hancom laid it # out as one without them and saved them as 0. With the margins back at -500 the estimate is the same.