git.iko.soy/typeable/pandoc
on master help sign in
Text.Pandoc: writers now an assoc list of String, Writer.
e6c7652John MacFarlane
src/Text/Pandoc.hs+57−54
@@ -63,7 +63,6 @@ module Text.Pandoc
63 -- * Lists of readers and writers
63 -- * Lists of readers and writers
64 , readers
64 , readers
65 , writers
65 , writers
66− , iowriters
67 -- * Readers: converting /to/ Pandoc format
66 -- * Readers: converting /to/ Pandoc format
68 , readMarkdown
67 , readMarkdown
69 , readRST
68 , readRST
@@ -81,6 +80,7 @@ module Text.Pandoc
81 , NoteTable
80 , NoteTable
82 , HeaderType (..)
81 , HeaderType (..)
83 -- * Writers: converting /from/ Pandoc format
82 -- * Writers: converting /from/ Pandoc format
83+ , Writer (..)
84 , writeNative
84 , writeNative
85 , writeMarkdown
85 , writeMarkdown
86 , writePlain
86 , writePlain
@@ -151,6 +151,7 @@ import Text.Pandoc.Writers.AsciiDoc
151import Text.Pandoc.Templates
151import Text.Pandoc.Templates
152import Text.Pandoc.Parsing
152import Text.Pandoc.Parsing
153import Text.Pandoc.Shared
153import Text.Pandoc.Shared
154+import Data.ByteString.Lazy (ByteString)
154import Data.Version (showVersion)
155import Data.Version (showVersion)
155import Text.JSON.Generic
156import Text.JSON.Generic
156import Paths_pandoc (version)
157import Paths_pandoc (version)
@@ -178,60 +179,62 @@ readers = [("native" , \_ -> readNative)
178 readLaTeX st{ stateLiterateHaskell = True})
179 readLaTeX st{ stateLiterateHaskell = True})
179 ]
180 ]
180
181
181−-- | Association list of formats and writers (omitting the
182+data Writer = PureStringWriter (WriterOptions -> Pandoc -> String)
182−-- binary writers, odt, docx, and epub).
183+ | IOStringWriter (WriterOptions -> Pandoc -> IO String)
183−writers :: [ ( String, WriterOptions -> Pandoc -> String ) ]
184+ | IOByteStringWriter (WriterOptions -> Pandoc -> IO ByteString)
184−writers = [("native" , writeNative)
185− ,("json" , \_ -> encodeJSON)
186− ,("html" , writeHtmlString)
187− ,("html5" , \o ->
188− writeHtmlString o{ writerHtml5 = True })
189− ,("html+lhs" , \o ->
190− writeHtmlString o{ writerLiterateHaskell = True })
191− ,("html5+lhs" , \o ->
192− writeHtmlString o{ writerLiterateHaskell = True,
193− writerHtml5 = True })
194− ,("s5" , \o ->
195− writeHtmlString o{ writerSlideVariant = S5Slides
196− , writerTableOfContents = False })
197− ,("slidy" , \o ->
198− writeHtmlString o{ writerSlideVariant = SlidySlides })
199− ,("slideous" , \o ->
200− writeHtmlString o{ writerSlideVariant = SlideousSlides })
201− ,("dzslides" , \o ->
202− writeHtmlString o{ writerSlideVariant = DZSlides
203− , writerHtml5 = True })
204− ,("docbook" , writeDocbook)
205− ,("opendocument" , writeOpenDocument)
206− ,("latex" , writeLaTeX)
207− ,("latex+lhs" , \o ->
208− writeLaTeX o{ writerLiterateHaskell = True })
209− ,("beamer" , \o ->
210− writeLaTeX o{ writerBeamer = True })
211− ,("beamer+lhs" , \o ->
212− writeLaTeX o{ writerBeamer = True, writerLiterateHaskell = True })
213− ,("context" , writeConTeXt)
214− ,("texinfo" , writeTexinfo)
215− ,("man" , writeMan)
216− ,("markdown" , writeMarkdown)
217− ,("markdown+lhs" , \o ->
218− writeMarkdown o{ writerLiterateHaskell = True })
219− ,("plain" , writePlain)
220− ,("rst" , writeRST)
221− ,("rst+lhs" , \o ->
222− writeRST o{ writerLiterateHaskell = True })
223− ,("mediawiki" , writeMediaWiki)
224− ,("textile" , writeTextile)
225− ,("rtf" , writeRTF)
226− ,("org" , writeOrg)
227− ,("asciidoc" , writeAsciiDoc)
228− ]
229
185
230−-- | Association list of formats and writers which require IO to work.
186+-- | Association list of formats and writers.
231−-- These writers produce text output as well as thoses in 'writers'.
187+writers :: [ ( String, Writer ) ]
232−iowriters :: [ (String, WriterOptions -> Pandoc -> IO String) ]
188+writers = [
189+ ("native" , PureStringWriter writeNative)
190+ ,("json" , PureStringWriter $ \_ -> encodeJSON)
191+ ,("docx" , IOByteStringWriter writeDocx)
192+ ,("odt" , IOByteStringWriter writeODT)
193+ ,("epub" , IOByteStringWriter writeEPUB)
233−iowriters = [ ("fb2" , writeFB2)
194+ ,("fb2" , IOStringWriter writeFB2)
195+ ,("html" , PureStringWriter writeHtmlString)
196+ ,("html5" , PureStringWriter $ \o ->
197+ writeHtmlString o{ writerHtml5 = True })
198+ ,("html+lhs" , PureStringWriter $ \o ->
199+ writeHtmlString o{ writerLiterateHaskell = True })
200+ ,("html5+lhs" , PureStringWriter $ \o ->
201+ writeHtmlString o{ writerLiterateHaskell = True,
202+ writerHtml5 = True })
203+ ,("s5" , PureStringWriter $ \o ->
204+ writeHtmlString o{ writerSlideVariant = S5Slides
205+ , writerTableOfContents = False })
206+ ,("slidy" , PureStringWriter $ \o ->
207+ writeHtmlString o{ writerSlideVariant = SlidySlides })
208+ ,("slideous" , PureStringWriter $ \o ->
209+ writeHtmlString o{ writerSlideVariant = SlideousSlides })
210+ ,("dzslides" , PureStringWriter $ \o ->
211+ writeHtmlString o{ writerSlideVariant = DZSlides
212+ , writerHtml5 = True })
213+ ,("docbook" , PureStringWriter writeDocbook)
214+ ,("opendocument" , PureStringWriter writeOpenDocument)
215+ ,("latex" , PureStringWriter writeLaTeX)
216+ ,("latex+lhs" , PureStringWriter $ \o ->
217+ writeLaTeX o{ writerLiterateHaskell = True })
218+ ,("beamer" , PureStringWriter $ \o ->
219+ writeLaTeX o{ writerBeamer = True })
220+ ,("beamer+lhs" , PureStringWriter $ \o ->
221+ writeLaTeX o{ writerBeamer = True, writerLiterateHaskell = True })
222+ ,("context" , PureStringWriter writeConTeXt)
223+ ,("texinfo" , PureStringWriter writeTexinfo)
224+ ,("man" , PureStringWriter writeMan)
225+ ,("markdown" , PureStringWriter writeMarkdown)
226+ ,("markdown+lhs" , PureStringWriter $ \o ->
227+ writeMarkdown o{ writerLiterateHaskell = True })
228+ ,("plain" , PureStringWriter writePlain)
229+ ,("rst" , PureStringWriter writeRST)
230+ ,("rst+lhs" , PureStringWriter $ \o ->
231+ writeRST o{ writerLiterateHaskell = True })
232+ ,("mediawiki" , PureStringWriter writeMediaWiki)
233+ ,("textile" , PureStringWriter writeTextile)
234+ ,("rtf" , PureStringWriter writeRTF)
235+ ,("org" , PureStringWriter writeOrg)
236+ ,("asciidoc" , PureStringWriter writeAsciiDoc)
234− ]
237+ ]
235
238
236{-# DEPRECATED jsonFilter "Use toJsonFilter instead" #-}
239{-# DEPRECATED jsonFilter "Use toJsonFilter instead" #-}
237-- | Converts a transformation on the Pandoc AST into a function
240-- | Converts a transformation on the Pandoc AST into a function
src/pandoc.hs+16−26
@@ -697,7 +697,7 @@ usageMessage programName = usageInfo
697 (wrapWords 16 78 $ readers'names) ++ "\nOutput formats: " ++
697 (wrapWords 16 78 $ readers'names) ++ "\nOutput formats: " ++
698 (wrapWords 16 78 $ writers'names ++ nonTextFormats) ++ "\nOptions:")
698 (wrapWords 16 78 $ writers'names ++ nonTextFormats) ++ "\nOptions:")
699 where
699 where
700− writers'names = map fst writers ++ map fst iowriters
700+ writers'names = map fst writers
701 readers'names = map fst readers
701 readers'names = map fst readers
702
702
703-- Determine default reader based on source file extensions
703-- Determine default reader based on source file extensions
@@ -1038,36 +1038,26 @@ main = do
1038 writerFn "-" = UTF8.putStr
1038 writerFn "-" = UTF8.putStr
1039 writerFn f = UTF8.writeFile f
1039 writerFn f = UTF8.writeFile f
1040
1040
1041− let purewriter = lookup writerName' writers
1041+ let mbwriter = lookup writerName' writers
1042− let iowriter = lookup writerName' iowriters
1042+ case mbwriter of
1043− case (purewriter, iowriter) of
1044− (Nothing, Just iow) -> do
1045− d <- iow writerOptions doc2
1046− writerFn outputFile d
1047− (Nothing, Nothing)
1048− | writerName' == "epub" ->
1049− writeEPUB writerOptions doc2
1050− >>= writeBinary
1051− | writerName' == "odt" ->
1052− writeODT writerOptions doc2 >>= writeBinary
1053− | writerName' == "docx" ->
1054− writeDocx writerOptions doc2 >>= writeBinary
1055− | otherwise -> err 9 ("Unknown writer: " ++ writerName')
1043+ Nothing -> err 9 ("Unknown writer: " ++ writerName')
1056− (Just w, _)
1044+ Just (IOStringWriter f) -> f writerOptions doc2 >>= writerFn outputFile
1045+ Just (IOByteStringWriter f) -> f writerOptions doc2 >>= writeBinary
1046+ Just (PureStringWriter f)
1057− | pdfOutput -> do
1047+ | pdfOutput -> do
1058− res <- tex2pdf latexEngine $ w writerOptions doc2
1048+ res <- tex2pdf latexEngine $ f writerOptions doc2
1059 case res of
1049 case res of
1060 Right pdf -> writeBinary pdf
1050 Right pdf -> writeBinary pdf
1061 Left err' -> err 43 $ toString err'
1051 Left err' -> err 43 $ toString err'
1062− (Just w, _)
1052+ | otherwise -> selfcontain (f writerOptions doc2 ++
1063− | htmlFormat && ascii ->
1064− writerFn outputFile . toEntities =<< selfcontain result
1065− | otherwise ->
1066− writerFn outputFile =<< selfcontain result
1067− where result = w writerOptions doc2 ++ ['\n' | not standalone']
1053+ ['\n' | not standalone'])
1054+ >>= writerFn outputFile . handleEntities
1068− htmlFormat = writerName' `elem`
1055+ where htmlFormat = writerName' `elem`
1069 ["html","html+lhs","html5","html5+lhs",
1056 ["html","html+lhs","html5","html5+lhs",
1070 "s5","slidy","slideous","dzslides"]
1057 "s5","slidy","slideous","dzslides"]
1071 selfcontain = if selfContained && htmlFormat
1058 selfcontain = if selfContained && htmlFormat
1072 then makeSelfContained datadir
1059 then makeSelfContained datadir
1073 else return
1060 else return
1061+ handleEntities = if htmlFormat && ascii
1062+ then toEntities
1063+ else id