git.iko.soy/typeable/pandoc
on master help sign in
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.

commit743419af5c0872d8e4b5fdf53d47080e8648b4a7 authorJohn MacFarlane <jgm@berkeley.edu> dateSat 24 Jun 2017, 13:47 (9 years ago) parentdd8f086
5 files changed+26−26
src/Text/Pandoc/App.hs+9−5 src/Text/Pandoc/Lua/PandocModule.hs+3−2 src/Text/Pandoc/Readers.hs+4−8 src/Text/Pandoc/Writers.hs+4−7 trypandoc/trypandoc.hs+6−4
src/Text/Pandoc/App.hs+9−5
@@ -182,11 +182,12 @@ convertWithOpts opts = do
182182 let msOutput = format == "ms"
183183
184184 -- disabling the custom writer for now
185− writer <- if ".lua" `isSuffixOf` format
185+ (writer, writerExts) <-
186+ if ".lua" `isSuffixOf` format
186187 -- note: use non-lowercased version writerName
187188 then return (TextWriter
188189 (\o d -> liftIO $ writeCustom writerName o d)
189− :: Writer PandocIO)
190+ :: Writer PandocIO, mempty)
190191 else case getWriter writerName of
191192 Left e -> E.throwIO $ PandocAppError $
192193 if format == "pdf"
@@ -196,12 +197,13 @@ convertWithOpts opts = do
196197 "\nand specify an output file with " ++
197198 ".pdf extension (-o filename.pdf)."
198199 else e
199− Right w -> return (w :: Writer PandocIO)
200+ Right (w, es) -> return (w :: Writer PandocIO, es)
200201
201202 -- TODO: we have to get the input and the output into the state for
202203 -- the sake of the text2tags reader.
203− reader <- case getReader readerName of
204− Right r -> return (r :: Reader PandocIO)
204+ (reader, readerExts) <-
205+ case getReader readerName of
206+ Right (r, es) -> return (r :: Reader PandocIO, es)
205207 Left e -> E.throwIO $ PandocAppError e'
206208 where e' = case readerName of
207209 "pdf" -> e ++
@@ -310,6 +312,7 @@ convertWithOpts opts = do
310312 optDefaultImageExtension opts
311313 , readerTrackChanges = optTrackChanges opts
312314 , readerAbbreviations = abbrevs
315+ , readerExtensions = readerExts
313316 }
314317
315318 highlightStyle <- lookupHighlightStyle $ optHighlightStyle opts
@@ -340,6 +343,7 @@ convertWithOpts opts = do
340343 writerNumberSections = optNumberSections opts,
341344 writerNumberOffset = optNumberOffset opts,
342345 writerSectionDivs = optSectionDivs opts,
346+ writerExtensions = writerExts,
343347 writerReferenceLinks = optReferenceLinks opts,
344348 writerReferenceLocation = optReferenceLocation opts,
345349 writerDpi = optDpi opts,
src/Text/Pandoc/Lua/PandocModule.hs+3−2
@@ -34,6 +34,7 @@ import Data.Text (pack)
3434import Scripting.Lua (LuaState, call, push, pushhsfunction, rawset)
3535import Text.Pandoc.Class hiding (readDataFile)
3636import Text.Pandoc.Definition (Pandoc)
37+import Text.Pandoc.Options (ReaderOptions(readerExtensions))
3738import Text.Pandoc.Lua.Compat (loadstring)
3839import Text.Pandoc.Lua.StackInstances ()
3940import Text.Pandoc.Readers (Reader (..), getReader)
@@ -57,10 +58,10 @@ read_doc :: String -> String -> IO (Either String Pandoc)
5758read_doc formatSpec content = do
5859 case getReader formatSpec of
5960 Left s -> return $ Left s
60− Right reader ->
61+ Right (reader, es) ->
6162 case reader of
6263 TextReader r -> do
63− res <- runIO $ r def (pack content)
64+ res <- runIO $ r def{ readerExtensions = es } (pack content)
6465 case res of
6566 Left s -> return . Left $ show s
6667 Right pd -> return $ Right pd
src/Text/Pandoc/Readers.hs+4−8
@@ -133,20 +133,16 @@ readers = [ ("native" , TextReader readNative)
133133 ,("muse" , TextReader readMuse)
134134 ]
135135
136−-- | Retrieve reader based on formatSpec (format+extensions).
137−getReader :: PandocMonad m => String -> Either String (Reader m)
136+-- | Retrieve reader, extensions based on formatSpec (format+extensions).
137+getReader :: PandocMonad m => String -> Either String (Reader m, Extensions)
138138getReader s =
139139 case parseFormatSpec s of
140140 Left e -> Left $ intercalate "\n" [m | Message m <- errorMessages e]
141141 Right (readerName, setExts) ->
142142 case lookup readerName readers of
143143 Nothing -> Left $ "Unknown reader: " ++ readerName
144− Just (TextReader r) -> Right $ TextReader $ \o ->
145− r o{ readerExtensions = setExts $
146− getDefaultExtensions readerName }
147− Just (ByteStringReader r) -> Right $ ByteStringReader $ \o ->
148− r o{ readerExtensions = setExts $
149− getDefaultExtensions readerName }
144+ Just r -> Right (r, setExts $
145+ getDefaultExtensions readerName)
150146
151147-- | Read pandoc document from JSON format.
152148readJSON :: ReaderOptions -> Text -> Either PandocError Pandoc
src/Text/Pandoc/Writers.hs+4−7
@@ -176,19 +176,16 @@ writers = [
176176 ,("muse" , TextWriter writeMuse)
177177 ]
178178
179−getWriter :: PandocMonad m => String -> Either String (Writer m)
179+-- | Retrieve writer, extensions based on formatSpec (format+extensions).
180+getWriter :: PandocMonad m => String -> Either String (Writer m, Extensions)
180181getWriter s
181182 = case parseFormatSpec s of
182183 Left e -> Left $ intercalate "\n" [m | Message m <- errorMessages e]
183184 Right (writerName, setExts) ->
184185 case lookup writerName writers of
185186 Nothing -> Left $ "Unknown writer: " ++ writerName
186− Just (TextWriter r) -> Right $ TextWriter $
187− \o -> r o{ writerExtensions = setExts $
188− getDefaultExtensions writerName }
189− Just (ByteStringWriter r) -> Right $ ByteStringWriter $
190− \o -> r o{ writerExtensions = setExts $
191− getDefaultExtensions writerName }
187+ Just r -> Right (r, setExts $
188+ getDefaultExtensions writerName)
192189
193190writeJSON :: WriterOptions -> Pandoc -> Text
194191writeJSON _ = UTF8.toText . BL.toStrict . encode
trypandoc/trypandoc.hs+6−4
@@ -3,15 +3,15 @@ module Main where
33import Network.Wai.Handler.CGI
44import Network.Wai
55import Control.Applicative ((<$>))
6−import Data.Maybe (mapMaybe, fromMaybe)
6+import Data.Maybe (fromMaybe)
77import Network.HTTP.Types.Status (status200)
88import Network.HTTP.Types.Header (hContentType)
99import Network.HTTP.Types.URI (queryToQueryText)
1010import Text.Pandoc
11+import Text.Pandoc.Writers.Math (defaultMathJaxURL)
1112import Text.Pandoc.Highlighting (pygments)
1213import Text.Pandoc.Readers (getReader, Reader(..))
1314import Text.Pandoc.Writers (getWriter, Writer(..))
14−import Text.Pandoc.Error (PandocError)
1515import Text.Pandoc.Shared (tabFilter)
1616import Data.Aeson
1717import qualified Data.Text as T
@@ -29,11 +29,13 @@ app req respond = do
2929 fromFormat <- fromMaybe "" <$> getParam "from"
3030 toFormat <- fromMaybe "" <$> getParam "to"
3131 let reader = case getReader (T.unpack fromFormat) of
32− Right (TextReader r) -> r readerOpts
32+ Right (TextReader r, es) -> r readerOpts{
33+ readerExtensions = es }
3334 _ -> error $ "could not find reader for "
3435 ++ T.unpack fromFormat
3536 let writer = case getWriter (T.unpack toFormat) of
36− Right (TextWriter w) -> w writerOpts
37+ Right (TextWriter w, es) -> w writerOpts{
38+ writerExtensions = es }
3739 _ -> error $ "could not find writer for " ++
3840 T.unpack toFormat
3941 let result = case runPure $ reader (tabFilter 4 text) >>= writer of