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:
parent
28321a18bf
commit
234652a4b8
6 changed files with 25 additions and 22 deletions
18
pandoc.hs
18
pandoc.hs
|
@ -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
|
||||
|
|
|
@ -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) $
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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..."
|
||||
|
|
|
@ -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..."
|
||||
|
|
|
@ -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..."
|
||||
|
|
Loading…
Add table
Reference in a new issue