Skip to content

Commit ce30f8b

Browse files
committed
refactor(createPngFallbacks): store Image attributes too
Signed-off-by: Edwin Török <[email protected]>
1 parent 6237700 commit ce30f8b

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

src/Text/Pandoc/App.hs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import Control.Monad.Catch ( MonadMask )
3434
import Control.Monad.Except (throwError)
3535
import qualified Data.ByteString.Lazy as BL
3636
import Data.Maybe (fromMaybe, isJust, isNothing)
37+
import Data.Map (findWithDefault)
3738
import qualified Data.Set as Set
3839
import Data.Text (Text)
3940
import qualified Data.Text as T
@@ -308,7 +309,7 @@ convertWithOpts' scriptingEngine istty datadir opts = do
308309
)
309310

310311
when (format == "docx" && not (optSandbox opts)) $ do
311-
createPngFallbacks (writerDpi writerOptions)
312+
createPngFallbacks writerOptions
312313

313314
output <- case writer of
314315
ByteStringWriter f
@@ -372,14 +373,16 @@ readAbbreviations mbfilepath =
372373
>>= fmap (Set.fromList . filter (not . T.null) . T.lines) .
373374
toTextM (fromMaybe mempty mbfilepath)
374375

375-
createPngFallbacks :: (PandocMonad m, MonadIO m) => Int -> m ()
376-
createPngFallbacks dpi = do
376+
createPngFallbacks :: (PandocMonad m, MonadIO m) => WriterOptions -> m ()
377+
createPngFallbacks opts = do
377378
-- create fallback pngs for svgs
378379
items <- mediaItems <$> getMediaBag
380+
attributes <- getImageAttrs
379381
forM_ items $ \(fp, mt, bs) ->
380382
case T.takeWhile (/=';') mt of
381383
"image/svg+xml" -> do
382-
res <- svgToPng dpi bs
384+
let attr = Data.Map.findWithDefault nullAttr fp attributes
385+
res <- svgToPng (writerDpi opts) bs
383386
case res of
384387
Right bs' -> do
385388
let fp' = fp <> ".png"

src/Text/Pandoc/Class/CommonState.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import Text.Collate.Lang (Lang)
2323
import Text.Pandoc.MediaBag (MediaBag)
2424
import Text.Pandoc.Logging (LogMessage, Verbosity (WARNING))
2525
import Text.Pandoc.Translations.Types (Translations)
26+
import Text.Pandoc.Definition (Attr)
27+
import qualified Data.Map as M
2628

2729
-- | 'CommonState' represents state that is used by all
2830
-- instances of 'PandocMonad'. Normally users should not
@@ -41,6 +43,8 @@ data CommonState = CommonState
4143
-- ^ Controls whether certificate validation is disabled
4244
, stMediaBag :: MediaBag
4345
-- ^ Media parsed from binary containers
46+
, stImageAttrs :: M.Map FilePath Attr
47+
-- ^ Image attributes
4448
, stTranslations :: Maybe (Lang, Maybe Translations)
4549
-- ^ Translations for localization
4650
, stInputFiles :: [FilePath]
@@ -71,6 +75,7 @@ defaultCommonState = CommonState
7175
, stRequestHeaders = []
7276
, stNoCheckCertificate = False
7377
, stMediaBag = mempty
78+
, stImageAttrs = M.empty
7479
, stTranslations = Nothing
7580
, stInputFiles = []
7681
, stOutputFile = Nothing

src/Text/Pandoc/Class/PandocMonad.hs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ module Text.Pandoc.Class.PandocMonad
3434
, getLog
3535
, setVerbosity
3636
, getVerbosity
37+
, getImageAttrs
3738
, getMediaBag
3839
, setMediaBag
3940
, insertMedia
@@ -86,6 +87,7 @@ import qualified Debug.Trace
8687
import qualified Text.Pandoc.MediaBag as MB
8788
import qualified Data.Text.Encoding as TSE
8889
import qualified Data.Text.Encoding.Error as TSE
90+
import Data.Map (Map, insert)
8991

9092
-- | The PandocMonad typeclass contains all the potentially
9193
-- IO-related functions used in pandoc's readers and writers.
@@ -202,12 +204,26 @@ setMediaBag mb = modifyCommonState $ \st -> st{stMediaBag = mb}
202204
getMediaBag :: PandocMonad m => m MediaBag
203205
getMediaBag = getsCommonState stMediaBag
204206

205-
-- | Insert an item into the media bag.
207+
-- | Initialize the image attributes
208+
setImageAttrs :: PandocMonad m => Map FilePath Attr -> m ()
209+
setImageAttrs mb = modifyCommonState $ \st -> st{stImageAttrs = mb}
210+
211+
-- | Retrieve the image attributes
212+
getImageAttrs :: PandocMonad m => m (Map FilePath Attr)
213+
getImageAttrs = getsCommonState stImageAttrs
214+
206215
insertMedia :: PandocMonad m => FilePath -> Maybe MimeType -> BL.ByteString -> m ()
207216
insertMedia fp mime bs = do
208-
mb <- getMediaBag
209-
let mb' = MB.insertMedia fp mime bs mb
210-
setMediaBag mb'
217+
mb <- getMediaBag
218+
let mb' = MB.insertMedia fp mime bs mb
219+
setMediaBag mb'
220+
221+
-- | Insert an item into the media bag.
222+
insertAttr :: PandocMonad m => FilePath -> Attr -> m ()
223+
insertAttr fp attr = do
224+
attrs <- getImageAttrs
225+
let attrs' = Data.Map.insert fp attr attrs
226+
setImageAttrs attrs'
211227

212228
-- | Retrieve the input filenames.
213229
getInputFiles :: PandocMonad m => m [FilePath]
@@ -464,6 +480,7 @@ fillMediaBag d = walkM handleImage d
464480
Nothing -> do
465481
(bs, mt) <- fetchItem src
466482
insertMedia fp mt (BL.fromStrict bs)
483+
insertAttr fp attr
467484
return $ Image attr lab (src, tit))
468485
(\e ->
469486
case e of

0 commit comments

Comments
 (0)