@@ -1079,7 +1079,7 @@ defaultWriterName x =
10791079
10801080-- Transformations of a Pandoc document post-parsing:
10811081
1082−extractMedia :: MediaBag -> FilePath -> Pandoc -> IO Pandoc
1082+extractMedia :: MonadIO m => MediaBag -> FilePath -> Pandoc -> m Pandoc
10831083extractMedia media dir d =
10841084 case [fp | (fp, _, _) <- mediaDirectory media] of
10851085 [] -> return d
@@ -1092,10 +1092,10 @@ adjustImagePath dir paths (Image attr lab (src, tit))
10921092 | src `elem` paths = Image attr lab (dir ++ "/" ++ src, tit)
10931093adjustImagePath _ _ x = x
10941094
1095−adjustMetadata :: M.Map String MetaValue -> Pandoc -> IO Pandoc
1095+adjustMetadata :: Monad m => M.Map String MetaValue -> Pandoc -> m Pandoc
10961096adjustMetadata metadata d = return $ M.foldWithKey setMeta d metadata
10971097
1098−applyTransforms :: [Transform] -> Pandoc -> IO Pandoc
1098+applyTransforms :: Monad m => [Transform] -> Pandoc -> m Pandoc
10991099applyTransforms transforms d = return $ foldr ($) d transforms
11001100
11011101 -- First we check to see if a filter is found. If not, and if it's
@@ -1445,53 +1445,53 @@ convertWithOpts opts args = do
14451445 withMediaBag . r readerOpts) sources
14461446 return (mconcat (map fst pairs), mconcat (map snd pairs))
14471447
1448− (doc, media) <- runIO' $ sourceToDoc sources
1449−
1450− doc' <- (maybe return (extractMedia media) mbExtractMedia >=>
1451− adjustMetadata metadata >=>
1452− applyTransforms transforms >=>
1453− applyFilters datadir filters' [format]) doc
1454−
1455− let writerOptions' = writerOptions{ writerMediaBag = media }
1456− case writer of
1457− -- StringWriter f -> f writerOptions doc' >>= writerFn outputFile
1458− ByteStringWriter f -> (runIO' $ f writerOptions' doc')
1459− >>= writeFnBinary outputFile
1460− StringWriter f
1461− | pdfOutput -> do
1462− -- make sure writer is latex or beamer or context or html5
1463− unless (laTeXOutput || conTeXtOutput || html5Output) $
1464− err 47 $ "cannot produce pdf output with " ++ format ++
1465− " writer"
1466−
1467− let pdfprog = case () of
1468− _ | conTeXtOutput -> "context"
1469− _ | html5Output -> "wkhtmltopdf"
1470− _ -> latexEngine
1471− -- check for pdf creating program
1472− mbPdfProg <- findExecutable pdfprog
1473− when (isNothing mbPdfProg) $
1474− err 41 $ pdfprog ++ " not found. " ++
1475− pdfprog ++ " is needed for pdf output."
1476−
1477− res <- makePDF pdfprog f writerOptions' doc'
1478− case res of
1479− Right pdf -> writeFnBinary outputFile pdf
1480− Left err' -> do
1481− B.hPutStr stderr err'
1482− B.hPut stderr $ B.pack [10]
1483− err 43 "Error producing PDF"
1484− | otherwise -> do
1485− let htmlFormat = format `elem`
1486− ["html","html5","s5","slidy","slideous","dzslides","revealjs"]
1487− selfcontain = if selfContained && htmlFormat
1488− then makeSelfContained writerOptions'
1489− else return
1490− handleEntities = if htmlFormat && ascii
1491− then toEntities
1492− else id
1493− output <- runIO' $ f writerOptions' doc'
1494− selfcontain (output ++ ['\n' | not standalone']) >>= writerFn outputFile . handleEntities
1448+ runIO' $ do
1449+ (doc, media) <- sourceToDoc sources
1450+ doc' <- (maybe return (extractMedia media) mbExtractMedia >=>
1451+ adjustMetadata metadata >=>
1452+ applyTransforms transforms >=>
1453+ applyFilters datadir filters' [format]) doc
1454+
1455+ let writerOptions' = writerOptions{ writerMediaBag = media }
1456+ case writer of
1457+ -- StringWriter f -> f writerOptions doc' >>= writerFn outputFile
1458+ ByteStringWriter f -> f writerOptions' doc' >>= writeFnBinary outputFile
1459+ StringWriter f
1460+ | pdfOutput -> do
1461+ -- make sure writer is latex or beamer or context or html5
1462+ unless (laTeXOutput || conTeXtOutput || html5Output) $
1463+ err 47 $ "cannot produce pdf output with " ++ format ++
1464+ " writer"
1465+
1466+ let pdfprog = case () of
1467+ _ | conTeXtOutput -> "context"
1468+ _ | html5Output -> "wkhtmltopdf"
1469+ _ -> latexEngine
1470+ -- check for pdf creating program
1471+ mbPdfProg <- liftIO $ findExecutable pdfprog
1472+ when (isNothing mbPdfProg) $
1473+ err 41 $ pdfprog ++ " not found. " ++
1474+ pdfprog ++ " is needed for pdf output."
1475+
1476+ res <- makePDF pdfprog f writerOptions' doc'
1477+ case res of
1478+ Right pdf -> writeFnBinary outputFile pdf
1479+ Left err' -> liftIO $ do
1480+ B.hPutStr stderr err'
1481+ B.hPut stderr $ B.pack [10]
1482+ err 43 "Error producing PDF"
1483+ | otherwise -> do
1484+ let htmlFormat = format `elem`
1485+ ["html","html5","s5","slidy","slideous","dzslides","revealjs"]
1486+ selfcontain = if selfContained && htmlFormat
1487+ then makeSelfContained writerOptions'
1488+ else return
1489+ handleEntities = if htmlFormat && ascii
1490+ then toEntities
1491+ else id
1492+ output <- f writerOptions' doc'
1493+ selfcontain (output ++ ['\n' | not standalone']) >>=
1494+ writerFn outputFile . handleEntities
14951495
14961496readSource :: MonadIO m => FilePath -> m String
14971497readSource "-" = liftIO UTF8.getContents