From 779bce16a76330bcf0bd2672ac2f81227163480b Mon Sep 17 00:00:00 2001 From: airmang <38392618+airmang@users.noreply.github.com> Date: Mon, 12 Oct 2026 11:45:12 +0900 Subject: [PATCH] fix(layout): count a square-wrapped control right at a line start on the line before A square-wrapped object's control right where a line starts, the line before full: Hancom counts it on that line before, where its text ends (as #443 found for a top-and-bottom object's anchor), and places the object from that line's top. The page estimate counted it on the next line when the document had no layout cache, putting the object and the lines beside it a line lower. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 3 +++ src/hwpx/layout/pages.py | 5 +++-- ...ges_square_table_after_a_full_first_line.hwpx | Bin 0 -> 8470 bytes .../pages_square_table_after_two_full_lines.hwpx | Bin 0 -> 8492 bytes tests/test_layout_page_estimate.py | 3 +++ 5 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/hancom_saved/pages_square_table_after_a_full_first_line.hwpx create mode 100644 tests/fixtures/hancom_saved/pages_square_table_after_two_full_lines.hwpx diff --git a/CHANGELOG.md b/CHANGELOG.md index 3dfda659..4717cd3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -137,6 +137,9 @@ - 쪽 수 추정이 글 뒤에 둔 어울림(`textWrap="SQUARE"`) 개체의 자리가 문단 둘째 줄 이후에 오는 경우도 따른다. 한/글처럼 문단을 단 폭 그대로 나눴을 때 그 자리가 든 줄을 찾고, 개체를 그 줄 위에서부터 놓는다. 그 앞 줄은 단 폭 그대로이고, 그 줄부터 개체 곁으로 좁아진다. 전에는 첫 줄에 드는 경우만 따르고 나머지는 지원하지 않았다. +- 위의 어울림 개체 자리가 앞 줄을 꼭 채운 바로 뒤(다음 줄의 시작)에 오면, 한/글처럼 그 글이 끝나는 앞 줄에 든 것으로 센다. + 예를 들어 첫 줄을 꼭 채운 글 뒤의 개체는 문단 위에서부터 놓인다. 전에는 줄 배치 정보가 없는 문서에서 다음 줄에 든 + 것으로 세어, 개체와 그 곁 줄이 한 줄 아래로 내려갔다. ## [6.8.0] - 2026-10-06 diff --git a/src/hwpx/layout/pages.py b/src/hwpx/layout/pages.py index 8262becf..3d87b2d6 100644 --- a/src/hwpx/layout/pages.py +++ b/src/hwpx/layout/pages.py @@ -2412,7 +2412,8 @@ def _square_object(objects: list[Any], runs: list[Any], column: int) -> Any: def _square_anchor_line(measure: _Measure, page: _Page, paragraph: Any, runs: list[Any], obj: Any) -> int: """The line *obj*'s control falls on, the paragraph laid out the column's whole width (FormFit's lines, - the object taking no room in them): Hancom places a square-wrapped object from that line's top.""" + the object taking no room in them): Hancom places a square-wrapped object from that line's top. A control + right where a line starts, the line before full, falls on that line before, where its text ends.""" place = 0 for child in (child for run in runs for child in run): @@ -2424,7 +2425,7 @@ def _square_anchor_line(measure: _Measure, page: _Page, paragraph: Any, runs: li style = measure.style(paragraph.get("paraPrIDRef"), refs, paragraph) shape = measure.shape(paragraph.get("paraPrIDRef")) starts = measure.line_starts(_run_text(runs), _line_widths(shape, page.column_width, style), size, style) - return sum(1 for start in starts[1:] if start <= place) + return sum(1 for start in starts[1:] if start < place) def _square_sides(obj: Any, page: _Page) -> tuple[int, int]: diff --git a/tests/fixtures/hancom_saved/pages_square_table_after_a_full_first_line.hwpx b/tests/fixtures/hancom_saved/pages_square_table_after_a_full_first_line.hwpx new file mode 100644 index 0000000000000000000000000000000000000000..c95fd07d8557131a14560e288ee38fcae5099a92 GIT binary patch literal 8470 zcmZ{J1y~%*(l#!^9RfiXcPBs=cXtS`3oN$C;sl4_5?q1=cTey@&_Hm9APF8INO1j^ zbMAL@PM-VkK0VXj)AdeuO?OpSmAVol5+U5*KN`5;BMCVISmUvv!HOf;5d`&i2AMlM zJAf_Cp&@6PL>cWu#=4lKu24aT@XO+1~qrGGIxMDfkXh_AU6QDm?+TJLs(u)R`+itY8Z%< zo3O2i2*4H!br$C2^z`)Pur-GPIdWJ+IP6^?8FO^tbR&SIA#A3wN-Cm8!d=1qk*8#y7-G z1i%A$LiDQOY!MNLQ?! zKA3QDU(5fNy%fX=3UY$FaoU2+tw64iVmvTbi(l#|dSF3vQ@}Baoc=fi$P%xZ@!7Pc zw=Ak!kB-IT$IqY_!W25OCLnZ9Bt{#T@~sWZ8_Ac5o<&EPw)N$TI>(UNI~>1~(j-(- zdRMTVQd)g zhPfF|V5CDcr>Ue`s_69*qVeh!4XM2J*Yk5|E$1HT3*VNneSLj#*zyFkap4}L%h~?l zURtY;uqt8;#!<)%Dk%tdA=8owUTdp<=A_YAO*l>cF%j~V;XPVWV^JaB#wT@YQ^n9s z2unSM;PMfdE2k8u`b$g(swpIlIpOC$(oXxvh|` zB*x%+PTSEJV02XZbz>K|%zF`PBUm!JGsm->GZE>Cl ztcM!oB*wlL56Q7Iv#sM`J^4cL8HsN?-u|G?hJCRnR-fP9K!pe8hDRevcQwsaEWqXL zu!eEFY}QS*GK+GxlG?=;yxt zkCp3=#XEzx2}iU6NX9z)r~a~|>s0TKo1=|9TAo%%w;O%EUZ4KAlQm<&#My9Utb1-xoF+ZF>6)r4w&A6G*Htc&^pp= z0)oA{_%~k+S!}cySW%hBRC*FplA47&m|X`it5$e7hgv!Hk0_Yvh0XD9yBjZ&<3CU~ zTdLUZ%q+#;(mDa07T&ZN&*LFm1jww9lJ}xez z_JIE^eKA*E2`TJ#7qm9v=qdG;Vl`bB3Jn@MW5XilrOUOXTc%#b? z3#!4432Lr^;Fv*bJN`Hy2M0b!9I-XlyG}_J9%(O|TOx7Cquu${I&p=P9=}hXB3~id zv*ZURr|?(wj6~?4Xg3T3330MKvkFlzQq)*wnhYvaS?!vnsl*Q`PF3#9w-f7o_VIRV z#c9rn3BQxCQF&6mH)smcwe+5u)-ETSUDXRSEz~G&R_J6Y)~sqg@AP@lU`~?;vUc7`&A1gvK*T$)tK^2}ucwAaa!mhEL@;HHl zYb*L6=72tfql@NJ1s|~OmSro*tjkZo(5uwGD=X(lGrRG}{9ro%men|dJH;%FSY?JP zVPU%S)}_GZ;W%V;H~(W#QSAQURLGRBAHcVuvuf4 zMI&1g4XaJ#GA5ag8);Rxge>b{gIPgLwtAzsilS1p3lxeKRtb}e!IMr=ll6QJ1|mfu zaE6N;ljHM{WL@H953OX~&+6mVIk1PUtFXaQ2euZb2dVp%?8~GXpnje#DXUYnP&1yy z^bWjg&*b1Y-3jcK;a`51g50wz8ze&C3os&IN;DYS@Fu2#_-Z&%lTVHkxnqfqy%zF1Z$ZTmu52u&-EpIJQ%SJ!LQt=&@cRj{}Kz=C0PhpY1ghc>r?hm-6Vo)Hnx>*q%LW-uL54DWP>Tx9ojy}VW; zQM!8?=nRN}*~pZm(+g$xS5%oimT$2D-@UiFknqOpZDnv>h$94*m{)%gd}n(`{FR!L z__Z8TZq?o1$}&+Eo%Qi)M18rV2)TElm5<1;Gd3L4OkUH1qmOX?KVMT7ta+5aowbS# zpXda7U+tgijRp9eC5PsV*fsb%Uc+N0^$Q%(OD0V~Y!i6S6w(C5IzR}%)4)RBT0mW7 zWTV?Pe;l)%$^=uS?fseE$$AA^G9q7d47>(0qQ)egMpEGI>B&-sm}pWmT5{Y&>~s2X zIpY{Pm5>rH)cDLmx!7;aZ2emDAti#SYBca_G~p%9q-xw)Ig=E?J|titY0jhtu!zrV z$n7W@|0vnQYbg3Sd1|ffOShJ4msZ@jG8nN!h>a(9jv_*iBIejn3t$`gNPBy2L8YsK zd^?vOPDhK|9Kd}OQH~x_?jo&(Nkjikh_T*HJnD*0_sf6;J9k{Nwscjfvawk8Ta>(N z|I1vytL?d(kCFEdUm5kwdbNHbi&+kh-I1}<1z+z$R*+A@_E%@6M|0Y}_^+1Y zlRiGs1V{Q;?_mkfkW%n>yOl8+dSlo;T>s#Fhz%5ygq_WLF6E=LN)iGYi9oE8*&H58MvuC2XE;eHZ)ww#ymSyP-AYlrBpgCYvyIv7 zOfY|XIeEA?5}w`#2Yy!kk_%7d`92LmaWekd34c;?mDF6pt>g=86SMQ!#>sH_&(0vfx7TUf0mWGK7@%U_lkAP z=35*#8LIjsRsI(oA6lk9_^2or!3Y+4vMTvcA@Y(xI6dfIqm#%AsV%&cc`q7acd(sZ zPm=L*@pC#m72`-qLiOGE*oFE+{r$W_0X9*^1w~UN;n>|w2H@NT-sEu8Zv3TOv;#AG zt+}A^t;YwRuw029UjOm;KU4L}9U4^dUAR4QUq?H7Anu{oc3Md^jNB%D-`X6aR!PMZ z><_0OD9e?*a`|2Z_Wy#Yp1}~!H;={@w^tD#rWMpa8$nI)GJ9;wfbIvr~JqgA6^@=VV8G6(-Yl#_jHensh&Nwe?dGvFLQ3gQS(d zjq4N7q~l7lU_BduanutcvkV%xc|I#ywo+-^j&8cN4E;y6~EpO_pOgZA93Y zj|3HW_)Z%%$>@5GOU{_3B7cSRP$K*Lk+XYw!FT3ClZt(iuW|5A%IYm9Bnc`_>k!2A zo%!dBKij4FlfNx-I8b6Srs?Wd?$2uKbz?!fLTVIy`-OwB|H(d+y5xxERg(XQVf(7Z)IM}GIq)LE-Pw$WdYs|(o ziF;f=&OW#5oiqjpCi;6WIE}m#*(if2L{mj;c4TH5m0n>K@&ru|OGM4CIn@{zxP~a7cJO+iyxH860m@wyMF8@=}q~6$csh>>l3hX7ke8mG=OQzO2|Lxq07@3okuAxiO^x znWr-Pip5ZnHD`I;8hQ=P4jLxT{6U5AB=L}JO{Vv}Rzbdjn!HLJDB6~lz4}%K<$2BP z^#x0=!*!OaU`*<5T)wEea$A9#V$UEw>4ho4iqTn3_*}=Qb&e#8?~&8mLdLHUUY^p- zB-5Sr?Yd@YnFs;^gJl#NScSCZ1Cw~0rCSj%TB!6um)3&!Vj3V5o(rc^VUO=CWBdcYaj0 zdY@hG*MEC+9ooyUlyW2ayx}5S4u|@=W(r0nD?v(T#*I)c>uTy*!u~6V<6$lk4n6B} z<;zGm+V}M5dPl5NyxjFl%jfjT@^f}#4$aj{MlGz4gh98PVh{K6RQD%$b*TZ{oZaO| z%h??H`ZUGKv0}(3bTmImKlK8NL%5vEhPF5ZE~iZS5k;P<5P0IMShb{XwlaW8RBxez zkxLSS&*t8%SfzVZ*b1!u5ZI;5%#m}L0#x-)9tJ$L2Mom$28>yzXmp8SO>uP>Aid=(naUztH8ExRPJ@GFS{bPW*x9lSOyH*}1&YHYygtH0-TKd}s$% zS=aZO+{=~h3*aUHX`og~T=osMf(ON2M}3c}ifq!)}L`R@b`=xb$?Sept- zD>4N#FzO@85`!IebT~4d0{sYoLYgO zh?;qMPXDB*_ME$SjL2rw^F=RzYechHJotDf=-4-M6V+Ng>h05QmSi&mc-C^3crE zSorkXv9jd{JY3V%PuO4*TNl-hVl3*~v;foEEYKiX6usAPDSK^Bm zxpbGGw7f5mVje6H!zi+NyQ~JqYa!?+p}I+cO)_B64 z<^rlyikXcvzE%2_?xQR5_AH%~4mQD#odjEPgv)-QgjMz;SX732Bg6dAi+caNwlZ-jttMqa(7 zJ9Atkc3+i<$QYA5;DXaN%_o9kemTKXjFl~Hegfp)4(!1X5uE2qm}4o#q7X6P^M1Dp zpMbw3SbNZTp06jV_%v|ZJ4Y}8t`HkgE#YiGM@v_zi*4krpTf_8$L!*-%dKG=f5q9n|)&5q`%7wZ((IZ&$Bqowx{(LekE_wVx+&dsJ?IP6@-fbe%H zSlt!m0S0+;s=In)=%Zl>b z5;HTjqS!n>_1l^7@E{q1a7c;!qJ+E&2RSVljxu)h)S!5~Q4J$IJStzhK=5S0`XZ8I zmL!;$$q~DVJ+F~IRDdsVQvDZZ{uY_!2ybYn4I2L#u3ZkzG*GJ4J6!!&OyCy$A8e=S zpMm;dY?Hte0I)zdoEr!Vg$4NC9#4br@hVD)+_>Qnis@}x)u@TJ3jpE?!(+rTDGxiz zBnA26>U&?U7`^Y3?$#_+q3}0ZdZ<@?H}1LUMifogz-j2<$s>~nSo8*s@5Gv zqUW^y3*{8J`#`rv_3y95nEGiM9X3@;#M1yINT{ zB@H`;aN)`X^tsM@1uE)D1hGY_r|D2ptz|Oj1;zr4LqFCK)GH9`C}wforMtz~Y@Auo zdG2GdH_6%n@o8*IQ_2jCZEo+XFewFT8Qtk$6mYNe;@f2TIaZ9F7BOW|%_U#!^pkIg z6Pjf*a4(}<+DE*h3*rhF#J-IUv_9D27;pTJkteSC{#o{z^-a?)SHWgYF4iUN8jtJk_h>Vs+_#3NjLBJi=dHK_h6`AjPYU{1KK^tC zQUu7~WBprrz~~=c_^{>OgaQZmn0xxK3-KsCSlWZb*4g^4&hVQoF5FupMNiuH*K{&u zhuvk`94#O*Gd3()ZXap<;p;=*bYzMp{R&q+`5!;YMx+*jA9n?OWvG(*i43=qhsV)a zQ-rklH@82`kfes8$x7N|>F$RHfyS0%-Q9P^DZT}gDWt0lsMj&b>bb65yjp?#ykj(f zyW>6eV)>-RqGM}~B8!wG@>^F=cZfalN~^q?e`^n>0x@Eg{BgQIAd$ z`ee4fcEoJ1b*8EX7!B`kNTV~AYxbcSWg;)!GrBrQ&=oyw&o9d`U`^B6L8BltsOA@c zZtc0Ese)cEx|+;!#?;T?##17!%k<<~WKpUj&$k*bFO@VeSK3HE9ioXTzDrlHg#+V2+9O(Cqfes25xwk9ki9Sd7W*$atEXge zt^qV2LP(^u_kDuT;rex>X#80cwHB8ci=a2@8FTT6!c$5loZ($*>lq4(Y$QO0Rmhyw zzy>>DU?DF^?1%FDxM5DAY_dYf#7f|>D6$DjgbXJ~gpRQRzAsCCQ4>q%?f6IL)t;$Z zcy%Rs1j4^m0gNSBI`q#p^kXj^95q~E(Bu98lG1-t{h5P)9Q!ww5bXY+l~!0u!_Mlwh=n!(GLAc)Yy4xa}>GK+fFOP;N)}d&Zodc=&+4ygdK;8Y4a2(hdxl z{+oLVMgt9PIZbU1S$Q2D4Q)nxXG;gDy9A>kvIcRvukqg3tlgo1)~q}rPB!Wu&Q@UL z8zkRQm;@sq<2^6`Ve5WANZNnMM}krDPp0TKY;7UdV0vWB&co@?A^)Xe%C3{(@3mohMhw<2hEp5Q=_hLLS)reW_BfVosgDDZ1g-v(NFlIb2 zneq8z&upDvwiyvcC`gpXEQ%|7VoOZo8b^jXF6&$QI(sBXI${>-ahP33*=a?*z?g6-H-+n0xJ-coIpqp5U$XH8&bjqE+jft8e`cdeY#CbFpAv zZMn}{s<$jH2>ipG8hOlRG?FEM9-*49PBBm@$}L@7z$<=W! z^x`Nu;$j1gmsuWj@Zsc3Qd4^RIw?&noRtg6VJ>2xK7fd{dg4aiMqIPJx|pZ1SgCw# z9o6LenQ=47lproDOV?e{Bm z2?ZX5I~A#V7Vf@pWIGQj8)S$FnHTn*(lwtK2fh0+CsLv(}2QR)h1^0Xz66 z2MQcR%luB2G*{6QYCrlgZGC1URY+0A&uro0g12y4ELO;+KLp6+VToI*?r`ul9<22+ zH59Wg#qL#rH&F1)vmvXk)?6Dp%g9nM5?Tt2ASa8T0n6$o-i<*vE`1|PW(IHO_;)-^ z7paKuXdA6H?DBECZP7vg9%ic`p+sgH3$-7Itp?y%m~3hIrVZx`~bU5S%qT^TQ^uxr1Jj8@ZXO-yO*e2Vk zjJgWbHfyztWyYN(rJPgE6w(WNvyc5GC;cSpJRjlX$JnbU;yp|A z%47VwgvK2aP3l6HrV84dkkU0`p_niP;;ADkZOLOBMsYbr=@ap32trpL9=iKzf-oxj zqnLb%VwoJgR1Z!v$0jE9qhV8>Z9mZLr|I}GgrIiI>p4&0#aBUS=8G_Tqkeie`E9x{ zh{O+3%E#GH-pkztJ2@f}nbvbc=?DpF7inpy_AHK5D&7aaoOE}U&XmN{5A34IrQK~< zd!#U2C_eNNe5END7WOnkepFGt+zVg2Fj zt{U^=vSD65fHhXb-5(M;K<^+J?c?Mm;7lO3#&O#&qsAwPu)86B?tJw1^J>*|rNVB% zk6sc>(6_Tx2WDp|SIn%WSRa|TjQvRnGQ2YKFn%OyaLCsgmnL&K)XC93KcGHS`&GOX zSKYl&xLf(0;hc}_dE>PdvduCd18vf7JwpF1tK zB+wT;_u1>1p(1$6Qh>|(Hl%Gv#P97#$Dn;Wy~*7=-w2z2G727 zK4XMMybL~V$nJ;i8C^#Rev-P5lECz}ae6jziPsPzP)9|~ zJ&H$>z+Yr-#i(IU+-G2P!BRH20pDR6R6=Q6eD;Z1t@3?QF)yaY^-J6a^YM2arlGt^ z7H`PZX6Rz)r`vDba^3EZ14qB+badxO?GH=^PJs@r?|6^-ns*!V2frKf>^u@9z%6YE z1Fho~iy5S60>rbqXge9)o3J1Yx1H$GtCcY^(FNsFgaLwM0MG8MyJI3=aCT(Pj_Ej4 z{Ju6SZQ?)&_l=WNqpNEOjpY_>FmZ>K5+A3LsoT~>9+xVii%SA!`*T)meEO5mv`bQs z!~t6^D!VRk(e*xOW}tfv#Clg}hpVZIS15Cbo2};B;^T(fF^xmz*jR6C1WwP8^x8E2tSYijg3W^vsA% z&dD|v%`Kwj8{GyPGXzE!V1ioMK*QSOj#|LWyM_G16pJK5v#B~pJh)=em6LYdO0 zHo&4b!>X1upMk@!b{Ut_4n|S-RvN_d=U@)-Q+tC^du2)4*?DT^5}Vjb<$y_-@X2a{ z8e@rkFeJ?l_S9K8Fj1c@(NiZ;e^7J0JQMknV--0#{J`GI{2+OsmTQ?J4cy0Ag=ZhS#=+gPD-{CQCc<%tw2*;}JEUS{;gqEu5Xp*hqNCPJLcPz>D=LPjO6CxSF#+lRe&X z@VJ(THatMi>}mW%8Lj=o_KQ0Hwh-T49jQ*W)$2D4dtSQ_)}%~{6bz2-^LJEP80q(| zeuOOdazFo4Qn6aWct8U-O6_5#f!n|Z9$ycNN2aj8%lLYQQ^aMWY1Bkt zoDWw7?2F{KV@$hwQX^R3`JbK{&IxCXXsw}y%*16;w}E{sl?>vd@q*wyYR}N+n~CMW z@j?e%1wQP?R-xwK5)L^PQcAPoYbNUcQrCU?(O!vYUyeuPBG=r+F93PQM=)N;!_iZlMz*e8kZrb za0aYOOSs2n{o}OGLOMj`VQuNmk#>?=bF?h?PtOh4DkZ3eA6*|gr+ss#1iOoV0uH?T;rw=u-Pd2(@=y|MAhf5!}?7gDlJRoX}D>o>C_u1 zyBo>(dOD@kY`H5Y^Ct=RZQ&&s;nmDZeou7jqXl#PqO$fM%C=j%e~j+?>id$654^zo zF5>w73tfLM1d6Fsn5l8?j$J7or23${Z9a%~EhpNN0(=@p{tm9#rm%*&rb8}l|NduV97mK-Vh~>a>8B6iY_F_wnq2d<;by(yUANEmq6F) z+A&RiQv<}lY9kAR`OsEJ;)Jm!pn+Gt7FUp0{ZpbZ3W)_+A zvr*O?=JE8|I_QF{Hj>c?K>`+^Rn zs_#{!M^7f{qK&=Ev~ctF7NYot;!p1AHCgonr<9zfMjp=4XpCXVGF%vo2YH|D{Op0jXo8+PuGL=t zlDkZoFWUZTLBlqdebK)Brgl%wu))XRIZE&!l**la6sAFk5&HFJiDj$dw&_=#s*V?A z-MChw&o>Zk{@y6t6^$Bw-NQ9Rz)eg`=eqdvcYu~viW7~f5wun!PYY+zRq&+Y0RBoC z4Y6*1oUuoaZ$qwk%@&QGvw!{?!Q7F%*vrB&65v$(;COf6#qXt;(D&6= z+Q@>e0B$?19386L(?kn>95&s>E%Iluuw; z{P{E@8cFhsGoZjlC2sGn!!LcgYTd*7l zUy7Rd?A%kP zO$tO)Wi$H(awDJYu?JygPwWOknRFIONhC1>;Vf_DAJYwvSr|kotlVUH=)aS&A&{50 z96FJ%D~AZEsf)Ggd=Pah2rRzrb%=F%31kPy&R^A~V=PH;W@8_Mi_cJup;i98-OYJ8 zfL$TZA=H7QR!pD1wU{{N($1{+-aHpwWj@D#eB5oqDZF)s->W6lMog+2Cu?4T=ZFHO>CB0yIBVG9=5?gFk5 z!mUrW04O{bX+*_~~*dW?U{& z8}x^d#O|#N&a|Yi7oQ&fWcirN0%YK+aHU$Wu~s z8Y+f}M{bdm>M!Jw27B!KkhfzR1NC_D%7`k`jH|u)HNDH(HjD*8lqDa^mU-?@a_Phg z3e$j?0E-djQS7qV)eaLfMTT}iqCyKBuzSi_RAxI5wT5~x{ooyCv>o{5>($_?rC#bV)>dkW&uqm0rOD{w`KthLEqv%2>O2#mbWmw6ZGH28F{HXQAgi0Y5!1-%<4mtd?kLE z`oS?hdeNBg?6BjeEiOYuHM7sdtMM4vGEl#KQNH;k5AQ|4Y94F4x6cFX)#b#PHT2G+U0UJ$#&> zx0G5C&B!+0MuaL^ADPo}Z%=p5XOi>y$$C1-Bq%8sl>hS8IUbMbf9<{c!@Jf+z@Q;Jot}q+Kj973A-n!`YeKyJ@K8CdE9dM8C+sZt+aF7j3OHtY6lHTBG~ySd z0*&I-B^QoLTISF`Eo-);6xTF@9B3wcMkJR&cj^a9Hx}{@<`x}BGT4>#Xln=O4@0Gk zrZ@cI;W>j--_!8Pnl-w@$qihVPchEKzurCBru+AFS(865VY-M#l3kAuh;BzPpWWUBa+SAn=j=t6uk6guk+$^lQ#=%@jR4y0vt+Z2u_nf}oBH z;%X%lJ>?AU+f-Og#n!p)oYy`MR~^VsoQT2hLsF5ksol+O87{2|6RQXFvs~Uyej>XJ zKj)IMv;3!NbaRP6_4=rGf=MjWS$LPRtQ|w+pS%VJi{Rfx`P&|BagWz-;AB77uBUlB zW_w+C1I!(6l$s$ah|05rEc1Rmd@Cm~>3AVSSyeZ#D!VF84f-*jn*em$BbB1(il;0) z*^U7{n~u(wHp(HT9cD1^P8*1^O`#a}&v+<~(+axy+R3qqU*Y+4ryg@glJ~~MoHa2+ z;G+4_E0cLVTcf97&?O`(Jh%X2_G@V1i^E@$~nDUW3OLqdYvmKBr#yr&LPS z6w<6>0U5Zj{P<%9Fu42T^UbdJ)U)N2LaVmzHR=os?y&XF?yf*bvXy2PqZGRHEB-1b<_==&9Y5bw}N02-VSNCCj)2i3NR+JgS{fkGez97 z-t75hn7mrkc6HLq4SQX2DwtJyp=_>XkcFiof1Eb;J)riC6z?)MaTZ;YF5l~&mYbo9 z_T@?o`Nu;{DW&Ya3%X`1mb}UW{b`za!ufBqWgyS3pXO#W<;Lm5Wr0H~aPRM>O=E_j z@4vpg=09Q3D;p<>P@WXINbbWVVvMZ$U=`ta1MQ*~Q{KF=7rv=@la`8yucwMYV<%0H zBZ%AA<=il_xxt`lzU5)R>VF<4jrh{HjX-lL+IrBs@#~DDh3bX;RZ?*O8Xa6hYk+8i z56h!R2in$(y4CP?+(I{sA)235D@#Wh&ad4_6{CCAqV@F1O|;P6A`MhzL8=k0I;r-V z9Yq#+RXJF(wF1rA0J$z)(hX94wIxW{6421zXiy+fr+ncQ%aSI_p;2Xz1r+#lV+AROAL+M3(>021II}KeR?19`HVTnH1|dA9_{OGZd&83xg!;NGK}*X8%B6O}{X*O2reCLdjeK zs(BT7z;EsQz7(YZqTOamE))-*#$vm}Mn}ShbP;gTve? zSf1mvV-B}HVI`~}2evKFVs}`|5KVBK*o_W}+4k4iSNV81y%><&ja3g`S`Q<6x0{*P zh%*lxQV^hnws@TWYI?m0()~({*cvmpJF>%a^-B06{BN;AIo4jdA-7yGvfTUh|J7U0 zmM#!mFbsaLuLYx2u)Be{=oO5$hfs34xBET;7l1zfaE6!caXJf&toiWk)U>&nL$N6p za-QJMl+84yI8Ji$2dmII+5Rmq#{T*2*HYh9H^)sf^FWD8Z4)d0!;fR0T+ukV(?tlhgOT002F}|MmUz|5DYzQ~jQq zz90J+l_>K0pG5Kf{Qf5V-#OVo>Hhp20=c^WtDXMN(Ebkad!*!V04Dr@0Q@s<@;k)u zcK>gPRB`~|f1Cn-2l(9p{|%r?@o#hdJLT`T>~Bgb%73hoe_6KQF@9I+e`EMP{)Ytq zq2PZ<_p2JL<8{{bY7 B`qcmc literal 0 HcmV?d00001 diff --git a/tests/test_layout_page_estimate.py b/tests/test_layout_page_estimate.py index 8dc00675..3c4c6fbd 100644 --- a/tests/test_layout_page_estimate.py +++ b/tests/test_layout_page_estimate.py @@ -140,6 +140,9 @@ "pages_square_table_after_text_on_the_second_line": 1, # after 60 characters, on the second line laid # out the whole width: from that line's top (9600), # the first line the whole width + "pages_square_table_after_a_full_first_line": 1, # after 43, which fill the first line: on that line, where + # its text ends, so from the paragraph's top + "pages_square_table_after_two_full_lines": 1, # after 86: on the second line, from its top "pages_picture_1319_down_moved_to_the_next_page": 3, # a picture 8000 tall placed top and bottom 1319 # below its empty paragraph's line: alone at the # next page's top, the line staying, the lines