@@ -24,6 +24,7 @@ import Control.Monad (when, unless)
2424import Control.Applicative ((<|>) )
2525import Control.Monad.Except (catchError )
2626import Crypto.Hash (hashWith , SHA1 (SHA1 ))
27+ import Data.ByteString (ByteString )
2728import qualified Data.ByteString.Lazy as BL
2829import Data.Char (isLetter , isSpace )
2930import Text.Pandoc.Char (isCJK )
@@ -48,6 +49,7 @@ import Text.Pandoc.UTF8 (fromText)
4849import Text.Pandoc.Definition
4950import Text.Pandoc.Highlighting (highlight )
5051import Text.Pandoc.Templates (compileDefaultTemplate , renderTemplate )
52+ import Text.Pandoc.Image (createPngFallback )
5153import Text.Pandoc.ImageSize
5254import Text.Pandoc.Logging
5355import Text.Pandoc.MIME (extensionFromMimeType , getMimeType )
@@ -60,6 +62,7 @@ import Text.Pandoc.Walk
6062import qualified Text.Pandoc.Writers.GridTable as Grid
6163import Text.Pandoc.Writers.Math
6264import Text.Pandoc.Writers.Shared
65+ import Text.Printf (printf )
6366import Text.TeXMath
6467import Text.Pandoc.Writers.OOXML
6568import Text.Pandoc.XML.Light as XML
@@ -718,6 +721,16 @@ formattedRun els = do
718721 props <- getTextProps
719722 return $ mknode " w:r" [] $ props ++ els
720723
724+ getOrCreateFallback :: PandocMonad m => Int -> (Integer , Integer ) -> FilePath -> ByteString -> m (Maybe MediaItem )
725+ getOrCreateFallback dpi (xemu, yemu) src' img = do
726+ mediabag <- getMediaBag
727+ let src = printf " %s_%d_%d.png" src' xemu yemu
728+ let xyPt = (fromIntegral xemu / 12700.0 , fromIntegral yemu / 12700.0 )
729+ case lookupMedia src mediabag of
730+ Just item -> return $ Just item
731+ Nothing -> createPngFallback dpi xyPt src $ BL. fromStrict img
732+
733+ -- | Convert an inline element to OpenXML.
721734-- | Convert an inline element to OpenXML.
722735inlineToOpenXML :: PandocMonad m => WriterOptions -> Inline -> WS m [Content ]
723736inlineToOpenXML opts il = withDirection $ inlineToOpenXML' opts il
@@ -919,17 +932,26 @@ inlineToOpenXML' opts (Image attr@(imgident, _, _) alt (src, title)) = do
919932 imgs <- gets stImages
920933 let
921934 stImage = M. lookup (T. unpack src) imgs
922- generateImgElt (ident, _fp , mt, img) = do
935+ generateImgElt (ident, fp , mt, img) = do
923936 docprid <- getUniqueId
924937 nvpicprid <- getUniqueId
938+ let
939+ (xpt,ypt) = desiredSizeInPoints opts attr
940+ (either (const def) id (imageSize opts img))
941+ -- 12700 emu = 1 pt
942+ pageWidthPt = case dimension Width attr of
943+ Just (Percent a) -> pageWidth * floor (a * 127 )
944+ _ -> pageWidth * 12700
945+ (xemu,yemu) = fitToPage (xpt * 12700 , ypt * 12700 ) pageWidthPt
925946 (blipAttrs, blipContents) <-
926947 case T. takeWhile (/= ' ;' ) <$> mt of
927948 Just " image/svg+xml" -> do
928949 -- get fallback png
929- mediabag <- getMediaBag
950+ fallback <- getOrCreateFallback (writerDpi opts) (xemu, yemu) fp img
930951 mbFallback <-
931- case lookupMedia ( T. unpack (src <> " .png " )) mediabag of
952+ case fallback of
932953 Just item -> do
954+ P. trace $ " Found fallback " <> tshow (mediaPath item)
933955 id' <- T. unpack . (" rId" <> ) <$> getUniqueId
934956 let fp' = " media/" <> id' <> " .png"
935957 let imgdata = (id',
@@ -956,13 +978,6 @@ inlineToOpenXML' opts (Image attr@(imgident, _, _) alt (src, title)) = do
956978 [extLst])
957979 _ -> return ([(" r:embed" , T. pack ident)], [] )
958980 let
959- (xpt,ypt) = desiredSizeInPoints opts attr
960- (either (const def) id (imageSize opts img))
961- -- 12700 emu = 1 pt
962- pageWidthPt = case dimension Width attr of
963- Just (Percent a) -> pageWidth * floor (a * 127 )
964- _ -> pageWidth * 12700
965- (xemu,yemu) = fitToPage (xpt * 12700 , ypt * 12700 ) pageWidthPt
966981 cNvPicPr = mknode " pic:cNvPicPr" [] $
967982 mknode " a:picLocks" [(" noChangeArrowheads" ," 1" )
968983 ,(" noChangeAspect" ," 1" )] ()
0 commit comments