{-# LANGUAGE OverloadedStrings #-}
module Text.Pandoc.Readers.Xlsx (readXlsx) 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.Xlsx.Parse (archiveToXlsx)
import Text.Pandoc.Readers.Xlsx.Sheets (xlsxToOutput)
readXlsx :: PandocMonad m => ReaderOptions -> B.ByteString -> m Pandoc
readXlsx :: forall (m :: * -> *).
PandocMonad m =>
ReaderOptions -> ByteString -> m Pandoc
readXlsx ReaderOptions
opts ByteString
bytes =
case ByteString -> Either String Archive
toArchiveOrFail ByteString
bytes of
Right Archive
archive ->
case Archive -> Either Text Xlsx
archiveToXlsx Archive
archive of
Right Xlsx
xlsx -> do
let (Meta
meta, [Block]
blocks) = ReaderOptions -> Xlsx -> (Meta, [Block])
xlsxToOutput ReaderOptions
opts Xlsx
xlsx
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 XLSX: " 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 XLSX archive: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack String
err