@@ -51,6 +51,8 @@ import Text.TeXMath
51import Control.Monad.State
51import Control.Monad.State
52import Text.Highlighting.Kate
52import Text.Highlighting.Kate
53import Data.Unique (hashUnique, newUnique)
53import Data.Unique (hashUnique, newUnique)
54+import System.Random (randomRIO)
55+import Text.Printf (printf)
55data WriterState = WriterState{
57data WriterState = WriterState{
56 stTextProperties :: [Element]
58 stTextProperties :: [Element]
@@ -152,8 +154,8 @@ writeDocx opts doc@(Pandoc (Meta tit auths date) _) = do
152 let styleEntry = toEntry stylepath epochtime $ UTF8.fromStringLazy $ showTopElement' styledoc'
154 let styleEntry = toEntry stylepath epochtime $ UTF8.fromStringLazy $ showTopElement' styledoc'
153 -- construct word/numbering.xml
155 -- construct word/numbering.xml
154 let numpath = "word/numbering.xml"
156 let numpath = "word/numbering.xml"
155− let numEntry = toEntry numpath epochtime $ UTF8.fromStringLazy $ showTopElement'
157+ numEntry <- (toEntry numpath epochtime . UTF8.fromStringLazy . showTopElement')
156− $ mkNumbering (stNumStyles st) (stLists st)
158+ `fmap` mkNumbering (stNumStyles st) (stLists st)
157 let docPropsPath = "docProps/core.xml"
159 let docPropsPath = "docProps/core.xml"
158 let docProps = mknode "cp:coreProperties"
160 let docProps = mknode "cp:coreProperties"
159 [("xmlns:cp","http://schemas.openxmlformats.org/package/2006/metadata/core-properties")
161 [("xmlns:cp","http://schemas.openxmlformats.org/package/2006/metadata/core-properties")
@@ -215,11 +217,12 @@ styleToOpenXml style = parStyle : map toStyle alltoktypes
215 $ backgroundColor style )
217 $ backgroundColor style )
218−mkNumbering :: M.Map ListMarker Int -> [ListMarker] -> Element
220+mkNumbering :: M.Map ListMarker Int -> [ListMarker] -> IO Element
219−mkNumbering markers lists =
221+mkNumbering markers lists = do
222+ elts <- mapM mkAbstractNum (M.toList markers)
223+ return $ mknode "w:numbering"
220− mknode "w:numbering" [("xmlns:w","http://schemas.openxmlformats.org/wordprocessingml/2006/main")]
224+ [("xmlns:w","http://schemas.openxmlformats.org/wordprocessingml/2006/main")]
221− $ map mkAbstractNum (M.toList markers)
222− ++ zipWith (mkNum markers) lists [1..(length lists)]
225+ $ elts ++ zipWith (mkNum markers) lists [1..(length lists)]
224mkNum :: M.Map ListMarker Int -> ListMarker -> Int -> Element
227mkNum :: M.Map ListMarker Int -> ListMarker -> Int -> Element
225mkNum markers marker numid =
228mkNum markers marker numid =
@@ -233,10 +236,12 @@ mkNum markers marker numid =
233 $ mknode "w:startOverride" [("w:val",show start)] ()) [0..6]
236 $ mknode "w:startOverride" [("w:val",show start)] ()) [0..6]
234 where absnumid = maybe 0 id $ M.lookup marker markers
237 where absnumid = maybe 0 id $ M.lookup marker markers
236−mkAbstractNum :: (ListMarker,Int) -> Element
239+mkAbstractNum :: (ListMarker,Int) -> IO Element
237−mkAbstractNum (marker,numid) =
240+mkAbstractNum (marker,numid) = do
241+ nsid <- randomRIO (0x10000000 :: Integer, 0xFFFFFFFF :: Integer)
238− mknode "w:abstractNum" [("w:abstractNumId",show numid)]
242+ return $ mknode "w:abstractNum" [("w:abstractNumId",show numid)]
243+ $ mknode "w:nsid" [("w:val", printf "%8x" nsid)] ()
239− $ mknode "w:multiLevelType" [("w:val","multilevel")] ()
244+ : mknode "w:multiLevelType" [("w:val","multilevel")] ()
240 : map (mkLvl marker) [0..6]
245 : map (mkLvl marker) [0..6]
242mkLvl :: ListMarker -> Int -> Element
247mkLvl :: ListMarker -> Int -> Element