From 80e750aa5e7ac03add8a3ef5a8f2725b1d0ff901 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Fri, 17 Mar 2023 20:06:17 -0700 Subject: [PATCH] Docx writer: include abstract title. Closes #8702. Uses localized term for abstract. --- MANUAL.txt | 1 + data/docx/word/styles.xml | 20 +++++++++++++++++++- src/Text/Pandoc/Writers/Docx.hs | 12 ++++++++++-- test/docx/golden/document-properties.docx | Bin 10314 -> 10324 bytes 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/MANUAL.txt b/MANUAL.txt index 0afe048e397b..cc97a51675ee 100644 --- a/MANUAL.txt +++ b/MANUAL.txt @@ -1166,6 +1166,7 @@ header when requesting a document from a URL: - Author - Date - Abstract + - AbstractTitle - Bibliography - Heading 1 - Heading 2 diff --git a/data/docx/word/styles.xml b/data/docx/word/styles.xml index 832b1b25b0a0..578c3ba5d4fd 100644 --- a/data/docx/word/styles.xml +++ b/data/docx/word/styles.xml @@ -99,6 +99,24 @@ + + + + + + + + + + + + + + + + > + + @@ -107,7 +125,7 @@ - + diff --git a/src/Text/Pandoc/Writers/Docx.hs b/src/Text/Pandoc/Writers/Docx.hs index e3956c5ef53b..d33f2aca6cc5 100644 --- a/src/Text/Pandoc/Writers/Docx.hs +++ b/src/Text/Pandoc/Writers/Docx.hs @@ -48,7 +48,7 @@ import Data.Time.Clock.POSIX import Data.Digest.Pure.SHA (sha1, showDigest) import Skylighting import Text.Pandoc.Class (PandocMonad, report, toLang, getMediaBag) -import Text.Pandoc.Translations (translateTerm) +import Text.Pandoc.Translations (Term(Abstract), translateTerm) import Text.Pandoc.MediaBag (lookupMedia, MediaItem(..)) import qualified Text.Pandoc.Translations as Term import qualified Text.Pandoc.Class.PandocMonad as P @@ -767,7 +767,15 @@ writeOpenXML opts (Pandoc meta blocks) = do date <- withParaPropM (pStyleM "Date") $ blocksToOpenXML opts [Para dat | not (null dat)] abstract <- if null abstract' then return [] - else withParaPropM (pStyleM "Abstract") $ blocksToOpenXML opts abstract' + else do + abstractTitle <- translateTerm Abstract + abstractTit <- withParaPropM (pStyleM "AbstractTitle") $ + blocksToOpenXML opts + [Para [Str abstractTitle]] + abstractContents <- withParaPropM (pStyleM "Abstract") $ + blocksToOpenXML opts abstract' + return $ abstractTit <> abstractContents + let convertSpace (Str x : Space : Str y : xs) = Str (x <> " " <> y) : xs convertSpace (Str x : Str y : xs) = Str (x <> y) : xs convertSpace xs = xs diff --git a/test/docx/golden/document-properties.docx b/test/docx/golden/document-properties.docx index d8f091956ca9fa2ba350b8de0a1a94fee2710ebc..5bc62090b3c23ea25cd467f3445b8eacff6ac6e8 100644 GIT binary patch delta 2373 zcmZWr2{e@J8=qk;V;O_78%Bl+p)5m|YlsqV=9ozKd&ySZkmM@Uy+}=#7?p&~2vgZ- zLRpe+vaf&HvqZ+ygvgZT4%0cE`oHJA=lq`cdA{HGJ@4;*-sfw>4qzczTW$~xz{SrG z005K#WspoDXb(_}fkHsxJ=CZ5p(!5-0E83iTxh&AK3!&Xw9<39jQY7J2-ZWA0_U=# z`>x(QKJwd6Sx_%`>PoSg$YSEb`T$S4h~g$@WBWqqD(FgJvr`=c;LKhDW@YG^O!IGQ!&2Dre(#B5sp+ACW7U#SBa?1bZdtYYK$h`szQO z;*N^xjewE~#x?l{vBuI&{Px;8Y=RtPezCGl1V^PmiJGmHB#@RIU2nxqp}VvqTq6_H zGXmD`!qRTofIwVJ=1UNaJi}YhKEoa_VP#SH@n&r&C|QyRgT^o|L(4uKOZKQ%E*Ke* zZc96kE^TYd8?Li_`^YHRMD@xJtt+j*JA9!pxrw4zpipcT@!=9!cY8soQEK!=QMXe> zARO?``Uu#j3>XeFUii%rEP}gG^*o9mJU2~`e>oH|Q<~+4b zSWNKqZ-PH7N4*U);z&nq<$27}FoZV(2-(w6_eEWF8e3s)EOCSHIG0)x^*4SMZv3`- zmm?E%(Q^FZ)C1RCG8?NmSV%JX^2H7<* z9>fZOQGQ|-%2S0$zd4IOlUI=7zuYdEp`$Pj`jA@0(Yb$`&WncZs@SXuc3@_u zR^h4>pWY%epMl}-RixJ0qhZ=3AN^O zlr3F!q}lFxkQFQ7BRS}J;ZS1~c3I9&-nyZtLRy5>?%8is*a@Jth0Gr7eRnJVnXhB> zTRgfTC3!P!QXlED?FW63A-V{Efu7q=&l`R`TaiDAZccsZ27mMZc}-+2YSC!LtJw8= zj%aM*wHUY|H`{)4M*nj5r?E({(IH9Fz|g(i3Esby z9d_d!M{34>D1Q&i$$_$N)a#heAey#$OQ_Yt)j&M0{cHcFIEKlhb}1dNW$_B*OGeMr z6Lg&j3gMYwiJsL^vry7FkRt4o!Y9Pn_y#&kHf$2 z6?nmDtzo~mX`JcKINu!rVg15=pCaGF&5}jp=~%bF3udd43kP>E^L?AK7uYWKAxp*z z=b)gj7Ey@9EC$LHeme45W}rRhLtPfG;we2b8#Pn(`{_7i1kkHVDuO*i^H?40*$F+hA z2qty-LGx~v6ZV~-J*VP#xqm6=e5l3un|MhS1O)F@al*8j>wc17F zRk^D@gN5bgUNS)CqP~3hbKRZSqVKw|xxBP-5lNmf`b1H>Q`He`^U|@x{E|eTd2o&t z>1OP$>4)pJ^_vXWg;@L+RI?|nMJqt$U>e5!MB|ud(y-5y_kS`f>TG#!9OiTQV*a^j zbu#(Tzs$z_f~lbv8?s*@b(Vf1qzH5E$-_d;7gKt!?4<6vnVIA{g#~d5C@al8Pn8H< zx^4hH>;X?1y^KnN86+f<)UtoF>{qd`UCZ<{smKI09$c(ARlpl7d{E`}u;jH7^HMDbT-rV-QmuFVSDQW8Xa7+wJ7U)lOMIrYIqsFX_9^11{{XS9;jI7w delta 2278 zcmZ8jc{tST7oTBlV=T>#CF{f(vP80%8F9zn*b}<4uY;B=+l)zs3gK%>_AN`@WD6nJ z5>eJduBEbMkV1nn@#9X<)34s=InVPs@A;f_{`kD_d)_zZJ?7lzCd?2dh>4vY6rEII zS;?IRh8%$EM_?G3>j06ZMTK*~AP_6i#iT}|il1-|+u4vic{NS!X*{zQt)SKGS*~hs zhv9e^u8&_7mGNF~_3>0JQxkXX>bx->+w?Fzwrlc<;!>UiTh8s2FJ+(P29>%jjfc22 z@Jqa{B@I?OB^u;uyAAMC>}h6;Hchz}KeczoR-LywX8c>DUUz#1=kP1()n^cbUTq z2ZMN%Z#gujjdqIPZ+cr%SL3x<@|sC1K211U60!Y8dbF?bL{i zsVFK{v6hhFbz*Y~0!{xRUKR3&R4zl|pIuDTs5f14vw*lU(+FtKFf5H)tG#BKDWsRt z^MdtkM!m{d-N1TDTIMy*Qxtno+4u9I3qyB0N>vok(JMxjNR{!mM;s(eBUJ8boEK~$ zxLZ%nFS$V$a%|Pozji8qc2Q)#xd|OUY(q?|qfc+kZWSfLy{2Y5S|)VX-en&0*cA9x zv1$OK#gGgbWGP~37s46@=04DFJ6WeNo*e|DngP3P`b=eI)%xsG%#>#S`SKu?Mgft+ zgTpl(ef%_q)R@WZ{LxEObYddSUo)C-!7uoYyh*Go@m0qMU*+SnA`}W6K2?}m6wl^) zOBr`Y4&GYBg;x}^qD`Ax+$d;2flu`{PAw=@LyD^2r&1601Og%osJ)i7s^fUYex!|z zRwx2V)+-WG$57_JnHt|nNe_rfDKTv`a)lH6(AI{f-$yQEoXK#4FmN#xlds#>oe{Nc zsNrkcHkJ_u?oFaE~jk+;UV#f=E~=F8hR z9F=fvVqkVHt3kjos3tgdYF6?c+;!0vDy)gM@!1VEplpyXQ4^Xkcm#L*mdz&FZcIn_ z_f3dyaIf%$C8m&e;!?kEYUw}B(c`S1cVvTkvxjlXZ;gTY@Cuzp?%t(QB%EVyMEXju zy}vW-jt<=>mZk+3H&^}}R#+KD~s?eEq_J zuDK!vuh=~iYuX#To^W3HYxt`n;?QLWE8k3)?%wm|mu)1)TwQ-H~Uf zc^iXswB(7<#b{_CLN>2>UOS1FhvEFea*L-7D5j~(c~^*d}dxAmyAsH*EjFd z)ZRMGxw^#n@0&+zUeBRQA~3d=&g6#vzSd$7WN|jWeOu~2x@pTX`5tr#p+1+B9b9wP z?RvtK1yTPNiFd~eljMC_NT;$0PNUvX-VVjrwH(IDwP5UBE)1e^XHrt?t^4@+JSCZ{ zNFFpE(>?Lljc1WjetBkDb`*^z!EM`mcjrCML<6#m#asm;;UsRCTmkIrJL2y)np23%FCc!fx5TQjn|)V$40LI7rWg&I+12Nj+@Z%bLw)Y= zL2-2P-|lfOukMehcjpiU%yDpibrXj0r2soZjMC~ep~M^gg$(_0#m~;s^7^W5R7zHr z`HSc@$Lq3Znv97?hSlqzXJ~fYE~&Lof|wilNQv`%v^)AOlM^D_33OKR8r7vZK6m|p z3?I~ZkB+_Gz_#@H2TT5`@OMnWl-5e=k;MAmDEp^@PxSs$Ek6A@Par=w>gM$A_2z%R zEjlbxqDTmZfpYnl0Wou#i0cW_4GtpJ-Im?YhnC6du#}>K(>$!q?kt6#{H>cG+PRDx zP+{=~Y~lsg^#d_^0v83NUCv3V$Rhil0zMjqD$IVvqkL+x!hx;qn8^3$DW5cHuw{aq#%;C_v$=udG@Nc3HBNKjz>dDW^ z#CV;r3L3I9P@7oSk7zvV10xDtmVEVJ5YRFh>~fnSFN(@WP<}@4zNu_?SMzfkOxc(1?LCcrW*P&A>;D_XkY0?pDts`l