From e6c76525b23856fd9f3e17220eba671fc9fc7d74 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Tue, 24 Jul 2012 19:05:38 -0700 Subject: Text.Pandoc: writers now an assoc list of String, Writer. A Writer can be a PureStringWriter, an IOStringWriter, or an IOByteStringWriter. ALL writers are now in the 'writers' list, including the binary writers and fb2 writer. Code simplified at end of pandoc.hs. --- src/Text/Pandoc.hs | 111 +++++++++++++++++++++++++++-------------------------- src/pandoc.hs | 42 ++++++++------------ 2 files changed, 73 insertions(+), 80 deletions(-) diff --git a/src/Text/Pandoc.hs b/src/Text/Pandoc.hs index a813996c0..ca6d00de6 100644 --- a/src/Text/Pandoc.hs +++ b/src/Text/Pandoc.hs @@ -63,7 +63,6 @@ module Text.Pandoc -- * Lists of readers and writers , readers , writers - , iowriters -- * Readers: converting /to/ Pandoc format , readMarkdown , readRST @@ -81,6 +80,7 @@ module Text.Pandoc , NoteTable , HeaderType (..) -- * Writers: converting /from/ Pandoc format + , Writer (..) , writeNative , writeMarkdown , writePlain @@ -151,6 +151,7 @@ import Text.Pandoc.Writers.AsciiDoc import Text.Pandoc.Templates import Text.Pandoc.Parsing import Text.Pandoc.Shared +import Data.ByteString.Lazy (ByteString) import Data.Version (showVersion) import Text.JSON.Generic import Paths_pandoc (version) @@ -178,60 +179,62 @@ readers = [("native" , \_ -> readNative) readLaTeX st{ stateLiterateHaskell = True}) ] --- | Association list of formats and writers (omitting the --- binary writers, odt, docx, and epub). -writers :: [ ( String, WriterOptions -> Pandoc -> String ) ] -writers = [("native" , writeNative) - ,("json" , \_ -> encodeJSON) - ,("html" , writeHtmlString) - ,("html5" , \o -> - writeHtmlString o{ writerHtml5 = True }) - ,("html+lhs" , \o -> - writeHtmlString o{ writerLiterateHaskell = True }) - ,("html5+lhs" , \o -> - writeHtmlString o{ writerLiterateHaskell = True, - writerHtml5 = True }) - ,("s5" , \o -> - writeHtmlString o{ writerSlideVariant = S5Slides - , writerTableOfContents = False }) - ,("slidy" , \o -> - writeHtmlString o{ writerSlideVariant = SlidySlides }) - ,("slideous" , \o -> - writeHtmlString o{ writerSlideVariant = SlideousSlides }) - ,("dzslides" , \o -> - writeHtmlString o{ writerSlideVariant = DZSlides - , writerHtml5 = True }) - ,("docbook" , writeDocbook) - ,("opendocument" , writeOpenDocument) - ,("latex" , writeLaTeX) - ,("latex+lhs" , \o -> - writeLaTeX o{ writerLiterateHaskell = True }) - ,("beamer" , \o -> - writeLaTeX o{ writerBeamer = True }) - ,("beamer+lhs" , \o -> - writeLaTeX o{ writerBeamer = True, writerLiterateHaskell = True }) - ,("context" , writeConTeXt) - ,("texinfo" , writeTexinfo) - ,("man" , writeMan) - ,("markdown" , writeMarkdown) - ,("markdown+lhs" , \o -> - writeMarkdown o{ writerLiterateHaskell = True }) - ,("plain" , writePlain) - ,("rst" , writeRST) - ,("rst+lhs" , \o -> - writeRST o{ writerLiterateHaskell = True }) - ,("mediawiki" , writeMediaWiki) - ,("textile" , writeTextile) - ,("rtf" , writeRTF) - ,("org" , writeOrg) - ,("asciidoc" , writeAsciiDoc) - ] +data Writer = PureStringWriter (WriterOptions -> Pandoc -> String) + | IOStringWriter (WriterOptions -> Pandoc -> IO String) + | IOByteStringWriter (WriterOptions -> Pandoc -> IO ByteString) --- | Association list of formats and writers which require IO to work. --- These writers produce text output as well as thoses in 'writers'. -iowriters :: [ (String, WriterOptions -> Pandoc -> IO String) ] -iowriters = [ ("fb2" , writeFB2) - ] +-- | Association list of formats and writers. +writers :: [ ( String, Writer ) ] +writers = [ + ("native" , PureStringWriter writeNative) + ,("json" , PureStringWriter $ \_ -> encodeJSON) + ,("docx" , IOByteStringWriter writeDocx) + ,("odt" , IOByteStringWriter writeODT) + ,("epub" , IOByteStringWriter writeEPUB) + ,("fb2" , IOStringWriter writeFB2) + ,("html" , PureStringWriter writeHtmlString) + ,("html5" , PureStringWriter $ \o -> + writeHtmlString o{ writerHtml5 = True }) + ,("html+lhs" , PureStringWriter $ \o -> + writeHtmlString o{ writerLiterateHaskell = True }) + ,("html5+lhs" , PureStringWriter $ \o -> + writeHtmlString o{ writerLiterateHaskell = True, + writerHtml5 = True }) + ,("s5" , PureStringWriter $ \o -> + writeHtmlString o{ writerSlideVariant = S5Slides + , writerTableOfContents = False }) + ,("slidy" , PureStringWriter $ \o -> + writeHtmlString o{ writerSlideVariant = SlidySlides }) + ,("slideous" , PureStringWriter $ \o -> + writeHtmlString o{ writerSlideVariant = SlideousSlides }) + ,("dzslides" , PureStringWriter $ \o -> + writeHtmlString o{ writerSlideVariant = DZSlides + , writerHtml5 = True }) + ,("docbook" , PureStringWriter writeDocbook) + ,("opendocument" , PureStringWriter writeOpenDocument) + ,("latex" , PureStringWriter writeLaTeX) + ,("latex+lhs" , PureStringWriter $ \o -> + writeLaTeX o{ writerLiterateHaskell = True }) + ,("beamer" , PureStringWriter $ \o -> + writeLaTeX o{ writerBeamer = True }) + ,("beamer+lhs" , PureStringWriter $ \o -> + writeLaTeX o{ writerBeamer = True, writerLiterateHaskell = True }) + ,("context" , PureStringWriter writeConTeXt) + ,("texinfo" , PureStringWriter writeTexinfo) + ,("man" , PureStringWriter writeMan) + ,("markdown" , PureStringWriter writeMarkdown) + ,("markdown+lhs" , PureStringWriter $ \o -> + writeMarkdown o{ writerLiterateHaskell = True }) + ,("plain" , PureStringWriter writePlain) + ,("rst" , PureStringWriter writeRST) + ,("rst+lhs" , PureStringWriter $ \o -> + writeRST o{ writerLiterateHaskell = True }) + ,("mediawiki" , PureStringWriter writeMediaWiki) + ,("textile" , PureStringWriter writeTextile) + ,("rtf" , PureStringWriter writeRTF) + ,("org" , PureStringWriter writeOrg) + ,("asciidoc" , PureStringWriter writeAsciiDoc) + ] {-# DEPRECATED jsonFilter "Use toJsonFilter instead" #-} -- | Converts a transformation on the Pandoc AST into a function diff --git a/src/pandoc.hs b/src/pandoc.hs index 3baf0251c..e6e9c710c 100644 --- a/src/pandoc.hs +++ b/src/pandoc.hs @@ -697,7 +697,7 @@ usageMessage programName = usageInfo (wrapWords 16 78 $ readers'names) ++ "\nOutput formats: " ++ (wrapWords 16 78 $ writers'names ++ nonTextFormats) ++ "\nOptions:") where - writers'names = map fst writers ++ map fst iowriters + writers'names = map fst writers readers'names = map fst readers -- Determine default reader based on source file extensions @@ -1038,36 +1038,26 @@ main = do writerFn "-" = UTF8.putStr writerFn f = UTF8.writeFile f - let purewriter = lookup writerName' writers - let iowriter = lookup writerName' iowriters - case (purewriter, iowriter) of - (Nothing, Just iow) -> do - d <- iow writerOptions doc2 - writerFn outputFile d - (Nothing, Nothing) - | writerName' == "epub" -> - writeEPUB writerOptions doc2 - >>= writeBinary - | writerName' == "odt" -> - writeODT writerOptions doc2 >>= writeBinary - | writerName' == "docx" -> - writeDocx writerOptions doc2 >>= writeBinary - | otherwise -> err 9 ("Unknown writer: " ++ writerName') - (Just w, _) - | pdfOutput -> do - res <- tex2pdf latexEngine $ w writerOptions doc2 + let mbwriter = lookup writerName' writers + case mbwriter of + Nothing -> err 9 ("Unknown writer: " ++ writerName') + Just (IOStringWriter f) -> f writerOptions doc2 >>= writerFn outputFile + Just (IOByteStringWriter f) -> f writerOptions doc2 >>= writeBinary + Just (PureStringWriter f) + | pdfOutput -> do + res <- tex2pdf latexEngine $ f writerOptions doc2 case res of Right pdf -> writeBinary pdf Left err' -> err 43 $ toString err' - (Just w, _) - | htmlFormat && ascii -> - writerFn outputFile . toEntities =<< selfcontain result - | otherwise -> - writerFn outputFile =<< selfcontain result - where result = w writerOptions doc2 ++ ['\n' | not standalone'] - htmlFormat = writerName' `elem` + | otherwise -> selfcontain (f writerOptions doc2 ++ + ['\n' | not standalone']) + >>= writerFn outputFile . handleEntities + where htmlFormat = writerName' `elem` ["html","html+lhs","html5","html5+lhs", "s5","slidy","slideous","dzslides"] selfcontain = if selfContained && htmlFormat then makeSelfContained datadir else return + handleEntities = if htmlFormat && ascii + then toEntities + else id -- cgit v1.2.3