From 530bfe5f5afb1098ef8cec46ffe00ff8a6f00a43 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Sun, 3 Nov 2019 12:54:42 -0800 Subject: [PATCH] Docx reader: fix list number resumption for sublists. Closes #4324. The first list item of a sublist should not resume numbering from the number of the last sublist item of the same level, if that sublist was a sublist of a different list item. That is, we should not get: ``` 1. one 1. sub one 2. sub two 2. two 3. sub one ``` --- src/Text/Pandoc/Readers/Docx.hs | 9 ++++++++- test/Tests/Readers/Docx.hs | 4 ++++ test/docx/lists_sublist_reset.docx | Bin 0 -> 12757 bytes test/docx/lists_sublist_reset.native | 8 ++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/docx/lists_sublist_reset.docx create mode 100644 test/docx/lists_sublist_reset.native diff --git a/src/Text/Pandoc/Readers/Docx.hs b/src/Text/Pandoc/Readers/Docx.hs index 9d17ab118..8b0b295ab 100644 --- a/src/Text/Pandoc/Readers/Docx.hs +++ b/src/Text/Pandoc/Readers/Docx.hs @@ -640,7 +640,14 @@ bodyPartToBlocks (ListItem pPr numId lvl (Just levelInfo) parparts) = do , ("text", txt) , ("start", show start) ] - modify $ \st -> st{ docxListState = M.insert (numId, lvl) start listState} + modify $ \st -> st{ docxListState = + -- expire all the continuation data for lists of level > this one: + -- a new level 1 list item resets continuation for level 2+ + let expireKeys = [ (numid', lvl') + | (numid', lvl') <- M.keys listState + , lvl' > lvl + ] + in foldr M.delete (M.insert (numId, lvl) start listState) expireKeys } blks <- bodyPartToBlocks (Paragraph pPr parparts) return $ divWith ("", ["list-item"], kvs) blks bodyPartToBlocks (ListItem pPr _ _ _ parparts) = diff --git a/test/Tests/Readers/Docx.hs b/test/Tests/Readers/Docx.hs index 583a6ec18..e107ff9ee 100644 --- a/test/Tests/Readers/Docx.hs +++ b/test/Tests/Readers/Docx.hs @@ -271,6 +271,10 @@ tests = [ testGroup "document" "lists restarting after interruption" "docx/lists_restarting.docx" "docx/lists_restarting.native" + , testCompare + "sublists reset numbering to 1" + "docx/lists_sublist_reset.docx" + "docx/lists_sublist_reset.native" , testCompare "definition lists" "docx/definition_list.docx" diff --git a/test/docx/lists_sublist_reset.docx b/test/docx/lists_sublist_reset.docx new file mode 100644 index 0000000000000000000000000000000000000000..d4bf738522010d4ad4dc8cf87a99a8011fd8f826 GIT binary patch literal 12757 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 LpoO;4{v7=uV5`M8 literal 0 HcmV?d00001 diff --git a/test/docx/lists_sublist_reset.native b/test/docx/lists_sublist_reset.native new file mode 100644 index 000000000..9ee80b2e8 --- /dev/null +++ b/test/docx/lists_sublist_reset.native @@ -0,0 +1,8 @@ +[OrderedList (1,Decimal,Period) + [[Para [Str "Head",Space,Str "1"] + ,OrderedList (1,Decimal,DefaultDelim) + [[Para [Str "Head",Space,Str "1.1"]] + ,[Para [Str "Head",Space,Str "1.2"]]]] + ,[Para [Str "Head",Space,Str "2"] + ,OrderedList (1,Decimal,DefaultDelim) + [[Para [Str "Head",Space,Str "2.1"]]]]]]