From 93e3d463fdce74a2f5399a360e4da552ec2fa039 Mon Sep 17 00:00:00 2001 From: John MacFarlane <jgm@berkeley.edu> Date: Mon, 24 Aug 2020 09:31:39 -0700 Subject: [PATCH] Docx writer: separate adjacent tables. Word combines adjacent tables, so to prevent this we insert an empty paragraph between two adjacent tables. Closes #4315. --- src/Text/Pandoc/Writers/Docx.hs | 10 +++++++++- test/docx/golden/tables.docx | Bin 10273 -> 10276 bytes 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Text/Pandoc/Writers/Docx.hs b/src/Text/Pandoc/Writers/Docx.hs index f448c4ce2..e738008ee 100644 --- a/src/Text/Pandoc/Writers/Docx.hs +++ b/src/Text/Pandoc/Writers/Docx.hs @@ -848,7 +848,15 @@ writeOpenXML opts (Pandoc meta blocks) = do -- | Convert a list of Pandoc blocks to OpenXML. blocksToOpenXML :: (PandocMonad m) => WriterOptions -> [Block] -> WS m [Element] -blocksToOpenXML opts bls = concat `fmap` mapM (blockToOpenXML opts) bls +blocksToOpenXML opts = fmap concat . mapM (blockToOpenXML opts) . separateTables + +-- Word combines adjacent tables unless you put an empty paragraph between +-- them. See #4315. +separateTables :: [Block] -> [Block] +separateTables [] = [] +separateTables (x@Table{}:y@Table{}:zs) = + x : RawBlock (Format "openxml") "<w:p />" : separateTables (y:zs) +separateTables (x:xs) = x : separateTables xs pStyleM :: (PandocMonad m) => ParaStyleName -> WS m XML.Element pStyleM styleName = do diff --git a/test/docx/golden/tables.docx b/test/docx/golden/tables.docx index 38b4d2391b47c5c3b729ae2e08a3314f21012634..af30e1fe65fedcb1722c79dc58b2d054a4d86a8b 100644 GIT binary patch delta 1687 zcmZ8h2{@E%6#i$-hOrxyNoHKL6fz1mkq22STzAGq;+b;M%~tkC6AfA|cT_*gzDBm} z%T1OPE?F*-<!YfUH+v{`(H%z5P2cmJ=RfcJopZkbob#P8jh;ytr<)7GWC17&1$1BD z#wZp~hQQX9(jtfiL~LE#^K>ytP6z<Z!8WMMc424euC%1gcA~3~TnSo*6F?kL|61#A zzc0-QloFEVW(;bOs$b1BnvIT0WA+^Qhx2;&`r6^y{7*Al63Ql4hWAX04B|CrIZSs@ z1BH&W3TeM(cK^yBwyq(&{g#M-#_*&IP}+z&n1rQHl0-<o1xMV}1DY{%SBf)?zHc~H zhUlseb!jbzH@8QVvP_vQYVTe@daZ-8YKG&a45@)D(x|-@?(s6*V$M!of5s!21uHli zvVUH!o5m$S5?0nF)T<=CZ>l*s0CBo7NzFZ4h&0CKxtuI_BNrvVJdwY<)kx02Mke)? zqM4dY-;>%#C(G5uft;w*$JXdMOU3&4Xz7D}Dxc_d2h!-cX>5B^lCOw{{20p<mY(`K zQx?s|rF~%f9MBRbr>b}L(32R2Y@S);EF(=a<hOTP%8@GVC@ri*#g!h6R~T*VK~7J7 z6v=%?)ZvU~n_fdz66NZ7N6}8DJRK8}7trI9%G-Ex`##z{p7K^|ES`+%QlTKjvkyJI z<#@@}AeVt(ap6e(Tqx4YyhzoKNL+I}a-7LEZYozbAEUu2r;jcbTntKu$i}+W6<DY9 zj30|&!{6+GJe61)mJiQ6EoxZV(s^##K)9bi>9~Bk=WSxsc~R*=xcGzq5r^Rs{gH`L zdvCvG8-?kG@?=Cr+sUdRuZ#y1wyI&Z!LDPYELvb>Q5-|JDY3HtE;4uA<th2OT)z+3 z#2c|<DrBii+tG6WtntGnr?4-$>=Jkv6xVg<=7gQ0RKxkp(rhp0j9PEFiTj5YDubeZ z&4;Hbzdu)OQC_9@4zB0+2j8d`51v&^cwS?~ig3IPyIUcS<(s;|9$)HwT^L<zL4G9G zm@$-IVa;oP5A6?~i)<C0_}XSGKd;YqsIzTf(;GgOJyZg7KiEYZDCwBd13$v_E&5iy zYwl+2POi$~JF*iv5fzUzrt;@Xjb%aW$bK*sq7cBV*oj@r8_FIT$h!clmUhq`J<FJ^ znh|&ed-xS~>!3ta2jh?s04Re2fC2yjY)>C&>M5U61q4|zK%glyOE5`u$db*O$`ZCg zZEz*hrkj+R3<82$AG4Yj^eSj8OW>Y+LXf;N8zd4@Emo1Ib%^Kd62nxr&dsx_QR*k| z96M|<`EJ^Lsz2x65XUKQAnHV_9o{-&C3vBG0@JD)D*e|GDu=DQ_{yW3WY@>WR7P({ z7IxTr8HWDinDR0DZ_MCzhh0s{vxa+8Os?}rUeFp3sl61pZ<6ppRuP;-FfcCJ)?pcK zF>P#&&3q%%eW|(viQ=Wf;W`0{XAabIglMCl`xaaA*|&$ChqL@;DWAHYwe<V5Uc}UB zk9E$EKU=WZcT*{su<$kTC(*?AmeG$dKa5nJ35LJDHl1^$@<K54OyV3P&N?;>LA^mF zry0#KKJUb*#Ea#MTHTCRd#*N8+k!14mIW^B;58@fpw@xU3s#WcFm%{>UD_IaYZpq> zF}%%kYhfz|<(|bJK?pQm#pcZ_BM90;8yu*w+$K;Yh<XBrPSpP4ox4rki(hZak3HtM zd2@XM-x5_fY<?ea(DLN7L44WqZF}RZ3+^VV365ZqaF9_jfTSdVNqm?9R*@71aF7p| zz@=}yI5G~R4{DPM8}Zk#1)hJ;jz9rGYD@g1pdXpQTK`Xov!$ss-=>FeBe}&U76Smz zo=$WhPcL8UuU=m20cSnv<`BN!|4)9)_|=qfzE>|_WVU$k0_Vv;5!O%8ixDZ4M*zSV zev15%->r98a21OM%_wL=GIkUkL<97vY^EB|hyQ}*6hSgq6^?Zz@|~OcBKuts0MG&# LDHH^hxK92Dt5T}| delta 1549 zcmZ8h4K&kh7~gEM63sTIC1JL)QS+V45N)i;jJOPUscs=uKBBHhHx#M(BVR4<_1(Cd zY;L}yoA2*bEH^UhqNDPe8+E5Sr*nJHdCvJg&-*;@^PJ!N{@wycK0}dl5CTPkWMD85 zG-HWzPmv3Tu7j#d@HVi*IucY;%aITehyrxU5O-W{hcay~=$+dBXI1!HiRUA=hj)Kz z2xP_g(E%k0ic>5i<FM~OmWVZpR}-^x_rF}Ojs4PZG1Fk7-~3~WBg0=w?<QVPD<mKY zBO9yfN~|<z>ZX%#>F8I+RdAtk182&V^IJgNu_k))ye2%8-rID=iS3q3w%wBpR=9H8 zRO7q{+{s)pR+GgaG(Jh3Gt{?}o0O;BHzeM(a?#>(T)dy~+MbuUZ3>x46!*vu9q-Fl zjzsqQB`2L|&N1XeWO)26-x`ks3pOu!jY^pck99bz+&kmm4SiO{N~)$(+s4~0!2c@e z|8<F`zND`nI*sl+6s;$oPUzs>SkrxM@U+1_F5wb_RBna!F%d@e=sujtw0{ZTzi*z7 zQ`O^KE^~f7*;kMm^T5s3F8omata%x#(Z0|Ynw|3G8oA5_+vk00cnkCSL*?<z+9G#| zwL9-mQta(+@-j#q!Oaj|)u$xzrqgtXVBY(#vG*Pk4ei)e)mn&Zt?;1U&3;SbZl0ob ztfYfW<0<ct_SgQjFr8;9SY}oYP5qG&Mxk<!4b<@cuG^hvW(<xNJ%?ay&Xg{{@WN#~ zr14JY!!9Dbdd+j%XqCPKR9MdH+xX@57=`NH@zxGTJ^p?|jV6z=F(gY(&u7(Mt^OC% zb;Xy7zf&5XJz-}J9~5p29#q~Li0em_yX)%Y6K*J(8U?gw&a0?~Ixngz3?CE8uqrq@ zJ+Y%Dz5a^D*zLk(2eVK;7iY1fK*P%hD?%WANIJGd!HjXm;EwV_uX~YB+%LH4V=auH zeu$V>9cu+C6fuAGVqTmjXLY;aJ)^24Q>>fBNMWF2*!$VK&rP4wQ`6hig!ut(tU*EQ z2gc~C7o2+}e17!~;%@$Dh$yM}xPK#Ib><o?!!MbDDQ3Apt1s^3j>!!_Xe>h`!%ozX zraoFR4iKE|WVQEfu|BxpASzMm0<$jx+taTS{##VSCpW7wecxAQJfpOsl!&sKbG7Uh z#K_vF|Er`5CQFgZ1fa_mN%b->$KOy+>1KDBGzLM?HeyalSuku}P0kg<Zh(c-;2e5H zhF^YXNu9XhN1(zz{m+9Ip$G(3BRHczsJz9Rj~-~C1lzh27hAe#veqmEYdzmO-HNum zA{sW=m8Th24(JA%h0Y1QUYmH{H%ngdegN9j6a_2M{JFH3wtFr2loF-bxI<r6DQTjT z?p@1<78#x@L7yd<+K^giOTZ}3fxJ9>_AEhbg-SHnT=V!xHYOGI1DS0wz}J}?PJ%nu ziO4#fT$;G)(cu|-?#QPS!qL%Xs`U<@E{AT-z2lqU5*mcvLW;egoT_FL(Pz3)=SbRa zlP51;aw~W-(v*L0-{S&rw?<^LFT?XdbL$9UGJ5HKjaRC`Pq}kA+E?%JUH)sK$%(}` zA2O3Z8}${K`OI+O&M^ibCPPkgK;Q9QsC<2cZ!@$|%IzH5K~{>a)LS=L-mGB)`5FUk zv0YMt(56U%tG3B^-&wl0p>(TL8v|YjUTc$ft=~}cn`Yw>5C{}4v7Hk8w)O&KoSw9V zjl;-{%K=~*3b={eDvjmgFyKs}7N;(C|CXf8DFI3d6rh0LNZE<UfGvT&c#UswfsI!I z(|~h$4QW-5BqI$F;CFqUrTtCZokYn1PbG%@Hi!h_fd#ylv;;%I$h<<Qs-giW!bTq- n0tT!PL=rTm8Mh_wN1%qV(PKnXV1NY}SQS7~2QK>syMFS2`{bFi