git.iko.soy/typeable/pandoc
on master help sign in
Switched Writer types to use Text.
fa719d0John MacFarlane
benchmark/benchmark-pandoc.hs+5−5
@@ -33,15 +33,15 @@ readerBench :: Pandoc
33 -> Maybe Benchmark
33 -> Maybe Benchmark
34readerBench doc (name, reader) =
34readerBench doc (name, reader) =
35 case lookup name writers of
35 case lookup name writers of
36− Just (StringWriter writer) ->
36+ Just (TextWriter writer) ->
37− let inp = either (error . show) pack $ runPure
37+ let inp = either (error . show) id $ runPure
38 $ writer def{ writerWrapText = WrapAuto} doc
38 $ writer def{ writerWrapText = WrapAuto} doc
39 in return $ bench (name ++ " reader") $ nf
39 in return $ bench (name ++ " reader") $ nf
40 (reader def) inp
40 (reader def) inp
41 _ -> trace ("\nCould not find writer for " ++ name ++ "\n") Nothing
41 _ -> trace ("\nCould not find writer for " ++ name ++ "\n") Nothing
42
42
43writerBench :: Pandoc
43writerBench :: Pandoc
44− -> (String, WriterOptions -> Pandoc -> String)
44+ -> (String, WriterOptions -> Pandoc -> Text)
45 -> Benchmark
45 -> Benchmark
46writerBench doc (name, writer) = bench (name ++ " writer") $ nf
46writerBench doc (name, writer) = bench (name ++ " writer") $ nf
47 (writer def{ writerWrapText = WrapAuto }) doc
47 (writer def{ writerWrapText = WrapAuto }) doc
@@ -55,7 +55,7 @@ main = do
55 [x] -> x == n
55 [x] -> x == n
56 (x:y:_) -> x == n && y == "reader"
56 (x:y:_) -> x == n && y == "reader"
57 matchReader (_, _) = False
57 matchReader (_, _) = False
58− let matchWriter (n, StringWriter _) =
58+ let matchWriter (n, TextWriter _) =
59 case args of
59 case args of
60 [] -> True
60 [] -> True
61 [x] -> x == n
61 [x] -> x == n
@@ -81,7 +81,7 @@ main = do
81 $ filter (\(n,_) -> n /="haddock") readers'
81 $ filter (\(n,_) -> n /="haddock") readers'
82 let writers' = [(n, \o d ->
82 let writers' = [(n, \o d ->
83 either (error . show) id $ runPure $ setupFakeFiles >> w o d)
83 either (error . show) id $ runPure $ setupFakeFiles >> w o d)
84− | (n, StringWriter w) <- matchedWriters]
84+ | (n, TextWriter w) <- matchedWriters]
85 let writerBs = map (writerBench doc)
85 let writerBs = map (writerBench doc)
86 $ writers'
86 $ writers'
87 defaultMainWith defaultConfig{ timeLimit = 6.0 }
87 defaultMainWith defaultConfig{ timeLimit = 6.0 }
benchmark/weigh-pandoc.hs+4−4
@@ -1,6 +1,6 @@
1import Weigh
1import Weigh
2import Text.Pandoc
2import Text.Pandoc
3−import Data.Text (Text, pack)
3+import Data.Text (Text)
4
4
5main :: IO ()
5main :: IO ()
6main = do
6main = do
@@ -24,14 +24,14 @@ main = do
24 ,("commonmark", writeCommonMark)
24 ,("commonmark", writeCommonMark)
25 ]
25 ]
26
26
27−weighWriter :: Pandoc -> String -> (Pandoc -> String) -> Weigh ()
27+weighWriter :: Pandoc -> String -> (Pandoc -> Text) -> Weigh ()
28weighWriter doc name writer = func (name ++ " writer") writer doc
28weighWriter doc name writer = func (name ++ " writer") writer doc
29
29
30weighReader :: Pandoc -> String -> (Text -> Pandoc) -> Weigh ()
30weighReader :: Pandoc -> String -> (Text -> Pandoc) -> Weigh ()
31weighReader doc name reader = do
31weighReader doc name reader = do
32 case lookup name writers of
32 case lookup name writers of
33− Just (StringWriter writer) ->
33+ Just (TextWriter writer) ->
34− let inp = either (error . show) pack $ runPure $ writer def{ writerWrapText = WrapAuto} doc
34+ let inp = either (error . show) id $ runPure $ writer def{ writerWrapText = WrapAuto} doc
35 in func (name ++ " reader") reader inp
35 in func (name ++ " reader") reader inp
36 _ -> return () -- no writer for reader
36 _ -> return () -- no writer for reader
37
37
src/Text/Pandoc/App.hs+18−11
@@ -43,6 +43,7 @@ import qualified Control.Exception as E
43import Control.Monad
43import Control.Monad
44import Control.Monad.Except (throwError)
44import Control.Monad.Except (throwError)
45import Control.Monad.Trans
45import Control.Monad.Trans
46+import Data.Monoid
46import Data.Aeson (FromJSON (..), ToJSON (..), defaultOptions, eitherDecode',
47import Data.Aeson (FromJSON (..), ToJSON (..), defaultOptions, eitherDecode',
47 encode, genericToEncoding)
48 encode, genericToEncoding)
48import qualified Data.ByteString as BS
49import qualified Data.ByteString as BS
@@ -183,7 +184,7 @@ convertWithOpts opts = do
183 -- disabling the custom writer for now
184 -- disabling the custom writer for now
184 writer <- if ".lua" `isSuffixOf` format
185 writer <- if ".lua" `isSuffixOf` format
185 -- note: use non-lowercased version writerName
186 -- note: use non-lowercased version writerName
186− then return (StringWriter
187+ then return (TextWriter
187 (\o d -> liftIO $ writeCustom writerName o d)
188 (\o d -> liftIO $ writeCustom writerName o d)
188 :: Writer PandocIO)
189 :: Writer PandocIO)
189 else case getWriter writerName of
190 else case getWriter writerName of
@@ -442,7 +443,7 @@ convertWithOpts opts = do
442
443
443 case writer of
444 case writer of
444 ByteStringWriter f -> f writerOptions doc >>= writeFnBinary outputFile
445 ByteStringWriter f -> f writerOptions doc >>= writeFnBinary outputFile
445− StringWriter f
446+ TextWriter f
446 | pdfOutput -> do
447 | pdfOutput -> do
447 -- make sure writer is latex, beamer, context, html5 or ms
448 -- make sure writer is latex, beamer, context, html5 or ms
448 unless (laTeXOutput || conTeXtOutput || html5Output ||
449 unless (laTeXOutput || conTeXtOutput || html5Output ||
@@ -469,18 +470,23 @@ convertWithOpts opts = do
469 | otherwise -> do
470 | otherwise -> do
470 let htmlFormat = format `elem`
471 let htmlFormat = format `elem`
471 ["html","html4","html5","s5","slidy","slideous","dzslides","revealjs"]
472 ["html","html4","html5","s5","slidy","slideous","dzslides","revealjs"]
472− selfcontain = if optSelfContained opts && htmlFormat
473− then makeSelfContained writerOptions
474− else return
475 handleEntities = if (htmlFormat ||
473 handleEntities = if (htmlFormat ||
476 format == "docbook4" ||
474 format == "docbook4" ||
477 format == "docbook5" ||
475 format == "docbook5" ||
478 format == "docbook") && optAscii opts
476 format == "docbook") && optAscii opts
479 then toEntities
477 then toEntities
480 else id
478 else id
479+ addNl = if standalone
480+ then id
481+ else (<> T.singleton '\n')
481− output <- f writerOptions doc
482+ output <- (addNl . handleEntities) <$> f writerOptions doc
482− selfcontain (output ++ ['\n' | not standalone]) >>=
483− writerFn eol outputFile . handleEntities
483+ writerFn eol outputFile =<<
484+ if optSelfContained opts && htmlFormat
485+ -- TODO not maximally efficient; change type
486+ -- of makeSelfContained so it works w/ Text
487+ then T.pack <$> makeSelfContained writerOptions
488+ (T.unpack output)
489+ else return output
484
490
485type Transform = Pandoc -> Pandoc
491type Transform = Pandoc -> Pandoc
486
492
@@ -810,9 +816,10 @@ writeFnBinary :: MonadIO m => FilePath -> B.ByteString -> m ()
810writeFnBinary "-" = liftIO . B.putStr
816writeFnBinary "-" = liftIO . B.putStr
811writeFnBinary f = liftIO . B.writeFile (UTF8.encodePath f)
817writeFnBinary f = liftIO . B.writeFile (UTF8.encodePath f)
812
818
813−writerFn :: MonadIO m => IO.Newline -> FilePath -> String -> m ()
819+writerFn :: MonadIO m => IO.Newline -> FilePath -> Text -> m ()
820+-- TODO this implementation isn't maximally efficient:
814−writerFn eol "-" = liftIO . UTF8.putStrWith eol
821+writerFn eol "-" = liftIO . UTF8.putStrWith eol . T.unpack
815−writerFn eol f = liftIO . UTF8.writeFileWith eol f
822+writerFn eol f = liftIO . UTF8.writeFileWith eol f . T.unpack
816
823
817lookupHighlightStyle :: Maybe String -> IO (Maybe Style)
824lookupHighlightStyle :: Maybe String -> IO (Maybe Style)
818lookupHighlightStyle Nothing = return Nothing
825lookupHighlightStyle Nothing = return Nothing
src/Text/Pandoc/PDF.hs+14−13
@@ -36,12 +36,13 @@ import qualified Codec.Picture as JP
36import qualified Control.Exception as E
36import qualified Control.Exception as E
37import Control.Monad (unless, when)
37import Control.Monad (unless, when)
38import Control.Monad.Trans (MonadIO (..))
38import Control.Monad.Trans (MonadIO (..))
39+import qualified Data.Text as T
40+import Data.Text (Text)
39import qualified Data.ByteString as BS
41import qualified Data.ByteString as BS
40import Data.ByteString.Lazy (ByteString)
42import Data.ByteString.Lazy (ByteString)
41import qualified Data.ByteString.Lazy as B
43import qualified Data.ByteString.Lazy as B
42import qualified Data.ByteString.Lazy as BL
44import qualified Data.ByteString.Lazy as BL
43import qualified Data.ByteString.Lazy.Char8 as BC
45import qualified Data.ByteString.Lazy.Char8 as BC
44−import Data.List (isInfixOf)
45import Data.Maybe (fromMaybe)
46import Data.Maybe (fromMaybe)
46import Data.Monoid ((<>))
47import Data.Monoid ((<>))
47import System.Directory
48import System.Directory
@@ -74,7 +75,7 @@ changePathSeparators = intercalate "/" . splitDirectories
74
75
75makePDF :: String -- ^ pdf creator (pdflatex, lualatex,
76makePDF :: String -- ^ pdf creator (pdflatex, lualatex,
76 -- xelatex, context, wkhtmltopdf, pdfroff)
77 -- xelatex, context, wkhtmltopdf, pdfroff)
77− -> (WriterOptions -> Pandoc -> PandocIO String) -- ^ writer
78+ -> (WriterOptions -> Pandoc -> PandocIO Text) -- ^ writer
78 -> WriterOptions -- ^ options
79 -> WriterOptions -- ^ options
79 -> Verbosity -- ^ verbosity level
80 -> Verbosity -- ^ verbosity level
80 -> MediaBag -- ^ media
81 -> MediaBag -- ^ media
@@ -178,10 +179,10 @@ tex2pdf' :: Verbosity -- ^ Verbosity level
178 -> [String] -- ^ Arguments to the latex-engine
179 -> [String] -- ^ Arguments to the latex-engine
179 -> FilePath -- ^ temp directory for output
180 -> FilePath -- ^ temp directory for output
180 -> String -- ^ tex program
181 -> String -- ^ tex program
181− -> String -- ^ tex source
182+ -> Text -- ^ tex source
182 -> IO (Either ByteString ByteString)
183 -> IO (Either ByteString ByteString)
183tex2pdf' verbosity args tmpDir program source = do
184tex2pdf' verbosity args tmpDir program source = do
184− let numruns = if "\\tableofcontents" `isInfixOf` source
185+ let numruns = if "\\tableofcontents" `T.isInfixOf` source
185 then 3 -- to get page numbers
186 then 3 -- to get page numbers
186 else 2 -- 1 run won't give you PDF bookmarks
187 else 2 -- 1 run won't give you PDF bookmarks
187 (exit, log', mbPdf) <- runTeXProgram verbosity program args 1 numruns tmpDir source
188 (exit, log', mbPdf) <- runTeXProgram verbosity program args 1 numruns tmpDir source
@@ -223,11 +224,11 @@ extractConTeXtMsg log' = do
223-- contents of stdout, contents of produced PDF if any). Rerun
224-- contents of stdout, contents of produced PDF if any). Rerun
224-- a fixed number of times to resolve references.
225-- a fixed number of times to resolve references.
225runTeXProgram :: Verbosity -> String -> [String] -> Int -> Int -> FilePath
226runTeXProgram :: Verbosity -> String -> [String] -> Int -> Int -> FilePath
226− -> String -> IO (ExitCode, ByteString, Maybe ByteString)
227+ -> Text -> IO (ExitCode, ByteString, Maybe ByteString)
227runTeXProgram verbosity program args runNumber numRuns tmpDir source = do
228runTeXProgram verbosity program args runNumber numRuns tmpDir source = do
228 let file = tmpDir </> "input.tex"
229 let file = tmpDir </> "input.tex"
229 exists <- doesFileExist file
230 exists <- doesFileExist file
230− unless exists $ UTF8.writeFile file source
231+ unless exists $ BS.writeFile file $ UTF8.fromText source
231#ifdef _WINDOWS
232#ifdef _WINDOWS
232 -- note: we want / even on Windows, for TexLive
233 -- note: we want / even on Windows, for TexLive
233 let tmpDir' = changePathSeparators tmpDir
234 let tmpDir' = changePathSeparators tmpDir
@@ -276,7 +277,7 @@ runTeXProgram verbosity program args runNumber numRuns tmpDir source = do
276
277
277ms2pdf :: Verbosity
278ms2pdf :: Verbosity
278 -> [String]
279 -> [String]
279− -> String
280+ -> Text
280 -> IO (Either ByteString ByteString)
281 -> IO (Either ByteString ByteString)
281ms2pdf verbosity args source = do
282ms2pdf verbosity args source = do
282 env' <- getEnvironment
283 env' <- getEnvironment
@@ -288,10 +289,10 @@ ms2pdf verbosity args source = do
288 mapM_ print env'
289 mapM_ print env'
289 putStr "\n"
290 putStr "\n"
290 putStrLn $ "[makePDF] Contents:\n"
291 putStrLn $ "[makePDF] Contents:\n"
291− putStr source
292+ putStr $ T.unpack source
292 putStr "\n"
293 putStr "\n"
293 (exit, out) <- pipeProcess (Just env') "pdfroff" args
294 (exit, out) <- pipeProcess (Just env') "pdfroff" args
294− (UTF8.fromStringLazy source)
295+ (BL.fromStrict $ UTF8.fromText source)
295 when (verbosity >= INFO) $ do
296 when (verbosity >= INFO) $ do
296 B.hPutStr stdout out
297 B.hPutStr stdout out
297 putStr "\n"
298 putStr "\n"
@@ -301,12 +302,12 @@ ms2pdf verbosity args source = do
301
302
302html2pdf :: Verbosity -- ^ Verbosity level
303html2pdf :: Verbosity -- ^ Verbosity level
303 -> [String] -- ^ Args to wkhtmltopdf
304 -> [String] -- ^ Args to wkhtmltopdf
304− -> String -- ^ HTML5 source
305+ -> Text -- ^ HTML5 source
305 -> IO (Either ByteString ByteString)
306 -> IO (Either ByteString ByteString)
306html2pdf verbosity args source = do
307html2pdf verbosity args source = do
307 file <- withTempFile "." "html2pdf.html" $ \fp _ -> return fp
308 file <- withTempFile "." "html2pdf.html" $ \fp _ -> return fp
308 pdfFile <- withTempFile "." "html2pdf.pdf" $ \fp _ -> return fp
309 pdfFile <- withTempFile "." "html2pdf.pdf" $ \fp _ -> return fp
309− UTF8.writeFile file source
310+ BS.writeFile file $ UTF8.fromText source
310 let programArgs = args ++ [file, pdfFile]
311 let programArgs = args ++ [file, pdfFile]
311 env' <- getEnvironment
312 env' <- getEnvironment
312 when (verbosity >= INFO) $ do
313 when (verbosity >= INFO) $ do
@@ -341,11 +342,11 @@ html2pdf verbosity args source = do
341
342
342context2pdf :: Verbosity -- ^ Verbosity level
343context2pdf :: Verbosity -- ^ Verbosity level
343 -> FilePath -- ^ temp directory for output
344 -> FilePath -- ^ temp directory for output
344− -> String -- ^ ConTeXt source
345+ -> Text -- ^ ConTeXt source
345 -> IO (Either ByteString ByteString)
346 -> IO (Either ByteString ByteString)
346context2pdf verbosity tmpDir source = inDirectory tmpDir $ do
347context2pdf verbosity tmpDir source = inDirectory tmpDir $ do
347 let file = "input.tex"
348 let file = "input.tex"
348− UTF8.writeFile file source
349+ BS.writeFile file $ UTF8.fromText source
349#ifdef _WINDOWS
350#ifdef _WINDOWS
350 -- note: we want / even on Windows, for TexLive
351 -- note: we want / even on Windows, for TexLive
351 let tmpDir' = changePathSeparators tmpDir
352 let tmpDir' = changePathSeparators tmpDir
src/Text/Pandoc/Shared.hs+2−2
@@ -284,8 +284,8 @@ escapeURI = escapeURIString (not . needsEscaping)
284tabFilter :: Int -- ^ Tab stop
284tabFilter :: Int -- ^ Tab stop
285 -> T.Text -- ^ Input
285 -> T.Text -- ^ Input
286 -> T.Text
286 -> T.Text
287−tabFilter tabStop =
287+tabFilter tabStop = T.filter (/= '\r') . T.unlines .
288− T.unlines . (if tabStop == 0 then id else map go) . T.lines
288+ (if tabStop == 0 then id else map go) . T.lines
289 where go s =
289 where go s =
290 let (s1, s2) = T.break (== '\t') s
290 let (s1, s2) = T.break (== '\t') s
291 in if T.null s2
291 in if T.null s2
src/Text/Pandoc/Writers/AsciiDoc.hs+7−4
@@ -43,6 +43,7 @@ import Data.Char (isPunctuation, isSpace)
43import Data.List (intercalate, intersperse, stripPrefix)
43import Data.List (intercalate, intersperse, stripPrefix)
44import qualified Data.Map as M
44import qualified Data.Map as M
45import Data.Maybe (fromMaybe)
45import Data.Maybe (fromMaybe)
46+import Data.Text (Text)
46import qualified Data.Text as T
47import qualified Data.Text as T
47import Text.Pandoc.Class (PandocMonad, report)
48import Text.Pandoc.Class (PandocMonad, report)
48import Text.Pandoc.Definition
49import Text.Pandoc.Definition
@@ -62,7 +63,7 @@ data WriterState = WriterState { defListMarker :: String
62 }
63 }
63
64
64-- | Convert Pandoc to AsciiDoc.
65-- | Convert Pandoc to AsciiDoc.
65−writeAsciiDoc :: PandocMonad m => WriterOptions -> Pandoc -> m String
66+writeAsciiDoc :: PandocMonad m => WriterOptions -> Pandoc -> m Text
66writeAsciiDoc opts document =
67writeAsciiDoc opts document =
67 evalStateT (pandocToAsciiDoc opts document) WriterState{
68 evalStateT (pandocToAsciiDoc opts document) WriterState{
68 defListMarker = "::"
69 defListMarker = "::"
@@ -74,16 +75,18 @@ writeAsciiDoc opts document =
74type ADW = StateT WriterState
75type ADW = StateT WriterState
75
76
76-- | Return asciidoc representation of document.
77-- | Return asciidoc representation of document.
77−pandocToAsciiDoc :: PandocMonad m => WriterOptions -> Pandoc -> ADW m String
78+pandocToAsciiDoc :: PandocMonad m => WriterOptions -> Pandoc -> ADW m Text
78pandocToAsciiDoc opts (Pandoc meta blocks) = do
79pandocToAsciiDoc opts (Pandoc meta blocks) = do
79 let titleblock = not $ null (docTitle meta) && null (docAuthors meta) &&
80 let titleblock = not $ null (docTitle meta) && null (docAuthors meta) &&
80 null (docDate meta)
81 null (docDate meta)
81 let colwidth = if writerWrapText opts == WrapAuto
82 let colwidth = if writerWrapText opts == WrapAuto
82 then Just $ writerColumns opts
83 then Just $ writerColumns opts
83 else Nothing
84 else Nothing
85+ let render' :: Doc -> Text
86+ render' = render colwidth
84 metadata <- metaToJSON opts
87 metadata <- metaToJSON opts
85− (fmap (render colwidth) . blockListToAsciiDoc opts)
88+ (fmap render' . blockListToAsciiDoc opts)
86− (fmap (render colwidth) . inlineListToAsciiDoc opts)
89+ (fmap render' . inlineListToAsciiDoc opts)
87 meta
90 meta
88 let addTitleLine (String t) = String $
91 let addTitleLine (String t) = String $
89 t <> "\n" <> T.replicate (T.length t) "="
92 t <> "\n" <> T.replicate (T.length t) "="
src/Text/Pandoc/Writers/CommonMark.hs+6−7
@@ -34,6 +34,7 @@ module Text.Pandoc.Writers.CommonMark (writeCommonMark) where
34import CMark
34import CMark
35import Control.Monad.State (State, get, modify, runState)
35import Control.Monad.State (State, get, modify, runState)
36import Data.Foldable (foldrM)
36import Data.Foldable (foldrM)
37+import Data.Text (Text)
37import qualified Data.Text as T
38import qualified Data.Text as T
38import Text.Pandoc.Class (PandocMonad)
39import Text.Pandoc.Class (PandocMonad)
39import Text.Pandoc.Definition
40import Text.Pandoc.Definition
@@ -45,7 +46,7 @@ import Text.Pandoc.Writers.HTML (writeHtml5String)
45import Text.Pandoc.Writers.Shared
46import Text.Pandoc.Writers.Shared
46
47
47-- | Convert Pandoc to CommonMark.
48-- | Convert Pandoc to CommonMark.
48−writeCommonMark :: PandocMonad m => WriterOptions -> Pandoc -> m String
49+writeCommonMark :: PandocMonad m => WriterOptions -> Pandoc -> m Text
49writeCommonMark opts (Pandoc meta blocks) = do
50writeCommonMark opts (Pandoc meta blocks) = do
50 let (blocks', notes) = runState (walkM processNotes blocks) []
51 let (blocks', notes) = runState (walkM processNotes blocks) []
51 notes' = if null notes
52 notes' = if null notes
@@ -71,7 +72,7 @@ processNotes x = return x
71node :: NodeType -> [Node] -> Node
72node :: NodeType -> [Node] -> Node
72node = Node Nothing
73node = Node Nothing
73
74
74−blocksToCommonMark :: PandocMonad m => WriterOptions -> [Block] -> m String
75+blocksToCommonMark :: PandocMonad m => WriterOptions -> [Block] -> m Text
75blocksToCommonMark opts bs = do
76blocksToCommonMark opts bs = do
76 let cmarkOpts = [optHardBreaks | isEnabled Ext_hard_line_breaks opts]
77 let cmarkOpts = [optHardBreaks | isEnabled Ext_hard_line_breaks opts]
77 colwidth = if writerWrapText opts == WrapAuto
78 colwidth = if writerWrapText opts == WrapAuto
@@ -79,14 +80,12 @@ blocksToCommonMark opts bs = do
79 else Nothing
80 else Nothing
80 nodes <- blocksToNodes bs
81 nodes <- blocksToNodes bs
81 return $
82 return $
82− T.unpack $
83 nodeToCommonmark cmarkOpts colwidth $
83 nodeToCommonmark cmarkOpts colwidth $
84 node DOCUMENT nodes
84 node DOCUMENT nodes
85
85
86−inlinesToCommonMark :: PandocMonad m => WriterOptions -> [Inline] -> m String
86+inlinesToCommonMark :: PandocMonad m => WriterOptions -> [Inline] -> m Text
87inlinesToCommonMark opts ils = return $
87inlinesToCommonMark opts ils = return $
88− T.unpack $ nodeToCommonmark cmarkOpts colwidth
88+ nodeToCommonmark cmarkOpts colwidth $ node PARAGRAPH (inlinesToNodes ils)
89− $ node PARAGRAPH (inlinesToNodes ils)
90 where cmarkOpts = [optHardBreaks | isEnabled Ext_hard_line_breaks opts]
89 where cmarkOpts = [optHardBreaks | isEnabled Ext_hard_line_breaks opts]
91 colwidth = if writerWrapText opts == WrapAuto
90 colwidth = if writerWrapText opts == WrapAuto
92 then Just $ writerColumns opts
91 then Just $ writerColumns opts
@@ -139,7 +138,7 @@ blockToNodes (DefinitionList items) ns = blockToNodes (BulletList items') ns
139 Para term : concat xs
138 Para term : concat xs
140blockToNodes t@(Table _ _ _ _ _) ns = do
139blockToNodes t@(Table _ _ _ _ _) ns = do
141 s <- writeHtml5String def $! Pandoc nullMeta [t]
140 s <- writeHtml5String def $! Pandoc nullMeta [t]
142− return (node (HTML_BLOCK (T.pack $! s)) [] : ns)
141+ return (node (HTML_BLOCK s) [] : ns)
143blockToNodes Null ns = return ns
142blockToNodes Null ns = return ns
144
143
145inlinesToNodes :: [Inline] -> [Node]
144inlinesToNodes :: [Inline] -> [Node]
src/Text/Pandoc/Writers/ConTeXt.hs+8−5
@@ -33,6 +33,7 @@ import Control.Monad.State
33import Data.Char (ord)
33import Data.Char (ord)
34import Data.List (intercalate, intersperse)
34import Data.List (intercalate, intersperse)
35import Data.Maybe (catMaybes)
35import Data.Maybe (catMaybes)
36+import Data.Text (Text)
36import Network.URI (unEscapeString)
37import Network.URI (unEscapeString)
37import Text.Pandoc.Class (PandocMonad, report)
38import Text.Pandoc.Class (PandocMonad, report)
38import Text.Pandoc.Logging
39import Text.Pandoc.Logging
@@ -56,7 +57,7 @@ orderedListStyles :: [Char]
56orderedListStyles = cycle "narg"
57orderedListStyles = cycle "narg"
57
58
58-- | Convert Pandoc to ConTeXt.
59-- | Convert Pandoc to ConTeXt.
59−writeConTeXt :: PandocMonad m => WriterOptions -> Pandoc -> m String
60+writeConTeXt :: PandocMonad m => WriterOptions -> Pandoc -> m Text
60writeConTeXt options document =
61writeConTeXt options document =
61 let defaultWriterState = WriterState { stNextRef = 1
62 let defaultWriterState = WriterState { stNextRef = 1
62 , stOrderedListLevel = 0
63 , stOrderedListLevel = 0
@@ -66,17 +67,19 @@ writeConTeXt options document =
66
67
67type WM = StateT WriterState
68type WM = StateT WriterState
68
69
69−pandocToConTeXt :: PandocMonad m => WriterOptions -> Pandoc -> WM m String
70+pandocToConTeXt :: PandocMonad m => WriterOptions -> Pandoc -> WM m Text
70pandocToConTeXt options (Pandoc meta blocks) = do
71pandocToConTeXt options (Pandoc meta blocks) = do
71 let colwidth = if writerWrapText options == WrapAuto
72 let colwidth = if writerWrapText options == WrapAuto
72 then Just $ writerColumns options
73 then Just $ writerColumns options
73 else Nothing
74 else Nothing
75+ let render' :: Doc -> Text
76+ render' = render colwidth
74 metadata <- metaToJSON options
77 metadata <- metaToJSON options
75− (fmap (render colwidth) . blockListToConTeXt)
78+ (fmap render' . blockListToConTeXt)
76− (fmap (render colwidth) . inlineListToConTeXt)
79+ (fmap render' . inlineListToConTeXt)
77 meta
80 meta
78 body <- mapM (elementToConTeXt options) $ hierarchicalize blocks
81 body <- mapM (elementToConTeXt options) $ hierarchicalize blocks
79− let main = (render colwidth . vcat) body
82+ let main = (render' . vcat) body
80 let layoutFromMargins = intercalate [','] $ catMaybes $
83 let layoutFromMargins = intercalate [','] $ catMaybes $
81 map (\(x,y) ->
84 map (\(x,y) ->
82 ((x ++ "=") ++) <$> getField y metadata)
85 ((x ++ "=") ++) <$> getField y metadata)
src/Text/Pandoc/Writers/Custom.hs+5−3
@@ -41,6 +41,7 @@ import Control.Monad (when)
41import Data.Char (toLower)
41import Data.Char (toLower)
42import Data.List (intersperse)
42import Data.List (intersperse)
43import qualified Data.Map as M
43import qualified Data.Map as M
44+import Data.Text (Text, pack)
44import Data.Typeable
45import Data.Typeable
45import GHC.IO.Encoding (getForeignEncoding, setForeignEncoding, utf8)
46import GHC.IO.Encoding (getForeignEncoding, setForeignEncoding, utf8)
46import Scripting.Lua (LuaState, StackValue, callfunc)
47import Scripting.Lua (LuaState, StackValue, callfunc)
@@ -116,7 +117,7 @@ data PandocLuaException = PandocLuaException String
116instance Exception PandocLuaException
117instance Exception PandocLuaException
117
118
118-- | Convert Pandoc to custom markup.
119-- | Convert Pandoc to custom markup.
119−writeCustom :: FilePath -> WriterOptions -> Pandoc -> IO String
120+writeCustom :: FilePath -> WriterOptions -> Pandoc -> IO Text
120writeCustom luaFile opts doc@(Pandoc meta _) = do
121writeCustom luaFile opts doc@(Pandoc meta _) = do
121 luaScript <- UTF8.readFile luaFile
122 luaScript <- UTF8.readFile luaFile
122 enc <- getForeignEncoding
123 enc <- getForeignEncoding
@@ -139,8 +140,9 @@ writeCustom luaFile opts doc@(Pandoc meta _) = do
139 setForeignEncoding enc
140 setForeignEncoding enc
140 let body = rendered
141 let body = rendered
141 case writerTemplate opts of
142 case writerTemplate opts of
142− Nothing -> return body
143+ Nothing -> return $ pack body
144+ Just tpl -> return $ pack $
143− Just tpl -> return $ renderTemplate' tpl $ setField "body" body context
145+ renderTemplate' tpl $ setField "body" body context
144
146
145docToCustom :: LuaState -> WriterOptions -> Pandoc -> IO String
147docToCustom :: LuaState -> WriterOptions -> Pandoc -> IO String
146docToCustom lua opts (Pandoc (Meta metamap) blocks) = do
148docToCustom lua opts (Pandoc (Meta metamap) blocks) = do
src/Text/Pandoc/Writers/Docbook.hs+8−6
@@ -32,6 +32,7 @@ Conversion of 'Pandoc' documents to Docbook XML.
32module Text.Pandoc.Writers.Docbook ( writeDocbook4, writeDocbook5 ) where
32module Text.Pandoc.Writers.Docbook ( writeDocbook4, writeDocbook5 ) where
33import Control.Monad.Reader
33import Control.Monad.Reader
34import Data.Char (toLower)
34import Data.Char (toLower)
35+import Data.Text (Text)
35import Data.Generics (everywhere, mkT)
36import Data.Generics (everywhere, mkT)
36import Data.List (intercalate, isPrefixOf, isSuffixOf, stripPrefix)
37import Data.List (intercalate, isPrefixOf, isSuffixOf, stripPrefix)
37import Data.Monoid (Any (..))
38import Data.Monoid (Any (..))
@@ -81,22 +82,23 @@ authorToDocbook opts name' = do
81 in inTagsSimple "firstname" (text $ escapeStringForXML firstname) $$
82 in inTagsSimple "firstname" (text $ escapeStringForXML firstname) $$
82 inTagsSimple "surname" (text $ escapeStringForXML lastname)
83 inTagsSimple "surname" (text $ escapeStringForXML lastname)
83
84
84−writeDocbook4 :: PandocMonad m => WriterOptions -> Pandoc -> m String
85+writeDocbook4 :: PandocMonad m => WriterOptions -> Pandoc -> m Text
85writeDocbook4 opts d =
86writeDocbook4 opts d =
86 runReaderT (writeDocbook opts d) DocBook4
87 runReaderT (writeDocbook opts d) DocBook4
87
88
88−writeDocbook5 :: PandocMonad m => WriterOptions -> Pandoc -> m String
89+writeDocbook5 :: PandocMonad m => WriterOptions -> Pandoc -> m Text
89writeDocbook5 opts d =
90writeDocbook5 opts d =
90 runReaderT (writeDocbook opts d) DocBook5
91 runReaderT (writeDocbook opts d) DocBook5
91
92
92-- | Convert Pandoc document to string in Docbook format.
93-- | Convert Pandoc document to string in Docbook format.
93−writeDocbook :: PandocMonad m => WriterOptions -> Pandoc -> DB m String
94+writeDocbook :: PandocMonad m => WriterOptions -> Pandoc -> DB m Text
94writeDocbook opts (Pandoc meta blocks) = do
95writeDocbook opts (Pandoc meta blocks) = do
95 let elements = hierarchicalize blocks
96 let elements = hierarchicalize blocks
96 let colwidth = if writerWrapText opts == WrapAuto
97 let colwidth = if writerWrapText opts == WrapAuto
97 then Just $ writerColumns opts
98 then Just $ writerColumns opts
98 else Nothing
99 else Nothing
100+ let render' :: Doc -> Text
99− let render' = render colwidth
101+ render' = render colwidth
100 let opts' = if (maybe False (("/book>" `isSuffixOf`) . trimr)
102 let opts' = if (maybe False (("/book>" `isSuffixOf`) . trimr)
101 (writerTemplate opts) &&
103 (writerTemplate opts) &&
102 TopLevelDefault == writerTopLevelDivision opts)
104 TopLevelDefault == writerTopLevelDivision opts)
@@ -111,10 +113,10 @@ writeDocbook opts (Pandoc meta blocks) = do
111 auths' <- mapM (authorToDocbook opts) $ docAuthors meta
113 auths' <- mapM (authorToDocbook opts) $ docAuthors meta
112 let meta' = B.setMeta "author" auths' meta
114 let meta' = B.setMeta "author" auths' meta
113 metadata <- metaToJSON opts
115 metadata <- metaToJSON opts
114− (fmap (render colwidth . vcat) .
116+ (fmap (render' . vcat) .
115 (mapM (elementToDocbook opts' startLvl) .
117 (mapM (elementToDocbook opts' startLvl) .
116 hierarchicalize))
118 hierarchicalize))
117− (fmap (render colwidth) . inlinesToDocbook opts')
119+ (fmap render' . inlinesToDocbook opts')
118 meta'
120 meta'
119 main <- (render' . vcat) <$> (mapM (elementToDocbook opts' startLvl) elements)
121 main <- (render' . vcat) <$> (mapM (elementToDocbook opts' startLvl) elements)
120 let context = defField "body" main
122 let context = defField "body" main
src/Text/Pandoc/Writers/DokuWiki.hs+4−3
@@ -44,6 +44,7 @@ import Control.Monad.Reader (ReaderT, ask, local, runReaderT)
44import Control.Monad.State (StateT, evalStateT, gets, modify)
44import Control.Monad.State (StateT, evalStateT, gets, modify)
45import Data.Default (Default (..))
45import Data.Default (Default (..))
46import Data.List (intercalate, intersect, isPrefixOf, transpose)
46import Data.List (intercalate, intersect, isPrefixOf, transpose)
47+import Data.Text (Text, pack)
47import Text.Pandoc.Class (PandocMonad, report)
48import Text.Pandoc.Class (PandocMonad, report)
48import Text.Pandoc.Logging
49import Text.Pandoc.Logging
49import Text.Pandoc.Definition
50import Text.Pandoc.Definition
@@ -75,7 +76,7 @@ instance Default WriterEnvironment where
75type DokuWiki m = ReaderT WriterEnvironment (StateT WriterState m)
76type DokuWiki m = ReaderT WriterEnvironment (StateT WriterState m)
76
77
77-- | Convert Pandoc to DokuWiki.
78-- | Convert Pandoc to DokuWiki.
78−writeDokuWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
79+writeDokuWiki :: PandocMonad m => WriterOptions -> Pandoc -> m Text
79writeDokuWiki opts document =
80writeDokuWiki opts document =
80 runDokuWiki (pandocToDokuWiki opts document)
81 runDokuWiki (pandocToDokuWiki opts document)
81
82
@@ -84,7 +85,7 @@ runDokuWiki = flip evalStateT def . flip runReaderT def
84
85
85-- | Return DokuWiki representation of document.
86-- | Return DokuWiki representation of document.
86pandocToDokuWiki :: PandocMonad m
87pandocToDokuWiki :: PandocMonad m
87− => WriterOptions -> Pandoc -> DokuWiki m String
88+ => WriterOptions -> Pandoc -> DokuWiki m Text
88pandocToDokuWiki opts (Pandoc meta blocks) = do
89pandocToDokuWiki opts (Pandoc meta blocks) = do
89 metadata <- metaToJSON opts
90 metadata <- metaToJSON opts
90 (fmap trimr . blockListToDokuWiki opts)
91 (fmap trimr . blockListToDokuWiki opts)
@@ -96,7 +97,7 @@ pandocToDokuWiki opts (Pandoc meta blocks) = do
96 then "" -- TODO Was "\n<references />" Check whether I can really remove this:
97 then "" -- TODO Was "\n<references />" Check whether I can really remove this:
97 -- if it is definitely to do with footnotes, can remove this whole bit
98 -- if it is definitely to do with footnotes, can remove this whole bit
98 else ""
99 else ""
99− let main = body ++ notes
100+ let main = pack $ body ++ notes
100 let context = defField "body" main
101 let context = defField "body" main
101 $ defField "toc" (writerTableOfContents opts)
102 $ defField "toc" (writerTableOfContents opts)
102 $ metadata
103 $ metadata
src/Text/Pandoc/Writers/EPUB.hs+3−2
@@ -40,6 +40,7 @@ import Control.Monad.State (State, StateT, evalState, evalStateT, get, gets,
40 lift, modify, put)
40 lift, modify, put)
41import qualified Data.ByteString.Lazy as B
41import qualified Data.ByteString.Lazy as B
42import qualified Data.ByteString.Lazy.Char8 as B8
42import qualified Data.ByteString.Lazy.Char8 as B8
43+import qualified Data.Text.Lazy as TL
43import Data.Char (isAlphaNum, isDigit, toLower)
44import Data.Char (isAlphaNum, isDigit, toLower)
44import Data.List (intercalate, isInfixOf, isPrefixOf)
45import Data.List (intercalate, isInfixOf, isPrefixOf)
45import qualified Data.Map as M
46import qualified Data.Map as M
@@ -373,8 +374,8 @@ pandocToEPUB :: PandocMonad m
373 -> E m B.ByteString
374 -> E m B.ByteString
374pandocToEPUB version opts doc@(Pandoc meta _) = do
375pandocToEPUB version opts doc@(Pandoc meta _) = do
375 let epub3 = version == EPUB3
376 let epub3 = version == EPUB3
376− let writeHtml o = fmap UTF8.fromStringLazy .
377+ let writeHtml o = fmap (UTF8.fromTextLazy . TL.fromStrict) .
377− writeHtmlStringForEPUB version o
378+ writeHtmlStringForEPUB version o
378 epochtime <- floor <$> lift P.getPOSIXTime
379 epochtime <- floor <$> lift P.getPOSIXTime
379 metadata <- getEPUBMetadata opts meta
380 metadata <- getEPUBMetadata opts meta
380 let mkEntry path content = toEntry path epochtime content
381 let mkEntry path content = toEntry path epochtime content
src/Text/Pandoc/Writers/FB2.hs+4−3
@@ -44,6 +44,7 @@ import Data.ByteString.Base64 (encode)
44import qualified Data.ByteString.Char8 as B8
44import qualified Data.ByteString.Char8 as B8
45import Data.Char (isAscii, isControl, isSpace, toLower)
45import Data.Char (isAscii, isControl, isSpace, toLower)
46import Data.Either (lefts, rights)
46import Data.Either (lefts, rights)
47+import Data.Text (Text, pack)
47import Data.List (intercalate, intersperse, isPrefixOf, stripPrefix)
48import Data.List (intercalate, intersperse, isPrefixOf, stripPrefix)
48import Network.HTTP (urlEncode)
49import Network.HTTP (urlEncode)
49import Text.XML.Light
50import Text.XML.Light
@@ -86,13 +87,13 @@ instance Show ImageMode where
86writeFB2 :: PandocMonad m
87writeFB2 :: PandocMonad m
87 => WriterOptions -- ^ conversion options
88 => WriterOptions -- ^ conversion options
88 -> Pandoc -- ^ document to convert
89 -> Pandoc -- ^ document to convert
89− -> m String -- ^ FictionBook2 document (not encoded yet)
90+ -> m Text -- ^ FictionBook2 document (not encoded yet)
90writeFB2 opts doc = flip evalStateT newFB $ pandocToFB2 opts doc
91writeFB2 opts doc = flip evalStateT newFB $ pandocToFB2 opts doc
91
92
92pandocToFB2 :: PandocMonad m
93pandocToFB2 :: PandocMonad m
93 => WriterOptions
94 => WriterOptions
94 -> Pandoc
95 -> Pandoc
95− -> FBM m String
96+ -> FBM m Text
96pandocToFB2 opts (Pandoc meta blocks) = do
97pandocToFB2 opts (Pandoc meta blocks) = do
97 modify (\s -> s { writerOptions = opts })
98 modify (\s -> s { writerOptions = opts })
98 desc <- description meta
99 desc <- description meta
@@ -103,7 +104,7 @@ pandocToFB2 opts (Pandoc meta blocks) = do
103 (imgs,missing) <- liftM imagesToFetch get >>= \s -> lift (fetchImages s)
104 (imgs,missing) <- liftM imagesToFetch get >>= \s -> lift (fetchImages s)
104 let body' = replaceImagesWithAlt missing body
105 let body' = replaceImagesWithAlt missing body
105 let fb2_xml = el "FictionBook" (fb2_attrs, [desc, body'] ++ notes ++ imgs)
106 let fb2_xml = el "FictionBook" (fb2_attrs, [desc, body'] ++ notes ++ imgs)
106− return $ xml_head ++ (showContent fb2_xml) ++ "\n"
107+ return $ pack $ xml_head ++ (showContent fb2_xml) ++ "\n"
107 where
108 where
108 xml_head = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
109 xml_head = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
109 fb2_attrs =
110 fb2_attrs =
src/Text/Pandoc/Writers/HTML.hs+28−22
@@ -45,6 +45,8 @@ module Text.Pandoc.Writers.HTML (
45 ) where
45 ) where
46import Control.Monad.State
46import Control.Monad.State
47import Data.Char (ord, toLower)
47import Data.Char (ord, toLower)
48+import Data.Text (Text)
49+import qualified Data.Text.Lazy as TL
48import Data.List (intersperse, isPrefixOf)
50import Data.List (intersperse, isPrefixOf)
49import Data.Maybe (catMaybes, fromMaybe, isJust, isNothing)
51import Data.Maybe (catMaybes, fromMaybe, isJust, isNothing)
50import Data.Monoid ((<>))
52import Data.Monoid ((<>))
@@ -67,7 +69,7 @@ import Text.Pandoc.Writers.Shared
67import Text.Pandoc.XML (escapeStringForXML, fromEntities)
69import Text.Pandoc.XML (escapeStringForXML, fromEntities)
68#if MIN_VERSION_blaze_markup(0,6,3)
70#if MIN_VERSION_blaze_markup(0,6,3)
69#else
71#else
70−import Text.Blaze.Internal (preEscapedString)
72+import Text.Blaze.Internal (preEscapedString, preEscapedText)
71#endif
73#endif
72#if MIN_VERSION_blaze_html(0,5,1)
74#if MIN_VERSION_blaze_html(0,5,1)
73import qualified Text.Blaze.XHtml5 as H5
75import qualified Text.Blaze.XHtml5 as H5
@@ -77,7 +79,7 @@ import qualified Text.Blaze.Html5 as H5
77import Control.Monad.Except (throwError)
79import Control.Monad.Except (throwError)
78import Data.Aeson (Value)
80import Data.Aeson (Value)
79import System.FilePath (takeExtension, takeBaseName)
81import System.FilePath (takeExtension, takeBaseName)
80−import Text.Blaze.Html.Renderer.String (renderHtml)
82+import Text.Blaze.Html.Renderer.Text (renderHtml)
81import qualified Text.Blaze.XHtml1.Transitional as H
83import qualified Text.Blaze.XHtml1.Transitional as H
82import qualified Text.Blaze.XHtml1.Transitional.Attributes as A
84import qualified Text.Blaze.XHtml1.Transitional.Attributes as A
83import Text.Pandoc.Class (PandocMonad, report)
85import Text.Pandoc.Class (PandocMonad, report)
@@ -123,7 +125,7 @@ nl opts = if writerWrapText opts == WrapNone
123 else preEscapedString "\n"
125 else preEscapedString "\n"
124
126
125-- | Convert Pandoc document to Html 5 string.
127-- | Convert Pandoc document to Html 5 string.
126−writeHtml5String :: PandocMonad m => WriterOptions -> Pandoc -> m String
128+writeHtml5String :: PandocMonad m => WriterOptions -> Pandoc -> m Text
127writeHtml5String = writeHtmlString'
129writeHtml5String = writeHtmlString'
128 defaultWriterState{ stHtml5 = True }
130 defaultWriterState{ stHtml5 = True }
129
131
@@ -132,7 +134,7 @@ writeHtml5 :: PandocMonad m => WriterOptions -> Pandoc -> m Html
132writeHtml5 = writeHtml' defaultWriterState{ stHtml5 = True }
134writeHtml5 = writeHtml' defaultWriterState{ stHtml5 = True }
133
135
134-- | Convert Pandoc document to Html 4 string.
136-- | Convert Pandoc document to Html 4 string.
135−writeHtml4String :: PandocMonad m => WriterOptions -> Pandoc -> m String
137+writeHtml4String :: PandocMonad m => WriterOptions -> Pandoc -> m Text
136writeHtml4String = writeHtmlString'
138writeHtml4String = writeHtmlString'
137 defaultWriterState{ stHtml5 = False }
139 defaultWriterState{ stHtml5 = False }
138
140
@@ -142,38 +144,39 @@ writeHtml4 = writeHtml' defaultWriterState{ stHtml5 = False }
142
144
143-- | Convert Pandoc document to Html appropriate for an epub version.
145-- | Convert Pandoc document to Html appropriate for an epub version.
144writeHtmlStringForEPUB :: PandocMonad m
146writeHtmlStringForEPUB :: PandocMonad m
145− => EPUBVersion -> WriterOptions -> Pandoc -> m String
147+ => EPUBVersion -> WriterOptions -> Pandoc
148+ -> m Text
146−writeHtmlStringForEPUB version = writeHtmlString'
149+writeHtmlStringForEPUB version o = writeHtmlString'
147 defaultWriterState{ stHtml5 = version == EPUB3,
150 defaultWriterState{ stHtml5 = version == EPUB3,
148− stEPUBVersion = Just version }
151+ stEPUBVersion = Just version } o
149
152
150-- | Convert Pandoc document to Reveal JS HTML slide show.
153-- | Convert Pandoc document to Reveal JS HTML slide show.
151writeRevealJs :: PandocMonad m
154writeRevealJs :: PandocMonad m
152− => WriterOptions -> Pandoc -> m String
155+ => WriterOptions -> Pandoc -> m Text
153writeRevealJs = writeHtmlSlideShow' RevealJsSlides
156writeRevealJs = writeHtmlSlideShow' RevealJsSlides
154
157
155-- | Convert Pandoc document to S5 HTML slide show.
158-- | Convert Pandoc document to S5 HTML slide show.
156writeS5 :: PandocMonad m
159writeS5 :: PandocMonad m
157− => WriterOptions -> Pandoc -> m String
160+ => WriterOptions -> Pandoc -> m Text
158writeS5 = writeHtmlSlideShow' S5Slides
161writeS5 = writeHtmlSlideShow' S5Slides
159
162
160-- | Convert Pandoc document to Slidy HTML slide show.
163-- | Convert Pandoc document to Slidy HTML slide show.
161writeSlidy :: PandocMonad m
164writeSlidy :: PandocMonad m
162− => WriterOptions -> Pandoc -> m String
165+ => WriterOptions -> Pandoc -> m Text
163writeSlidy = writeHtmlSlideShow' SlidySlides
166writeSlidy = writeHtmlSlideShow' SlidySlides
164
167
165-- | Convert Pandoc document to Slideous HTML slide show.
168-- | Convert Pandoc document to Slideous HTML slide show.
166writeSlideous :: PandocMonad m
169writeSlideous :: PandocMonad m
167− => WriterOptions -> Pandoc -> m String
170+ => WriterOptions -> Pandoc -> m Text
168writeSlideous = writeHtmlSlideShow' SlideousSlides
171writeSlideous = writeHtmlSlideShow' SlideousSlides
169
172
170-- | Convert Pandoc document to DZSlides HTML slide show.
173-- | Convert Pandoc document to DZSlides HTML slide show.
171writeDZSlides :: PandocMonad m
174writeDZSlides :: PandocMonad m
172− => WriterOptions -> Pandoc -> m String
175+ => WriterOptions -> Pandoc -> m Text
173writeDZSlides = writeHtmlSlideShow' DZSlides
176writeDZSlides = writeHtmlSlideShow' DZSlides
174
177
175writeHtmlSlideShow' :: PandocMonad m
178writeHtmlSlideShow' :: PandocMonad m
176− => HTMLSlideVariant -> WriterOptions -> Pandoc -> m String
179+ => HTMLSlideVariant -> WriterOptions -> Pandoc -> m Text
177writeHtmlSlideShow' variant = writeHtmlString'
180writeHtmlSlideShow' variant = writeHtmlString'
178 defaultWriterState{ stSlideVariant = variant
181 defaultWriterState{ stSlideVariant = variant
179 , stHtml5 = case variant of
182 , stHtml5 = case variant of
@@ -185,12 +188,15 @@ writeHtmlSlideShow' variant = writeHtmlString'
185 NoSlides -> False
188 NoSlides -> False
186 }
189 }
187
190
191+renderHtml' :: Html -> Text
192+renderHtml' = TL.toStrict . renderHtml
193+
188writeHtmlString' :: PandocMonad m
194writeHtmlString' :: PandocMonad m
189− => WriterState -> WriterOptions -> Pandoc -> m String
195+ => WriterState -> WriterOptions -> Pandoc -> m Text
190writeHtmlString' st opts d = do
196writeHtmlString' st opts d = do
191 (body, context) <- evalStateT (pandocToHtml opts d) st
197 (body, context) <- evalStateT (pandocToHtml opts d) st
192 case writerTemplate opts of
198 case writerTemplate opts of
193− Nothing -> return $ renderHtml body
199+ Nothing -> return $ renderHtml' body
194 Just tpl -> do
200 Just tpl -> do
195 -- warn if empty lang
201 -- warn if empty lang
196 when (isNothing (getField "lang" context :: Maybe String)) $
202 when (isNothing (getField "lang" context :: Maybe String)) $
@@ -205,12 +211,12 @@ writeHtmlString' st opts d = do
205 report $ NoTitleElement fallback
211 report $ NoTitleElement fallback
206 return $ resetField "pagetitle" fallback context
212 return $ resetField "pagetitle" fallback context
207 return $ renderTemplate' tpl $
213 return $ renderTemplate' tpl $
208− defField "body" (renderHtml body) context'
214+ defField "body" (renderHtml' body) context'
209
215
210writeHtml' :: PandocMonad m => WriterState -> WriterOptions -> Pandoc -> m Html
216writeHtml' :: PandocMonad m => WriterState -> WriterOptions -> Pandoc -> m Html
211writeHtml' st opts d = do
217writeHtml' st opts d = do
212 case writerTemplate opts of
218 case writerTemplate opts of
213− Just _ -> preEscapedString <$> writeHtmlString' st opts d
219+ Just _ -> preEscapedText <$> writeHtmlString' st opts d
214 Nothing -> do
220 Nothing -> do
215 (body, _) <- evalStateT (pandocToHtml opts d) st
221 (body, _) <- evalStateT (pandocToHtml opts d) st
216 return body
222 return body
@@ -222,8 +228,8 @@ pandocToHtml :: PandocMonad m
222 -> StateT WriterState m (Html, Value)
228 -> StateT WriterState m (Html, Value)
223pandocToHtml opts (Pandoc meta blocks) = do
229pandocToHtml opts (Pandoc meta blocks) = do
224 metadata <- metaToJSON opts
230 metadata <- metaToJSON opts
225− (fmap renderHtml . blockListToHtml opts)
231+ (fmap renderHtml' . blockListToHtml opts)
226− (fmap renderHtml . inlineListToHtml opts)
232+ (fmap renderHtml' . inlineListToHtml opts)
227 meta
233 meta
228 let stringifyHTML = escapeStringForXML . stringify
234 let stringifyHTML = escapeStringForXML . stringify
229 let authsMeta = map stringifyHTML $ docAuthors meta
235 let authsMeta = map stringifyHTML $ docAuthors meta
@@ -277,10 +283,10 @@ pandocToHtml opts (Pandoc meta blocks) = do
277 Nothing -> id
283 Nothing -> id
278 else id) $
284 else id) $
279 (if stMath st
285 (if stMath st
280− then defField "math" (renderHtml math)
286+ then defField "math" (renderHtml' math)
281 else id) $
287 else id) $
282 defField "quotes" (stQuotes st) $
288 defField "quotes" (stQuotes st) $
283− maybe id (defField "toc" . renderHtml) toc $
289+ maybe id (defField "toc" . renderHtml') toc $
284 defField "author-meta" authsMeta $
290 defField "author-meta" authsMeta $
285 maybe id (defField "date-meta") (normalizeDate dateMeta) $
291 maybe id (defField "date-meta") (normalizeDate dateMeta) $
286 defField "pagetitle" (stringifyHTML (docTitle meta)) $
292 defField "pagetitle" (stringifyHTML (docTitle meta)) $
@@ -463,7 +469,7 @@ parseMailto s = do
463obfuscateLink :: PandocMonad m => WriterOptions -> Attr -> Html -> String -> m Html
469obfuscateLink :: PandocMonad m => WriterOptions -> Attr -> Html -> String -> m Html
464obfuscateLink opts attr txt s | writerEmailObfuscation opts == NoObfuscation =
470obfuscateLink opts attr txt s | writerEmailObfuscation opts == NoObfuscation =
465 return $ addAttrs opts attr $ H.a ! A.href (toValue s) $ txt
471 return $ addAttrs opts attr $ H.a ! A.href (toValue s) $ txt
466−obfuscateLink opts attr (renderHtml -> txt) s =
472+obfuscateLink opts attr (TL.unpack . renderHtml -> txt) s =
467 let meth = writerEmailObfuscation opts
473 let meth = writerEmailObfuscation opts
468 s' = map toLower (take 7 s) ++ drop 7 s
474 s' = map toLower (take 7 s) ++ drop 7 s
469 in case parseMailto s' of
475 in case parseMailto s' of
src/Text/Pandoc/Writers/Haddock.hs+6−5
@@ -35,6 +35,7 @@ Haddock: <http://www.haskell.org/haddock/doc/html/>
35module Text.Pandoc.Writers.Haddock (writeHaddock) where
35module Text.Pandoc.Writers.Haddock (writeHaddock) where
36import Control.Monad.State
36import Control.Monad.State
37import Data.Default
37import Data.Default
38+import Data.Text (Text)
38import Data.List (intersperse, transpose)
39import Data.List (intersperse, transpose)
39import Text.Pandoc.Class (PandocMonad, report)
40import Text.Pandoc.Class (PandocMonad, report)
40import Text.Pandoc.Definition
41import Text.Pandoc.Definition
@@ -52,14 +53,14 @@ instance Default WriterState
52 where def = WriterState{ stNotes = [] }
53 where def = WriterState{ stNotes = [] }
53
54
54-- | Convert Pandoc to Haddock.
55-- | Convert Pandoc to Haddock.
55−writeHaddock :: PandocMonad m => WriterOptions -> Pandoc -> m String
56+writeHaddock :: PandocMonad m => WriterOptions -> Pandoc -> m Text
56writeHaddock opts document =
57writeHaddock opts document =
57 evalStateT (pandocToHaddock opts{
58 evalStateT (pandocToHaddock opts{
58 writerWrapText = writerWrapText opts } document) def
59 writerWrapText = writerWrapText opts } document) def
59
60
60-- | Return haddock representation of document.
61-- | Return haddock representation of document.
61pandocToHaddock :: PandocMonad m
62pandocToHaddock :: PandocMonad m
62− => WriterOptions -> Pandoc -> StateT WriterState m String
63+ => WriterOptions -> Pandoc -> StateT WriterState m Text
63pandocToHaddock opts (Pandoc meta blocks) = do
64pandocToHaddock opts (Pandoc meta blocks) = do
64 let colwidth = if writerWrapText opts == WrapAuto
65 let colwidth = if writerWrapText opts == WrapAuto
65 then Just $ writerColumns opts
66 then Just $ writerColumns opts
@@ -67,13 +68,13 @@ pandocToHaddock opts (Pandoc meta blocks) = do
67 body <- blockListToHaddock opts blocks
68 body <- blockListToHaddock opts blocks
68 st <- get
69 st <- get
69 notes' <- notesToHaddock opts (reverse $ stNotes st)
70 notes' <- notesToHaddock opts (reverse $ stNotes st)
70− let render' :: Doc -> String
71+ let render' :: Doc -> Text
71 render' = render colwidth
72 render' = render colwidth
72 let main = render' $ body <>
73 let main = render' $ body <>
73 (if isEmpty notes' then empty else blankline <> notes')
74 (if isEmpty notes' then empty else blankline <> notes')
74 metadata <- metaToJSON opts
75 metadata <- metaToJSON opts
75− (fmap (render colwidth) . blockListToHaddock opts)
76+ (fmap render' . blockListToHaddock opts)
76− (fmap (render colwidth) . inlineListToHaddock opts)
77+ (fmap render' . inlineListToHaddock opts)
77 meta
78 meta
78 let context = defField "body" main
79 let context = defField "body" main
79 $ metadata
80 $ metadata
src/Text/Pandoc/Writers/ICML.hs+3−1
@@ -21,6 +21,7 @@ import Control.Monad.State
21import Data.List (intersperse, isInfixOf, isPrefixOf, stripPrefix)
21import Data.List (intersperse, isInfixOf, isPrefixOf, stripPrefix)
22import qualified Data.Set as Set
22import qualified Data.Set as Set
23import Data.Text as Text (breakOnAll, pack)
23import Data.Text as Text (breakOnAll, pack)
24+import Data.Text (Text)
24import Text.Pandoc.Class (PandocMonad, report)
25import Text.Pandoc.Class (PandocMonad, report)
25import qualified Text.Pandoc.Class as P
26import qualified Text.Pandoc.Class as P
26import Text.Pandoc.Definition
27import Text.Pandoc.Definition
@@ -127,11 +128,12 @@ footnoteName = "Footnote"
127citeName = "Cite"
128citeName = "Cite"
128
129
129-- | Convert Pandoc document to string in ICML format.
130-- | Convert Pandoc document to string in ICML format.
130−writeICML :: PandocMonad m => WriterOptions -> Pandoc -> m String
131+writeICML :: PandocMonad m => WriterOptions -> Pandoc -> m Text
131writeICML opts (Pandoc meta blocks) = do
132writeICML opts (Pandoc meta blocks) = do
132 let colwidth = if writerWrapText opts == WrapAuto
133 let colwidth = if writerWrapText opts == WrapAuto
133 then Just $ writerColumns opts
134 then Just $ writerColumns opts
134 else Nothing
135 else Nothing
136+ render' :: Doc -> Text
135 render' = render colwidth
137 render' = render colwidth
136 renderMeta f s = liftM (render' . fst) $ runStateT (f opts [] s) defaultWriterState
138 renderMeta f s = liftM (render' . fst) $ runStateT (f opts [] s) defaultWriterState
137 metadata <- metaToJSON opts
139 metadata <- metaToJSON opts
src/Text/Pandoc/Writers/JATS.hs+7−5
@@ -33,6 +33,7 @@ https://jats.nlm.nih.gov/publishing/tag-library/1.1d3/element/mml-math.html
33module Text.Pandoc.Writers.JATS ( writeJATS ) where
33module Text.Pandoc.Writers.JATS ( writeJATS ) where
34import Control.Monad.Reader
34import Control.Monad.Reader
35import Data.Char (toLower)
35import Data.Char (toLower)
36+import Data.Text (Text)
36import Data.Generics (everywhere, mkT)
37import Data.Generics (everywhere, mkT)
37import Data.List (intercalate, isSuffixOf, partition)
38import Data.List (intercalate, isSuffixOf, partition)
38import Data.Maybe (fromMaybe)
39import Data.Maybe (fromMaybe)
@@ -81,12 +82,12 @@ authorToJATS opts name' = do
81 in inTagsSimple "firstname" (text $ escapeStringForXML firstname) $$
82 in inTagsSimple "firstname" (text $ escapeStringForXML firstname) $$
82 inTagsSimple "surname" (text $ escapeStringForXML lastname)
83 inTagsSimple "surname" (text $ escapeStringForXML lastname)
83
84
84−writeJATS :: PandocMonad m => WriterOptions -> Pandoc -> m String
85+writeJATS :: PandocMonad m => WriterOptions -> Pandoc -> m Text
85writeJATS opts d =
86writeJATS opts d =
86 runReaderT (docToJATS opts d) JATS1_1
87 runReaderT (docToJATS opts d) JATS1_1
87
88
88-- | Convert Pandoc document to string in JATS format.
89-- | Convert Pandoc document to string in JATS format.
89−docToJATS :: PandocMonad m => WriterOptions -> Pandoc -> DB m String
90+docToJATS :: PandocMonad m => WriterOptions -> Pandoc -> DB m Text
90docToJATS opts (Pandoc meta blocks) = do
91docToJATS opts (Pandoc meta blocks) = do
91 let isBackBlock (Div ("refs",_,_) _) = True
92 let isBackBlock (Div ("refs",_,_) _) = True
92 isBackBlock _ = False
93 isBackBlock _ = False
@@ -96,7 +97,8 @@ docToJATS opts (Pandoc meta blocks) = do
96 let colwidth = if writerWrapText opts == WrapAuto
97 let colwidth = if writerWrapText opts == WrapAuto
97 then Just $ writerColumns opts
98 then Just $ writerColumns opts
98 else Nothing
99 else Nothing
100+ let render' :: Doc -> Text
99− let render' = render colwidth
101+ render' = render colwidth
100 let opts' = if (maybe False (("/book>" `isSuffixOf`) . trimr)
102 let opts' = if (maybe False (("/book>" `isSuffixOf`) . trimr)
101 (writerTemplate opts) &&
103 (writerTemplate opts) &&
102 TopLevelDefault == writerTopLevelDivision opts)
104 TopLevelDefault == writerTopLevelDivision opts)
@@ -111,10 +113,10 @@ docToJATS opts (Pandoc meta blocks) = do
111 auths' <- mapM (authorToJATS opts) $ docAuthors meta
113 auths' <- mapM (authorToJATS opts) $ docAuthors meta
112 let meta' = B.setMeta "author" auths' meta
114 let meta' = B.setMeta "author" auths' meta
113 metadata <- metaToJSON opts
115 metadata <- metaToJSON opts
114− (fmap (render colwidth . vcat) .
116+ (fmap (render' . vcat) .
115 (mapM (elementToJATS opts' startLvl) .
117 (mapM (elementToJATS opts' startLvl) .
116 hierarchicalize))
118 hierarchicalize))
117− (fmap (render colwidth) . inlinesToJATS opts')
119+ (fmap render' . inlinesToJATS opts')
118 meta'
120 meta'
119 main <- (render' . vcat) <$>
121 main <- (render' . vcat) <$>
120 (mapM (elementToJATS opts' startLvl) elements)
122 (mapM (elementToJATS opts' startLvl) elements)
src/Text/Pandoc/Writers/LaTeX.hs+10−7
@@ -42,6 +42,7 @@ import Data.Char (isAlphaNum, isAscii, isDigit, isLetter, isPunctuation, ord,
42import Data.List (foldl', intercalate, intersperse, isInfixOf, nub, nubBy,
42import Data.List (foldl', intercalate, intersperse, isInfixOf, nub, nubBy,
43 stripPrefix, (\\))
43 stripPrefix, (\\))
44import Data.Maybe (catMaybes, fromMaybe, isJust)
44import Data.Maybe (catMaybes, fromMaybe, isJust)
45+import Data.Text (Text)
45import qualified Data.Text as T
46import qualified Data.Text as T
46import Network.URI (unEscapeString)
47import Network.URI (unEscapeString)
47import Text.Pandoc.Class (PandocMonad, report)
48import Text.Pandoc.Class (PandocMonad, report)
@@ -114,13 +115,13 @@ startingState options = WriterState {
114 , stEmptyLine = True }
115 , stEmptyLine = True }
115
116
116-- | Convert Pandoc to LaTeX.
117-- | Convert Pandoc to LaTeX.
117−writeLaTeX :: PandocMonad m => WriterOptions -> Pandoc -> m String
118+writeLaTeX :: PandocMonad m => WriterOptions -> Pandoc -> m Text
118writeLaTeX options document =
119writeLaTeX options document =
119 evalStateT (pandocToLaTeX options document) $
120 evalStateT (pandocToLaTeX options document) $
120 startingState options
121 startingState options
121
122
122-- | Convert Pandoc to LaTeX Beamer.
123-- | Convert Pandoc to LaTeX Beamer.
123−writeBeamer :: PandocMonad m => WriterOptions -> Pandoc -> m String
124+writeBeamer :: PandocMonad m => WriterOptions -> Pandoc -> m Text
124writeBeamer options document =
125writeBeamer options document =
125 evalStateT (pandocToLaTeX options document) $
126 evalStateT (pandocToLaTeX options document) $
126 (startingState options){ stBeamer = True }
127 (startingState options){ stBeamer = True }
@@ -128,7 +129,7 @@ writeBeamer options document =
128type LW m = StateT WriterState m
129type LW m = StateT WriterState m
129
130
130pandocToLaTeX :: PandocMonad m
131pandocToLaTeX :: PandocMonad m
131− => WriterOptions -> Pandoc -> LW m String
132+ => WriterOptions -> Pandoc -> LW m Text
132pandocToLaTeX options (Pandoc meta blocks) = do
133pandocToLaTeX options (Pandoc meta blocks) = do
133 -- Strip off final 'references' header if --natbib or --biblatex
134 -- Strip off final 'references' header if --natbib or --biblatex
134 let method = writerCiteMethod options
135 let method = writerCiteMethod options
@@ -146,9 +147,11 @@ pandocToLaTeX options (Pandoc meta blocks) = do
146 let colwidth = if writerWrapText options == WrapAuto
147 let colwidth = if writerWrapText options == WrapAuto
147 then Just $ writerColumns options
148 then Just $ writerColumns options
148 else Nothing
149 else Nothing
150+ let render' :: Doc -> Text
151+ render' = render colwidth
149 metadata <- metaToJSON options
152 metadata <- metaToJSON options
150− (fmap (render colwidth) . blockListToLaTeX)
153+ (fmap render' . blockListToLaTeX)
151− (fmap (render colwidth) . inlineListToLaTeX)
154+ (fmap render' . inlineListToLaTeX)
152 meta
155 meta
153 let bookClasses = ["memoir","book","report","scrreprt","scrbook"]
156 let bookClasses = ["memoir","book","report","scrreprt","scrbook"]
154 let documentClass = case P.parse pDocumentClass "template" template of
157 let documentClass = case P.parse pDocumentClass "template" template of
@@ -180,8 +183,8 @@ pandocToLaTeX options (Pandoc meta blocks) = do
180 then toSlides blocks''
183 then toSlides blocks''
181 else return blocks''
184 else return blocks''
182 body <- mapM (elementToLaTeX options) $ hierarchicalize blocks'''
185 body <- mapM (elementToLaTeX options) $ hierarchicalize blocks'''
183− (biblioTitle :: String) <- liftM (render colwidth) $ inlineListToLaTeX lastHeader
186+ (biblioTitle :: Text) <- render' <$> inlineListToLaTeX lastHeader
184− let main = render colwidth $ vsep body
187+ let main = render' $ vsep body
185 st <- get
188 st <- get
186 titleMeta <- stringToLaTeX TextString $ stringify $ docTitle meta
189 titleMeta <- stringToLaTeX TextString $ stringify $ docTitle meta
187 authorsMeta <- mapM (stringToLaTeX TextString . stringify) $ docAuthors meta
190 authorsMeta <- mapM (stringToLaTeX TextString . stringify) $ docAuthors meta
src/Text/Pandoc/Writers/Man.hs+17−13
@@ -1,3 +1,4 @@
1+{-# LANGUAGE OverloadedStrings #-}
1{-
2{-
2Copyright (C) 2007-2017 John MacFarlane <jgm@berkeley.edu>
3Copyright (C) 2007-2017 John MacFarlane <jgm@berkeley.edu>
3
4
@@ -34,6 +35,8 @@ import Control.Monad.State
34import Data.List (intercalate, intersperse, stripPrefix, sort)
35import Data.List (intercalate, intersperse, stripPrefix, sort)
35import qualified Data.Map as Map
36import qualified Data.Map as Map
36import Data.Maybe (fromMaybe)
37import Data.Maybe (fromMaybe)
38+import Data.Text (Text)
39+import qualified Data.Text as T
37import Text.Pandoc.Builder (deleteMeta)
40import Text.Pandoc.Builder (deleteMeta)
38import Text.Pandoc.Class (PandocMonad, report)
41import Text.Pandoc.Class (PandocMonad, report)
39import Text.Pandoc.Definition
42import Text.Pandoc.Definition
@@ -62,36 +65,37 @@ defaultWriterState = WriterState { stNotes = []
62 , stHasTables = False }
65 , stHasTables = False }
63
66
64-- | Convert Pandoc to Man.
67-- | Convert Pandoc to Man.
65−writeMan :: PandocMonad m => WriterOptions -> Pandoc -> m String
68+writeMan :: PandocMonad m => WriterOptions -> Pandoc -> m Text
66writeMan opts document =
69writeMan opts document =
67 evalStateT (pandocToMan opts document) defaultWriterState
70 evalStateT (pandocToMan opts document) defaultWriterState
68
71
69-- | Return groff man representation of document.
72-- | Return groff man representation of document.
70−pandocToMan :: PandocMonad m => WriterOptions -> Pandoc -> StateT WriterState m String
73+pandocToMan :: PandocMonad m => WriterOptions -> Pandoc -> StateT WriterState m Text
71pandocToMan opts (Pandoc meta blocks) = do
74pandocToMan opts (Pandoc meta blocks) = do
72 let colwidth = if writerWrapText opts == WrapAuto
75 let colwidth = if writerWrapText opts == WrapAuto
73 then Just $ writerColumns opts
76 then Just $ writerColumns opts
74 else Nothing
77 else Nothing
78+ let render' :: Doc -> Text
75− let render' = render colwidth
79+ render' = render colwidth
76 titleText <- inlineListToMan opts $ docTitle meta
80 titleText <- inlineListToMan opts $ docTitle meta
77 let title' = render' titleText
81 let title' = render' titleText
78 let setFieldsFromTitle =
82 let setFieldsFromTitle =
79− case break (== ' ') title' of
83+ case T.break (== ' ') title' of
80− (cmdName, rest) -> case break (=='(') cmdName of
84+ (cmdName, rest) -> case T.break (=='(') cmdName of
81− (xs, '(':ys) | not (null ys) &&
85+ (xs, ys) | "(" `T.isPrefixOf` ys
82− last ys == ')' ->
86+ && ")" `T.isSuffixOf` ys ->
83 defField "title" xs .
87 defField "title" xs .
84− defField "section" (init ys) .
88+ defField "section" (T.init $ T.drop 1 ys) .
85− case splitBy (=='|') rest of
89+ case T.splitOn "|" rest of
86 (ft:hds) ->
90 (ft:hds) ->
87− defField "footer" (trim ft) .
91+ defField "footer" (T.strip ft) .
88 defField "header"
92 defField "header"
89− (trim $ concat hds)
93+ (T.strip $ mconcat hds)
90 [] -> id
94 [] -> id
91 _ -> defField "title" title'
95 _ -> defField "title" title'
92 metadata <- metaToJSON opts
96 metadata <- metaToJSON opts
93− (fmap (render colwidth) . blockListToMan opts)
97+ (fmap render' . blockListToMan opts)
94− (fmap (render colwidth) . inlineListToMan opts)
98+ (fmap render' . inlineListToMan opts)
95 $ deleteMeta "title" meta
99 $ deleteMeta "title" meta
96 body <- blockListToMan opts blocks
100 body <- blockListToMan opts blocks
97 notes <- gets stNotes
101 notes <- gets stNotes
src/Text/Pandoc/Writers/Markdown.hs+13−10
@@ -45,6 +45,7 @@ import Data.Maybe (fromMaybe)
45import Data.Monoid (Any (..))
45import Data.Monoid (Any (..))
46import Data.Ord (comparing)
46import Data.Ord (comparing)
47import qualified Data.Set as Set
47import qualified Data.Set as Set
48+import Data.Text (Text)
48import qualified Data.Text as T
49import qualified Data.Text as T
49import qualified Data.Vector as V
50import qualified Data.Vector as V
50import Data.Yaml (Value (Array, Bool, Number, Object, String))
51import Data.Yaml (Value (Array, Bool, Number, Object, String))
@@ -106,7 +107,7 @@ instance Default WriterState
106 }
107 }
107
108
108-- | Convert Pandoc to Markdown.
109-- | Convert Pandoc to Markdown.
109−writeMarkdown :: PandocMonad m => WriterOptions -> Pandoc -> m String
110+writeMarkdown :: PandocMonad m => WriterOptions -> Pandoc -> m Text
110writeMarkdown opts document =
111writeMarkdown opts document =
111 evalMD (pandocToMarkdown opts{
112 evalMD (pandocToMarkdown opts{
112 writerWrapText = if isEnabled Ext_hard_line_breaks opts
113 writerWrapText = if isEnabled Ext_hard_line_breaks opts
@@ -116,7 +117,7 @@ writeMarkdown opts document =
116
117
117-- | Convert Pandoc to plain text (like markdown, but without links,
118-- | Convert Pandoc to plain text (like markdown, but without links,
118-- pictures, or inline formatting).
119-- pictures, or inline formatting).
119−writePlain :: PandocMonad m => WriterOptions -> Pandoc -> m String
120+writePlain :: PandocMonad m => WriterOptions -> Pandoc -> m Text
120writePlain opts document =
121writePlain opts document =
121 evalMD (pandocToMarkdown opts document) def{ envPlain = True } def
122 evalMD (pandocToMarkdown opts document) def{ envPlain = True } def
122
123
@@ -180,15 +181,17 @@ jsonToYaml (Number n) = text $ show n
180jsonToYaml _ = empty
181jsonToYaml _ = empty
181
182
182-- | Return markdown representation of document.
183-- | Return markdown representation of document.
183−pandocToMarkdown :: PandocMonad m => WriterOptions -> Pandoc -> MD m String
184+pandocToMarkdown :: PandocMonad m => WriterOptions -> Pandoc -> MD m Text
184pandocToMarkdown opts (Pandoc meta blocks) = do
185pandocToMarkdown opts (Pandoc meta blocks) = do
185 let colwidth = if writerWrapText opts == WrapAuto
186 let colwidth = if writerWrapText opts == WrapAuto
186 then Just $ writerColumns opts
187 then Just $ writerColumns opts
187 else Nothing
188 else Nothing
188 isPlain <- asks envPlain
189 isPlain <- asks envPlain
190+ let render' :: Doc -> Text
191+ render' = render colwidth . chomp
189 metadata <- metaToJSON'
192 metadata <- metaToJSON'
190− (fmap (render colwidth) . blockListToMarkdown opts)
193+ (fmap render' . blockListToMarkdown opts)
191− (fmap (render colwidth) . blockToMarkdown opts . Plain)
194+ (fmap render' . blockToMarkdown opts . Plain)
192 meta
195 meta
193 let title' = maybe empty text $ getField "title" metadata
196 let title' = maybe empty text $ getField "title" metadata
194 let authors' = maybe [] (map text) $ getField "author" metadata
197 let authors' = maybe [] (map text) $ getField "author" metadata
@@ -216,8 +219,6 @@ pandocToMarkdown opts (Pandoc meta blocks) = do
216 else blocks
219 else blocks
217 body <- blockListToMarkdown opts blocks'
220 body <- blockListToMarkdown opts blocks'
218 notesAndRefs' <- notesAndRefs opts
221 notesAndRefs' <- notesAndRefs opts
219− let render' :: Doc -> String
220− render' = render colwidth . chomp
221 let main = render' $ body <> notesAndRefs'
222 let main = render' $ body <> notesAndRefs'
222 let context = defField "toc" (render' toc)
223 let context = defField "toc" (render' toc)
223 $ defField "body" main
224 $ defField "body" main
@@ -571,7 +572,7 @@ blockToMarkdown' opts t@(Table caption aligns widths headers rows) = do
571 gridTable opts blockListToMarkdown
572 gridTable opts blockListToMarkdown
572 (all null headers) aligns' widths' headers rows
573 (all null headers) aligns' widths' headers rows
573 | isEnabled Ext_raw_html opts -> fmap (id,) $
574 | isEnabled Ext_raw_html opts -> fmap (id,) $
574− text <$>
575+ (text . T.unpack) <$>
575 (writeHtml5String def $ Pandoc nullMeta [t])
576 (writeHtml5String def $ Pandoc nullMeta [t])
576 | otherwise -> return $ (id, text "[TABLE]")
577 | otherwise -> return $ (id, text "[TABLE]")
577 return $ nst $ tbl $$ caption'' $$ blankline
578 return $ nst $ tbl $$ caption'' $$ blankline
@@ -1110,7 +1111,8 @@ inlineToMarkdown opts lnk@(Link attr txt (src, tit))
1110 | isEnabled Ext_raw_html opts &&
1111 | isEnabled Ext_raw_html opts &&
1111 not (isEnabled Ext_link_attributes opts) &&
1112 not (isEnabled Ext_link_attributes opts) &&
1112 attr /= nullAttr = -- use raw HTML
1113 attr /= nullAttr = -- use raw HTML
1114+ (text . T.unpack . T.strip) <$>
1113− (text . trim) <$> writeHtml5String def (Pandoc nullMeta [Plain [lnk]])
1115+ writeHtml5String def (Pandoc nullMeta [Plain [lnk]])
1114 | otherwise = do
1116 | otherwise = do
1115 plain <- asks envPlain
1117 plain <- asks envPlain
1116 linktext <- inlineListToMarkdown opts txt
1118 linktext <- inlineListToMarkdown opts txt
@@ -1149,7 +1151,8 @@ inlineToMarkdown opts img@(Image attr alternate (source, tit))
1149 | isEnabled Ext_raw_html opts &&
1151 | isEnabled Ext_raw_html opts &&
1150 not (isEnabled Ext_link_attributes opts) &&
1152 not (isEnabled Ext_link_attributes opts) &&
1151 attr /= nullAttr = -- use raw HTML
1153 attr /= nullAttr = -- use raw HTML
1154+ (text . T.unpack . T.strip) <$>
1152− (text . trim) <$> writeHtml5String def (Pandoc nullMeta [Plain [img]])
1155+ writeHtml5String def (Pandoc nullMeta [Plain [img]])
1153 | otherwise = do
1156 | otherwise = do
1154 plain <- asks envPlain
1157 plain <- asks envPlain
1155 let txt = if null alternate || alternate == [Str source]
1158 let txt = if null alternate || alternate == [Str source]
src/Text/Pandoc/Writers/MediaWiki.hs+5−3
@@ -34,6 +34,7 @@ import Control.Monad.Reader
34import Control.Monad.State
34import Control.Monad.State
35import Data.List (intercalate)
35import Data.List (intercalate)
36import qualified Data.Set as Set
36import qualified Data.Set as Set
37+import Data.Text (Text, pack)
37import Text.Pandoc.Class (PandocMonad, report)
38import Text.Pandoc.Class (PandocMonad, report)
38import Text.Pandoc.Logging
39import Text.Pandoc.Logging
39import Text.Pandoc.Definition
40import Text.Pandoc.Definition
@@ -59,14 +60,14 @@ data WriterReader = WriterReader {
59type MediaWikiWriter m = ReaderT WriterReader (StateT WriterState m)
60type MediaWikiWriter m = ReaderT WriterReader (StateT WriterState m)
60
61
61-- | Convert Pandoc to MediaWiki.
62-- | Convert Pandoc to MediaWiki.
62−writeMediaWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
63+writeMediaWiki :: PandocMonad m => WriterOptions -> Pandoc -> m Text
63writeMediaWiki opts document =
64writeMediaWiki opts document =
64 let initialState = WriterState { stNotes = False, stOptions = opts }
65 let initialState = WriterState { stNotes = False, stOptions = opts }
65 env = WriterReader { options = opts, listLevel = [], useTags = False }
66 env = WriterReader { options = opts, listLevel = [], useTags = False }
66 in evalStateT (runReaderT (pandocToMediaWiki document) env) initialState
67 in evalStateT (runReaderT (pandocToMediaWiki document) env) initialState
67
68
68-- | Return MediaWiki representation of document.
69-- | Return MediaWiki representation of document.
69−pandocToMediaWiki :: PandocMonad m => Pandoc -> MediaWikiWriter m String
70+pandocToMediaWiki :: PandocMonad m => Pandoc -> MediaWikiWriter m Text
70pandocToMediaWiki (Pandoc meta blocks) = do
71pandocToMediaWiki (Pandoc meta blocks) = do
71 opts <- asks options
72 opts <- asks options
72 metadata <- metaToJSON opts
73 metadata <- metaToJSON opts
@@ -81,7 +82,8 @@ pandocToMediaWiki (Pandoc meta blocks) = do
81 let main = body ++ notes
82 let main = body ++ notes
82 let context = defField "body" main
83 let context = defField "body" main
83 $ defField "toc" (writerTableOfContents opts) metadata
84 $ defField "toc" (writerTableOfContents opts) metadata
85+ return $ pack
84− return $ case writerTemplate opts of
86+ $ case writerTemplate opts of
85 Nothing -> main
87 Nothing -> main
86 Just tpl -> renderTemplate' tpl context
88 Just tpl -> renderTemplate' tpl context
87
89
src/Text/Pandoc/Writers/Ms.hs+7−5
@@ -44,6 +44,7 @@ import Text.Pandoc.Options
44import Text.Pandoc.Writers.Math
44import Text.Pandoc.Writers.Math
45import Text.Printf ( printf )
45import Text.Printf ( printf )
46import qualified Data.Text as T
46import qualified Data.Text as T
47+import Data.Text (Text)
47import qualified Data.Map as Map
48import qualified Data.Map as Map
48import Data.Maybe ( catMaybes, fromMaybe )
49import Data.Maybe ( catMaybes, fromMaybe )
49import Data.List ( intersperse, intercalate, sort )
50import Data.List ( intersperse, intercalate, sort )
@@ -85,17 +86,18 @@ type Note = [Block]
85type MS = StateT WriterState
86type MS = StateT WriterState
86
87
87-- | Convert Pandoc to Ms.
88-- | Convert Pandoc to Ms.
88−writeMs :: PandocMonad m => WriterOptions -> Pandoc -> m String
89+writeMs :: PandocMonad m => WriterOptions -> Pandoc -> m Text
89writeMs opts document =
90writeMs opts document =
90 evalStateT (pandocToMs opts document) defaultWriterState
91 evalStateT (pandocToMs opts document) defaultWriterState
91
92
92-- | Return groff ms representation of document.
93-- | Return groff ms representation of document.
93−pandocToMs :: PandocMonad m => WriterOptions -> Pandoc -> MS m String
94+pandocToMs :: PandocMonad m => WriterOptions -> Pandoc -> MS m Text
94pandocToMs opts (Pandoc meta blocks) = do
95pandocToMs opts (Pandoc meta blocks) = do
95 let colwidth = if writerWrapText opts == WrapAuto
96 let colwidth = if writerWrapText opts == WrapAuto
96 then Just $ writerColumns opts
97 then Just $ writerColumns opts
97 else Nothing
98 else Nothing
99+ let render' :: Doc -> Text
98− let render' = render colwidth
100+ render' = render colwidth
99 metadata <- metaToJSON opts
101 metadata <- metaToJSON opts
100 (fmap render' . blockListToMs opts)
102 (fmap render' . blockListToMs opts)
101 (fmap render' . inlineListToMs' opts)
103 (fmap render' . inlineListToMs' opts)
@@ -108,9 +110,9 @@ pandocToMs opts (Pandoc meta blocks) = do
108 hasHighlighting <- gets stHighlighting
110 hasHighlighting <- gets stHighlighting
109 let highlightingMacros = if hasHighlighting
111 let highlightingMacros = if hasHighlighting
110 then case writerHighlightStyle opts of
112 then case writerHighlightStyle opts of
111− Nothing -> ""
113+ Nothing -> mempty
112 Just sty -> render' $ styleToMs sty
114 Just sty -> render' $ styleToMs sty
113− else ""
115+ else mempty
114
116
115 let context = defField "body" main
117 let context = defField "body" main
116 $ defField "has-inline-math" hasInlineMath
118 $ defField "has-inline-math" hasInlineMath
src/Text/Pandoc/Writers/Muse.hs+7−4
@@ -43,6 +43,7 @@ even though it is supported only in Emacs Muse.
43-}
43-}
44module Text.Pandoc.Writers.Muse (writeMuse) where
44module Text.Pandoc.Writers.Muse (writeMuse) where
45import Control.Monad.State
45import Control.Monad.State
46+import Data.Text (Text)
46import Data.List (intersperse, transpose, isInfixOf)
47import Data.List (intersperse, transpose, isInfixOf)
47import System.FilePath (takeExtension)
48import System.FilePath (takeExtension)
48import Text.Pandoc.Class (PandocMonad)
49import Text.Pandoc.Class (PandocMonad)
@@ -68,7 +69,7 @@ data WriterState =
68writeMuse :: PandocMonad m
69writeMuse :: PandocMonad m
69 => WriterOptions
70 => WriterOptions
70 -> Pandoc
71 -> Pandoc
71− -> m String
72+ -> m Text
72writeMuse opts document =
73writeMuse opts document =
73 let st = WriterState { stNotes = []
74 let st = WriterState { stNotes = []
74 , stOptions = opts
75 , stOptions = opts
@@ -81,15 +82,17 @@ writeMuse opts document =
81-- | Return Muse representation of document.
82-- | Return Muse representation of document.
82pandocToMuse :: PandocMonad m
83pandocToMuse :: PandocMonad m
83 => Pandoc
84 => Pandoc
84− -> StateT WriterState m String
85+ -> StateT WriterState m Text
85pandocToMuse (Pandoc meta blocks) = do
86pandocToMuse (Pandoc meta blocks) = do
86 opts <- gets stOptions
87 opts <- gets stOptions
87 let colwidth = if writerWrapText opts == WrapAuto
88 let colwidth = if writerWrapText opts == WrapAuto
88 then Just $ writerColumns opts
89 then Just $ writerColumns opts
89 else Nothing
90 else Nothing
91+ let render' :: Doc -> Text
92+ render' = render Nothing
90 metadata <- metaToJSON opts
93 metadata <- metaToJSON opts
91− (fmap (render Nothing) . blockListToMuse)
94+ (fmap render' . blockListToMuse)
92− (fmap (render Nothing) . inlineListToMuse)
95+ (fmap render' . inlineListToMuse)
93 meta
96 meta
94 body <- blockListToMuse blocks
97 body <- blockListToMuse blocks
95 notes <- liftM (reverse . stNotes) get >>= notesToMuse
98 notes <- liftM (reverse . stNotes) get >>= notesToMuse
src/Text/Pandoc/Writers/Native.hs+2−1
@@ -30,6 +30,7 @@ Conversion of a 'Pandoc' document to a string representation.
30-}
30-}
31module Text.Pandoc.Writers.Native ( writeNative )
31module Text.Pandoc.Writers.Native ( writeNative )
32where
32where
33+import Data.Text (Text)
33import Data.List (intersperse)
34import Data.List (intersperse)
34import Text.Pandoc.Class (PandocMonad)
35import Text.Pandoc.Class (PandocMonad)
35import Text.Pandoc.Definition
36import Text.Pandoc.Definition
@@ -67,7 +68,7 @@ prettyBlock (Div attr blocks) =
67prettyBlock block = text $ show block
68prettyBlock block = text $ show block
68
69
69-- | Prettyprint Pandoc document.
70-- | Prettyprint Pandoc document.
70−writeNative :: PandocMonad m => WriterOptions -> Pandoc -> m String
71+writeNative :: PandocMonad m => WriterOptions -> Pandoc -> m Text
71writeNative opts (Pandoc meta blocks) = return $
72writeNative opts (Pandoc meta blocks) = return $
72 let colwidth = if writerWrapText opts == WrapAuto
73 let colwidth = if writerWrapText opts == WrapAuto
73 then Just $ writerColumns opts
74 then Just $ writerColumns opts
src/Text/Pandoc/Writers/ODT.hs+3−2
@@ -35,6 +35,7 @@ import Control.Monad.State
35import qualified Data.ByteString.Lazy as B
35import qualified Data.ByteString.Lazy as B
36import Data.List (isPrefixOf)
36import Data.List (isPrefixOf)
37import Data.Maybe (fromMaybe)
37import Data.Maybe (fromMaybe)
38+import qualified Data.Text.Lazy as TL
38import System.FilePath (takeDirectory, takeExtension, (<.>))
39import System.FilePath (takeDirectory, takeExtension, (<.>))
39import Text.Pandoc.Class (PandocMonad, report)
40import Text.Pandoc.Class (PandocMonad, report)
40import qualified Text.Pandoc.Class as P
41import qualified Text.Pandoc.Class as P
@@ -45,7 +46,7 @@ import Text.Pandoc.MIME (extensionFromMimeType, getMimeType)
45import Text.Pandoc.Options (WrapOption (..), WriterOptions (..))
46import Text.Pandoc.Options (WrapOption (..), WriterOptions (..))
46import Text.Pandoc.Pretty
47import Text.Pandoc.Pretty
47import Text.Pandoc.Shared (stringify)
48import Text.Pandoc.Shared (stringify)
48−import Text.Pandoc.UTF8 (fromStringLazy)
49+import Text.Pandoc.UTF8 (fromStringLazy, fromTextLazy)
49import Text.Pandoc.Walk
50import Text.Pandoc.Walk
50import Text.Pandoc.Writers.OpenDocument (writeOpenDocument)
51import Text.Pandoc.Writers.OpenDocument (writeOpenDocument)
51import Text.Pandoc.Writers.Shared (fixDisplayMath)
52import Text.Pandoc.Writers.Shared (fixDisplayMath)
@@ -88,7 +89,7 @@ pandocToODT opts doc@(Pandoc meta _) = do
88 newContents <- lift $ writeOpenDocument opts{writerWrapText = WrapNone} doc'
89 newContents <- lift $ writeOpenDocument opts{writerWrapText = WrapNone} doc'
89 epochtime <- floor `fmap` (lift P.getPOSIXTime)
90 epochtime <- floor `fmap` (lift P.getPOSIXTime)
90 let contentEntry = toEntry "content.xml" epochtime
91 let contentEntry = toEntry "content.xml" epochtime
91− $ fromStringLazy newContents
92+ $ fromTextLazy $ TL.fromStrict newContents
92 picEntries <- gets stEntries
93 picEntries <- gets stEntries
93 let archive = foldr addEntryToArchive refArchive
94 let archive = foldr addEntryToArchive refArchive
94 $ contentEntry : picEntries
95 $ contentEntry : picEntries
src/Text/Pandoc/Writers/OPML.hs+9−6
@@ -30,6 +30,8 @@ Conversion of 'Pandoc' documents to OPML XML.
30-}
30-}
31module Text.Pandoc.Writers.OPML ( writeOPML) where
31module Text.Pandoc.Writers.OPML ( writeOPML) where
32import Control.Monad.Except (throwError)
32import Control.Monad.Except (throwError)
33+import Data.Text (Text, unpack)
34+import qualified Data.Text as T
33import qualified Text.Pandoc.Builder as B
35import qualified Text.Pandoc.Builder as B
34import Text.Pandoc.Class (PandocMonad)
36import Text.Pandoc.Class (PandocMonad)
35import Text.Pandoc.Compat.Time
37import Text.Pandoc.Compat.Time
@@ -45,7 +47,7 @@ import Text.Pandoc.Writers.Shared
45import Text.Pandoc.XML
47import Text.Pandoc.XML
46
48
47-- | Convert Pandoc document to string in OPML format.
49-- | Convert Pandoc document to string in OPML format.
48−writeOPML :: PandocMonad m => WriterOptions -> Pandoc -> m String
50+writeOPML :: PandocMonad m => WriterOptions -> Pandoc -> m Text
49writeOPML opts (Pandoc meta blocks) = do
51writeOPML opts (Pandoc meta blocks) = do
50 let elements = hierarchicalize blocks
52 let elements = hierarchicalize blocks
51 colwidth = if writerWrapText opts == WrapAuto
53 colwidth = if writerWrapText opts == WrapAuto
@@ -54,7 +56,7 @@ writeOPML opts (Pandoc meta blocks) = do
54 meta' = B.setMeta "date" (B.str $ convertDate $ docDate meta) meta
56 meta' = B.setMeta "date" (B.str $ convertDate $ docDate meta) meta
55 metadata <- metaToJSON opts
57 metadata <- metaToJSON opts
56 (writeMarkdown def . Pandoc nullMeta)
58 (writeMarkdown def . Pandoc nullMeta)
57− (\ils -> trimr <$> (writeMarkdown def $ Pandoc nullMeta [Plain ils]))
59+ (\ils -> T.stripEnd <$> (writeMarkdown def $ Pandoc nullMeta [Plain ils]))
58 meta'
60 meta'
59 main <- (render colwidth . vcat) <$> (mapM (elementToOPML opts) elements)
61 main <- (render colwidth . vcat) <$> (mapM (elementToOPML opts) elements)
60 let context = defField "body" main metadata
62 let context = defField "body" main metadata
@@ -63,9 +65,9 @@ writeOPML opts (Pandoc meta blocks) = do
63 Just tpl -> renderTemplate' tpl context
65 Just tpl -> renderTemplate' tpl context
64
66
65
67
66−writeHtmlInlines :: PandocMonad m => [Inline] -> m String
68+writeHtmlInlines :: PandocMonad m => [Inline] -> m Text
67writeHtmlInlines ils =
69writeHtmlInlines ils =
68− trim <$> (writeHtml5String def $ Pandoc nullMeta [Plain ils])
70+ T.strip <$> (writeHtml5String def $ Pandoc nullMeta [Plain ils])
69
71
70-- date format: RFC 822: Thu, 14 Jul 2005 23:41:05 GMT
72-- date format: RFC 822: Thu, 14 Jul 2005 23:41:05 GMT
71showDateTimeRFC822 :: UTCTime -> String
73showDateTimeRFC822 :: UTCTime -> String
@@ -95,9 +97,10 @@ elementToOPML opts (Sec _ _num _ title elements) = do
95 (blocks, rest) = span isBlk elements
97 (blocks, rest) = span isBlk elements
96 htmlIls <- writeHtmlInlines title
98 htmlIls <- writeHtmlInlines title
97 md <- if null blocks
99 md <- if null blocks
98− then return []
100+ then return mempty
99 else do blks <- mapM fromBlk blocks
101 else do blks <- mapM fromBlk blocks
100 writeMarkdown def $ Pandoc nullMeta blks
102 writeMarkdown def $ Pandoc nullMeta blks
103+ let attrs = [("text", unpack htmlIls)] ++
101− let attrs = [("text", htmlIls)] ++ [("_note", md) | not (null blocks)]
104+ [("_note", unpack md) | not (null blocks)]
102 o <- mapM (elementToOPML opts) rest
105 o <- mapM (elementToOPML opts) rest
103 return $ inTags True "outline" attrs $ vcat o
106 return $ inTags True "outline" attrs $ vcat o
src/Text/Pandoc/Writers/OpenDocument.hs+6−4
@@ -36,6 +36,7 @@ import Control.Arrow ((***), (>>>))
36import Control.Monad.State hiding (when)
36import Control.Monad.State hiding (when)
37import Data.Char (chr)
37import Data.Char (chr)
38import Data.List (sortBy)
38import Data.List (sortBy)
39+import Data.Text (Text)
39import qualified Data.Map as Map
40import qualified Data.Map as Map
40import Data.Ord (comparing)
41import Data.Ord (comparing)
41import qualified Data.Set as Set
42import qualified Data.Set as Set
@@ -195,17 +196,18 @@ handleSpaces s
195 rm [] = empty
196 rm [] = empty
196
197
197-- | Convert Pandoc document to string in OpenDocument format.
198-- | Convert Pandoc document to string in OpenDocument format.
198−writeOpenDocument :: PandocMonad m => WriterOptions -> Pandoc -> m String
199+writeOpenDocument :: PandocMonad m => WriterOptions -> Pandoc -> m Text
199writeOpenDocument opts (Pandoc meta blocks) = do
200writeOpenDocument opts (Pandoc meta blocks) = do
200 let colwidth = if writerWrapText opts == WrapAuto
201 let colwidth = if writerWrapText opts == WrapAuto
201 then Just $ writerColumns opts
202 then Just $ writerColumns opts
202 else Nothing
203 else Nothing
204+ let render' :: Doc -> Text
203− let render' = render colwidth
205+ render' = render colwidth
204 ((body, metadata),s) <- flip runStateT
206 ((body, metadata),s) <- flip runStateT
205 defaultWriterState $ do
207 defaultWriterState $ do
206 m <- metaToJSON opts
208 m <- metaToJSON opts
207− (fmap (render colwidth) . blocksToOpenDocument opts)
209+ (fmap render' . blocksToOpenDocument opts)
208− (fmap (render colwidth) . inlinesToOpenDocument opts)
210+ (fmap render' . inlinesToOpenDocument opts)
209 meta
211 meta
210 b <- render' `fmap` blocksToOpenDocument opts blocks
212 b <- render' `fmap` blocksToOpenDocument opts blocks
211 return (b, m)
213 return (b, m)
src/Text/Pandoc/Writers/Org.hs+7−4
@@ -37,6 +37,7 @@ Org-Mode: <http://orgmode.org>
37module Text.Pandoc.Writers.Org (writeOrg) where
37module Text.Pandoc.Writers.Org (writeOrg) where
38import Control.Monad.State
38import Control.Monad.State
39import Data.Char (isAlphaNum, toLower)
39import Data.Char (isAlphaNum, toLower)
40+import Data.Text (Text)
40import Data.List (intersect, intersperse, isPrefixOf, partition, transpose)
41import Data.List (intersect, intersperse, isPrefixOf, partition, transpose)
41import Text.Pandoc.Class (PandocMonad, report)
42import Text.Pandoc.Class (PandocMonad, report)
42import Text.Pandoc.Definition
43import Text.Pandoc.Definition
@@ -56,7 +57,7 @@ data WriterState =
56type Org = StateT WriterState
57type Org = StateT WriterState
57
58
58-- | Convert Pandoc to Org.
59-- | Convert Pandoc to Org.
59−writeOrg :: PandocMonad m => WriterOptions -> Pandoc -> m String
60+writeOrg :: PandocMonad m => WriterOptions -> Pandoc -> m Text
60writeOrg opts document = do
61writeOrg opts document = do
61 let st = WriterState { stNotes = [],
62 let st = WriterState { stNotes = [],
62 stHasMath = False,
63 stHasMath = False,
@@ -64,15 +65,17 @@ writeOrg opts document = do
64 evalStateT (pandocToOrg document) st
65 evalStateT (pandocToOrg document) st
65
66
66-- | Return Org representation of document.
67-- | Return Org representation of document.
67−pandocToOrg :: PandocMonad m => Pandoc -> Org m String
68+pandocToOrg :: PandocMonad m => Pandoc -> Org m Text
68pandocToOrg (Pandoc meta blocks) = do
69pandocToOrg (Pandoc meta blocks) = do
69 opts <- gets stOptions
70 opts <- gets stOptions
70 let colwidth = if writerWrapText opts == WrapAuto
71 let colwidth = if writerWrapText opts == WrapAuto
71 then Just $ writerColumns opts
72 then Just $ writerColumns opts
72 else Nothing
73 else Nothing
74+ let render' :: Doc -> Text
75+ render' = render colwidth
73 metadata <- metaToJSON opts
76 metadata <- metaToJSON opts
74− (fmap (render colwidth) . blockListToOrg)
77+ (fmap render' . blockListToOrg)
75− (fmap (render colwidth) . inlineListToOrg)
78+ (fmap render' . inlineListToOrg)
76 meta
79 meta
77 body <- blockListToOrg blocks
80 body <- blockListToOrg blocks
78 notes <- gets (reverse . stNotes) >>= notesToOrg
81 notes <- gets (reverse . stNotes) >>= notesToOrg
src/Text/Pandoc/Writers/RST.hs+8−5
@@ -35,6 +35,7 @@ import Control.Monad.State
35import Data.Char (isSpace, toLower)
35import Data.Char (isSpace, toLower)
36import Data.List (isPrefixOf, stripPrefix)
36import Data.List (isPrefixOf, stripPrefix)
37import Data.Maybe (fromMaybe)
37import Data.Maybe (fromMaybe)
38+import Data.Text (Text, stripEnd)
38import qualified Text.Pandoc.Builder as B
39import qualified Text.Pandoc.Builder as B
39import Text.Pandoc.Class (PandocMonad, report)
40import Text.Pandoc.Class (PandocMonad, report)
40import Text.Pandoc.Logging
41import Text.Pandoc.Logging
@@ -62,7 +63,7 @@ data WriterState =
62type RST = StateT WriterState
63type RST = StateT WriterState
63
64
64-- | Convert Pandoc to RST.
65-- | Convert Pandoc to RST.
65−writeRST :: PandocMonad m => WriterOptions -> Pandoc -> m String
66+writeRST :: PandocMonad m => WriterOptions -> Pandoc -> m Text
66writeRST opts document = do
67writeRST opts document = do
67 let st = WriterState { stNotes = [], stLinks = [],
68 let st = WriterState { stNotes = [], stLinks = [],
68 stImages = [], stHasMath = False,
69 stImages = [], stHasMath = False,
@@ -71,19 +72,21 @@ writeRST opts document = do
71 evalStateT (pandocToRST document) st
72 evalStateT (pandocToRST document) st
72
73
73-- | Return RST representation of document.
74-- | Return RST representation of document.
74−pandocToRST :: PandocMonad m => Pandoc -> RST m String
75+pandocToRST :: PandocMonad m => Pandoc -> RST m Text
75pandocToRST (Pandoc meta blocks) = do
76pandocToRST (Pandoc meta blocks) = do
76 opts <- gets stOptions
77 opts <- gets stOptions
77 let colwidth = if writerWrapText opts == WrapAuto
78 let colwidth = if writerWrapText opts == WrapAuto
78 then Just $ writerColumns opts
79 then Just $ writerColumns opts
79 else Nothing
80 else Nothing
81+ let render' :: Doc -> Text
82+ render' = render colwidth
80 let subtit = case lookupMeta "subtitle" meta of
83 let subtit = case lookupMeta "subtitle" meta of
81 Just (MetaBlocks [Plain xs]) -> xs
84 Just (MetaBlocks [Plain xs]) -> xs
82 _ -> []
85 _ -> []
83 title <- titleToRST (docTitle meta) subtit
86 title <- titleToRST (docTitle meta) subtit
84 metadata <- metaToJSON opts
87 metadata <- metaToJSON opts
85− (fmap (render colwidth) . blockListToRST)
88+ (fmap render' . blockListToRST)
86− (fmap (trimr . render colwidth) . inlineListToRST)
89+ (fmap (stripEnd . render') . inlineListToRST)
87 $ B.deleteMeta "title" $ B.deleteMeta "subtitle" meta
90 $ B.deleteMeta "title" $ B.deleteMeta "subtitle" meta
88 body <- blockListToRST' True $ case writerTemplate opts of
91 body <- blockListToRST' True $ case writerTemplate opts of
89 Just _ -> normalizeHeadings 1 blocks
92 Just _ -> normalizeHeadings 1 blocks
@@ -94,7 +97,7 @@ pandocToRST (Pandoc meta blocks) = do
94 pics <- gets (reverse . stImages) >>= pictRefsToRST
97 pics <- gets (reverse . stImages) >>= pictRefsToRST
95 hasMath <- gets stHasMath
98 hasMath <- gets stHasMath
96 rawTeX <- gets stHasRawTeX
99 rawTeX <- gets stHasRawTeX
97− let main = render colwidth $ foldl ($+$) empty $ [body, notes, refs, pics]
100+ let main = render' $ foldl ($+$) empty $ [body, notes, refs, pics]
98 let context = defField "body" main
101 let context = defField "body" main
99 $ defField "toc" (writerTableOfContents opts)
102 $ defField "toc" (writerTableOfContents opts)
100 $ defField "toc-depth" (show $ writerTOCDepth opts)
103 $ defField "toc-depth" (show $ writerTOCDepth opts)
src/Text/Pandoc/Writers/RTF.hs+5−2
@@ -34,6 +34,8 @@ import Control.Monad.Except (catchError, throwError)
34import qualified Data.ByteString as B
34import qualified Data.ByteString as B
35import Data.Char (chr, isDigit, ord)
35import Data.Char (chr, isDigit, ord)
36import Data.List (intercalate, isSuffixOf)
36import Data.List (intercalate, isSuffixOf)
37+import Data.Text (Text)
38+import qualified Data.Text as T
37import qualified Data.Map as M
39import qualified Data.Map as M
38import Text.Pandoc.Class (PandocMonad, report)
40import Text.Pandoc.Class (PandocMonad, report)
39import qualified Text.Pandoc.Class as P
41import qualified Text.Pandoc.Class as P
@@ -97,7 +99,7 @@ rtfEmbedImage opts x@(Image attr _ (src,_)) = catchError
97rtfEmbedImage _ x = return x
99rtfEmbedImage _ x = return x
98
100
99-- | Convert Pandoc to a string in rich text format.
101-- | Convert Pandoc to a string in rich text format.
100−writeRTF :: PandocMonad m => WriterOptions -> Pandoc -> m String
102+writeRTF :: PandocMonad m => WriterOptions -> Pandoc -> m Text
101writeRTF options doc = do
103writeRTF options doc = do
102 -- handle images
104 -- handle images
103 Pandoc meta@(Meta metamap) blocks <- walkM (rtfEmbedImage options) doc
105 Pandoc meta@(Meta metamap) blocks <- walkM (rtfEmbedImage options) doc
@@ -123,7 +125,8 @@ writeRTF options doc = do
123 then defField "toc" toc
125 then defField "toc" toc
124 else id)
126 else id)
125 $ metadata
127 $ metadata
128+ return $ T.pack
126− return $ case writerTemplate options of
129+ $ case writerTemplate options of
127 Just tpl -> renderTemplate' tpl context
130 Just tpl -> renderTemplate' tpl context
128 Nothing -> case reverse body of
131 Nothing -> case reverse body of
129 ('\n':_) -> body
132 ('\n':_) -> body
src/Text/Pandoc/Writers/TEI.hs+6−4
@@ -31,6 +31,7 @@ Conversion of 'Pandoc' documents to Docbook XML.
31-}
31-}
32module Text.Pandoc.Writers.TEI (writeTEI) where
32module Text.Pandoc.Writers.TEI (writeTEI) where
33import Data.Char (toLower)
33import Data.Char (toLower)
34+import Data.Text (Text)
34import Data.List (isPrefixOf, stripPrefix)
35import Data.List (isPrefixOf, stripPrefix)
35import qualified Text.Pandoc.Builder as B
36import qualified Text.Pandoc.Builder as B
36import Text.Pandoc.Class (PandocMonad, report)
37import Text.Pandoc.Class (PandocMonad, report)
@@ -56,12 +57,13 @@ authorToTEI opts name' = do
56 inTagsSimple "author" (text $ escapeStringForXML name)
57 inTagsSimple "author" (text $ escapeStringForXML name)
57
58
58-- | Convert Pandoc document to string in Docbook format.
59-- | Convert Pandoc document to string in Docbook format.
59−writeTEI :: PandocMonad m => WriterOptions -> Pandoc -> m String
60+writeTEI :: PandocMonad m => WriterOptions -> Pandoc -> m Text
60writeTEI opts (Pandoc meta blocks) = do
61writeTEI opts (Pandoc meta blocks) = do
61 let elements = hierarchicalize blocks
62 let elements = hierarchicalize blocks
62 colwidth = if writerWrapText opts == WrapAuto
63 colwidth = if writerWrapText opts == WrapAuto
63 then Just $ writerColumns opts
64 then Just $ writerColumns opts
64 else Nothing
65 else Nothing
66+ render' :: Doc -> Text
65 render' = render colwidth
67 render' = render colwidth
66 startLvl = case writerTopLevelDivision opts of
68 startLvl = case writerTopLevelDivision opts of
67 TopLevelPart -> -1
69 TopLevelPart -> -1
@@ -71,9 +73,9 @@ writeTEI opts (Pandoc meta blocks) = do
71 auths' <- mapM (authorToTEI opts) $ docAuthors meta
73 auths' <- mapM (authorToTEI opts) $ docAuthors meta
72 let meta' = B.setMeta "author" auths' meta
74 let meta' = B.setMeta "author" auths' meta
73 metadata <- metaToJSON opts
75 metadata <- metaToJSON opts
74− (fmap (render colwidth . vcat) .
76+ (fmap (render' . vcat) .
75− (mapM (elementToTEI opts startLvl)) . hierarchicalize)
77+ mapM (elementToTEI opts startLvl) . hierarchicalize)
76− (fmap (render colwidth) . inlinesToTEI opts)
78+ (fmap render' . inlinesToTEI opts)
77 meta'
79 meta'
78 main <- (render' . vcat) <$> mapM (elementToTEI opts startLvl) elements
80 main <- (render' . vcat) <$> mapM (elementToTEI opts startLvl) elements
79 let context = defField "body" main
81 let context = defField "body" main
src/Text/Pandoc/Writers/Texinfo.hs+7−4
@@ -37,6 +37,7 @@ import Data.Char (chr, ord)
37import Data.List (maximumBy, transpose)
37import Data.List (maximumBy, transpose)
38import Data.Ord (comparing)
38import Data.Ord (comparing)
39import qualified Data.Set as Set
39import qualified Data.Set as Set
40+import Data.Text (Text)
40import Network.URI (unEscapeString)
41import Network.URI (unEscapeString)
41import System.FilePath
42import System.FilePath
42import Text.Pandoc.Class (PandocMonad, report)
43import Text.Pandoc.Class (PandocMonad, report)
@@ -68,7 +69,7 @@ data WriterState =
68type TI m = StateT WriterState m
69type TI m = StateT WriterState m
69
70
70-- | Convert Pandoc to Texinfo.
71-- | Convert Pandoc to Texinfo.
71−writeTexinfo :: PandocMonad m => WriterOptions -> Pandoc -> m String
72+writeTexinfo :: PandocMonad m => WriterOptions -> Pandoc -> m Text
72writeTexinfo options document =
73writeTexinfo options document =
73 evalStateT (pandocToTexinfo options $ wrapTop document) $
74 evalStateT (pandocToTexinfo options $ wrapTop document) $
74 WriterState { stStrikeout = False, stSuperscript = False,
75 WriterState { stStrikeout = False, stSuperscript = False,
@@ -80,16 +81,18 @@ wrapTop :: Pandoc -> Pandoc
80wrapTop (Pandoc meta blocks) =
81wrapTop (Pandoc meta blocks) =
81 Pandoc meta (Header 0 nullAttr (docTitle meta) : blocks)
82 Pandoc meta (Header 0 nullAttr (docTitle meta) : blocks)
82
83
83−pandocToTexinfo :: PandocMonad m => WriterOptions -> Pandoc -> TI m String
84+pandocToTexinfo :: PandocMonad m => WriterOptions -> Pandoc -> TI m Text
84pandocToTexinfo options (Pandoc meta blocks) = do
85pandocToTexinfo options (Pandoc meta blocks) = do
85 let titlePage = not $ all null
86 let titlePage = not $ all null
86 $ docTitle meta : docDate meta : docAuthors meta
87 $ docTitle meta : docDate meta : docAuthors meta
87 let colwidth = if writerWrapText options == WrapAuto
88 let colwidth = if writerWrapText options == WrapAuto
88 then Just $ writerColumns options
89 then Just $ writerColumns options
89 else Nothing
90 else Nothing
91+ let render' :: Doc -> Text
92+ render' = render colwidth
90 metadata <- metaToJSON options
93 metadata <- metaToJSON options
91− (fmap (render colwidth) . blockListToTexinfo)
94+ (fmap render' . blockListToTexinfo)
92− (fmap (render colwidth) . inlineListToTexinfo)
95+ (fmap render' . inlineListToTexinfo)
93 meta
96 meta
94 main <- blockListToTexinfo blocks
97 main <- blockListToTexinfo blocks
95 st <- get
98 st <- get
src/Text/Pandoc/Writers/Textile.hs+6−5
@@ -33,6 +33,7 @@ module Text.Pandoc.Writers.Textile ( writeTextile ) where
33import Control.Monad.State
33import Control.Monad.State
34import Data.Char (isSpace)
34import Data.Char (isSpace)
35import Data.List (intercalate)
35import Data.List (intercalate)
36+import Data.Text (Text, pack)
36import Text.Pandoc.Class (PandocMonad, report)
37import Text.Pandoc.Class (PandocMonad, report)
37import Text.Pandoc.Logging
38import Text.Pandoc.Logging
38import Text.Pandoc.Definition
39import Text.Pandoc.Definition
@@ -54,7 +55,7 @@ data WriterState = WriterState {
54type TW = StateT WriterState
55type TW = StateT WriterState
55
56
56-- | Convert Pandoc to Textile.
57-- | Convert Pandoc to Textile.
57−writeTextile :: PandocMonad m => WriterOptions -> Pandoc -> m String
58+writeTextile :: PandocMonad m => WriterOptions -> Pandoc -> m Text
58writeTextile opts document =
59writeTextile opts document =
59 evalStateT (pandocToTextile opts document)
60 evalStateT (pandocToTextile opts document)
60 WriterState { stNotes = [],
61 WriterState { stNotes = [],
@@ -64,17 +65,17 @@ writeTextile opts document =
64
65
65-- | Return Textile representation of document.
66-- | Return Textile representation of document.
66pandocToTextile :: PandocMonad m
67pandocToTextile :: PandocMonad m
67− => WriterOptions -> Pandoc -> TW m String
68+ => WriterOptions -> Pandoc -> TW m Text
68pandocToTextile opts (Pandoc meta blocks) = do
69pandocToTextile opts (Pandoc meta blocks) = do
69 metadata <- metaToJSON opts (blockListToTextile opts)
70 metadata <- metaToJSON opts (blockListToTextile opts)
70 (inlineListToTextile opts) meta
71 (inlineListToTextile opts) meta
71 body <- blockListToTextile opts blocks
72 body <- blockListToTextile opts blocks
72 notes <- gets $ unlines . reverse . stNotes
73 notes <- gets $ unlines . reverse . stNotes
73− let main = body ++ if null notes then "" else ("\n\n" ++ notes)
74+ let main = pack $ body ++ if null notes then "" else ("\n\n" ++ notes)
74 let context = defField "body" main metadata
75 let context = defField "body" main metadata
75 case writerTemplate opts of
76 case writerTemplate opts of
76− Nothing -> return main
77+ Nothing -> return main
77− Just tpl -> return $ renderTemplate' tpl context
78+ Just tpl -> return $ renderTemplate' tpl context
78
79
79withUseTags :: PandocMonad m => TW m a -> TW m a
80withUseTags :: PandocMonad m => TW m a -> TW m a
80withUseTags action = do
81withUseTags action = do
src/Text/Pandoc/Writers/ZimWiki.hs+4−4
@@ -37,7 +37,7 @@ import Control.Monad.State (StateT, evalStateT, gets, modify)
37import Data.Default (Default (..))
37import Data.Default (Default (..))
38import Data.List (intercalate, isInfixOf, isPrefixOf, transpose)
38import Data.List (intercalate, isInfixOf, isPrefixOf, transpose)
39import qualified Data.Map as Map
39import qualified Data.Map as Map
40−import Data.Text (breakOnAll, pack)
40+import Data.Text (breakOnAll, pack, Text)
41import Text.Pandoc.Class (PandocMonad, report)
41import Text.Pandoc.Class (PandocMonad, report)
42import Text.Pandoc.Logging
42import Text.Pandoc.Logging
43import Text.Pandoc.Definition
43import Text.Pandoc.Definition
@@ -61,17 +61,17 @@ instance Default WriterState where
61type ZW = StateT WriterState
61type ZW = StateT WriterState
62
62
63-- | Convert Pandoc to ZimWiki.
63-- | Convert Pandoc to ZimWiki.
64−writeZimWiki :: PandocMonad m => WriterOptions -> Pandoc -> m String
64+writeZimWiki :: PandocMonad m => WriterOptions -> Pandoc -> m Text
65writeZimWiki opts document = evalStateT (pandocToZimWiki opts document) def
65writeZimWiki opts document = evalStateT (pandocToZimWiki opts document) def
66
66
67-- | Return ZimWiki representation of document.
67-- | Return ZimWiki representation of document.
68−pandocToZimWiki :: PandocMonad m => WriterOptions -> Pandoc -> ZW m String
68+pandocToZimWiki :: PandocMonad m => WriterOptions -> Pandoc -> ZW m Text
69pandocToZimWiki opts (Pandoc meta blocks) = do
69pandocToZimWiki opts (Pandoc meta blocks) = do
70 metadata <- metaToJSON opts
70 metadata <- metaToJSON opts
71 (fmap trimr . blockListToZimWiki opts)
71 (fmap trimr . blockListToZimWiki opts)
72 (inlineListToZimWiki opts)
72 (inlineListToZimWiki opts)
73 meta
73 meta
74− body <- blockListToZimWiki opts blocks
74+ body <- pack <$> blockListToZimWiki opts blocks
75 --let header = "Content-Type: text/x-zim-wiki\nWiki-Format: zim 0.4\n"
75 --let header = "Content-Type: text/x-zim-wiki\nWiki-Format: zim 0.4\n"
76 let main = body
76 let main = body
77 let context = defField "body" main
77 let context = defField "body" main
src/Text/Pandoc/XML.hs+6−5
@@ -37,6 +37,8 @@ module Text.Pandoc.XML ( escapeCharForXML,
37 fromEntities ) where
37 fromEntities ) where
38
38
39import Data.Char (isAscii, isSpace, ord)
39import Data.Char (isAscii, isSpace, ord)
40+import Data.Text (Text)
41+import qualified Data.Text as T
40import Text.HTML.TagSoup.Entity (lookupEntity)
42import Text.HTML.TagSoup.Entity (lookupEntity)
41import Text.Pandoc.Pretty
43import Text.Pandoc.Pretty
42
44
@@ -91,11 +93,10 @@ inTagsIndented :: String -> Doc -> Doc
91inTagsIndented tagType = inTags True tagType []
93inTagsIndented tagType = inTags True tagType []
92
94
93-- | Escape all non-ascii characters using numerical entities.
95-- | Escape all non-ascii characters using numerical entities.
94−toEntities :: String -> String
96+toEntities :: Text -> Text
95−toEntities [] = ""
97+toEntities = T.concatMap go
96−toEntities (c:cs)
98+ where go c | isAscii c = T.singleton c
97− | isAscii c = c : toEntities cs
98− | otherwise = "&#" ++ show (ord c) ++ ";" ++ toEntities cs
99+ | otherwise = T.pack ("&#" ++ show (ord c) ++ ";")
99
100
100-- Unescapes XML entities
101-- Unescapes XML entities
101fromEntities :: String -> String
102fromEntities :: String -> String
test/Tests/Helpers.hs+4−3
@@ -106,17 +106,18 @@ class ToString a where
106 toString :: a -> String
106 toString :: a -> String
107
107
108instance ToString Pandoc where
108instance ToString Pandoc where
109+ toString d = unpack $
109− toString d = purely (writeNative def{ writerTemplate = s }) $ toPandoc d
110+ purely (writeNative def{ writerTemplate = s }) $ toPandoc d
110 where s = case d of
111 where s = case d of
111 (Pandoc (Meta m) _)
112 (Pandoc (Meta m) _)
112 | M.null m -> Nothing
113 | M.null m -> Nothing
113 | otherwise -> Just "" -- need this to get meta output
114 | otherwise -> Just "" -- need this to get meta output
114
115
115instance ToString Blocks where
116instance ToString Blocks where
116− toString = purely (writeNative def) . toPandoc
117+ toString = unpack . purely (writeNative def) . toPandoc
117
118
118instance ToString Inlines where
119instance ToString Inlines where
119− toString = trimr . purely (writeNative def) . toPandoc
120+ toString = trimr . unpack . purely (writeNative def) . toPandoc
120
121
121instance ToString String where
122instance ToString String where
122 toString = id
123 toString = id
test/Tests/Readers/Docx.hs+2−1
@@ -3,6 +3,7 @@ module Tests.Readers.Docx (tests) where
3import Codec.Archive.Zip
3import Codec.Archive.Zip
4import qualified Data.ByteString.Lazy as B
4import qualified Data.ByteString.Lazy as B
5import qualified Data.ByteString as BS
5import qualified Data.ByteString as BS
6+import qualified Data.Text as T
6import qualified Data.Map as M
7import qualified Data.Map as M
7import Test.Tasty
8import Test.Tasty
8import Test.Tasty.HUnit
9import Test.Tasty.HUnit
@@ -27,7 +28,7 @@ defopts :: ReaderOptions
27defopts = def{ readerExtensions = getDefaultExtensions "docx" }
28defopts = def{ readerExtensions = getDefaultExtensions "docx" }
28
29
29instance ToString NoNormPandoc where
30instance ToString NoNormPandoc where
30− toString d = purely (writeNative def{ writerTemplate = s }) $ toPandoc d
31+ toString d = T.unpack $ purely (writeNative def{ writerTemplate = s }) $ toPandoc d
31 where s = case d of
32 where s = case d of
32 NoNormPandoc (Pandoc (Meta m) _)
33 NoNormPandoc (Pandoc (Meta m) _)
33 | M.null m -> Nothing
34 | M.null m -> Nothing
test/Tests/Readers/LaTeX.hs+1−1
@@ -6,7 +6,7 @@ import Tests.Helpers
6import Text.Pandoc
6import Text.Pandoc
7import Text.Pandoc.Arbitrary ()
7import Text.Pandoc.Arbitrary ()
8import Text.Pandoc.Builder
8import Text.Pandoc.Builder
9−import Data.Text (Text, pack)
9+import Data.Text (Text)
10import qualified Data.Text as T
10import qualified Data.Text as T
11
11
12latex :: Text -> Pandoc
12latex :: Text -> Pandoc
test/Tests/Readers/Odt.hs+3−1
@@ -5,6 +5,7 @@ import qualified Data.ByteString.Lazy as B
5import qualified Data.ByteString as BS
5import qualified Data.ByteString as BS
6import qualified Text.Pandoc.UTF8 as UTF8
6import qualified Text.Pandoc.UTF8 as UTF8
7import qualified Data.Map as M
7import qualified Data.Map as M
8+import Data.Text (unpack)
8import Test.Tasty
9import Test.Tasty
9import Tests.Helpers
10import Tests.Helpers
10import Text.Pandoc
11import Text.Pandoc
@@ -41,7 +42,8 @@ newtype NoNormPandoc = NoNormPandoc {unNoNorm :: Pandoc}
41 deriving ( Show )
42 deriving ( Show )
42
43
43instance ToString NoNormPandoc where
44instance ToString NoNormPandoc where
45+ toString d = unpack $
44− toString d = purely (writeNative def{ writerTemplate = s }) $ toPandoc d
46+ purely (writeNative def{ writerTemplate = s }) $ toPandoc d
45 where s = case d of
47 where s = case d of
46 NoNormPandoc (Pandoc (Meta m) _)
48 NoNormPandoc (Pandoc (Meta m) _)
47 | M.null m -> Nothing
49 | M.null m -> Nothing
test/Tests/Writers/AsciiDoc.hs+2−1
@@ -1,5 +1,6 @@
1module Tests.Writers.AsciiDoc (tests) where
1module Tests.Writers.AsciiDoc (tests) where
2
2
3+import Data.Text (unpack)
3import Test.Tasty
4import Test.Tasty
4import Tests.Helpers
5import Tests.Helpers
5import Text.Pandoc
6import Text.Pandoc
@@ -7,7 +8,7 @@ import Text.Pandoc.Arbitrary ()
7import Text.Pandoc.Builder
8import Text.Pandoc.Builder
8
9
9asciidoc :: (ToPandoc a) => a -> String
10asciidoc :: (ToPandoc a) => a -> String
10−asciidoc = purely (writeAsciiDoc def{ writerWrapText = WrapNone }) . toPandoc
11+asciidoc = unpack . purely (writeAsciiDoc def{ writerWrapText = WrapNone }) . toPandoc
11
12
12tests :: [TestTree]
13tests :: [TestTree]
13tests = [ testGroup "emphasis"
14tests = [ testGroup "emphasis"
test/Tests/Writers/ConTeXt.hs+3−2
@@ -1,6 +1,7 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2module Tests.Writers.ConTeXt (tests) where
2module Tests.Writers.ConTeXt (tests) where
3
3
4+import Data.Text (unpack)
4import Test.Tasty
5import Test.Tasty
5import Test.Tasty.QuickCheck
6import Test.Tasty.QuickCheck
6import Tests.Helpers
7import Tests.Helpers
@@ -9,10 +10,10 @@ import Text.Pandoc.Arbitrary ()
9import Text.Pandoc.Builder
10import Text.Pandoc.Builder
10
11
11context :: (ToPandoc a) => a -> String
12context :: (ToPandoc a) => a -> String
12−context = purely (writeConTeXt def) . toPandoc
13+context = unpack . purely (writeConTeXt def) . toPandoc
13
14
14context' :: (ToPandoc a) => a -> String
15context' :: (ToPandoc a) => a -> String
15−context' = purely (writeConTeXt def{ writerWrapText = WrapNone }) . toPandoc
16+context' = unpack . purely (writeConTeXt def{ writerWrapText = WrapNone }) . toPandoc
16
17
17{-
18{-
18 "my test" =: X =?> Y
19 "my test" =: X =?> Y
test/Tests/Writers/Docbook.hs+2−1
@@ -1,6 +1,7 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2module Tests.Writers.Docbook (tests) where
2module Tests.Writers.Docbook (tests) where
3
3
4+import Data.Text (unpack)
4import Test.Tasty
5import Test.Tasty
5import Tests.Helpers
6import Tests.Helpers
6import Text.Pandoc
7import Text.Pandoc
@@ -11,7 +12,7 @@ docbook :: (ToPandoc a) => a -> String
11docbook = docbookWithOpts def{ writerWrapText = WrapNone }
12docbook = docbookWithOpts def{ writerWrapText = WrapNone }
12
13
13docbookWithOpts :: ToPandoc a => WriterOptions -> a -> String
14docbookWithOpts :: ToPandoc a => WriterOptions -> a -> String
14−docbookWithOpts opts = purely (writeDocbook4 opts) . toPandoc
15+docbookWithOpts opts = unpack . purely (writeDocbook4 opts) . toPandoc
15
16
16{-
17{-
17 "my test" =: X =?> Y
18 "my test" =: X =?> Y
test/Tests/Writers/HTML.hs+2−1
@@ -1,6 +1,7 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2module Tests.Writers.HTML (tests) where
2module Tests.Writers.HTML (tests) where
3
3
4+import Data.Text (unpack)
4import Test.Tasty
5import Test.Tasty
5import Tests.Helpers
6import Tests.Helpers
6import Text.Pandoc
7import Text.Pandoc
@@ -8,7 +9,7 @@ import Text.Pandoc.Arbitrary ()
8import Text.Pandoc.Builder
9import Text.Pandoc.Builder
9
10
10html :: (ToPandoc a) => a -> String
11html :: (ToPandoc a) => a -> String
11−html = purely (writeHtml4String def{ writerWrapText = WrapNone }) . toPandoc
12+html = unpack . purely (writeHtml4String def{ writerWrapText = WrapNone }) . toPandoc
12
13
13{-
14{-
14 "my test" =: X =?> Y
15 "my test" =: X =?> Y
test/Tests/Writers/LaTeX.hs+3−2
@@ -1,6 +1,7 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2module Tests.Writers.LaTeX (tests) where
2module Tests.Writers.LaTeX (tests) where
3
3
4+import Data.Text (unpack)
4import Test.Tasty
5import Test.Tasty
5import Tests.Helpers
6import Tests.Helpers
6import Text.Pandoc
7import Text.Pandoc
@@ -14,10 +15,10 @@ latexListing :: (ToPandoc a) => a -> String
14latexListing = latexWithOpts def{ writerListings = True }
15latexListing = latexWithOpts def{ writerListings = True }
15
16
16latexWithOpts :: (ToPandoc a) => WriterOptions -> a -> String
17latexWithOpts :: (ToPandoc a) => WriterOptions -> a -> String
17−latexWithOpts opts = purely (writeLaTeX opts) . toPandoc
18+latexWithOpts opts = unpack . purely (writeLaTeX opts) . toPandoc
18
19
19beamerWithOpts :: (ToPandoc a) => WriterOptions -> a -> String
20beamerWithOpts :: (ToPandoc a) => WriterOptions -> a -> String
20−beamerWithOpts opts = purely (writeBeamer opts) . toPandoc
21+beamerWithOpts opts = unpack . purely (writeBeamer opts) . toPandoc
21
22
22{-
23{-
23 "my test" =: X =?> Y
24 "my test" =: X =?> Y
test/Tests/Writers/Markdown.hs+3−2
@@ -2,6 +2,7 @@
2{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
2{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
3module Tests.Writers.Markdown (tests) where
3module Tests.Writers.Markdown (tests) where
4
4
5+import Data.Text (unpack)
5import Test.Tasty
6import Test.Tasty
6import Tests.Helpers
7import Tests.Helpers
7import Text.Pandoc
8import Text.Pandoc
@@ -12,10 +13,10 @@ defopts :: WriterOptions
12defopts = def{ writerExtensions = pandocExtensions }
13defopts = def{ writerExtensions = pandocExtensions }
13
14
14markdown :: (ToPandoc a) => a -> String
15markdown :: (ToPandoc a) => a -> String
15−markdown = purely (writeMarkdown defopts) . toPandoc
16+markdown = unpack . purely (writeMarkdown defopts) . toPandoc
16
17
17markdownWithOpts :: (ToPandoc a) => WriterOptions -> a -> String
18markdownWithOpts :: (ToPandoc a) => WriterOptions -> a -> String
18−markdownWithOpts opts x = purely (writeMarkdown opts) $ toPandoc x
19+markdownWithOpts opts x = unpack . purely (writeMarkdown opts) $ toPandoc x
19
20
20{-
21{-
21 "my test" =: X =?> Y
22 "my test" =: X =?> Y
test/Tests/Writers/Muse.hs+2−1
@@ -1,5 +1,6 @@
1module Tests.Writers.Muse (tests) where
1module Tests.Writers.Muse (tests) where
2
2
3+import Data.Text (unpack)
3import Test.Tasty
4import Test.Tasty
4import Tests.Helpers
5import Tests.Helpers
5import Text.Pandoc
6import Text.Pandoc
@@ -10,7 +11,7 @@ muse :: (ToPandoc a) => a -> String
10muse = museWithOpts def{ writerWrapText = WrapNone }
11muse = museWithOpts def{ writerWrapText = WrapNone }
11
12
12museWithOpts :: (ToPandoc a) => WriterOptions -> a -> String
13museWithOpts :: (ToPandoc a) => WriterOptions -> a -> String
13−museWithOpts opts = purely (writeMuse opts) . toPandoc
14+museWithOpts opts = unpack . purely (writeMuse opts) . toPandoc
14
15
15infix 4 =:
16infix 4 =:
16(=:) :: (ToString a, ToPandoc a)
17(=:) :: (ToString a, ToPandoc a)
test/Tests/Writers/Native.hs+3−3
@@ -1,5 +1,6 @@
1module Tests.Writers.Native (tests) where
1module Tests.Writers.Native (tests) where
2
2
3+import Data.Text (unpack)
3import Test.Tasty
4import Test.Tasty
4import Test.Tasty.QuickCheck
5import Test.Tasty.QuickCheck
5import Tests.Helpers
6import Tests.Helpers
@@ -8,12 +9,11 @@ import Text.Pandoc.Arbitrary ()
8
9
9p_write_rt :: Pandoc -> Bool
10p_write_rt :: Pandoc -> Bool
10p_write_rt d =
11p_write_rt d =
11− read (purely (writeNative def{ writerTemplate = Just "" }) d) == d
12+ read (unpack $ purely (writeNative def{ writerTemplate = Just "" }) d) == d
12
13
13p_write_blocks_rt :: [Block] -> Bool
14p_write_blocks_rt :: [Block] -> Bool
14p_write_blocks_rt bs =
15p_write_blocks_rt bs =
15− read (purely (writeNative def) (Pandoc nullMeta bs)) ==
16+ read (unpack $ purely (writeNative def) (Pandoc nullMeta bs)) == bs
16− bs
17
17
18tests :: [TestTree]
18tests :: [TestTree]
19tests = [ testProperty "p_write_rt" p_write_rt
19tests = [ testProperty "p_write_rt" p_write_rt
trypandoc/trypandoc.hs+2−2
@@ -33,11 +33,11 @@ app req respond = do
33 _ -> error $ "could not find reader for "
33 _ -> error $ "could not find reader for "
34 ++ T.unpack fromFormat
34 ++ T.unpack fromFormat
35 let writer = case getWriter (T.unpack toFormat) of
35 let writer = case getWriter (T.unpack toFormat) of
36− Right (StringWriter w) -> w writerOpts
36+ Right (TextWriter w) -> w writerOpts
37 _ -> error $ "could not find writer for " ++
37 _ -> error $ "could not find writer for " ++
38 T.unpack toFormat
38 T.unpack toFormat
39 let result = case runPure $ reader (tabFilter 4 text) >>= writer of
39 let result = case runPure $ reader (tabFilter 4 text) >>= writer of
40− Right s -> T.pack s
40+ Right s -> s
41 Left err -> error (show err)
41 Left err -> error (show err)
42 let output = encode $ object [ T.pack "html" .= result
42 let output = encode $ object [ T.pack "html" .= result
43 , T.pack "name" .=
43 , T.pack "name" .=