From 1b4a5356b4550e98d94f6558f1861383de24bebd Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Tue, 9 Jun 2026 09:58:26 +0000 Subject: [PATCH] Docx reader: key list numbering off `abstractNumId`. Word represents "restart numbering" on a style-based list by pointing only the first item of the restarted list at a new `numId` that shares the original list's abstract numbering definition but carries a `w:startOverride`; the remaining items keep using the original `numId`. Pandoc keyed list continuation and grouping on the `numId`, so the restarted items continued the stale count from the earlier list (and were split into a separate ordered list with the wrong start). Key continuation and grouping off the `abstractNumId` instead (the real running counter in Word), and treat `startOverride` as a restart that resets the count. Closes #8367. Co-Authored-By: Claude --- src/Text/Pandoc/Readers/Docx.hs | 13 ++++---- src/Text/Pandoc/Readers/Docx/Parse.hs | 42 +++++++++++++++++++++----- test/Tests/Readers/Docx.hs | 4 +++ test/docx/lists_restart_8367.docx | Bin 0 -> 22718 bytes test/docx/lists_restart_8367.native | 13 ++++++++ 5 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 test/docx/lists_restart_8367.docx create mode 100644 test/docx/lists_restart_8367.native diff --git a/src/Text/Pandoc/Readers/Docx.hs b/src/Text/Pandoc/Readers/Docx.hs index 6e597ec0f..b825a4cef 100644 --- a/src/Text/Pandoc/Readers/Docx.hs +++ b/src/Text/Pandoc/Readers/Docx.hs @@ -782,15 +782,16 @@ bodyPartToBlocks (Paragraph pPr parparts) = do then (<> horizontalRule) else id) <$> getMainPar -bodyPartToBlocks (ListItem pPr numId lvl (Just levelInfo) parparts) = do - -- We check whether this current numId has previously been used, - -- since Docx expects us to pick up where we left off. +bodyPartToBlocks (ListItem pPr numId lvl isRestart (Just levelInfo) parparts) = do + -- We check whether this current abstract numbering id has previously been + -- used, since Docx expects us to pick up where we left off -- unless this + -- item explicitly restarts numbering (see #8367). listState <- gets docxListState let startFromState = M.lookup (numId, lvl) listState Level _ fmt txt startFromLevelInfo = levelInfo start = case startFromState of - Just n -> n + 1 - Nothing -> fromMaybe 1 startFromLevelInfo + Just n | not isRestart -> n + 1 + _ -> fromMaybe 1 startFromLevelInfo kvs = [ ("level", lvl) , ("num-id", numId) , ("format", fmt) @@ -804,7 +805,7 @@ bodyPartToBlocks (ListItem pPr numId lvl (Just levelInfo) parparts) = do in M.insert (numId, lvl) start (M.filterWithKey notExpired listState) } blks <- bodyPartToBlocks (Paragraph pPr parparts) return $ divWith ("", ["list-item"], kvs) blks -bodyPartToBlocks (ListItem pPr _ _ _ parparts) = +bodyPartToBlocks (ListItem pPr _ _ _ _ parparts) = let pPr' = pPr {pStyle = constructBogusParStyleData "list-paragraph": pStyle pPr} in bodyPartToBlocks $ Paragraph pPr' parparts diff --git a/src/Text/Pandoc/Readers/Docx/Parse.hs b/src/Text/Pandoc/Readers/Docx/Parse.hs index b6b2ab550..50584daa8 100644 --- a/src/Text/Pandoc/Readers/Docx/Parse.hs +++ b/src/Text/Pandoc/Readers/Docx/Parse.hs @@ -304,7 +304,7 @@ defaultParagraphStyle = ParagraphStyle { pStyle = [] data BodyPart = Paragraph ParagraphStyle [ParPart] | Heading Int ParaStyleName ParagraphStyle T.Text T.Text (Maybe Level) [ParPart] - | ListItem ParagraphStyle T.Text T.Text (Maybe Level) [ParPart] + | ListItem ParagraphStyle T.Text T.Text Bool (Maybe Level) [ParPart] | Tbl (Maybe T.Text) T.Text TblGrid TblLook [Row] | Captioned ParagraphStyle [ParPart] BodyPart | HRule @@ -619,6 +619,28 @@ lookupLevel numId ilvl (Numbering _ numbs absNumbs) = do _ -> lookup ilvl $ map (\l@(Level i _ _ _) -> (i, l)) lvls +-- | Given a @numId@ and level, return the abstract numbering id (the stable +-- identifier shared by all numbering instances based on the same abstract +-- numbering definition) together with a flag indicating whether this +-- particular instance restarts numbering at this level (via a +-- @w:startOverride@). Word represents "restart numbering" by pointing the +-- first item of the restarted list at a new numId that shares the abstract +-- numbering of the original list but carries a startOverride; the remaining +-- items keep using the original numId. Keying list continuation off the +-- abstract numbering id (rather than the numId) lets those items be treated +-- as one continuous, restarted list. See #8367. +lookupNumberingInfo :: T.Text -> T.Text -> Numbering -> (T.Text, Bool) +lookupNumberingInfo numId ilvl (Numbering _ numbs _) = + case lookup numId $ + map (\(Numb nid absnumid ovr) -> (nid, (absnumid, ovr))) numbs of + Nothing -> (numId, False) + Just (absNumId, ovrrides) -> + let isRestart = case lookup ilvl $ + map (\lo@(LevelOverride i _ _) -> (i, lo)) ovrrides of + Just (LevelOverride _ (Just _) _) -> True + _ -> False + in (absNumId, isRestart) + loElemToLevelOverride :: NameSpaces -> Element -> Maybe LevelOverride loElemToLevelOverride ns element | isElem ns "w" "lvlOverride" element = do @@ -820,8 +842,10 @@ pNumInfo = getParStyleField numInfo . pStyle mkListItem :: ParagraphStyle -> Text -> Text -> [ParPart] -> D BodyPart mkListItem parstyle numId lvl parparts = do - lvlInfo <- lookupLevel numId lvl <$> asks envNumbering - return $ ListItem parstyle numId lvl lvlInfo parparts + numbering <- asks envNumbering + let lvlInfo = lookupLevel numId lvl numbering + (absNumId, isRestart) = lookupNumberingInfo numId lvl numbering + return $ ListItem parstyle absNumId lvl isRestart lvlInfo parparts pStyleIndentation :: ParagraphStyle -> Maybe ParIndentation pStyleIndentation style = (getParStyleField indent . pStyle) style @@ -877,7 +901,8 @@ elemToBodyPart ns element elemToBodyPart ns element | isElem ns "w" "p" element , Just (numId, lvl) <- getNumInfo ns element = do - lvlInfo <- lookupLevel numId lvl <$> asks envNumbering + numbering <- asks envNumbering + let lvlInfo = lookupLevel numId lvl numbering parstyle <- elemToParagraphStyle ns element <$> asks envParStyles <*> asks envNumbering @@ -885,7 +910,8 @@ elemToBodyPart ns element case pHeading parstyle of Nothing -> mkListItem parstyle numId lvl parparts Just (parstylename, lev) - -> return $ Heading lev parstylename parstyle numId lvl lvlInfo parparts + -> let (absNumId, _) = lookupNumberingInfo numId lvl numbering + in return $ Heading lev parstylename parstyle absNumId lvl lvlInfo parparts elemToBodyPart ns element | isElem ns "w" "p" element , [ppr] <- elChildren element @@ -928,8 +954,10 @@ elemToBodyPart ns element mkListItem parstyle numId lvl parparts Just (parstylename, lev) -> do let (numId, lvl) = fromMaybe ("","") $ pNumInfo parstyle - lvlInfo <- lookupLevel numId lvl <$> asks envNumbering - return $ Heading lev parstylename parstyle numId lvl lvlInfo parparts + numbering <- asks envNumbering + let lvlInfo = lookupLevel numId lvl numbering + (absNumId, _) = lookupNumberingInfo numId lvl numbering + return $ Heading lev parstylename parstyle absNumId lvl lvlInfo parparts Nothing -> return $ Paragraph parstyle parparts elemToBodyPart ns element | isElem ns "w" "tbl" element = do diff --git a/test/Tests/Readers/Docx.hs b/test/Tests/Readers/Docx.hs index c4b19b6d7..f7f40807e 100644 --- a/test/Tests/Readers/Docx.hs +++ b/test/Tests/Readers/Docx.hs @@ -281,6 +281,10 @@ tests = [ testGroup "document" "sublists reset numbering to 1" "docx/lists_sublist_reset.docx" "docx/lists_sublist_reset.native" + , testCompare + "style-based list restarted on one item (#8367)" + "docx/lists_restart_8367.docx" + "docx/lists_restart_8367.native" , testCompare "definition lists" "docx/definition_list.docx" diff --git a/test/docx/lists_restart_8367.docx b/test/docx/lists_restart_8367.docx new file mode 100644 index 0000000000000000000000000000000000000000..5fcfcd6df4a5bb9e39515ff6601dc6c6dae9eaa0 GIT binary patch literal 22718 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 literal 0 HcmV?d00001 diff --git a/test/docx/lists_restart_8367.native b/test/docx/lists_restart_8367.native new file mode 100644 index 000000000..343eb0e6c --- /dev/null +++ b/test/docx/lists_restart_8367.native @@ -0,0 +1,13 @@ +[Header 1 ("section-1",[],[]) [Str "Section",Space,Str "1"] +,OrderedList (1,Decimal,Period) + [[Para [Str "Item",Space,Str "1"]] + ,[Para [Str "Item",Space,Str "2"]] + ,[Para [Str "Item",Space,Str "3"]]] +,Para [Str "Conclusion"] +,Header 1 ("section-2",[],[]) [Str "Section",Space,Str "2"] +,OrderedList (1,Decimal,Period) + [[Para [Str "Item",Space,Str "1"]] + ,[Para [Str "Item",Space,Str "2"]] + ,[Para [Str "Item",Space,Str "3"]] + ,[Para [Str "Item",Space,Str "4"]]] +,Para [Str "Conclusion"]]