summaryrefslogtreecommitdiff
path: root/src/Text/Pandoc.hs
diff options
context:
space:
mode:
authorJesse Rosenthal <jrosenthal@jhu.edu>2016-11-28 17:13:46 -0500
committerJohn MacFarlane <jgm@berkeley.edu>2017-01-25 17:07:40 +0100
commitb53ebcdf8e8e1f7098a0c93ead4b5bf99971c77f (patch)
tree01e8d78b85f68e88a737baec9e6bbc932f0a84be /src/Text/Pandoc.hs
parent840439ab2a4d44bc4d295df0d66003fbcc9bb18e (diff)
Working on readers.
Diffstat (limited to 'src/Text/Pandoc.hs')
-rw-r--r--src/Text/Pandoc.hs95
1 files changed, 49 insertions, 46 deletions
diff --git a/src/Text/Pandoc.hs b/src/Text/Pandoc.hs
index 34b6b8d0c..02217c376 100644
--- a/src/Text/Pandoc.hs
+++ b/src/Text/Pandoc.hs
@@ -69,7 +69,6 @@ module Text.Pandoc
, writers
-- * Readers: converting /to/ Pandoc format
, Reader (..)
- , mkStringReader
, readDocx
, readOdt
, readMarkdown
@@ -183,7 +182,7 @@ import Text.Pandoc.Options
import Text.Pandoc.Shared (safeRead, warn, mapLeft, pandocVersion)
import Text.Pandoc.MediaBag (MediaBag)
import Text.Pandoc.Error
-import Text.Pandoc.Class (PandocMonad, runIOorExplode)
+import Text.Pandoc.Class (PandocMonad, runIOorExplode, PandocExecutionError(..))
import Data.Aeson
import qualified Data.ByteString.Lazy as BL
import Data.List (intercalate)
@@ -192,6 +191,7 @@ import qualified Data.Set as Set
import Text.Parsec
import Text.Parsec.Error
import qualified Text.Pandoc.UTF8 as UTF8
+import Control.Monad.Except (throwError)
parseFormatSpec :: String
-> Either ParseError (String, Set Extension -> Set Extension)
@@ -216,55 +216,58 @@ parseFormatSpec = parse formatSpec ""
-- TODO: when we get the PandocMonad stuff all sorted out,
-- we can simply these types considerably. Errors/MediaBag can be
-- part of the monad's internal state.
-data Reader m = StringReader (ReaderOptions -> String -> m (Either PandocError Pandoc))
- | ByteStringReader (ReaderOptions -> BL.ByteString -> m (Either PandocError (Pandoc,MediaBag)))
+data Reader m = StringReader (ReaderOptions -> String -> m Pandoc)
+ | ByteStringReader (ReaderOptions -> BL.ByteString -> m Pandoc)
-mkStringReader :: (ReaderOptions -> String -> Either PandocError Pandoc) -> Reader IO
-mkStringReader r = StringReader (\o s -> return $ r o s)
+-- mkStringReader :: (ReaderOptions -> String -> Either PandocError Pandoc) -> Reader IO
+-- mkStringReader r = StringReader (\o s -> return $ r o s)
-mkStringReaderWithWarnings :: (ReaderOptions -> String -> Either PandocError (Pandoc, [String])) -> Reader IO
-mkStringReaderWithWarnings r = StringReader $ \o s ->
- case r o s of
- Left err -> return $ Left err
- Right (doc, warnings) -> do
- mapM_ warn warnings
- return (Right doc)
+-- mkStringReaderWithWarnings :: (ReaderOptions -> String -> Either PandocError (Pandoc, [String])) -> Reader IO
+-- mkStringReaderWithWarnings r = StringReader $ \o s ->
+-- case r o s of
+-- Left err -> return $ Left err
+-- Right (doc, warnings) -> do
+-- mapM_ warn warnings
+-- return (Right doc)
-mkBSReader :: (ReaderOptions -> BL.ByteString -> Either PandocError (Pandoc, MediaBag)) -> Reader IO
-mkBSReader r = ByteStringReader (\o s -> return $ r o s)
+-- mkBSReader :: (ReaderOptions -> BL.ByteString -> Either PandocError (Pandoc, MediaBag)) -> Reader IO
+-- mkBSReader r = ByteStringReader (\o s -> return $ r o s)
-mkBSReaderWithWarnings :: (ReaderOptions -> BL.ByteString -> Either PandocError (Pandoc, MediaBag, [String])) -> Reader IO
-mkBSReaderWithWarnings r = ByteStringReader $ \o s ->
- case r o s of
- Left err -> return $ Left err
- Right (doc, mediaBag, warnings) -> do
- mapM_ warn warnings
- return $ Right (doc, mediaBag)
+-- mkBSReaderWithWarnings :: (ReaderOptions -> BL.ByteString -> Either PandocError (Pandoc, MediaBag, [String])) -> Reader IO
+-- mkBSReaderWithWarnings r = ByteStringReader $ \o s ->
+-- case r o s of
+-- Left err -> return $ Left err
+-- Right (doc, mediaBag, warnings) -> do
+-- mapM_ warn warnings
+-- return $ Right (doc, mediaBag)
-- | Association list of formats and readers.
-readers :: [(String, Reader IO)]
-readers = [ ("native" , StringReader $ \_ s -> runIOorExplode (readNative s))
- ,("json" , mkStringReader readJSON )
- ,("markdown" , mkStringReaderWithWarnings readMarkdownWithWarnings)
- ,("markdown_strict" , mkStringReaderWithWarnings readMarkdownWithWarnings)
- ,("markdown_phpextra" , mkStringReaderWithWarnings readMarkdownWithWarnings)
- ,("markdown_github" , mkStringReaderWithWarnings readMarkdownWithWarnings)
- ,("markdown_mmd", mkStringReaderWithWarnings readMarkdownWithWarnings)
- ,("commonmark" , mkStringReader readCommonMark)
- ,("rst" , mkStringReaderWithWarnings readRSTWithWarnings )
- ,("mediawiki" , mkStringReader readMediaWiki)
- ,("docbook" , mkStringReader readDocBook)
- ,("opml" , mkStringReader readOPML)
- ,("org" , mkStringReader readOrg)
- ,("textile" , mkStringReader readTextile) -- TODO : textile+lhs
- ,("html" , mkStringReader readHtml)
- ,("latex" , mkStringReader readLaTeX)
- ,("haddock" , mkStringReader readHaddock)
- ,("twiki" , mkStringReader readTWiki)
- ,("docx" , mkBSReaderWithWarnings readDocxWithWarnings)
- ,("odt" , mkBSReader readOdt)
- ,("t2t" , mkStringReader readTxt2TagsNoMacros)
- ,("epub" , mkBSReader readEPUB)
+readers :: PandocMonad m => [(String, Reader m)]
+readers = [ ("native" , StringReader $ \_ s -> readNative s)
+ ,("json" , StringReader $ \o s ->
+ case readJSON o s of
+ Right doc -> return doc
+ Left _ -> throwError $ PandocParseError "JSON parse error")
+ ,("markdown" , StringReader readMarkdown)
+ ,("markdown_strict" , StringReader readMarkdown)
+ ,("markdown_phpextra" , StringReader readMarkdown)
+ ,("markdown_github" , StringReader readMarkdown)
+ ,("markdown_mmd", StringReader readMarkdown)
+ ,("commonmark" , StringReader readCommonMark)
+ ,("rst" , StringReader readRSTWithWarnings )
+ ,("mediawiki" , StringReader readMediaWiki)
+ ,("docbook" , StringReader readDocBook)
+ ,("opml" , StringReader readOPML)
+ ,("org" , StringReader readOrg)
+ ,("textile" , StringReader readTextile) -- TODO : textile+lhs
+ ,("html" , StringReader readHtml)
+ ,("latex" , StringReader readLaTeX)
+ ,("haddock" , StringReader readHaddock)
+ ,("twiki" , StringReader readTWiki)
+ ,("docx" , ByteStringReader readDocx)
+ ,("odt" , ByteStringReader readOdt)
+ -- ,("t2t" , mkStringReader readTxt2TagsNoMacros)
+ ,("epub" , ByteStringReader readEPUB)
]
data Writer m = StringWriter (WriterOptions -> Pandoc -> m String)
@@ -351,7 +354,7 @@ getDefaultExtensions "epub" = Set.fromList [Ext_raw_html,
getDefaultExtensions _ = Set.fromList [Ext_auto_identifiers]
-- | Retrieve reader based on formatSpec (format+extensions).
-getReader :: String -> Either String (Reader IO)
+getReader :: PandocMonad m => String -> Either String (Reader m)
getReader s =
case parseFormatSpec s of
Left e -> Left $ intercalate "\n" [m | Message m <- errorMessages e]