git.iko.soy/typeable/pandoc
on master help sign in
Docx writer: Simplified abstractNumId numbering.

Instead of sequential numbering, we assign numbers based on the list marker styles. This simplifies some of the code and should make it easier to modify numbering in the future.

commit05355ac57b7ccadfa4462f3304a7f6364147c8eb authorJohn MacFarlane <fiddlosopher@gmail.com> dateTue 3 Jun 2014, 11:03 (12 years ago) parent356a32e
1 file changed+30−19
src/Text/Pandoc/Writers/Docx.hs+30−19
src/Text/Pandoc/Writers/Docx.hs+30−19
@@ -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 []