diff options
author | Jesse Rosenthal <jrosenthal@jhu.edu> | 2016-11-28 17:13:46 -0500 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2017-01-25 17:07:40 +0100 |
commit | b53ebcdf8e8e1f7098a0c93ead4b5bf99971c77f (patch) | |
tree | 01e8d78b85f68e88a737baec9e6bbc932f0a84be /src/Text/Pandoc.hs | |
parent | 840439ab2a4d44bc4d295df0d66003fbcc9bb18e (diff) |
Working on readers.
Diffstat (limited to 'src/Text/Pandoc.hs')
-rw-r--r-- | src/Text/Pandoc.hs | 95 |
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] |