git.iko.soy/typeable/pandoc
on master help sign in
Docx writer: Fixed bug with nested lists.

Previously a list like 1. one - a - b 2. two would come out with a bullet instead of "2." Thanks to Russell Allen for reporting the bug.

commit6f0b465173968959baf021e1d50d569c0e248623 authorJohn MacFarlane <jgm@berkeley.edu> dateWed 5 Sep 2012, 16:23 (14 years ago) parent784e6e6
1 file changed+19−20
src/Text/Pandoc/Writers/Docx.hs+19−20
src/Text/Pandoc/Writers/Docx.hs+19−20
@@ -60,7 +60,7 @@ data WriterState = WriterState{
6060 , stExternalLinks :: M.Map String String
6161 , stImages :: M.Map FilePath (String, B.ByteString)
6262 , stListLevel :: Int
63− , stListMarker :: ListMarker
63+ , stListNumId :: Int
6464 , stNumStyles :: M.Map ListMarker Int
6565 , stLists :: [ListMarker]
6666 }
@@ -79,7 +79,7 @@ defaultWriterState = WriterState{
7979 , stExternalLinks = M.empty
8080 , stImages = M.empty
8181 , stListLevel = -1
82− , stListMarker = NoMarker
82+ , stListNumId = 1
8383 , stNumStyles = M.fromList [(NoMarker, 0)]
8484 , stLists = [NoMarker]
8585 }
@@ -285,6 +285,9 @@ mkLvl marker lvl =
285285 patternFor TwoParens s = "(" ++ s ++ ")"
286286 patternFor _ s = s ++ "."
287287
288+getNumId :: WS Int
289+getNumId = length `fmap` gets stLists
290+
288291-- | Convert Pandoc document to string in OpenXML format.
289292writeOpenXML :: WriterOptions -> Pandoc -> WS Element
290293writeOpenXML opts (Pandoc (Meta tit auths dat) blocks) = do
@@ -402,11 +405,13 @@ blockToOpenXML opts (Table caption aligns widths headers rows) = do
402405blockToOpenXML opts (BulletList lst) = do
403406 let marker = BulletMarker
404407 addList marker
405− asList $ concat `fmap` mapM (listItemToOpenXML opts marker) lst
408+ numid <- getNumId
409+ asList $ concat `fmap` mapM (listItemToOpenXML opts numid) lst
406410blockToOpenXML opts (OrderedList (start, numstyle, numdelim) lst) = do
407411 let marker = NumberMarker numstyle numdelim start
408412 addList marker
409− asList $ concat `fmap` mapM (listItemToOpenXML opts marker) lst
413+ numid <- getNumId
414+ asList $ concat `fmap` mapM (listItemToOpenXML opts numid) lst
410415blockToOpenXML opts (DefinitionList items) =
411416 concat `fmap` mapM (definitionListItemToOpenXML opts) items
412417
@@ -418,9 +423,6 @@ definitionListItemToOpenXML opts (term,defs) = do
418423 $ concat `fmap` mapM (blocksToOpenXML opts) defs
419424 return $ term' ++ defs'
420425
421−getNumId :: WS Int
422−getNumId = length `fmap` gets stLists
423−
424426addList :: ListMarker -> WS ()
425427addList marker = do
426428 lists <- gets stLists
@@ -431,11 +433,11 @@ addList marker = do
431433 Nothing -> modify $ \st ->
432434 st{ stNumStyles = M.insert marker (M.size numStyles + 1) numStyles }
433435
434−listItemToOpenXML :: WriterOptions -> ListMarker -> [Block] -> WS [Element]
436+listItemToOpenXML :: WriterOptions -> Int -> [Block] -> WS [Element]
435437listItemToOpenXML _ _ [] = return []
436−listItemToOpenXML opts marker (first:rest) = do
437− first' <- withMarker marker $ blockToOpenXML opts first
438− rest' <- withMarker NoMarker $ blocksToOpenXML opts rest
438+listItemToOpenXML opts numid (first:rest) = do
439+ first' <- withNumId numid $ blockToOpenXML opts first
440+ rest' <- withNumId 1 $ blocksToOpenXML opts rest
439441 return $ first' ++ rest'
440442
441443alignmentToString :: Alignment -> [Char]
@@ -449,12 +451,12 @@ alignmentToString alignment = case alignment of
449451inlinesToOpenXML :: WriterOptions -> [Inline] -> WS [Element]
450452inlinesToOpenXML opts lst = concat `fmap` mapM (inlineToOpenXML opts) lst
451453
452−withMarker :: ListMarker -> WS a -> WS a
453−withMarker m p = do
454− origMarker <- gets stListMarker
455− modify $ \st -> st{ stListMarker = m }
454+withNumId :: Int -> WS a -> WS a
455+withNumId numid p = do
456+ origNumId <- gets stListNumId
457+ modify $ \st -> st{ stListNumId = numid }
456458 result <- p
457− modify $ \st -> st{ stListMarker = origMarker }
459+ modify $ \st -> st{ stListNumId = origNumId }
458460 return result
459461
460462asList :: WS a -> WS a
@@ -489,10 +491,7 @@ getParaProps :: WS [Element]
489491getParaProps = do
490492 props <- gets stParaProperties
491493 listLevel <- gets stListLevel
492− listMarker <- gets stListMarker
493− numid <- case listMarker of
494− NoMarker -> return 1
495− _ -> getNumId
494+ numid <- gets stListNumId
496495 let listPr = if listLevel >= 0
497496 then [ mknode "w:numPr" []
498497 [ mknode "w:numId" [("w:val",show numid)] ()