git.iko.soy/typeable/pandoc
on master help sign in
Merge pull request #5054 from lierdakil/docx-image-bookmarks
846e231John MacFarlane
src/Text/Pandoc/Writers/Docx.hs+17−26
@@ -879,14 +879,7 @@ blockToOpenXML' opts (Div (ident,classes,kvs) bs) = do
879 else id
879 else id
880 header <- dirmod $ stylemod $ blocksToOpenXML opts hs
880 header <- dirmod $ stylemod $ blocksToOpenXML opts hs
881 contents <- dirmod $ bibmod $ stylemod $ blocksToOpenXML opts bs'
881 contents <- dirmod $ bibmod $ stylemod $ blocksToOpenXML opts bs'
882− if null ident
883− then return $ header ++ contents
882+ wrapBookmark ident $ header ++ contents
884− else do
885− id' <- getUniqueId
886− let bookmarkStart = mknode "w:bookmarkStart" [("w:id", id')
887− ,("w:name",ident)] ()
888− let bookmarkEnd = mknode "w:bookmarkEnd" [("w:id", id')] ()
889− return $ bookmarkStart : header ++ contents ++ [bookmarkEnd]
890blockToOpenXML' opts (Header lev (ident,_,_) lst) = do
883blockToOpenXML' opts (Header lev (ident,_,_) lst) = do
891 setFirstPara
884 setFirstPara
892 paraProps <- withParaPropM (pStyleM ("Heading "++show lev)) $
885 paraProps <- withParaPropM (pStyleM ("Heading "++show lev)) $
@@ -898,12 +891,8 @@ blockToOpenXML' opts (Header lev (ident,_,_) lst) = do
898 let bookmarkName = ident
891 let bookmarkName = ident
899 modify $ \s -> s{ stSectionIds = Set.insert bookmarkName
892 modify $ \s -> s{ stSectionIds = Set.insert bookmarkName
900 $ stSectionIds s }
893 $ stSectionIds s }
901− id' <- getUniqueId
894+ bookmarkedContents <- wrapBookmark bookmarkName contents
902− let bookmarkStart = mknode "w:bookmarkStart" [("w:id", id')
903− ,("w:name",bookmarkName)] ()
904− let bookmarkEnd = mknode "w:bookmarkEnd" [("w:id", id')] ()
905− return [mknode "w:p" [] (paraProps ++
895+ return [mknode "w:p" [] (paraProps ++ bookmarkedContents)]
906− [bookmarkStart] ++ contents ++ [bookmarkEnd])]
907blockToOpenXML' opts (Plain lst) = withParaProp (pCustomStyle "Compact")
896blockToOpenXML' opts (Plain lst) = withParaProp (pCustomStyle "Compact")
908 $ blockToOpenXML opts (Para lst)
897 $ blockToOpenXML opts (Para lst)
909-- title beginning with fig: indicates that the image is a figure
898-- title beginning with fig: indicates that the image is a figure
@@ -945,10 +934,10 @@ blockToOpenXML' opts (BlockQuote blocks) = do
945 p <- withParaPropM (pStyleM "Block Text") $ blocksToOpenXML opts blocks
934 p <- withParaPropM (pStyleM "Block Text") $ blocksToOpenXML opts blocks
946 setFirstPara
935 setFirstPara
947 return p
936 return p
948−blockToOpenXML' opts (CodeBlock attrs str) = do
937+blockToOpenXML' opts (CodeBlock attrs@(ident, _, _) str) = do
949 p <- withParaProp (pCustomStyle "SourceCode") (blockToOpenXML opts $ Para [Code attrs str])
938 p <- withParaProp (pCustomStyle "SourceCode") (blockToOpenXML opts $ Para [Code attrs str])
950 setFirstPara
939 setFirstPara
951− return p
940+ wrapBookmark ident p
952blockToOpenXML' _ HorizontalRule = do
941blockToOpenXML' _ HorizontalRule = do
953 setFirstPara
942 setFirstPara
954 return [
943 return [
@@ -1202,14 +1191,7 @@ inlineToOpenXML' opts (Span (ident,classes,kvs) ils) = do
1202 else return id
1191 else return id
1203 contents <- insmod $ delmod $ dirmod $ stylemod $ pmod
1192 contents <- insmod $ delmod $ dirmod $ stylemod $ pmod
1204 $ inlinesToOpenXML opts ils
1193 $ inlinesToOpenXML opts ils
1205− if null ident
1194+ wrapBookmark ident contents
1206− then return contents
1207− else do
1208− id' <- getUniqueId
1209− let bookmarkStart = mknode "w:bookmarkStart" [("w:id", id')
1210− ,("w:name",ident)] ()
1211− let bookmarkEnd = mknode "w:bookmarkEnd" [("w:id", id')] ()
1212− return $ bookmarkStart : contents ++ [bookmarkEnd]
1213inlineToOpenXML' opts (Strong lst) =
1195inlineToOpenXML' opts (Strong lst) =
1214 withTextProp (mknode "w:b" [] ()) $ inlinesToOpenXML opts lst
1196 withTextProp (mknode "w:b" [] ()) $ inlinesToOpenXML opts lst
1215inlineToOpenXML' opts (Emph lst) =
1197inlineToOpenXML' opts (Emph lst) =
@@ -1299,7 +1281,7 @@ inlineToOpenXML' opts (Link _ txt (src,_)) = do
1299 M.insert src i extlinks }
1281 M.insert src i extlinks }
1300 return i
1282 return i
1301 return [ mknode "w:hyperlink" [("r:id",id')] contents ]
1283 return [ mknode "w:hyperlink" [("r:id",id')] contents ]
1302−inlineToOpenXML' opts (Image attr alt (src, title)) = do
1284+inlineToOpenXML' opts (Image attr@(imgident, _, _) alt (src, title)) = do
1303 pageWidth <- asks envPrintWidth
1285 pageWidth <- asks envPrintWidth
1304 imgs <- gets stImages
1286 imgs <- gets stImages
1305 let
1287 let
@@ -1361,7 +1343,7 @@ inlineToOpenXML' opts (Image attr alt (src, title)) = do
1361 in
1343 in
1362 imgElt
1344 imgElt
1363
1345
1364− case stImage of
1346+ wrapBookmark imgident =<< case stImage of
1365 Just imgData -> return [generateImgElt imgData]
1347 Just imgData -> return [generateImgElt imgData]
1366 Nothing -> ( do --try
1348 Nothing -> ( do --try
1367 (img, mt) <- P.fetchItem src
1349 (img, mt) <- P.fetchItem src
@@ -1440,3 +1422,12 @@ withDirection x = do
1440 else flip local x $ \env -> env { envParaProperties = paraProps'
1422 else flip local x $ \env -> env { envParaProperties = paraProps'
1441 , envTextProperties = textProps'
1423 , envTextProperties = textProps'
1442 }
1424 }
1425+
1426+wrapBookmark :: (PandocMonad m) => String -> [Element] -> WS m [Element]
1427+wrapBookmark [] contents = return contents
1428+wrapBookmark ident contents = do
1429+ id' <- getUniqueId
1430+ let bookmarkStart = mknode "w:bookmarkStart" [("w:id", id')
1431+ ,("w:name",ident)] ()
1432+ bookmarkEnd = mknode "w:bookmarkEnd" [("w:id", id')] ()
1433+ return $ bookmarkStart : contents ++ [bookmarkEnd]