diff --git a/pandoc.cabal b/pandoc.cabal index cd948d253..1c6f3fbd8 100644 --- a/pandoc.cabal +++ b/pandoc.cabal @@ -400,6 +400,7 @@ extra-source-files: test/odt/native/*.native test/lua/*.lua test/lua/module/*.lua + test/lua/module/tiny.epub source-repository head type: git location: git://github.com/jgm/pandoc.git diff --git a/src/Text/Pandoc/Lua/Module/Pandoc.hs b/src/Text/Pandoc/Lua/Module/Pandoc.hs index 20c2f5af5..d2d74aaa8 100644 --- a/src/Text/Pandoc/Lua/Module/Pandoc.hs +++ b/src/Text/Pandoc/Lua/Module/Pandoc.hs @@ -21,7 +21,6 @@ module Text.Pandoc.Lua.Module.Pandoc import Prelude hiding (read) import Control.Monad (forM_, when) import Control.Monad.Catch (catch, throwM) -import Control.Monad.Except (throwError) import Data.Data (Data, dataTypeConstrs, dataTypeOf, showConstr) import Data.Default (Default (..)) import Data.Maybe (fromMaybe) @@ -47,6 +46,7 @@ import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString.Lazy.Char8 as BSL import qualified Data.Text as T import qualified Text.Pandoc.Lua.Util as LuaUtil +import qualified Text.Pandoc.UTF8 as UTF8 import Text.Pandoc.Error -- | Push the "pandoc" package to the Lua stack. Requires the `List` @@ -170,12 +170,12 @@ functions = , defun "read" ### (\content mformatspec mreaderOptions -> do let formatSpec = fromMaybe "markdown" mformatspec - readerOptions = fromMaybe def mreaderOptions + readerOpts = fromMaybe def mreaderOptions res <- Lua.liftIO . runIO $ getReader formatSpec >>= \case - (TextReader r, es) -> r readerOptions{ readerExtensions = es } - content - _ -> throwError $ PandocSomeError - "Only textual formats are supported" + (TextReader r, es) -> + r readerOpts{ readerExtensions = es } (UTF8.toText content) + (ByteStringReader r, es) -> + r readerOpts{ readerExtensions = es } (BSL.fromStrict content) case res of Right pd -> return pd -- success, got a Pandoc document Left (PandocUnknownReaderError f) -> @@ -185,7 +185,7 @@ functions = "Extension " <> e <> " not supported for " <> f Left e -> throwM e) - <#> parameter peekText "string" "content" "text to parse" + <#> parameter peekByteString "string" "content" "text to parse" <#> optionalParameter peekText "string" "formatspec" "format and extensions" <#> optionalParameter peekReaderOptions "ReaderOptions" "reader_options" "reader options" diff --git a/test/lua/module/pandoc.lua b/test/lua/module/pandoc.lua index 892ffee03..397182438 100644 --- a/test/lua/module/pandoc.lua +++ b/test/lua/module/pandoc.lua @@ -279,6 +279,14 @@ return { pandoc.read(indented_code, 'markdown', {indented_code_classes={'foo'}}) ) end), + test('can read epub', function () + local epub = io.open('lua/module/tiny.epub', 'rb') + local blocks = pandoc.read(epub:read'a', 'epub').blocks + assert.are_equal( + blocks[#blocks], + pandoc.Para { pandoc.Emph 'EPUB' } + ) + end), test('failing read', function () assert.error_matches( function () pandoc.read('foo', 'nosuchreader') end, diff --git a/test/lua/module/tiny.epub b/test/lua/module/tiny.epub new file mode 100644 index 000000000..9e92202b7 Binary files /dev/null and b/test/lua/module/tiny.epub differ