@@ -118,6 +118,7 @@ readDocx _ _ =
118 throwError $ PandocSomeError "couldn't parse docx file"
118 throwError $ PandocSomeError "couldn't parse docx file"
120data DState = DState { docxAnchorMap :: M.Map String String
120data DState = DState { docxAnchorMap :: M.Map String String
121+ , docxAnchorSet :: Set.Set String
121 , docxMediaBag :: MediaBag
122 , docxMediaBag :: MediaBag
122 , docxDropCap :: Inlines
123 , docxDropCap :: Inlines
123 , docxWarnings :: [String]
124 , docxWarnings :: [String]
@@ -128,6 +129,7 @@ data DState = DState { docxAnchorMap :: M.Map String String
129instance Default DState where
130instance Default DState where
130 def = DState { docxAnchorMap = M.empty
131 def = DState { docxAnchorMap = M.empty
132+ , docxAnchorSet = mempty
131 , docxMediaBag = mempty
133 , docxMediaBag = mempty
132 , docxDropCap = mempty
134 , docxDropCap = mempty
133 , docxWarnings = []
135 , docxWarnings = []
@@ -561,7 +563,7 @@ bodyPartToBlocks (ListItem pPr numId lvl (Just levelInfo) parparts) = do
562 modify $ \st -> st{ docxListState = M.insert (numId, lvl) start listState}
564 modify $ \st -> st{ docxListState = M.insert (numId, lvl) start listState}
563 blks <- bodyPartToBlocks (Paragraph pPr parparts)
565 blks <- bodyPartToBlocks (Paragraph pPr parparts)
564− return $ divWith ("", ["list-item"], kvs) blks
566+ return $ divWith ("", ["list-item"], kvs) blks
565bodyPartToBlocks (ListItem pPr _ _ _ parparts) =
567bodyPartToBlocks (ListItem pPr _ _ _ parparts) =
566 let pPr' = pPr {pStyle = "ListParagraph": pStyle pPr}
568 let pPr' = pPr {pStyle = "ListParagraph": pStyle pPr}
@@ -603,21 +605,41 @@ bodyPartToBlocks (OMathPara e) =
603rewriteLink' :: PandocMonad m => Inline -> DocxContext m Inline
605rewriteLink' :: PandocMonad m => Inline -> DocxContext m Inline
604rewriteLink' l@(Link attr ils ('#':target, title)) = do
606rewriteLink' l@(Link attr ils ('#':target, title)) = do
605 anchorMap <- gets docxAnchorMap
607 anchorMap <- gets docxAnchorMap
606− return $ case M.lookup target anchorMap of
608+ case M.lookup target anchorMap of
609+ Just newTarget -> do
610+ modify $ \s -> s{docxAnchorSet = Set.insert newTarget (docxAnchorSet s)}
607− Just newTarget -> Link attr ils ('#':newTarget, title)
611+ return $ Link attr ils ('#':newTarget, title)
608− Nothing -> l
612+ Nothing -> do
613+ modify $ \s -> s{docxAnchorSet = Set.insert target (docxAnchorSet s)}
609rewriteLink' il = return il
615rewriteLink' il = return il
611rewriteLinks :: PandocMonad m => [Block] -> DocxContext m [Block]
617rewriteLinks :: PandocMonad m => [Block] -> DocxContext m [Block]
612rewriteLinks = mapM (walkM rewriteLink')
618rewriteLinks = mapM (walkM rewriteLink')
620+removeOrphanAnchors'' :: PandocMonad m => Inline -> DocxContext m [Inline]
621+removeOrphanAnchors'' s@(Span (ident, classes, _) ils)
622+ | "anchor" `elem` classes = do
623+ anchorSet <- gets docxAnchorSet
624+ return $ if ident `Set.member` anchorSet
627+removeOrphanAnchors'' il = return [il]
629+removeOrphanAnchors' :: PandocMonad m => [Inline] -> DocxContext m [Inline]
630+removeOrphanAnchors' ils = liftM concat $ mapM removeOrphanAnchors'' ils
632+removeOrphanAnchors :: PandocMonad m => [Block] -> DocxContext m [Block]
633+removeOrphanAnchors = mapM (walkM removeOrphanAnchors')
614bodyToOutput :: PandocMonad m => Body -> DocxContext m (Meta, [Block])
635bodyToOutput :: PandocMonad m => Body -> DocxContext m (Meta, [Block])
615bodyToOutput (Body bps) = do
636bodyToOutput (Body bps) = do
616 let (metabps, blkbps) = sepBodyParts bps
637 let (metabps, blkbps) = sepBodyParts bps
617 meta <- bodyPartsToMeta metabps
638 meta <- bodyPartsToMeta metabps
618 blks <- smushBlocks <$> mapM bodyPartToBlocks blkbps
639 blks <- smushBlocks <$> mapM bodyPartToBlocks blkbps
619 blks' <- rewriteLinks $ blocksToDefinitions $ blocksToBullets $ toList blks
640 blks' <- rewriteLinks $ blocksToDefinitions $ blocksToBullets $ toList blks
641+ blks'' <- removeOrphanAnchors blks'
620− return (meta, blks')
642+ return (meta, blks'')
622docxToOutput :: PandocMonad m
644docxToOutput :: PandocMonad m
623 => ReaderOptions
645 => ReaderOptions