From 72020f17738e5fd3c47d479a80a2de698980e4c6 Mon Sep 17 00:00:00 2001
From: John MacFarlane <fiddlosopher@gmail.com>
Date: Sat, 30 Mar 2013 22:09:24 -0700
Subject: [PATCH] Docx writer: Use Compact style for Plain block elements.

This differentiates between tight and loose lists.
Closes #775.
---
 README                          |   2 +-
 data/reference.docx             | Bin 9757 -> 9782 bytes
 src/Text/Pandoc/Writers/Docx.hs |  10 ++++++++--
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/README b/README
index 10c3571f4..7efc00e26 100644
--- a/README
+++ b/README
@@ -485,7 +485,7 @@ Options affecting specific writers
     for a file `reference.docx` in the user data directory (see
     `--data-dir`). If this is not found either, sensible defaults will be
     used. The following styles are used by pandoc: [paragraph]
-    Normal, Title, Authors, Date, Heading 1, Heading 2, Heading 3,
+    Normal, Compact, Title, Authors, Date, Heading 1, Heading 2, Heading 3,
     Heading 4, Heading 5, Block Quote, Definition Term, Definition,
     Body Text, Table Caption, Image Caption; [character] Default
     Paragraph Font, Body Text Char, Verbatim Char, Footnote Ref,
