git.iko.soy/typeable/pandoc
on master help sign in
PDF: use fillMedia and extractMedia to extract media to tmp dir.

This reduces code duplication. We should be able to do something similar in ODT, Docx, EPUB writers.

commita902109c6d56f5249a0521c89ab90ca105b7b023 authorJohn MacFarlane <jgm@berkeley.edu> dateSun 7 May 2017, 20:57 (10 years ago) parentaf7215a
1 file changed+11−39
src/Text/Pandoc/PDF.hs+11−39
src/Text/Pandoc/PDF.hs+11−39
@@ -34,14 +34,13 @@ module Text.Pandoc.PDF ( makePDF ) where
3434
3535import qualified Codec.Picture as JP
3636import qualified Control.Exception as E
37−import Control.Monad (unless, when, (<=<))
37+import Control.Monad (unless, when)
3838import Control.Monad.Trans (MonadIO (..))
3939import qualified Data.ByteString as BS
4040import Data.ByteString.Lazy (ByteString)
4141import qualified Data.ByteString.Lazy as B
4242import qualified Data.ByteString.Lazy as BL
4343import qualified Data.ByteString.Lazy.Char8 as BC
44−import Data.Digest.Pure.SHA (sha1, showDigest)
4544import Data.List (isInfixOf)
4645import Data.Maybe (fromMaybe)
4746import Data.Monoid ((<>))
@@ -53,7 +52,7 @@ import System.IO (stdout)
5352import System.IO.Temp (withTempDirectory, withTempFile)
5453import Text.Pandoc.Definition
5554import Text.Pandoc.MediaBag
56−import Text.Pandoc.MIME (extensionFromMimeType, getMimeType)
55+import Text.Pandoc.MIME (getMimeType)
5756import Text.Pandoc.Options (HTMLMathMethod (..), WriterOptions (..))
5857import Text.Pandoc.Process (pipeProcess)
5958import Text.Pandoc.Shared (inDirectory, stringify, withTempDir)
@@ -63,8 +62,8 @@ import Text.Pandoc.Writers.Shared (getField, metaToJSON)
6362#ifdef _WINDOWS
6463import Data.List (intercalate)
6564#endif
66−import Text.Pandoc.Class (PandocIO, fetchItem, report, runIO, runIOorExplode,
67− setMediaBag, setVerbosity)
65+import Text.Pandoc.Class (PandocIO, report, runIO, runIOorExplode,
66+ setMediaBag, setVerbosity, fillMedia, extractMedia)
6867import Text.Pandoc.Logging
6968
7069#ifdef _WINDOWS
@@ -135,40 +134,13 @@ handleImages :: Verbosity
135134 -> FilePath -- ^ temp dir to store images
136135 -> Pandoc -- ^ document
137136 -> IO Pandoc
138−handleImages verbosity opts mediabag tmpdir =
139− walkM (convertImages verbosity tmpdir) <=<
140− walkM (handleImage' verbosity opts mediabag tmpdir)
141−
142−handleImage' :: Verbosity
143− -> WriterOptions
144− -> MediaBag
145− -> FilePath
146− -> Inline
147− -> IO Inline
148−handleImage' verbosity opts mediabag tmpdir (Image attr ils (src,tit)) = do
149− exists <- doesFileExist src
150− if exists
151− then return $ Image attr ils (src,tit)
152− else do
153− res <- runIO $ do
154− setVerbosity verbosity
155− setMediaBag mediabag
156− fetchItem (writerSourceURL opts) src
157− case res of
158− Right (contents, Just mime) -> do
159− let ext = fromMaybe (takeExtension src) $
160− extensionFromMimeType mime
161− let basename = showDigest $ sha1 $ BL.fromChunks [contents]
162− let fname = tmpdir </> basename <.> ext
163− BS.writeFile fname contents
164− return $ Image attr ils (fname,tit)
165− _ -> do
166− runIO $ do
167− setVerbosity verbosity
168− report $ CouldNotFetchResource src "skipping..."
169− -- return alt text
170− return $ Emph ils
171−handleImage' _ _ _ _ x = return x
137+handleImages verbosity opts mediabag tmpdir doc = do
138+ doc' <- runIOorExplode $ do
139+ setVerbosity verbosity
140+ setMediaBag mediabag
141+ fillMedia (writerSourceURL opts) doc >>=
142+ extractMedia tmpdir
143+ walkM (convertImages verbosity tmpdir) doc'
172144
173145convertImages :: Verbosity -> FilePath -> Inline -> IO Inline
174146convertImages verbosity tmpdir (Image attr ils (src, tit)) = do