@@ -66,6 +66,25 @@ data ListMarker = NoMarker
6666 | NumberMarker ListNumberStyle ListNumberDelim Int
6767 deriving (Show, Read, Eq, Ord)
6868
69+listMarkerToId :: ListMarker -> String
70+listMarkerToId NoMarker = "0"
71+listMarkerToId BulletMarker = "1"
72+listMarkerToId (NumberMarker sty delim n) =
73+ styNum : delimNum : show n
74+ where styNum = case sty of
75+ DefaultStyle -> '2'
76+ Example -> '3'
77+ Decimal -> '4'
78+ LowerRoman -> '5'
79+ UpperRoman -> '6'
80+ LowerAlpha -> '7'
81+ UpperAlpha -> '8'
82+ delimNum = case delim of
83+ DefaultDelim -> '0'
84+ Period -> '1'
85+ OneParen -> '2'
86+ TwoParens -> '3'
87+
6988data WriterState = WriterState{
7089 stTextProperties :: [Element]
7190 , stParaProperties :: [Element]
@@ -75,7 +94,6 @@ data WriterState = WriterState{
7594 , stImages :: M.Map FilePath (String, String, Maybe String, Element, B.ByteString)
7695 , stListLevel :: Int
7796 , stListNumId :: Int
78− , stNumStyles :: M.Map ListMarker Int
7997 , stLists :: [ListMarker]
8098 }
8199
@@ -89,7 +107,6 @@ defaultWriterState = WriterState{
89107 , stImages = M.empty
90108 , stListLevel = -1
91109 , stListNumId = 1
92− , stNumStyles = M.fromList [(NoMarker, 0)]
93110 , stLists = [NoMarker]
94111 }
95112
@@ -273,7 +290,7 @@ writeDocx opts doc@(Pandoc meta _) = do
273290 -- construct word/numbering.xml
274291 let numpath = "word/numbering.xml"
275292 numEntry <- (toEntry numpath epochtime . renderXml)
276− `fmap` mkNumbering (stNumStyles st) (stLists st)
293+ `fmap` mkNumbering (stLists st)
277294 let docPropsPath = "docProps/core.xml"
278295 let docProps = mknode "cp:coreProperties"
279296 [("xmlns:cp","http://schemas.openxmlformats.org/package/2006/metadata/core-properties")
@@ -371,29 +388,28 @@ styleToOpenXml style = parStyle : map toStyle alltoktypes
371388 $ backgroundColor style )
372389 ]
373390
374−mkNumbering :: M.Map ListMarker Int -> [ListMarker] -> IO Element
375−mkNumbering markers lists = do
376− elts <- mapM mkAbstractNum (M.toList markers)
391+mkNumbering :: [ListMarker] -> IO Element
392+mkNumbering lists = do
393+ elts <- mapM mkAbstractNum (ordNub lists)
377394 return $ mknode "w:numbering"
378395 [("xmlns:w","http://schemas.openxmlformats.org/wordprocessingml/2006/main")]
379− $ elts ++ zipWith (mkNum markers) lists [1..(length lists)]
396+ $ elts ++ zipWith mkNum lists [1..(length lists)]
380397
381−mkNum :: M.Map ListMarker Int -> ListMarker -> Int -> Element
382−mkNum markers marker numid =
398+mkNum :: ListMarker -> Int -> Element
399+mkNum marker numid =
383400 mknode "w:num" [("w:numId",show numid)]
384− $ mknode "w:abstractNumId" [("w:val",show absnumid)] ()
401+ $ mknode "w:abstractNumId" [("w:val",listMarkerToId marker)] ()
385402 : case marker of
386403 NoMarker -> []
387404 BulletMarker -> []
388405 NumberMarker _ _ start ->
389406 map (\lvl -> mknode "w:lvlOverride" [("w:ilvl",show (lvl :: Int))]
390407 $ mknode "w:startOverride" [("w:val",show start)] ()) [0..6]
391− where absnumid = fromMaybe 0 $ M.lookup marker markers
392408
393−mkAbstractNum :: (ListMarker,Int) -> IO Element
394−mkAbstractNum (marker,numid) = do
409+mkAbstractNum :: ListMarker -> IO Element
410+mkAbstractNum marker = do
395411 nsid <- randomRIO (0x10000000 :: Integer, 0xFFFFFFFF :: Integer)
396− return $ mknode "w:abstractNum" [("w:abstractNumId",show numid)]
412+ return $ mknode "w:abstractNum" [("w:abstractNumId",listMarkerToId marker)]
397413 $ mknode "w:nsid" [("w:val", printf "%8x" nsid)] ()
398414 : mknode "w:multiLevelType" [("w:val","multilevel")] ()
399415 : map (mkLvl marker) [0..6]
@@ -594,11 +610,6 @@ addList :: ListMarker -> WS ()
594610addList marker = do
595611 lists <- gets stLists
596612 modify $ \st -> st{ stLists = lists ++ [marker] }
597− numStyles <- gets stNumStyles
598− case M.lookup marker numStyles of
599− Just _ -> return ()
600− Nothing -> modify $ \st ->
601− st{ stNumStyles = M.insert marker (M.size numStyles + 1) numStyles }
602613
603614listItemToOpenXML :: WriterOptions -> Int -> [Block] -> WS [Element]
604615listItemToOpenXML _ _ [] = return []