From f5531f18a54ca008eaa7caadb216657d28a7ffa5 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Tue, 4 Jun 2024 10:03:26 -0700 Subject: [PATCH] Docx writer: better formatting for task lists. Task lists are now properly formatted, with no bullet. In addition, we have removed an expensive generic traverse to remove Space elements, and replaced it with code in `inlinesToOpenXML`. This should give better performance; it also reduces XML size in the metadata, which wasn't previously affected by the de-Spacing. TODO: parse this in the reader so that we can have task lists round-trip. Closes #5198. --- src/Text/Pandoc/Writers/Docx.hs | 8 ++- src/Text/Pandoc/Writers/Docx/OpenXML.hs | 52 +++++++++++++----- src/Text/Pandoc/Writers/Docx/Types.hs | 3 + test/Tests/Writers/Docx.hs | 5 ++ .../document-properties-short-desc.docx | Bin 10496 -> 10481 bytes test/docx/golden/document-properties.docx | Bin 10990 -> 10967 bytes test/docx/golden/lists.docx | Bin 11005 -> 11007 bytes test/docx/golden/lists_continuing.docx | Bin 10667 -> 10667 bytes test/docx/golden/lists_div_bullets.docx | Bin 10651 -> 10651 bytes test/docx/golden/lists_multiple_initial.docx | Bin 10885 -> 10885 bytes test/docx/golden/lists_restarting.docx | Bin 10665 -> 10665 bytes test/docx/golden/table_with_list_cell.docx | Bin 10938 -> 10939 bytes test/docx/golden/task_list.docx | Bin 0 -> 10753 bytes test/docx/task_list.native | 40 ++++++++++++++ 14 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 test/docx/golden/task_list.docx create mode 100644 test/docx/task_list.native diff --git a/src/Text/Pandoc/Writers/Docx.hs b/src/Text/Pandoc/Writers/Docx.hs index ca1ada4c9..5c89b9f5e 100644 --- a/src/Text/Pandoc/Writers/Docx.hs +++ b/src/Text/Pandoc/Writers/Docx.hs @@ -709,6 +709,7 @@ mkNum marker numid = : case marker of NoMarker -> [] BulletMarker -> [] + CheckboxMarker _ -> [] NumberMarker _ _ start -> map (\lvl -> mknode "w:lvlOverride" [("w:ilvl",tshow (lvl :: Int))] $ mknode "w:startOverride" [("w:val",tshow start)] ()) @@ -725,8 +726,9 @@ mkAbstractNum marker = mkLvl :: ListMarker -> Int -> Element mkLvl marker lvl = mknode "w:lvl" [("w:ilvl",tshow lvl)] $ - [ mknode "w:start" [("w:val",start)] () - | marker /= NoMarker && marker /= BulletMarker ] ++ + (case marker of + NumberMarker{} -> [mknode "w:start" [("w:val",start)] ()] + _ -> []) ++ [ mknode "w:numFmt" [("w:val",fmt)] () , mknode "w:lvlText" [("w:val", lvltxt)] () , mknode "w:lvlJc" [("w:val","left")] () @@ -745,6 +747,8 @@ mkLvl marker lvl = case marker of NoMarker -> ("bullet"," ", Nothing, "1") BulletMarker -> bulletFor lvl + CheckboxMarker False -> ("bullet","\9744", Nothing, "1") + CheckboxMarker True -> ("bullet","\9746", Nothing, "1") NumberMarker st de n -> (styleFor st lvl ,patternFor de ("%" <> tshow (lvl + 1)) ,Nothing diff --git a/src/Text/Pandoc/Writers/Docx/OpenXML.hs b/src/Text/Pandoc/Writers/Docx/OpenXML.hs index a0ca85278..5fa61e9b3 100644 --- a/src/Text/Pandoc/Writers/Docx/OpenXML.hs +++ b/src/Text/Pandoc/Writers/Docx/OpenXML.hs @@ -1,6 +1,7 @@ {-# LANGUAGE PatternGuards #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TupleSections #-} {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE LambdaCase #-} @@ -45,7 +46,6 @@ import qualified Text.Pandoc.Translations as Term import qualified Text.Pandoc.Class.PandocMonad as P import Text.Pandoc.UTF8 (fromTextLazy) import Text.Pandoc.Definition -import Text.Pandoc.Generic import Text.Pandoc.Highlighting (highlight) import Text.Pandoc.Templates (compileDefaultTemplate, renderTemplate) import Text.Pandoc.ImageSize @@ -200,11 +200,7 @@ writeOpenXML opts (Pandoc meta blocks) = do (fmap (hcat . map (literal . showContent)) . inlinesToOpenXML opts) (docAuthors meta) - 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 - let blocks' = bottomUp convertSpace blocks - doc' <- setFirstPara >> blocksToOpenXML opts blocks' + doc' <- setFirstPara >> blocksToOpenXML opts blocks let body = vcat $ map (literal . showContent) doc' notes' <- gets (reverse . stFootnotes) comments <- gets (reverse . stComments) @@ -393,17 +389,38 @@ blockToOpenXML' opts (Table attr caption colspecs thead tbodies tfoot) = do let (tableId, _, _) = attr wrapBookmark tableId content blockToOpenXML' opts el - | BulletList lst <- el = addOpenXMLList BulletMarker lst + | BulletList lst <- el + = if isTaskList lst + then addOpenXMLList $ + map (\bs -> + case bs of + (Plain (Str "\9744":Space:ils):xs) + -> (Just (CheckboxMarker False),Plain ils : xs) + (Para (Str "\9744":Space:ils):xs) + -> (Just (CheckboxMarker False),Plain ils : xs) + (Plain (Str "\9746":Space:ils):xs) + -> (Just (CheckboxMarker True),Para ils : xs) + (Para (Str "\9746":Space:ils):xs) + -> (Just (CheckboxMarker True),Para ils : xs) + _ -> (Just BulletMarker,bs)) lst + else addOpenXMLList $ zip (Just BulletMarker : repeat Nothing) lst | OrderedList (start, numstyle, numdelim) lst <- el - = addOpenXMLList (NumberMarker numstyle numdelim start) lst + = addOpenXMLList $ + zip (Just (NumberMarker numstyle numdelim start) : repeat Nothing) lst where - addOpenXMLList marker lst = do - addList marker - numid <- getNumId - exampleid <- case marker of - NumberMarker Example _ _ -> gets stExampleId + addOpenXMLList items = do + exampleid <- case items of + (Just (NumberMarker Example _ _),_) : _ -> gets stExampleId _ -> return Nothing - l <- asList $ concat `fmap` mapM (listItemToOpenXML opts $ fromMaybe numid exampleid) lst + l <- asList $ mconcat <$> + mapM (\(mbmarker, bs) -> do + numid <- case mbmarker of + Nothing -> getNumId + Just marker -> do + addList marker + getNumId + listItemToOpenXML opts (fromMaybe numid exampleid) bs) + items setFirstPara return l blockToOpenXML' opts (DefinitionList items) = do @@ -552,7 +569,7 @@ listItemToOpenXML opts numid bs = do -- | Convert a list of inline elements to OpenXML. inlinesToOpenXML :: PandocMonad m => WriterOptions -> [Inline] -> WS m [Content] -inlinesToOpenXML opts lst = concat `fmap` mapM (inlineToOpenXML opts) lst +inlinesToOpenXML opts lst = concat `fmap` mapM (inlineToOpenXML opts) (convertSpace lst) withNumId :: (PandocMonad m) => Int -> WS m a -> WS m a withNumId numid = local $ \env -> env{ envListNumId = numid } @@ -1006,3 +1023,8 @@ toBookmarkName s maxListLevel :: Int maxListLevel = 8 +convertSpace :: [Inline] -> [Inline] +convertSpace (Str x : Space : Str y : xs) = convertSpace (Str (x <> " " <> y) : xs) +convertSpace (Str x : Str y : xs) = convertSpace (Str (x <> y) : xs) +convertSpace (x:xs) = x : convertSpace xs +convertSpace [] = [] diff --git a/src/Text/Pandoc/Writers/Docx/Types.hs b/src/Text/Pandoc/Writers/Docx/Types.hs index 176b16352..afa98be64 100644 --- a/src/Text/Pandoc/Writers/Docx/Types.hs +++ b/src/Text/Pandoc/Writers/Docx/Types.hs @@ -40,12 +40,15 @@ import qualified Data.Text as T data ListMarker = NoMarker | BulletMarker + | CheckboxMarker Bool | NumberMarker ListNumberStyle ListNumberDelim Int deriving (Show, Read, Eq, Ord) listMarkerToId :: ListMarker -> Text listMarkerToId NoMarker = "990" listMarkerToId BulletMarker = "991" +listMarkerToId (CheckboxMarker False) = "992" +listMarkerToId (CheckboxMarker True) = "993" listMarkerToId (NumberMarker sty delim n) = T.pack $ '9' : '9' : styNum : delimNum : show n where styNum = case sty of diff --git a/test/Tests/Writers/Docx.hs b/test/Tests/Writers/Docx.hs index e19a9465e..46983315f 100644 --- a/test/Tests/Writers/Docx.hs +++ b/test/Tests/Writers/Docx.hs @@ -97,6 +97,11 @@ tests = [ testGroup "inlines" def "docx/definition_list.native" "docx/golden/definition_list.docx" + , docxTest + "task lists" + def + "docx/task_list.native" + "docx/golden/task_list.docx" , docxTest "footnotes and endnotes" def diff --git a/test/docx/golden/document-properties-short-desc.docx b/test/docx/golden/document-properties-short-desc.docx index 62df051a934105caf3af202209bff57a1ceaec3a..1f74335fa74af7bcf0abe0558bc0c1fcdf78d685 100644 GIT binary patch delta 1444 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 S6Fq>}Og^lo%C=Pvq!9qG{ z4CVPnDf%h-$)&lec_n%kxj9#-o%MTcAaMMBZP$tKX03;_L?NCE!ocK5{iIY5_};0{ii4fB#pe+5FqF^KbU6C9EoMbM)4QWlwAfU3cZ%gzo2W z4}aReLs!f^Hmu(2s>FslER9RooOV6>X0wTEXye2!MRGYWZd;p7au(*#e7@n!3lRa< zc`Gl!{`xCCYst2xBQv}W^7dcndgsop)Uul6;7Wm(sG@>7T5mNk#pp?Gx!DmVwf4fq z+n<9hC-YAEC@%W8y6f7N!kF@{`x@@D>uNnwoi|luxA~#hTW2|NXw~O^coO$q-Qe8x ze|0ZJj{Dr&`Dtl{%0q5m`zvj~*pjm|>_2+*dQRWE>D$wgJyEspM0RyuPW-Hy{8F9f zLQff&uD6>w|FP@zIrp;v@3%YmRv}=|!9?kAwueRUURPQcv4;sMIWPg!!B!S)aDtfp znRO{RVa#T$f}{`$jubAiNWG9VMC7P2DU@=4=XD zBCz$9YSA0c*K9eb=kf0DznuQE`)WnwU5}lvj}o5!|I>fm{>t^=`;_w^>@ljED-tMV`Wd3&z(q5~I~?3V=>FDq%k=yWaE z`@g_B}SnGHj2Rq+f0li9fkV=Wz#jp#Mv` zd^Q!%l_AG@(w{zm^~}9^_68$;{Y!t0Vnuzm3qxb4gx3A6&iR}7|KtY#`QN*LwLH!_ z(6?~UZ{r*FNKp-p=_O+QkZ3fM;9&wstgDneJDAb07zq}c{95@mSYW3L2SnhAnjJ`B zGOM~7A8Kha*;CyRELE#6&A5N^Om%H}kb;(*J<7SjVx$I$Wq}w0{!V_Zt^-yx`X~xdUt2GqC zyz@Zb`N^*}6u|mHNpuC!j$md;v4$|>`eZFl1+WfZO=-q;lQT8t!MtuD&tdX%O(ihz v43OtP`Guwmn8&Xr%{X(iwiZO6ACUKTa+a1dSZ)H4cX;v|EmgKNY9Lzx7h+gR diff --git a/test/docx/golden/lists.docx b/test/docx/golden/lists.docx index 8a4e90205bdc27e7a3fba6cfb663340d64c54838..89a686f11a221657d731fc73a89d1d55bd1889cb 100644 GIT binary patch delta 1065 zcmewx`ahI6z?+#xgn@~JgW*f-k&V0?8JU6f=7Ws9j6y(0#Cg+e2Y)g$Fr4RPU=U=O z+^8%?@$a(|P3FQz^=yfyvM`kQ4R#Zla{ z`8$g>*fEn$*_MJGb(hV78O%`NO5p-C+C`ip?ma8Y%E$q7@3)nAFHXKCCSQLx?~s8& zOT6kQ+l|bEYu5u9+LZlE;@9iH|GQ%6Ho?}Z4zr>> z`=p{XvZ^ANP32Lz(3)7Sb1C=Tg9|$sBn7Qob=jp^JY?FW4~pL-f6lS9T|aHf%nhDX zH%FdZr5S4Z_$u@I8{a?9SpARt!V>k^*VY~B2PXXZWo}ZB8qNw5{g80pB)JV7s@YQR z>|n-L#YiR)W3r&iX|TY36%L5ND>XZ?gtodFCp?)<&Qdp%2k}bR9!g^YCYsGG3=A?1 z$l%T7{p#9aop05p8MP*JYUqG|a>>aDB}KK-ojPmHUQTg#28Jvh1_n_S?Fp0lv{b;(;GZwfqzg1& zgB9JWt0o6(L7dtu6LM}2Q2%it7C|wGZSn*yWw1GRF$u9Zfld_xW^dGBxia~ZmMYs_ HHIPOC)Qo|8 delta 1059 zcmew#`Zts}z?+#xgn@~JgTbkF|3==8jLblK^Fc;lMou6j;(0-;%lFOKnGP@}-1YhN z=I=NAH-|5G+{^plzhck)YSvkP)%M+G>ZgTP{I`8Iai&JyZ@zucChX*z@n37EMFRKg z(~CLPABM;NDdyWJS0+~U-Q{t2oTc32TFpPRa>eTzQ7qs5lf@cr`($&rrC?XwXLDc% zGnBYexWJ4~5od@4&x^7$a)2B-rdw$G7xaBSN&vH80R`w^w1*F)nThb zR)yV-{Kg>m(fQk!#{KI(6+}8^t^424eQdpL_R+ZVllngvteH7k>9i-4Tg1vUX?}KL zr@u_px#eb|wx-=YU$!DdVA72=CgD84Z5@4qQb)v0_#;bZXsla%T_*XZ`IW+rkEIu+ z&O5(??a8Ei<>l@Puhf(*6_?JK@a}jyvjZ2GY=(hE#zfICk6b@k-N})dQt!9+!-EIQ zzUuhBs|}dE@%`^L>)Eo;#9vr{efsyrD`}v6NunPT&RZn6fkQP{%AFm|*sd7K1Y%4URyhq8c&New z5qP6!2bR!PH$$Y0$vNs~@}Nj4U3(~vg^___GYbQQ3xCyz)RYH%L#k4>w*x451&D=F)GVER zUQ-FIX4aa$oZ{>Z3|Tr13_y1yfw;*6S}GbKukz0qXVL}Qqrr;q)fI|RuNF_9rzH+H zuvI4H+#H}W$AMS`$v6fEmdTT}lodb*+QlTq-UK>cgcCh{FR4uapdvE)rIrBOZ8eZ? E0F8HJ<^TWy diff --git a/test/docx/golden/lists_continuing.docx b/test/docx/golden/lists_continuing.docx index ca9965997b2683d5b6a5a0d1d7614f69da72ab37..a24e04fe2732722c17d1ce93f3185453b102aca5 100644 GIT binary patch delta 585 zcmZ1-ygHaSz?+#xgn@~JgW*f-k&V0?8JU6f=7Ws95XMEODG){mi#3=rc^T_cuo6GE zS|%{#97hTlm|-gH3{hJx!pg`2G$!KP%DWdQcZkZ@pUpdDAkY%8`pI@9v*6k_0(@&N zwgxQ?+WPA3Ch-j&^(pz%6~AY(I8EG9__-?0{`{?V;?7mhvh_>ME{6Prl^iP+(^j5!)B8IoN6>b;$thh4!R{v;JY#kzuq-pmSs`Ae zZswrgb9M!zh*$lB1?~y&+?6a9r^-zHr@qD3!IMi@VuM6xh!&s^axf4eqi|C0Fi`tSd)*tt!xb*jUxD9=8r=!~qY$YoP`6fU$T zR_k2KefQwP&IL(9>sDQMX%-KeHtB=n_sE}f>}=OhTQYNl=hV%S=T>QkT0XwYy#B`b zk26;PBO5w)G z(hE}OonOKBWKzBIa`%K+YD$)hOJ_`Ycf6e0fs0Ev!$2ZqqUe`Lt{<%KoY}sexFRZ^l{d?k-keLm4I23Y~S)E&DxA5-OdF)m3Ami^2 zThWhZwhCYPT4^y_!U znb7~ND;`f?cUAU?ae`0HU+G)+C^4}4oLE03oD(FrfkRbN(w!a5NLGjh2l(XuN~ggB zy~-RAff=fHAc4s@Rn5S(keUsc4pego)3en)!1OaUTQIGrZUv^3)gk=F>NbezdaiB` fmQ>WR2Gj8x5W^Q}IDq+&H6Vs7Y1)JNDVpv81IqaR diff --git a/test/docx/golden/lists_div_bullets.docx b/test/docx/golden/lists_div_bullets.docx index c491af67e6cd2d800cbc01149cd3c4b65051b971..6eafe8cf4db817c05661092a00f2e0225e84490e 100644 GIT binary patch delta 585 zcmbOoJUf^-z?+#xgn@~JgW*f-k&V0?8JU6f=7Ws95XMEOT@Xeei#3=r`3&n)u#yrs zcP21nA4duon4v1{3{jgc!pg`2G$!KP%DWdQSBT2jpUpdDAkY%8`pI@9v*6k_0(@&N zwgxQ?+WPA3Ch-j&^(pz%6~AY(I8EG9__-?0{`{?V;?7mhvh_>ME{6Prl^iP+(^j5!)B8IoN6>b;$thh4!R{v;JY#kzuq-pmSs`Ae zZswrgb9M!zh*$lB1?~y&+?6a9r^-zHr@qD3!IMi@VuM6xh!&s^axf4eqi|C0Fi`tSd)*tt!xb*jUxD9=8r=!~qY$YoP`6fU$T zR_k2KefQwP&IL(9>sDQMX%-KeHtB=n_sE}f>}=OhTQYNl=hV%S=T>QkT0XwYy#B`b zk26;P%?SV;++ zI}@0(k0XT(%up3}hN#UJVP)h18WS<)U(uAw6{7O>r}GXO2)Nd(ezGf!bDb)BXp!jZ zuvHBO5w)G z(hE}OonOKBWKzBIa`%K+YD$)hOJ_`Ycf6e0fs0Ev!$2ZqqUe`Lt{<%KoY}sexFRZ^l{d?k-keLm4I23Y~S)E&DxA5-OdF)m3Ami^2 zThWhZwhCYPT4^y_!U znb7~ND;`f?cUAU?ae`0HU+G)+C^4{kpIAR6oC74bfkTy3(w!a52v&#$2l(XmN~ggB zwaOe2feuwWkig`Vs%BuCNzDdKJF2;Z>25U-FnvwU7EFt&TY>3dbqIg5x(y<_uB)4a fB?UFC!L+{y#PA6k4q*Oe4T#}Fn)YCRh^9LLkfZmY diff --git a/test/docx/golden/lists_multiple_initial.docx b/test/docx/golden/lists_multiple_initial.docx index 4c3c09bbb87b3f19f687cc764ed86c09979af5d9..ec7555793a23e07c3efef4608e45f34c5286759e 100644 GIT binary patch delta 610 zcmZn-Z4KoO@MdNaVPN9mVEEE{WFzlJMrI(r`5+@NgmIB+5`>Y)Vhv_YUc$N*ti*>c zk{Qfc!I{DZX7GzRL)3;rmWoqlCjL|3 zV(Z|^r7N*PA~SNzmq)G~YWH$pOs)4@{PDrVWnXpr-ql`Nyz%v}MYF$Mo3ejN{CfTO ze^>0>CfGXFVOEr9pHy^4R#oJ(sXPi7S`!1RbuQ(;dvIarf~25zt1i1Vi-$~`^g;1^ zgLFEt3oXwUu9l@L+PWkCz=R*a%uVW1;%4&- z@qS1QSV?XJhxcbmcXlwtRxy$Z#F#u&`7~G{U4;W8P^4xDme{Oj2BzPr*??(nb$2jb zs_p@%52)LM=t&w@V6LqOm^-;v!-fMEkCP8-n1dyMYgmJ6OHGK`RhkZ9{$5Rp*?%Pzmaz%BQucRe2|eB!nnvZ3BpKYu?90HFJWB@R^r1J z$qZ(!;7s8HGx$ZEA!7>(nhYSQ<>s3G56~?(v6+N^_bamLOkX2!KBfl|-eRTe|rE&jyPX&=qS?m7y zb01r8n|(B{{G|Sm1#4zbRyys;*}Ou$ z9})vrlH0)H{aMnT9n7#*jAQ~aCeKtp4HigO;eZGfso8-gHmjL|={IUNU|L(<9ZZ+1 zdw}T!>b4+yl77mhvh_>ME{6Prl^iP+(^j5!)B8IoN6>b;$thh4!R{v;JY#kzuq-pmSs`Ae zZswrgb9M!zh*$lB1?~y&+?6a9r^-zHr@qD3!IMi@VuM6xh!&s^axf4eqi|C0Fi`tSd)*tt!xb*jUxD9=8r=!~qY$YoP`6fU$T zR_k2KefQwP&IL(9>sDQMX%-KeHtB=n_sE}f>}=OhTQYNl=hV%S=T>QkT0XwYy#B`b zk26;Po0|3FW6Po}4 delta 585 zcmZ1(yfTBO5w)G z(hE}OonOKBWKzBIa`%K+YD$)hOJ_`Ycf6e0fs0Ev!$2ZqqUe`Lt{<%KoY}sexFRZ^l{d?k-keLm4I23Y~S)E&DxA5-OdF)m3Ami^2 zThWhZwhCYPT4^y_!U znb7~ND;`f?cUAU?ae`0HU+G)+C^4}4j95P;oZ}?6fkRbX(w!a5NK}Xf2l(W@N~ggB z-O3ygfoZCCAc4u(Rn5S(fSL`M_E&QU(=*jP!1NO}TQIGnZUv?j)gkNbezda7;? fmXz192Gg+`5X0wbIDq*NH6Vs7XxfAMNt*5e%Axqa diff --git a/test/docx/golden/table_with_list_cell.docx b/test/docx/golden/table_with_list_cell.docx index 7a4d0060a179d565a1a1e48a337a45cee5b58fda..94d5a1ad8a7257bbef22593b526586122afa505e 100644 GIT binary patch delta 678 zcmdlLx;vCNz?+#xgn@~JgW*f-k&V0?8JU6f=7Ws95XMC&dnT}mFsn6KWO5+eQn0{J zwucazyPPRpU=bG)XNaaQQC3DypfM3w%pUd0PM#sAQD4Xu7!~PhvE|Vfuc=;FSDBxV zJD~J$;@;c`Z?lCsTpt}f`+DYIo9x|jZ%U{CY2rUMt4$=*PsreqSE?EB&j{Vi?wc~Q zAI{hycW+PWgFr`*q}iN4JKAytWfz-t=w`@mdSMV46TRN@*rogxkCTp@JET{}1@fLy zb@%H(aK+c9$jPhTQ1Nd6d$tA<5vvOc1{ajHUmWdzP`cx$fyVziQ4bFu^nD#U=g#j1 zYRUJ%N7~D;F|2po9~XbGJuo*H@BM{eIaxNv)1 z+lrXb<(+Q&CsfoDlizLrWLaMor|W5bIz4q(cxK$XuCA&4YjpPYA6JO^8sA`L_cH3P zqYd-1BiHvY{L73I@|*99_d~)rUve8bG&Q8$*};q=#Yk{KPd=x78Z0nJg##k6T+I$7 zF!_a=8JJd7w*k`$>h55AmAVI*{;F;ZrcE`hz;uxYguh9{1}U1pYd}mf(3EDpIN3*2 z9;`MG$V;BwrKtqwtq1aCCZE<+Q2<3R|9o*KT_y$w4ORvQK?Y=yrZ~A#QJ6o#n-M4t tPhOJ^wWJvjP4?ANmIrCKi%E#R$q1C^WMB|N*3B?sa=(@;+e|f(AOOe{8$AF3 delta 699 zcmdlTx+|17z?+#xgn@~JgW^ioemTuvU{P6_;I3>8+SC zW%etZiw{_*E>)>HQ5$Hd*6;sXG*c_gx7h4-N|KyhFDc3&;LXUyzyMDxlQ#erN>4tcsUi=GYX14+Ou9gM4ORvQK?Y=yI+W~hM#0dH;t ASpWb4 diff --git a/test/docx/golden/task_list.docx b/test/docx/golden/task_list.docx new file mode 100644 index 0000000000000000000000000000000000000000..f31f9c502cbdd8a20b10585361d1bd68f2aa7410 GIT binary patch literal 10753 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 i=KpKK6g0m1zeQd_8Vbb9UkVlq00DH