Readers.getReader, Writers.getWriter API change.

Now these functions return a pair of a reader/writer and an
Extensions, instead of building the extensions into the
reader/writer.  The calling code must explicitly set
readerExtensions or writerExtensions using the Extensions
returned.

The point of the change is to make it possible for the
calling code to determine what extensions are being used.

See #3659.
This commit is contained in:
John MacFarlane 2017-06-24 13:47:10 +02:00
parent dd8f086a2c
commit 743419af5c
5 changed files with 26 additions and 26 deletions

View file

@ -182,11 +182,12 @@ convertWithOpts opts = do
let msOutput = format == "ms"
-- disabling the custom writer for now
writer <- if ".lua" `isSuffixOf` format
(writer, writerExts) <-
if ".lua" `isSuffixOf` format
-- note: use non-lowercased version writerName
then return (TextWriter
(\o d -> liftIO $ writeCustom writerName o d)
:: Writer PandocIO)
:: Writer PandocIO, mempty)
else case getWriter writerName of
Left e -> E.throwIO $ PandocAppError $
if format == "pdf"
@ -196,12 +197,13 @@ convertWithOpts opts = do
"\nand specify an output file with " ++
".pdf extension (-o filename.pdf)."
else e
Right w -> return (w :: Writer PandocIO)
Right (w, es) -> return (w :: Writer PandocIO, es)
-- TODO: we have to get the input and the output into the state for
-- the sake of the text2tags reader.
reader <- case getReader readerName of
Right r -> return (r :: Reader PandocIO)
(reader, readerExts) <-
case getReader readerName of
Right (r, es) -> return (r :: Reader PandocIO, es)
Left e -> E.throwIO $ PandocAppError e'
where e' = case readerName of
"pdf" -> e ++
@ -310,6 +312,7 @@ convertWithOpts opts = do
optDefaultImageExtension opts
, readerTrackChanges = optTrackChanges opts
, readerAbbreviations = abbrevs
, readerExtensions = readerExts
}
highlightStyle <- lookupHighlightStyle $ optHighlightStyle opts
@ -340,6 +343,7 @@ convertWithOpts opts = do
writerNumberSections = optNumberSections opts,
writerNumberOffset = optNumberOffset opts,
writerSectionDivs = optSectionDivs opts,
writerExtensions = writerExts,
writerReferenceLinks = optReferenceLinks opts,
writerReferenceLocation = optReferenceLocation opts,
writerDpi = optDpi opts,

View file

@ -34,6 +34,7 @@ import Data.Text (pack)
import Scripting.Lua (LuaState, call, push, pushhsfunction, rawset)
import Text.Pandoc.Class hiding (readDataFile)
import Text.Pandoc.Definition (Pandoc)
import Text.Pandoc.Options (ReaderOptions(readerExtensions))
import Text.Pandoc.Lua.Compat (loadstring)
import Text.Pandoc.Lua.StackInstances ()
import Text.Pandoc.Readers (Reader (..), getReader)
@ -57,10 +58,10 @@ read_doc :: String -> String -> IO (Either String Pandoc)
read_doc formatSpec content = do
case getReader formatSpec of
Left s -> return $ Left s
Right reader ->
Right (reader, es) ->
case reader of
TextReader r -> do
res <- runIO $ r def (pack content)
res <- runIO $ r def{ readerExtensions = es } (pack content)
case res of
Left s -> return . Left $ show s
Right pd -> return $ Right pd

View file

@ -133,20 +133,16 @@ readers = [ ("native" , TextReader readNative)
,("muse" , TextReader readMuse)
]
-- | Retrieve reader based on formatSpec (format+extensions).
getReader :: PandocMonad m => String -> Either String (Reader m)
-- | Retrieve reader, extensions based on formatSpec (format+extensions).
getReader :: PandocMonad m => String -> Either String (Reader m, Extensions)
getReader s =
case parseFormatSpec s of
Left e -> Left $ intercalate "\n" [m | Message m <- errorMessages e]
Right (readerName, setExts) ->
case lookup readerName readers of
Nothing -> Left $ "Unknown reader: " ++ readerName
Just (TextReader r) -> Right $ TextReader $ \o ->
r o{ readerExtensions = setExts $
getDefaultExtensions readerName }
Just (ByteStringReader r) -> Right $ ByteStringReader $ \o ->
r o{ readerExtensions = setExts $
getDefaultExtensions readerName }
Just r -> Right (r, setExts $
getDefaultExtensions readerName)
-- | Read pandoc document from JSON format.
readJSON :: ReaderOptions -> Text -> Either PandocError Pandoc

View file

@ -176,19 +176,16 @@ writers = [
,("muse" , TextWriter writeMuse)
]
getWriter :: PandocMonad m => String -> Either String (Writer m)
-- | Retrieve writer, extensions based on formatSpec (format+extensions).
getWriter :: PandocMonad m => String -> Either String (Writer m, Extensions)
getWriter s
= case parseFormatSpec s of
Left e -> Left $ intercalate "\n" [m | Message m <- errorMessages e]
Right (writerName, setExts) ->
case lookup writerName writers of
Nothing -> Left $ "Unknown writer: " ++ writerName
Just (TextWriter r) -> Right $ TextWriter $
\o -> r o{ writerExtensions = setExts $
getDefaultExtensions writerName }
Just (ByteStringWriter r) -> Right $ ByteStringWriter $
\o -> r o{ writerExtensions = setExts $
getDefaultExtensions writerName }
Just r -> Right (r, setExts $
getDefaultExtensions writerName)
writeJSON :: WriterOptions -> Pandoc -> Text
writeJSON _ = UTF8.toText . BL.toStrict . encode

View file

@ -3,15 +3,15 @@ module Main where
import Network.Wai.Handler.CGI
import Network.Wai
import Control.Applicative ((<$>))
import Data.Maybe (mapMaybe, fromMaybe)
import Data.Maybe (fromMaybe)
import Network.HTTP.Types.Status (status200)
import Network.HTTP.Types.Header (hContentType)
import Network.HTTP.Types.URI (queryToQueryText)
import Text.Pandoc
import Text.Pandoc.Writers.Math (defaultMathJaxURL)
import Text.Pandoc.Highlighting (pygments)
import Text.Pandoc.Readers (getReader, Reader(..))
import Text.Pandoc.Writers (getWriter, Writer(..))
import Text.Pandoc.Error (PandocError)
import Text.Pandoc.Shared (tabFilter)
import Data.Aeson
import qualified Data.Text as T
@ -29,11 +29,13 @@ app req respond = do
fromFormat <- fromMaybe "" <$> getParam "from"
toFormat <- fromMaybe "" <$> getParam "to"
let reader = case getReader (T.unpack fromFormat) of
Right (TextReader r) -> r readerOpts
Right (TextReader r, es) -> r readerOpts{
readerExtensions = es }
_ -> error $ "could not find reader for "
++ T.unpack fromFormat
let writer = case getWriter (T.unpack toFormat) of
Right (TextWriter w) -> w writerOpts
Right (TextWriter w, es) -> w writerOpts{
writerExtensions = es }
_ -> error $ "could not find writer for " ++
T.unpack toFormat
let result = case runPure $ reader (tabFilter 4 text) >>= writer of