Docx writer: better handle list items whose contents are lists (#6522)

If the first element of a bulleted or ordered list is another list,
then that first item will disappear if the target format is docx. This
changes the docx writer so that it prepends an empty string for those
cases. With this, no items will disappear.

Closes #5948.
This commit is contained in:
Michael Hoffmann 2020-10-02 18:30:05 +02:00 committed by GitHub
parent 27b4c21f72
commit 74bd5a4f47
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 3 deletions

View file

@ -3,6 +3,7 @@
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{- |
Module : Text.Pandoc.Writers.Docx
@ -1087,11 +1088,20 @@ listItemToOpenXML _ _ [] = return []
listItemToOpenXML opts numid (first:rest) = do
oldInList <- gets stInList
modify $ \st -> st{ stInList = True }
first' <- withNumId numid $ blockToOpenXML opts first
let isListBlock = \case
BulletList{} -> True
OrderedList{} -> True
_ -> False
-- Prepend an empty string if the first entry is another
-- list. Otherwise the outer bullet will disappear.
let (first', rest') = if isListBlock first
then (Plain [Str ""] , first:rest)
else (first, rest)
first'' <- withNumId numid $ blockToOpenXML opts first'
-- baseListId is the code for no list marker:
rest' <- withNumId baseListId $ blocksToOpenXML opts rest
rest'' <- withNumId baseListId $ blocksToOpenXML opts rest'
modify $ \st -> st{ stInList = oldInList }
return $ first' ++ rest'
return $ first'' ++ rest''
alignmentToString :: Alignment -> [Char]
alignmentToString alignment = case alignment of

View file

@ -83,6 +83,11 @@ tests = [ testGroup "inlines"
def
"docx/lists_restarting.native"
"docx/golden/lists_restarting.docx"
, docxTest
"lists with multiple initial list levels"
def
"docx/lists_multiple_initial.native"
"docx/golden/lists_multiple_initial.docx"
, docxTest
"definition lists"
def

Binary file not shown.

View file

@ -0,0 +1,8 @@
[OrderedList (1,Decimal,Period)
[[OrderedList (1,LowerAlpha,TwoParens)
[[Para [Str "foo"]]
,[Para [Str "bar"]]]]]
,BulletList
[[BulletList
[[Para [Str "foo"]]
,[Para [Str "bar"]]]]]]