@@ -77,6 +77,9 @@ import Text.Pandoc.Writers.OOXML
7777import Text.Pandoc.XML.Light as XML
7878import Data.Generics (mkT , everywhere )
7979import Text.Collate.Lang (renderLang , Lang (.. ))
80+ import Text.Pandoc.Image (createPngFallback )
81+ import Data.ByteString (ByteString )
82+ import Text.Printf (printf )
8083
8184-- from wml.xsd EG_RPrBase
8285rPrTagOrder :: M. Map Text Int
@@ -1321,6 +1324,15 @@ formattedRun els = do
13211324 props <- getTextProps
13221325 return [ mknode " w:r" [] $ props ++ els ]
13231326
1327+ getOrCreateFallback :: PandocMonad m => Int -> (Integer , Integer ) -> FilePath -> ByteString -> m (Maybe MediaItem )
1328+ getOrCreateFallback dpi (xemu, yemu) src' img = do
1329+ mediabag <- getMediaBag
1330+ let src = printf " %s_%d_%d.png" src' xemu yemu
1331+ let xyPt = (fromIntegral xemu / 12700.0 , fromIntegral yemu / 12700.0 )
1332+ case lookupMedia src mediabag of
1333+ Just item -> return $ Just item
1334+ Nothing -> createPngFallback dpi xyPt src $ BL. fromStrict img
1335+
13241336-- | Convert an inline element to OpenXML.
13251337inlineToOpenXML :: PandocMonad m => WriterOptions -> Inline -> WS m [Content ]
13261338inlineToOpenXML opts il = withDirection $ inlineToOpenXML' opts il
@@ -1522,17 +1534,26 @@ inlineToOpenXML' opts (Image attr@(imgident, _, _) alt (src, title)) = do
15221534 imgs <- gets stImages
15231535 let
15241536 stImage = M. lookup (T. unpack src) imgs
1525- generateImgElt (ident, _fp , mt, img) = do
1537+ generateImgElt (ident, fp , mt, img) = do
15261538 docprid <- getUniqueId
15271539 nvpicprid <- getUniqueId
1540+ let
1541+ (xpt,ypt) = desiredSizeInPoints opts attr
1542+ (either (const def) id (imageSize opts img))
1543+ -- 12700 emu = 1 pt
1544+ pageWidthPt = case dimension Width attr of
1545+ Just (Percent a) -> pageWidth * floor (a * 127 )
1546+ _ -> pageWidth * 12700
1547+ (xemu,yemu) = fitToPage (xpt * 12700 , ypt * 12700 ) pageWidthPt
15281548 (blipAttrs, blipContents) <-
15291549 case T. takeWhile (/= ' ;' ) <$> mt of
15301550 Just " image/svg+xml" -> do
15311551 -- get fallback png
1532- mediabag <- getMediaBag
1552+ fallback <- getOrCreateFallback (writerDpi opts) (xemu, yemu) fp img
15331553 mbFallback <-
1534- case lookupMedia ( T. unpack (src <> " .png " )) mediabag of
1554+ case fallback of
15351555 Just item -> do
1556+ P. trace $ " Found fallback " <> tshow (mediaPath item)
15361557 id' <- T. unpack . (" rId" <> ) <$> getUniqueId
15371558 let fp' = " media/" <> id' <> " .png"
15381559 let imgdata = (id',
@@ -1559,13 +1580,6 @@ inlineToOpenXML' opts (Image attr@(imgident, _, _) alt (src, title)) = do
15591580 [extLst])
15601581 _ -> return ([(" r:embed" , T. pack ident)], [] )
15611582 let
1562- (xpt,ypt) = desiredSizeInPoints opts attr
1563- (either (const def) id (imageSize opts img))
1564- -- 12700 emu = 1 pt
1565- pageWidthPt = case dimension Width attr of
1566- Just (Percent a) -> pageWidth * floor (a * 127 )
1567- _ -> pageWidth * 12700
1568- (xemu,yemu) = fitToPage (xpt * 12700 , ypt * 12700 ) pageWidthPt
15691583 cNvPicPr = mknode " pic:cNvPicPr" [] $
15701584 mknode " a:picLocks" [(" noChangeArrowheads" ," 1" )
15711585 ,(" noChangeAspect" ," 1" )] ()
0 commit comments