From cf104be5cbafd1fa7edfcf3c2d9daeaeb239b0cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?= Date: Wed, 1 Jul 2026 00:01:10 +0200 Subject: [PATCH] tdf#119908 tdf#166113 cool#15973 sw smart justify: fix DOCX hyphenation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Setting 150% maximum word spacing instead of 133% during DOCX import, the improved line breaking fixes DOCX layout interoperability in the case of hyphenation, too. Note: justification of MSO 2013 and later uses also a "less hyphenation" strategy, not only "better word spacing", resulting different line breaking, when hyphenation is enabled. Follow-up to commit d572576dd6cc3b2473d9abbe8deb00006da130a8 "tdf#119908 cool#15973 sw smart justify: fix "smart" hyphenation", commit 529755f0919217a84a12daad0fddfddd1124f0e9 "tdf#166113 sw smart justify: adjust algorithm for interoperability" and commit 7d08767b890e723cd502b1c61d250924f695eb98 "tdf#130088 tdf#119908 smart justify: fix DOCX line count + compat opt." Change-Id: I85410b4a73c96dab4ddfc25d894e72780ebe4728 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/207508 Tested-by: László Németh Reviewed-by: László Németh --- .../data/tdf119908_smart_hyphenation.docx | Bin 0 -> 9708 bytes sw/qa/extras/layout/layout3.cxx | 143 ++++++++++++++++++ sw/source/filter/ww8/docxattributeoutput.cxx | 4 +- .../writerfilter/dmapper/DomainMapper.cxx | 4 +- 4 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 sw/qa/extras/layout/data/tdf119908_smart_hyphenation.docx diff --git a/sw/qa/extras/layout/data/tdf119908_smart_hyphenation.docx b/sw/qa/extras/layout/data/tdf119908_smart_hyphenation.docx new file mode 100644 index 0000000000000000000000000000000000000000..e051463f2447a6a26909e714641e127abd0ba653 GIT binary patch literal 9708 zcmaKS1yo#HvNrDS1PdN4xVyVs@ZheE6WraMMuJOl8YcmQCNuy*%`@-c26s)l5=+Er0^A=$T()o`<_^sA++rH}`lVRsNN9?;@wf zc4P6hcjUcr;&_g9Y-+*0KeU=6BGR_oh1Bko_!BTtP-_3Dg0P>Suy8h4b8~h9u$nu& zS-$pmbcj#+;?&26C4G4xGkm*7BP8_!s{|xrgoj*NsB>Uw4b>WLK93RnvF?~WqyVQK~9#FvLHCR=JFkRoU z@F02D^UlXHe;=Tp7z3@aQH$M&rv_VT4PDY*tGg1Bs0x8sc>glzs`qoE41|qlJuI%@ zF)k2T7wl+QQKG{d9j`f|VQ?(l`-2$&b`nE~KkebPtf5V#do<3jsabK=RgMCj z;aWVCt`ig6Q3L@Ujo3(q9M1qD%1&rLh&MZ=FV?Oe>@b82_au9hXDN8Hd3ZaT1FBw& ziUenSV!Uo>Sf>jGEky>3xSpUt+s#is9EzGdqHj`-h0RpnF*X7Rwae0M1$fR0$F1*y={whbwb$@VA;lsn2y4|zBS*sx`_+# z@-Cb`TIxm}bUIbXePoG|Cp{`>&fgn>ewG<9!WYt5egT!)l`8l;uQM8vGcG;89!HGT_|xg5>;i5; z>0`qSUtcaqnqSmHOrC6x|9j^m8l@uwEp5mTP?mDk$^m zt&g9+|96leefrnS+0BCWU!n9VUU)cKI=Mf~_OGz2@#RTCtgc&p(<7b_F;QISR3W;R z6j)O~VHas=s&`jOw3jEp)mfZwhMZJ_1xU?o2&ecM&|B(fSuSU)PW zhhZSU9$iNQ(VP2bET(Lcndhf%PVaBQywAoE521nIWppYP7)80JN!VFB=YDxRVX-I? zv`Bzle`j}0;i#Dr-`ApEj=}BUu$EuTa#Q%qD4b?3xVRAZuJhhP?sn29hL;M$)T0%a7sor%Zhg!$^3Zeq>AQp-TD0G7OJ=^#=&g+VQlga{T@zd*(k{{W*mG zrJdjPvTdXcSZe#$^YLRy>FJxsu1>H_G;d3~GLK*V7kt5V&WO)wronI~P7E-&U7zHVZ^BLHsrpaU`pT%f=tO?9S#oz;U;{x{p^^vxKWA z+>})fnlte?W7G1H)uQ*m0t1CsJZgc6!h;c3MEyWN0Qc?j>*j89EpPU$na(xOV`)f) zVC!PGPC13HZCD^+dWdg%d8tHv)@hPjc#&VULM}5PkXkZ8VYS2O{A3$KQuiUId1WG( zVQU`4PIH>;7<7`B#+^TeH{41KFMFnMv1@ zbgnsLNlxQ?v2r&^2X27M-KyWXsL1Ek>9OO(!h_suFDPJlM{g>dYHB&l1E1_=>(qA$ z`_`=IC<2SKqq6nM&rCOnX0Ee?(ZP29(5zEN!5-wHw`tSpZk?hSdR85DE#Io+BQg=c z$Q_uA$juYTdn)U5+cSw1@O*fiUGH{re9ac{$+VOB@Nxj}q<3tk(k zq%2A**n2EMPHi)lv5Y4d2gX~|Y>-(xa_*Wc5{*mx4xXx@59YtXy;=c}(b$~GdKp8& z=(#_pNU6vW@&hNU2K2A|1#m%&TIjoAxVpeJI_z zEE9-nQp+J-Ao_^T0v649?ICM;kDxdn!3j^F0-%Tuq>K_61}s0F#MWi>r4y$o7jG#x zoJB`>&;x6j4${O2UwYYgDgmO09@=$9>{LIgm84vWU&S1M?od8Bp21Ke`9wWjD{r4# z{stAzjDu@m2|!SZBimn}W;dMPA@0zGn^rPnJ4{!k~={i;GgG-zR?d@+jdb z%1y!i?>S`7DQStq!e1uK?7sI{5-+}sV%!gtkpN_d^MnkOP4BX2$>e>y#SMC=XaGk z>U2aVhUFEU%MA_kh^81)hCgcUsI1USGb5S$ryI@GM2m20>rjP%sHd^?6x+&`Mjxh_ zH8*8Y$r7%9Uy?B)rdkF?mLIy;C``#a@>RDBh0TjhHTQ=x1UWK}u-ljs&sbkQOq-nt z*1q$7cf_u(bIpdQf9tKRBSyRrZfRKgx{08(Tlgui*COQm6AuP0G6i{4O)n^+|I zBY|dIuSe2`Hbg%=vQ23aN-s_7z3jI%86mf|*{c}4xB0|6X|4IrmtYSM+@Wel-ABTD znLv&FlbU$VYw?w)31exau1FBs@M#H6M|Xc^?5T7+57#~$d9YrA;t0Z5vYvHtU5PPB zO2lPNEx)-1jZS|AF#Dqdc3ZBjL$&3ZoC+~=_`Gf~x1D+^Yxll}6sIvnHC<=IeGf3?pksp zsld6uy|JPKP@T0^krdZe8{SWKc{+|Y82N?aO2zF_MXcklo9d83WLA&%4TXV{pscxC zfuTsE2?rHg4?(7{6Mk|<_QJNp=Eroyqztu4b{gb4mg|EbkL8mT-T=z5W3c*=M9%a-rOxR)GQy4aL}x?OH7_wy|JRRqYRgb8r}3ff46(7UHcFl6MRzA?*s2RK6Ntu z3X(;RGjnEb?y)S_>94naLUBIg5{I{kyLMP#6(s&ymDZSN%)nlM@-ThKbXg+Ygk)ty zjGS(p)*GmDgJZ00Izff}5=jS4Av<-XX~DaFAVx|v=$s3Zg=>yN*+587RRQ*_NC<=^ zZdHd{4I7i=!2g;Q!NPU;zQ=~CWK(P}&d!-k4#7t3=q!j2cU%R5V;k1qWScrWQHfA7 z!cmxk?~^gltC&_k-`Bh`+?|MfVVk@rl2<16ea6<<2$Th*qE;B*Ah|~Ez3_snb&Ya#J!MGww36X6ne>t?h;Hx0g_M^zj z&i@71O|s0a@daW_@ObEP+KiJsDMP*>D!o)s<_0p{tvgvCWjJWRj?s-S2vt-MpbUT8 zAz>@eG@nv0ztBxVj1|=0AZJwv=?_vgeR+ZRgH8JTX>ucO}xi^jj>}!It`8=owhz+ zQqn!o;rTYiqpxhj5!jH`Y8|~f{4LY{`Td}Yt47h}BP(*cElz(m#OeZmn`GllqQ#}_fSL=)Ec%qkxhjtj{k))5 z`LkXLK=))qF`vX7Bg4IFGAX6Gf_65?Av2ps4hSXAaqL4$ioJ56$+NrQ`cc+{xlwwP zkyz(0bcg>fQ?9+AfFJghZcQvw4We|rA#i5SqiukWCbRzHKXCfW`DmG>TMrQ8*({IwpZYV z;LRu(qvx8tNzIvzz8=X=Ezm`zCQPHn+mfNxpmU_O%em;*#@ z$811!NRQmEfO=*L$DLTF}LU+aq71NWj_(D7&(ED;yUgER#zFPDB&Odk~97Us@ki#=vlEYAfGuFRmLo)+9U z)hCZ{DUA!We<0|-6$eJ=$j@wle+>6d`Mgz0&}0Nx)fO!;&09?Ce_zY;P^wrX^_y@H_N_cxv(f)w7l^$$qLr(OLz$|zHrV^yiWUS5qk79 zD1KF(GC)F_kBmMzzLAZf$QF?MI}_%g=qd6q zE7__(5AsvO&ut{M@~$n<`{3=AVuCsS)s$)i;3h4f zsh4g?KtC%@hy!}Z&u~ZFmS`f}s>U}Te3@H=Ct>(v&$B3Uq+{ykwp)UrZuEH-hLn;L zoD>fbyG#z2O&vr_K60BsWH~4x|JD>ib!Swx4@-ltD}|J^9j0a<0VZ0!2>8ooDDhj& zY`>7z59u%I6+!jbc;|{AS?Xi9L}ezgta0C4m={i5HglQEJILNKKt*hmVl2CoRHaO} z23w?OT^6P%?M-UYtJ`dQd)q91yE);%+bR?StS>Q>2Q4LT3#B8wSeq70))-BBJ4KTk zmrq%=h)X7Tm?fNvuEBa5m&T=zWDDAWG8WM3K7hPt-1lj~FMpMe9^c=cV9og3)bP9b zWnzR-zrIiNoun*2W0JDihWDCID(ffd2+b-ND(}nM;pwRMmgunT@)UZ?9YmW@6 zJX5T%>Q?J=4{MT8%4%apPK#?DIq^Ho7!#sdl&sHO>2@oS(zxO+hpR1 zt*&;U6y4hq5z-MO@ry|(G=&v$Vy5|8|?VB<*2s-Eug zZgX~ZD8so~l0NF|>TwWdkQb4M-U5(D!yfFlvPVaGDAw26*?BMD;Y_`EGiYc+2(HIs zDdLh%Ejg+PBW#zS)obOd(}>L@{g4-05=s+HMX?~CO6!(A~ooD9NrwStN}7l|4D+SeoiPa(drj zfi_qPMf;O;$msBl(!`ltpW8*hYv!yr#hxDXTFS~8;y}43+IC^2P7oc_uz8dfVxs4e z`h&(%5OWuc>n5;r`rx(&UNH2_ybUaLwmp38dTvKb=ACn!7r|OlD^_D4BQL}8oKHja zoiNn?5g-8phTMhMT9fyznIit0)*^F)#}~qk%^L6VVkPyB(?qSzB1ZDv@(>o(Vn`HE zL{8LBDTMew2;pp!=L>TF2!LT*R;fHCL6h)no zy6bGL)jN`~#qiMj&Jv*zb+cuERN8&&WC7g1&E03=F6o;ka_&SfGOFPPtGv25gSP>F zu#&2Bi!>m$FsXX*dac>l$LW6PgV3SjZ4<8%wacewLFtay1g6nUA9))}g+B(2e34j9 zz{H&gJJ%Zf-!2~+o5$qBXYgJp0+yKr1&<;FVV@gQ&^}Tn`Z!QfLC*iww!{2SV+!Ez z<6sGRZr2UyEV?bQVfi2F+MKDNp`}`7@nxqey;wlAlsJKwFgEAz&`vQQp4H{x@%Y4* zRyIXg@7WDm27qh*1KROOg+m*ZMu;v|I*5Wx7){-VMV91uK3KJ^8YmRa*vYC(#NUf0Sn770S%bS%~bt(69=azEvP^s836A&G+hS!las^VD`@F39JwdS=~aY<7J5so5p>@ivDHO_JaKhY3P z;rQHbBa`jrbxZyD)vKnq>qXk6q`*?JEOJ`e&MXC9|`$fUl_Y5GhEYyf-Xz!X>Q*pMK1`!iDH z**gkt>$YpQG692^zOO4`XiFH;I+R6u2C;JQ6fZ0Id2+E^m_~sm;!ExG;C=~x>nc&k zfj)0y1k7J1=4zm+7mtR}RuTCi#BY2fu`CZWcw?;*;I2^{WBa<&{upt~4$w*^fjg?O zw6i9S+>5Q1D!`VT+cPC#S8F))*`{uVJnPpcUogxvlemSXBTIg9iwwSQS#7+x14i=N z{KvGn@^?iWZSXiciwOdDw>ey9l-G2NY1F3eMc1hcI+zb#x|*s`zLQ85+bd z#vlE#b~w{XP;6wn_{wFt`J9g(0OW>|Y7Yp>)`9&)2>p%{A+Yxnm%M4;?X6%LE=kTs zFd?1atu2q!1B3?r%4&IS`fumT4zrdWE4V=CC;Bq+!dLl68U6?4iyKikJ0FQWJ4({; zStj+%N{!ok0o|Y;m&*k2Kixt*|Mj>abh8cb1pWHbbM__Gcg6VSzz9-58H}4DSt+k`iqZzNozy z7geXGvv76E{Oy9(R(cmDq(mvYxh{$Eb&SQw(~ud;fmnGlRCeW0Ew*o7*DgoDrgy2_ zi+3G1iw9nvVN|G2aKjA(z|anqO-fZg7aOk zuwpKI!{ZXVcL4DiEdC^1F*s2JvcE1RAJ5KaVOe|r!WTJmB7L}@AQ5`Fe^UDYG{*s! z?(Viu)_+Bz(iBzaC!G%*-QsB<7KhtDGNPCvex~sZv7K}(^RNZc)Z%0&_}>rHo5{S%xdF~hJo)P=1?=rbn zB394x9MIpPF^c4TQvB%>>}zn`gj>>^Z$ItGf{anKRO~lR;>dMmQXxjGv3dT{{teI% zMe9UN-;7ZaxOq&z&o%Z-2MEm#z4}>LA%fQ)^LhuDJ@u!fKlBwTVO$X?GTRk1kdpIo zHNO;pXUiK|_U@bKFKW1acyyzdZ{fcJI#mN*PX5XVjED;H%1^c!{zsq!|341kZe!_a z$@!QYAHxw-`O7>2#Ma&V9h*9D9p zRo*3+mE>x+RPxy zCG=ho?H<%)zvvE%`ZX+?Rg>$ zec(n6Rv%#*Gfy(iGmIhnM%rvT!+rXWieQ2lJCHzLAX>3@#TLKy zvwV|!k7J{)3+2TH&0O)ZbdJO?8c!8x?*jn>%fpO0CSxzgYW%Zte7TRzMGFMJ@xQq8 z^6D@~k;-dZofy8*^vPHf1rIOn1nK{bZ2vy!)VrmP@=#JGnPN}|d89uVNteHLdy~Uq z7r5S@?No9E{B8J{$5A!rKBrQ(f zW40!?H(uTT3(pM=I7ha43IsLq&qjiV!GrpHF6Q@vkmtFW|EAxjWd3CQeInsGp8rjh zPh0(e(<6Vf|BjtMk1hO7^H0a=f7t&$#PBEg?+Eqt;rg4Lo)XXhaQ}_A|GB{LAnr4e z{Wr-xDe0eJ?LSxgz3TpNJy;<8FA(sb?7vqj&!zd_bWike_P-1DKbe2ew$Fvk--Pxg z)L&BkS6TBX|L+;%zu!HW>_40TmZAS-|K0hY)5zb1PVsN{KackY YP*a3|QY#b`>eJ`b(@7zqe*X3U02f4n&j0`b literal 0 HcmV?d00001 diff --git a/sw/qa/extras/layout/layout3.cxx b/sw/qa/extras/layout/layout3.cxx index 970a5e8c2d56..9328cdaf4186 100644 --- a/sw/qa/extras/layout/layout3.cxx +++ b/sw/qa/extras/layout/layout3.cxx @@ -397,6 +397,149 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf119908_smart_hyphenation) assertXPath(pXmlDoc, "/root/page[1]/body/txt/SwParaPortion/SwLineLayout/SwHyphPortion", 4); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf119908_DOCX_smart_hyphenation) +{ + uno::Reference xHyphenator = LinguMgr::GetHyphenator(); + if (!xHyphenator->hasLocale(lang::Locale(u"en"_ustr, u"US"_ustr, OUString()))) + return; + + createSwDoc("tdf119908_smart_hyphenation.docx"); + // Ensure that all text portions are calculated before testing. + SwViewShell* pViewShell = getSwDoc()->getIDocumentLayoutAccess().GetCurrentViewShell(); + + CPPUNIT_ASSERT(pViewShell); + pViewShell->Reformat(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // 2 hyphenations on page 1 + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout[1]", "portion", + u"Whereas it is essential to promote the development of friendly relations between na"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout[1]/SwHyphPortion", + 1); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout[1]", "portion", + u"Whereas a common understanding of these rights and freedoms is of the greatest im"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout[1]/SwHyphPortion", + 1); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt/SwParaPortion/SwLineLayout/SwHyphPortion", 2); + + // delete first page to update hyphenation on the next page + + SwWrtShell* const pWrtShell = getSwDocShell()->GetWrtShell(); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 2836, /*bBasicCall=*/false); + pWrtShell->Delete(); + + // 3 hyphenations on page 2 + + pViewShell->Reformat(); + pXmlDoc = parseLayoutDump(); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]", "portion", + u"No one shall be held in slavery or servitude; slavery and the slave trade shall be pro"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwHyphPortion", + 1); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout[1]", "portion", + u"All are equal before the law and are entitled without any discrimination to equal pro"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout[1]/SwHyphPortion", + 1); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[24]/SwParaPortion/SwLineLayout[2]", "portion", + u"political crimes or from acts contrary to the purposes and principles of the United Na"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[24]/SwParaPortion/SwLineLayout[2]/SwHyphPortion", + 1); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt/SwParaPortion/SwLineLayout/SwHyphPortion", 3); + + // delete second page to update hyphenation on the next page + + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 2336, /*bBasicCall=*/false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 2336, /*bBasicCall=*/false); + pWrtShell->Delete(); + + // 5 hyphenations on page 3 + + pViewShell->Reformat(); + pXmlDoc = parseLayoutDump(); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout[1]", "portion", + u"The family is the natural and fundamental group unit of society and is entitled to pro"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout[1]/SwHyphPortion", + 1); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout[1]", "portion", + u"Everyone has the right to freedom of thought, conscience and religion; this right in"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout[1]/SwHyphPortion", + 1); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout[2]", "portion", + u"cludes freedom to change his religion or belief, and freedom, either alone or in com"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout[2]/SwHyphPortion", + 1); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout[3]", "portion", + u"munity with others and in public or private, to manifest his religion or belief " + u"in teach"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout[3]/SwHyphPortion", + 1); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[12]/SwParaPortion/SwLineLayout[1]", "portion", + u"Everyone has the right to freedom of opinion and expression; this right includes free"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[12]/SwParaPortion/SwLineLayout[1]/SwHyphPortion", + 1); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt/SwParaPortion/SwLineLayout/SwHyphPortion", 5); + + // delete second page to update hyphenation on the next page + + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 2646, /*bBasicCall=*/false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 2646, /*bBasicCall=*/false); + pWrtShell->Delete(); + + // 4 hyphenations on page 4 + + pViewShell->Reformat(); + pXmlDoc = parseLayoutDump(); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]", "portion", + u"Everyone has the right to form and to join trade unions for the protection of his inter"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwHyphPortion", + 1); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout[2]", "portion", + u"himself and of his family, including food, clothing, housing and medical care and nec"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout[2]/SwHyphPortion", + 1); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout[2]", "portion", + u"and fundamental stages. Elementary education shall be compulsory. Technical and pro"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout[2]/SwHyphPortion", + 1); + + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[18]/SwParaPortion/SwLineLayout[1]", "portion", + u"In the exercise of his rights and freedoms, everyone shall be subject only to such limi"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[18]/SwParaPortion/SwLineLayout[1]/SwHyphPortion", + 1); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt/SwParaPortion/SwLineLayout/SwHyphPortion", 4); +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf158333) { createSwDoc("tdf130088.docx"); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 31251d57f2c0..851067a5415d 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -9432,7 +9432,9 @@ void DocxAttributeOutput::ParaAdjust( const SvxAdjustItem& rAdjust ) switch ( rAdjust.GetPropWordSpacingMinimum() ) { case 133: - if ( rAdjust.GetPropWordSpacingMaximum() == 133 ) + case 150: + if ( rAdjust.GetPropWordSpacingMaximum() == 133 || + rAdjust.GetPropWordSpacingMaximum() == 150 ) pAdjustString = "lowKashida"; break; case 200: diff --git a/sw/source/writerfilter/dmapper/DomainMapper.cxx b/sw/source/writerfilter/dmapper/DomainMapper.cxx index 9af5e9d74582..76a12e4ac2de 100644 --- a/sw/source/writerfilter/dmapper/DomainMapper.cxx +++ b/sw/source/writerfilter/dmapper/DomainMapper.cxx @@ -5133,13 +5133,13 @@ void DomainMapper::handleParaJustification(const sal_Int32 nIntValue, if ( GetSettingsTable()->GetWordCompatibilityMode() >= 15 ) { rContext->Insert( PROP_PARA_WORD_SPACING_MINIMUM, uno::Any( sal_uInt16(75) ) ); - rContext->Insert( PROP_PARA_WORD_SPACING_MAXIMUM, uno::Any( sal_uInt16(133) ) ); + rContext->Insert( PROP_PARA_WORD_SPACING_MAXIMUM, uno::Any( sal_uInt16(150) ) ); } break; case NS_ooxml::LN_Value_ST_Jc_lowKashida: nAdjust = style::ParagraphAdjust_BLOCK; // modify this value also in sw/source/filter/ww8/docxattributeoutput.cxx - nWordSpacing = 133; + nWordSpacing = 150; break; case NS_ooxml::LN_Value_ST_Jc_mediumKashida: nAdjust = style::ParagraphAdjust_BLOCK;