@@ -33,6 +33,8 @@ import System.FilePath ( (</>) )
3333import qualified Data.ByteString.Lazy as B
3434import qualified Data.Map as M
3535import Data.ByteString.Lazy.UTF8 ( fromString, toString )
36+import Text.Pandoc.UTF8 as UTF8
37+import System.IO ( stderr )
3638import Codec.Archive.Zip
3739import System.Time
3840import Paths_pandoc ( getDataFileName )
@@ -575,52 +577,58 @@ inlineToOpenXML opts (Link txt (src,_)) = do
575577 M.insert src i extlinks }
576578 return i
577579 return [ mknode "w:hyperlink" [("r:id",ind)] contents ]
578−inlineToOpenXML _ (Image _ (src, tit)) = do
579− imgs <- gets stImages
580− (ident,size) <- case M.lookup src imgs of
581− Just (i,img) -> return (i, imageSize img)
582− Nothing -> do
583− -- TODO check existence download etc.
584− img <- liftIO $ B.readFile src
585− let ident' = "image" ++ show (M.size imgs + 1)
586− let size' = imageSize img
587− modify $ \st -> st{
588− stImages = M.insert src (ident',img) $ stImages st }
589− return (ident',size')
590− let (xpt,ypt) = maybe (120,120) sizeInPoints size
591− -- 12700 emu = 1 pt
592− let (xemu,yemu) = (xpt * 12700, ypt * 12700)
593− let cNvPicPr = mknode "pic:cNvPicPr" [] $
594− mknode "a:picLocks" [("noChangeArrowheads","1"),("noChangeAspect","1")] ()
595− let nvPicPr = mknode "pic:nvPicPr" []
596− [ mknode "pic:cNvPr"
597− [("descr",src),("id","0"),("name","Picture")] ()
598− , cNvPicPr ]
599− let blipFill = mknode "pic:blipFill" []
600− [ mknode "a:blip" [("r:embed",ident)] ()
601− , mknode "a:stretch" [] $ mknode "a:fillRect" [] () ]
602− let xfrm = mknode "a:xfrm" []
603− [ mknode "a:off" [("x","0"),("y","0")] ()
604− , mknode "a:ext" [("cx",show xemu),("cy",show yemu)] () ]
605− let prstGeom = mknode "a:prstGeom" [("prst","rect")] $
606− mknode "a:avLst" [] ()
607− let ln = mknode "a:ln" [("w","9525")]
608− [ mknode "a:noFill" [] ()
609− , mknode "a:headEnd" [] ()
610− , mknode "a:tailEnd" [] () ]
611− let spPr = mknode "pic:spPr" [("bwMode","auto")]
612− [xfrm, prstGeom, mknode "a:noFill" [] (), ln]
613− let graphic = mknode "a:graphic" [] $
614− mknode "a:graphicData" [("uri","http://schemas.openxmlformats.org/drawingml/2006/picture")]
615− [ mknode "pic:pic" []
616− [ nvPicPr
617− , blipFill
618− , spPr ] ]
619− return [ mknode "w:r" [] $
620− mknode "w:drawing" [] $
621− mknode "wp:inline" []
622− [ mknode "wp:extent" [("cx",show xemu),("cy",show yemu)] ()
623− , mknode "wp:effectExtent" [("b","0"),("l","0"),("r","0"),("t","0")] ()
624− , mknode "wp:docPr" [("descr",tit),("id","1"),("name","Picture")] ()
625− , graphic ] ]
626−
580+inlineToOpenXML opts (Image alt (src, tit)) = do
581+ exists <- liftIO $ doesFileExist src
582+ if exists
583+ then do
584+ imgs <- gets stImages
585+ (ident,size) <- case M.lookup src imgs of
586+ Just (i,img) -> return (i, imageSize img)
587+ Nothing -> do
588+ -- TODO check existence download etc.
589+ img <- liftIO $ B.readFile src
590+ let ident' = "image" ++ show (M.size imgs + 1)
591+ let size' = imageSize img
592+ modify $ \st -> st{
593+ stImages = M.insert src (ident',img) $ stImages st }
594+ return (ident',size')
595+ let (xpt,ypt) = maybe (120,120) sizeInPoints size
596+ -- 12700 emu = 1 pt
597+ let (xemu,yemu) = (xpt * 12700, ypt * 12700)
598+ let cNvPicPr = mknode "pic:cNvPicPr" [] $
599+ mknode "a:picLocks" [("noChangeArrowheads","1"),("noChangeAspect","1")] ()
600+ let nvPicPr = mknode "pic:nvPicPr" []
601+ [ mknode "pic:cNvPr"
602+ [("descr",src),("id","0"),("name","Picture")] ()
603+ , cNvPicPr ]
604+ let blipFill = mknode "pic:blipFill" []
605+ [ mknode "a:blip" [("r:embed",ident)] ()
606+ , mknode "a:stretch" [] $ mknode "a:fillRect" [] () ]
607+ let xfrm = mknode "a:xfrm" []
608+ [ mknode "a:off" [("x","0"),("y","0")] ()
609+ , mknode "a:ext" [("cx",show xemu),("cy",show yemu)] () ]
610+ let prstGeom = mknode "a:prstGeom" [("prst","rect")] $
611+ mknode "a:avLst" [] ()
612+ let ln = mknode "a:ln" [("w","9525")]
613+ [ mknode "a:noFill" [] ()
614+ , mknode "a:headEnd" [] ()
615+ , mknode "a:tailEnd" [] () ]
616+ let spPr = mknode "pic:spPr" [("bwMode","auto")]
617+ [xfrm, prstGeom, mknode "a:noFill" [] (), ln]
618+ let graphic = mknode "a:graphic" [] $
619+ mknode "a:graphicData" [("uri","http://schemas.openxmlformats.org/drawingml/2006/picture")]
620+ [ mknode "pic:pic" []
621+ [ nvPicPr
622+ , blipFill
623+ , spPr ] ]
624+ return [ mknode "w:r" [] $
625+ mknode "w:drawing" [] $
626+ mknode "wp:inline" []
627+ [ mknode "wp:extent" [("cx",show xemu),("cy",show yemu)] ()
628+ , mknode "wp:effectExtent" [("b","0"),("l","0"),("r","0"),("t","0")] ()
629+ , mknode "wp:docPr" [("descr",tit),("id","1"),("name","Picture")] ()
630+ , graphic ] ]
631+ else do
632+ liftIO $ UTF8.hPutStrLn stderr $
633+ "Could not find image `" ++ src ++ "', skipping..."
634+ inlinesToOpenXML opts alt