git.iko.soy/typeable/pandoc
on master help sign in
Docx writer: Added nsid to abstractNum elements.

This helps when merging word documents with numbered or bulleted lists. Closes #627.

commit3f86127f5a146d63261a378a826532183ab3a63b authorJohn MacFarlane <jgm@berkeley.edu> dateTue 2 Oct 2012, 19:43 (14 years ago) parent02bb0f0
1 file changed+16−11
src/Text/Pandoc/Writers/Docx.hs+16−11
src/Text/Pandoc/Writers/Docx.hs+16−11
@@ -51,6 +51,8 @@ import Text.TeXMath
5151import Control.Monad.State
5252import Text.Highlighting.Kate
5353import Data.Unique (hashUnique, newUnique)
54+import System.Random (randomRIO)
55+import Text.Printf (printf)
5456
5557data WriterState = WriterState{
5658 stTextProperties :: [Element]
@@ -152,8 +154,8 @@ writeDocx opts doc@(Pandoc (Meta tit auths date) _) = do
152154 let styleEntry = toEntry stylepath epochtime $ UTF8.fromStringLazy $ showTopElement' styledoc'
153155 -- construct word/numbering.xml
154156 let numpath = "word/numbering.xml"
155− let numEntry = toEntry numpath epochtime $ UTF8.fromStringLazy $ showTopElement'
156− $ mkNumbering (stNumStyles st) (stLists st)
157+ numEntry <- (toEntry numpath epochtime . UTF8.fromStringLazy . showTopElement')
158+ `fmap` mkNumbering (stNumStyles st) (stLists st)
157159 let docPropsPath = "docProps/core.xml"
158160 let docProps = mknode "cp:coreProperties"
159161 [("xmlns:cp","http://schemas.openxmlformats.org/package/2006/metadata/core-properties")
@@ -215,11 +217,12 @@ styleToOpenXml style = parStyle : map toStyle alltoktypes
215217 $ backgroundColor style )
216218 ]
217219
218−mkNumbering :: M.Map ListMarker Int -> [ListMarker] -> Element
219−mkNumbering markers lists =
220− mknode "w:numbering" [("xmlns:w","http://schemas.openxmlformats.org/wordprocessingml/2006/main")]
221− $ map mkAbstractNum (M.toList markers)
222− ++ zipWith (mkNum markers) lists [1..(length lists)]
220+mkNumbering :: M.Map ListMarker Int -> [ListMarker] -> IO Element
221+mkNumbering markers lists = do
222+ elts <- mapM mkAbstractNum (M.toList markers)
223+ return $ mknode "w:numbering"
224+ [("xmlns:w","http://schemas.openxmlformats.org/wordprocessingml/2006/main")]
225+ $ elts ++ zipWith (mkNum markers) lists [1..(length lists)]
223226
224227mkNum :: M.Map ListMarker Int -> ListMarker -> Int -> Element
225228mkNum markers marker numid =
@@ -233,10 +236,12 @@ mkNum markers marker numid =
233236 $ mknode "w:startOverride" [("w:val",show start)] ()) [0..6]
234237 where absnumid = maybe 0 id $ M.lookup marker markers
235238
236−mkAbstractNum :: (ListMarker,Int) -> Element
237−mkAbstractNum (marker,numid) =
238− mknode "w:abstractNum" [("w:abstractNumId",show numid)]
239− $ mknode "w:multiLevelType" [("w:val","multilevel")] ()
239+mkAbstractNum :: (ListMarker,Int) -> IO Element
240+mkAbstractNum (marker,numid) = do
241+ nsid <- randomRIO (0x10000000 :: Integer, 0xFFFFFFFF :: Integer)
242+ return $ mknode "w:abstractNum" [("w:abstractNumId",show numid)]
243+ $ mknode "w:nsid" [("w:val", printf "%8x" nsid)] ()
244+ : mknode "w:multiLevelType" [("w:val","multilevel")] ()
240245 : map (mkLvl marker) [0..6]
241246
242247mkLvl :: ListMarker -> Int -> Element