git.iko.soy/typeable/pandoc
on master help sign in
PDF: use fillMedia and extractMedia to extract media to tmp dir.
a902109John MacFarlane
src/Text/Pandoc/PDF.hs+11−39
@@ -34,14 +34,13 @@ module Text.Pandoc.PDF ( makePDF ) where
34
34
35import qualified Codec.Picture as JP
35import qualified Codec.Picture as JP
36import qualified Control.Exception as E
36import qualified Control.Exception as E
37−import Control.Monad (unless, when, (<=<))
37+import Control.Monad (unless, when)
38import Control.Monad.Trans (MonadIO (..))
38import Control.Monad.Trans (MonadIO (..))
39import qualified Data.ByteString as BS
39import qualified Data.ByteString as BS
40import Data.ByteString.Lazy (ByteString)
40import Data.ByteString.Lazy (ByteString)
41import qualified Data.ByteString.Lazy as B
41import qualified Data.ByteString.Lazy as B
42import qualified Data.ByteString.Lazy as BL
42import qualified Data.ByteString.Lazy as BL
43import qualified Data.ByteString.Lazy.Char8 as BC
43import qualified Data.ByteString.Lazy.Char8 as BC
44−import Data.Digest.Pure.SHA (sha1, showDigest)
45import Data.List (isInfixOf)
44import Data.List (isInfixOf)
46import Data.Maybe (fromMaybe)
45import Data.Maybe (fromMaybe)
47import Data.Monoid ((<>))
46import Data.Monoid ((<>))
@@ -53,7 +52,7 @@ import System.IO (stdout)
53import System.IO.Temp (withTempDirectory, withTempFile)
52import System.IO.Temp (withTempDirectory, withTempFile)
54import Text.Pandoc.Definition
53import Text.Pandoc.Definition
55import Text.Pandoc.MediaBag
54import Text.Pandoc.MediaBag
56−import Text.Pandoc.MIME (extensionFromMimeType, getMimeType)
55+import Text.Pandoc.MIME (getMimeType)
57import Text.Pandoc.Options (HTMLMathMethod (..), WriterOptions (..))
56import Text.Pandoc.Options (HTMLMathMethod (..), WriterOptions (..))
58import Text.Pandoc.Process (pipeProcess)
57import Text.Pandoc.Process (pipeProcess)
59import Text.Pandoc.Shared (inDirectory, stringify, withTempDir)
58import Text.Pandoc.Shared (inDirectory, stringify, withTempDir)
@@ -63,8 +62,8 @@ import Text.Pandoc.Writers.Shared (getField, metaToJSON)
63#ifdef _WINDOWS
62#ifdef _WINDOWS
64import Data.List (intercalate)
63import Data.List (intercalate)
65#endif
64#endif
66−import Text.Pandoc.Class (PandocIO, fetchItem, report, runIO, runIOorExplode,
65+import Text.Pandoc.Class (PandocIO, report, runIO, runIOorExplode,
67− setMediaBag, setVerbosity)
66+ setMediaBag, setVerbosity, fillMedia, extractMedia)
68import Text.Pandoc.Logging
67import Text.Pandoc.Logging
69
68
70#ifdef _WINDOWS
69#ifdef _WINDOWS
@@ -135,40 +134,13 @@ handleImages :: Verbosity
135 -> FilePath -- ^ temp dir to store images
134 -> FilePath -- ^ temp dir to store images
136 -> Pandoc -- ^ document
135 -> Pandoc -- ^ document
137 -> IO Pandoc
136 -> IO Pandoc
138−handleImages verbosity opts mediabag tmpdir =
137+handleImages verbosity opts mediabag tmpdir doc = do
139− walkM (convertImages verbosity tmpdir) <=<
138+ doc' <- runIOorExplode $ do
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
139+ setVerbosity verbosity
155− setMediaBag mediabag
140+ setMediaBag mediabag
156− fetchItem (writerSourceURL opts) src
141+ fillMedia (writerSourceURL opts) doc >>=
157− case res of
142+ extractMedia tmpdir
158− Right (contents, Just mime) -> do
143+ walkM (convertImages verbosity tmpdir) doc'
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
172
144
173convertImages :: Verbosity -> FilePath -> Inline -> IO Inline
145convertImages :: Verbosity -> FilePath -> Inline -> IO Inline
174convertImages verbosity tmpdir (Image attr ils (src, tit)) = do
146convertImages verbosity tmpdir (Image attr ils (src, tit)) = do