diff --git a/data/reference.docx b/data/reference.docx
index b1d0ab15dc3c22d7fa08a2f7ba903c72ee57bb42..42c14a9060df7d05691e26f490334880be90a65e 100644
GIT binary patch
delta 1354
zcmV-Q1-1H}Otwt0n-hQKuzo@v1lpd!1ONcpBLDyo02}~!Z*pWWb98xZWpgfgZERIk
z2>=6q#8**$#8**ucnbgl1oZ&`00a~O008Y-QFG!p5Ps)Zc>JCN14$_pazjWn$xM39
z71BNnTVP#m$(7^~?$>uE+h7^n5JHnC!yDRNulD=&c_rlYug`yBU_D_j2%`hr`O>m2
zOkL&?Iv?1voSpP+OGrdL6flYh_7V&G>qX;y(HC+VU}3@YRP_14_N9#a&8BdD93t_B
zMVNwb#(0P%4EemtW;5dAE9S-_rn1>?wa%Ix2S~!)!Y7fi8%egsF4-20dl6?Y76OV5
zgCt*w2(>R7mIZ$mdd$7TGZY6>D2ul7d!E`7Q)bLY$@rR4DXc{w373!wlmN&>LK(jq
zQbFuh?4pm6kV8SxW)L`i^`rK2SIC_El6df3)2K!Kgs>+R4D5Dy(>D^;-T={g=Ed~n
zVQlB>&6%b!>%d0*WIW8JIB({7Ne2dVFhf*EW>g?kM96<7x)L;#7=!}rRG25q&toQ4
zmclw}Xc81OP80|Mcy`C!N9>IyI0kmhPK*z?_na_J<WkuhR$?9FklYZ@!!#F3ed6K2
zeM}z&_SW|A*IIF_$6Xdv7`1;nOCe-00{G-Ig1IBa(VU~mPcx{p;l)xT9e4}bzp12w
zz2cFg5NCfYmHIM*!23^9L(Y<;*dTa{;RS&joSv>f<y()M2EiG#x}xncR)vpP2$RY3
z$}?xK&?y2o|DcD&);Y^T>zo}5*@Vadm*YxYFF{4|v)mu^BgWA;m7!TM-Vq9NZ`RV&
zHI}~JHD0wv|A(8^<-!Yuc^Q4hmRQ*k(T_q$+iZV_D&)7+w$Twwo?rJv<t+3=MZGy1
znRK`;U_1lZ>7EXILp7;RIZ{4obFKpJtY_5Dv5!2M^zzi4ZQXlwLfh!P1rhT7ML3M5
z&$uX;Vdi`fo$Vr<eE?rUyDmqoJ)a5c4Myrv<&?usy_R#pJ`<B{_se2_eWx~5XhJNO
z0px$UdkV6`N;jxuA9}Aol&Y~^uhsV3X*D*EXKy89eNf$9#Lg!care6CTwYa)xJs<;
z8nLzyEY?oFSUX3t9>rQG)^@L2tU2Fd#M-SFYxgMDqgZRj+N}|5_rPL3trzR*QLG<Z
zti&9BP_bSH%zgYGv#LLo+HWNR|9`=j-06QADs);O?=Mq9SUG{TY6Q}Hxj<YW6yoat
z?#2~t!!qt3632a}CdE_5T|^RTtwJpwn_E1wx>DY<`1OTLG*vf^mG{OI<==jJY)z6p
zd(>AUPB{$>QNj3@dNAuEy(&-Y_nwitk`On-LGU{=KM6<{ZFyFQ1$ZWtIH%RCjhufn
zDOtEnPEO|j_M~c=inXV<S6p`C8KFdd?3!R6R!S|6v2@VBoob!OuIw>;ZHgPaV14(Q
z9;mzL@ND62SIYL<W0<#`0Am$940tW=e#xrA>ESV-K_wVL1FK%Qjm2=<2m8RIJI4q`
z)lBOMD+_rmq}eWL?1AO5OH@b>q{4sO5Y6k^(Gj1X9b<!aV*$Nae~aDRWDO+sZ;e$%
zTcE6TzurRNPVf5eX#T={iX;iE(PR<Zz*Mbp-PuijVWolvNUV-yc~iyNYL9!i-3hs7
zOj0;e|A}Yid}INZig+y@PngSLK<2B*L>yr*TuvhSU!sKl@Ua}8_PiF>9{&lj%0aGv
zii^g-vw;{l3=ZY6enK4t+Md7!007w|lg1<{1AW9-lkp@v0h*I6B~St1lYJ#x0Z^0J
MB|ioqAOHXW05;Z%_W%F@

delta 1362
zcmV-Y1+DtFOr1=yn-hQOty)6ngQke51ONcFA^-pn02}~!Z*pWWb98xZWpgfgZERIk
z2>=7;oh?!3oh?yycnbgl1oZ&`00a~O008Y-UvuI%5P#=Wc>JCN6OvLU<c5%Dl9}|H
zE2MoEvW#`HC0CL|=%?>Ww!t>G;RwxLGQ6SP)&BkMN){KNU&4RDdL}|r&W5)0sbgD&
zVeV2kAKJ0<PWrYb6=E(5I3q)QNu>SxvURZ-NVN=zv|vAz12MFHrJ_N*EwN8RBtP+p
zFyMJygh;_s%-h`aC??k&$01>=-R*SF+kym0fo<v2NZPGL+hP}O3ohJ9a7?5GXTu=T
z7b42+%a&z<hc17|*Th3{proc4ns^W?Eg@yZY?Z8UI8)ME43NZ>PQe9;Jfw_^+Yyu0
zUdb*71W7fL6m1Ft)7L*5w_~Yt>?`WRzIMSE`7ek)qhM%vdz-wmtmg)Z%`+}xCyx_5
z=WmWQ1FJ(DiId4Fr{bcW%S*Z_WDYDuRmqG>$&?Yo)Ode_JVgK~P^XfeC~v2zR8vZI
zG@&U#&?G@12oUd{<0s-y6flN%$4-ckcMpPcLDf>zT2?}xkdWR|*Ci|`$$aXPzkR|U
zC2`mEuQvv9tL>P_3|8G=&eIUGMgX2#MqoQa0?h@A{8WQ>8yZWmjNlz;|Du%!_9~AI
zg(Ry~%FBNe1l)fTA5wemRL^$fD|1t-0#a=)Vdad?5XAontM`VH7qz3WWjMg<iIC`v
z*3d2y?<s>)=BaDk%n0;7MAz$^vScvo6=1X&e8ZVv7{Ecq+OGn{3hiFo?C4vmTQ^%>
zi~N?-HoCoH|GL*Tv()Q4^~Ke=m=4SXF0uemduM;6{zw}&D#w}!EsS;G&f213PJHBo
z(W|qfwe?&%Juh?CQzggC4TOC_IEt0eg{+2Q#{3aD+XXiJ1bhvns5)B1`ADJO5~ME-
zPIb5`*K!UxXJVR7_Dts2A2fzaLx{&J03G+wLFQQJIEQ|wIh3NY+l<xj+hH{>Ts__j
z#O8kzwmXQO4-DeoP2ah?t^;u$Si22i?H(Acr_EqJJ%aTJ)+Vra`}JVW@eTvlUNcyG
zN3b5j+6dNO16X?p2J2ZfSkI1NecxcE#nn3n>s7$<)7O~SeNY;{l?eR&fZar)Q$V59
zd4HcwC1B+M(rExl=lcPIeLx5{-|mIy#g>0nczZ|~4;h+to@(AA5=m<%Y8lyF@#N~c
zbW8D@9am_kUm9!QM5mg+{bAIaCVKYpuLhiI78F1Q>pSLx)kXRYocQm)pkgIKZcKvU
zcT{}tRy^9W*N6qgQ;D3@={HKwxKcdaMW>*1f4fp$rn2uT?G=w*#G{PrKXRr-gtdQA
zOJyu0wC|)^>#=KR%wC7$#wpl5eP#!m?zwoj<ZaiK?RCa*cR7WO)toTEwG8`vss^`*
zr@RKOU<?DSzHS@EaJrS{*z0c)JvqiGs?W5MuriUiiZnX~3uj<;*cB+G2SVXph~~}N
zF%lm>JB0%l#}a0*`JZv~kS#>g+%<nzIoeXnD$naJ3EZjIcaP>TB4$X@us)hhVp}kE
z6>hq_4ec>!k_Skxu48#p&E0B`cedRVa>Kb|aHIZ{c-8sH1S~D_+H^b<p+*6nueQlJ
zB0^$8BlUkq3FqNcb$EvJ+OYQc!m18(^;2H9{sT};0|W{H00000PN5}2005Ic0}7M-
z1_`sh7!(W+>8)Bq=7Xk)rvv~1wIY+>Bq#*toh?z4BNdY%B_siXlSL&^1I8Etll&MM
UldvT~0XLKJB|ioRAOHXW063|HUH||9

diff --git a/src/Text/Pandoc/Writers/Docx.hs b/src/Text/Pandoc/Writers/Docx.hs
index 0549772af..50e39a2a7 100644
--- a/src/Text/Pandoc/Writers/Docx.hs
+++ b/src/Text/Pandoc/Writers/Docx.hs
@@ -418,7 +418,8 @@ blockToOpenXML opts (Header lev (ident,_,_) lst) = do
                                                ,("w:name",bookmarkName)] ()
   let bookmarkEnd = mknode "w:bookmarkEnd" [("w:id", id')] ()
   return $ [bookmarkStart] ++ contents ++ [bookmarkEnd]
-blockToOpenXML opts (Plain lst) = blockToOpenXML opts (Para lst)
+blockToOpenXML opts (Plain lst) = withParaProp (pStyle "Compact")
+  $ blockToOpenXML opts (Para lst)
 -- title beginning with fig: indicates that the image is a figure
 blockToOpenXML opts (Para [Image alt (src,'f':'i':'g':':':tit)]) = do
   paraProps <- getParaProps False
@@ -781,7 +782,12 @@ stripLeadingTrailingSpace = go . reverse . go . reverse
         go xs         = xs
 
 fixDisplayMath :: Block -> [Block]
-fixDisplayMath (Plain lst) = fixDisplayMath (Para lst)
+fixDisplayMath (Plain lst)
+  | any isDisplayMath lst && not (all isDisplayMath lst) =
+    -- chop into several paragraphs so each displaymath is its own
+    map (Plain . stripLeadingTrailingSpace) $
+       groupBy (\x y -> (isDisplayMath x && isDisplayMath y) ||
+                         not (isDisplayMath x || isDisplayMath y)) lst
 fixDisplayMath (Para lst)
   | any isDisplayMath lst && not (all isDisplayMath lst) =
     -- chop into several paragraphs so each displaymath is its own