git.iko.soy/typeable/pandoc
on master help sign in
Avoid a pointless Text -> String conversion on output.
87ce1ffJohn MacFarlane
src/Text/Pandoc/App.hs+14−8
@@ -34,15 +34,16 @@ import Data.Maybe (fromMaybe, isJust, isNothing)
34import qualified Data.Set as Set
34import qualified Data.Set as Set
35import Data.Text (Text)
35import Data.Text (Text)
36import qualified Data.Text as T
36import qualified Data.Text as T
37+import qualified Data.Text.IO as TIO
37import qualified Data.Text.Lazy as TL
38import qualified Data.Text.Lazy as TL
38−import qualified Data.Text.Lazy.Encoding as TE
39import qualified Data.Text.Encoding.Error as TE
39import qualified Data.Text.Encoding.Error as TE
40−import qualified Data.Text.Encoding.Error as TSE
40+import qualified Data.Text.Lazy.Encoding as TLE
41import Network.URI (URI (..), parseURI)
41import Network.URI (URI (..), parseURI)
42import System.Directory (doesDirectoryExist)
42import System.Directory (doesDirectoryExist)
43import System.Exit (exitSuccess)
43import System.Exit (exitSuccess)
44import System.FilePath
44import System.FilePath
45−import System.IO (nativeNewline, stdout)
45+import System.IO (nativeNewline, stdout, hSetNewlineMode, hSetEncoding,
46+ NewlineMode(..), utf8)
46import qualified System.IO as IO (Newline (..))
47import qualified System.IO as IO (Newline (..))
47import Text.Pandoc
48import Text.Pandoc
48import Text.Pandoc.App.FormatHeuristics (formatFromFilePaths)
49import Text.Pandoc.App.FormatHeuristics (formatFromFilePaths)
@@ -295,7 +296,7 @@ convertWithOpts opts = do
295 case res of
296 case res of
296 Right pdf -> writeFnBinary outputFile pdf
297 Right pdf -> writeFnBinary outputFile pdf
297 Left err' -> throwError $ PandocPDFError $
298 Left err' -> throwError $ PandocPDFError $
298− TL.unpack (TE.decodeUtf8With TE.lenientDecode err')
299+ TL.unpack (TLE.decodeUtf8With TE.lenientDecode err')
299
300
300 Nothing -> do
301 Nothing -> do
301 let addNl = if standalone
302 let addNl = if standalone
@@ -365,7 +366,7 @@ readSource src = case parseURI src of
365 else BS.readFile fp
366 else BS.readFile fp
366 E.catch (return $! UTF8.toText bs)
367 E.catch (return $! UTF8.toText bs)
367 (\e -> case e of
368 (\e -> case e of
368− TSE.DecodeError _ (Just w) -> do
369+ TE.DecodeError _ (Just w) -> do
369 case BS.elemIndex w bs of
370 case BS.elemIndex w bs of
370 Just offset -> E.throwIO $
371 Just offset -> E.throwIO $
371 PandocUTF8DecodingError fp offset w
372 PandocUTF8DecodingError fp offset w
@@ -384,6 +385,11 @@ writeFnBinary "-" = liftIO . BL.putStr
384writeFnBinary f = liftIO . BL.writeFile (UTF8.encodePath f)
385writeFnBinary f = liftIO . BL.writeFile (UTF8.encodePath f)
385
386
386writerFn :: MonadIO m => IO.Newline -> FilePath -> Text -> m ()
387writerFn :: MonadIO m => IO.Newline -> FilePath -> Text -> m ()
387−-- TODO this implementation isn't maximally efficient:
388−writerFn eol "-" = liftIO . UTF8.putStrWith eol . T.unpack
388+writerFn eol "-" t = liftIO $ do
389+ hSetNewlineMode stdout (NewlineMode eol eol)
390+ hSetEncoding stdout utf8
391+ TIO.putStr t
389−writerFn eol f = liftIO . UTF8.writeFileWith eol f . T.unpack
392+writerFn eol f t = liftIO $ do
393+ hSetNewlineMode stdout (NewlineMode eol eol)
394+ hSetEncoding stdout utf8
395+ TIO.writeFile f t