PDF, Docx, EPUB, and ODT writers now automatically use MediaBag.

The MediaBag is thread through from the reader, with no need
to extract to files.
This commit is contained in:
John MacFarlane 2014-07-30 14:07:31 -07:00
parent 28321a18bf
commit 234652a4b8
6 changed files with 25 additions and 22 deletions

View file

@ -1222,21 +1222,23 @@ main = do
| src `elem` paths = Image lab (dir ++ "/" ++ src, tit)
adjustImagePath _ _ x = x
(doc, writerOptions') <-
(doc, media) <-
case reader of
StringReader r-> do
inp <- readSources sources >>=
handleIncludes' . convertTabs . intercalate "\n"
d <- r readerOpts inp
return (d, writerOptions)
return (d, M.empty)
ByteStringReader r -> do
(d, media) <- readFiles sources >>= r readerOpts
case mbExtractMedia of
Just dir | not (M.null media) -> do
mapM_ (writeMedia dir) $ M.toList media
let d' = walk (adjustImagePath dir (M.keys media)) d
return (d', writerOptions{ writerMediaBag = media })
_ -> return (d, writerOptions)
d' <- case mbExtractMedia of
Just dir | not (M.null media) -> do
mapM_ (writeMedia dir) $ M.toList media
return $ walk (adjustImagePath dir (M.keys media)) d
_ -> return d
return (d', media)
let writerOptions' = writerOptions{ writerMediaBag = media }
let doc0 = M.foldWithKey setMeta doc metadata
let doc1 = foldr ($) doc0 transforms

View file

@ -45,7 +45,7 @@ import Data.Maybe (fromMaybe)
import qualified Text.Pandoc.UTF8 as UTF8
import Text.Pandoc.Definition
import Text.Pandoc.Walk (walkM)
import Text.Pandoc.Shared (fetchItem, warn, withTempDir)
import Text.Pandoc.Shared (fetchItem', warn, withTempDir)
import Text.Pandoc.Options (WriterOptions(..))
import Text.Pandoc.MIME (extensionFromMimeType)
import Text.Pandoc.Process (pipeProcess)
@ -65,26 +65,26 @@ makePDF :: String -- ^ pdf creator (pdflatex, lualatex, xelatex)
-> Pandoc -- ^ document
-> IO (Either ByteString ByteString)
makePDF program writer opts doc = withTempDir "tex2pdf." $ \tmpdir -> do
doc' <- handleImages (writerSourceURL opts) tmpdir doc
doc' <- handleImages opts tmpdir doc
let source = writer opts doc'
tex2pdf' tmpdir program source
handleImages :: Maybe String -- ^ source base URL
handleImages :: WriterOptions
-> FilePath -- ^ temp dir to store images
-> Pandoc -- ^ document
-> IO Pandoc
handleImages baseURL tmpdir = walkM (handleImage' baseURL tmpdir)
handleImages opts tmpdir = walkM (handleImage' opts tmpdir)
handleImage' :: Maybe String
handleImage' :: WriterOptions
-> FilePath
-> Inline
-> IO Inline
handleImage' baseURL tmpdir (Image ils (src,tit)) = do
handleImage' opts tmpdir (Image ils (src,tit)) = do
exists <- doesFileExist src
if exists
then return $ Image ils (src,tit)
else do
res <- fetchItem baseURL src
res <- fetchItem' (writerMediaBag opts) (writerSourceURL opts) src
case res of
Right (contents, Just mime) -> do
let ext = fromMaybe (takeExtension src) $

View file

@ -793,10 +793,9 @@ fetchItem sourceURL s
return (cont, mime)
-- | Like 'fetchItem', but also looks for items in a 'MediaBag'.
fetchItem' :: Maybe MediaBag -> Maybe String -> String
fetchItem' :: MediaBag -> Maybe String -> String
-> IO (Either E.SomeException (BS.ByteString, Maybe String))
fetchItem' Nothing sourceURL s = fetchItem sourceURL s
fetchItem' (Just media) sourceURL s = do
fetchItem' media sourceURL s = do
case M.lookup s media of
Nothing -> fetchItem sourceURL s
Just bs -> do

View file

@ -830,7 +830,8 @@ inlineToOpenXML opts (Image alt (src, tit)) = do
case M.lookup src imgs of
Just (_,_,_,elt,_) -> return [elt]
Nothing -> do
res <- liftIO $ fetchItem (writerSourceURL opts) src
res <- liftIO $
fetchItem' (writerMediaBag opts) (writerSourceURL opts) src
case res of
Left (_ :: E.SomeException) -> do
liftIO $ warn $ "Could not find image `" ++ src ++ "', skipping..."

View file

@ -360,7 +360,8 @@ writeEPUB opts doc@(Pandoc meta _) = do
walkM (transformBlock opts' mediaRef)
pics <- readIORef mediaRef
let readPicEntry entries (oldsrc, newsrc) = do
res <- fetchItem (writerSourceURL opts') oldsrc
res <- fetchItem' (writerMediaBag opts')
(writerSourceURL opts') oldsrc
case res of
Left _ -> do
warn $ "Could not find media `" ++ oldsrc ++ "', skipping..."

View file

@ -38,7 +38,7 @@ import qualified Data.ByteString.Lazy as B
import Text.Pandoc.UTF8 ( fromStringLazy )
import Codec.Archive.Zip
import Text.Pandoc.Options ( WriterOptions(..) )
import Text.Pandoc.Shared ( stringify, readDataFile, fetchItem, warn )
import Text.Pandoc.Shared ( stringify, readDataFile, fetchItem', warn )
import Text.Pandoc.ImageSize ( imageSize, sizeInPoints )
import Text.Pandoc.MIME ( getMimeType )
import Text.Pandoc.Definition
@ -131,7 +131,7 @@ writeODT opts doc@(Pandoc meta _) = do
transformPicMath :: WriterOptions -> IORef [Entry] -> Inline -> IO Inline
transformPicMath opts entriesRef (Image lab (src,_)) = do
res <- fetchItem (writerSourceURL opts) src
res <- fetchItem' (writerMediaBag opts) (writerSourceURL opts) src
case res of
Left (_ :: E.SomeException) -> do
warn $ "Could not find image `" ++ src ++ "', skipping..."