{-# LANGUAGE OverloadedStrings #-}
module Text.Pandoc.Readers.Pptx (readPptx) where
import qualified Data.ByteString.Lazy as B
import qualified Data.Text as T
import Codec.Archive.Zip (toArchiveOrFail)
import Control.Monad.Except (throwError)
import Text.Pandoc.Class.PandocMonad (PandocMonad)
import Text.Pandoc.Definition (Pandoc(..))
import Text.Pandoc.Error (PandocError(..))
import Text.Pandoc.Options (ReaderOptions)
import Text.Pandoc.Readers.Pptx.Parse (archiveToPptx)
import Text.Pandoc.Readers.Pptx.Slides (pptxToOutput)
readPptx :: PandocMonad m => ReaderOptions -> B.ByteString -> m Pandoc
readPptx :: forall (m :: * -> *).
PandocMonad m =>
ReaderOptions -> ByteString -> m Pandoc
readPptx ReaderOptions
opts ByteString
bytes =
case ByteString -> Either String Archive
toArchiveOrFail ByteString
bytes of
Right Archive
archive ->
case Archive -> Either Text Pptx
archiveToPptx Archive
archive of
Right Pptx
pptx -> do
(Meta
meta, [Block]
blocks) <- ReaderOptions -> Pptx -> m (Meta, [Block])
forall (m :: * -> *).
PandocMonad m =>
ReaderOptions -> Pptx -> m (Meta, [Block])
pptxToOutput ReaderOptions
opts Pptx
pptx
Pandoc -> m Pandoc
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Pandoc -> m Pandoc) -> Pandoc -> m Pandoc
forall a b. (a -> b) -> a -> b
$ Meta -> [Block] -> Pandoc
Pandoc Meta
meta [Block]
blocks
Left Text
err ->
PandocError -> m Pandoc
forall a. PandocError -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (PandocError -> m Pandoc) -> PandocError -> m Pandoc
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocParseError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$
Text
"Failed to parse PPTX: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
err
Left String
err ->
PandocError -> m Pandoc
forall a. PandocError -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (PandocError -> m Pandoc) -> PandocError -> m Pandoc
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocParseError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$
Text
"Failed to unpack PPTX archive: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack String
err