Blame src/Text/Pandoc/UTF8.hs

Packit Service d2f85f
{-# LANGUAGE OverloadedStrings #-}
Packit Service d2f85f
{-
Packit Service d2f85f
Copyright (C) 2010-2017 John MacFarlane <jgm@berkeley.edu>
Packit Service d2f85f
Packit Service d2f85f
This program is free software; you can redistribute it and/or modify
Packit Service d2f85f
it under the terms of the GNU General Public License as published by
Packit Service d2f85f
the Free Software Foundation; either version 2 of the License, or
Packit Service d2f85f
(at your option) any later version.
Packit Service d2f85f
Packit Service d2f85f
This program is distributed in the hope that it will be useful,
Packit Service d2f85f
but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d2f85f
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d2f85f
GNU General Public License for more details.
Packit Service d2f85f
Packit Service d2f85f
You should have received a copy of the GNU General Public License
Packit Service d2f85f
along with this program; if not, write to the Free Software
Packit Service d2f85f
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service d2f85f
-}
Packit Service d2f85f
Packit Service d2f85f
{- |
Packit Service d2f85f
   Module      : Text.Pandoc.UTF8
Packit Service d2f85f
   Copyright   : Copyright (C) 2010-2017 John MacFarlane
Packit Service d2f85f
   License     : GNU GPL, version 2 or above
Packit Service d2f85f
Packit Service d2f85f
   Maintainer  : John MacFarlane <jgm@berkeley.edu>
Packit Service d2f85f
   Stability   : alpha
Packit Service d2f85f
   Portability : portable
Packit Service d2f85f
Packit Service d2f85f
UTF-8 aware string IO functions that will work with GHC 6.10, 6.12, or 7.
Packit Service d2f85f
-}
Packit Service d2f85f
module Text.Pandoc.UTF8 ( readFile
Packit Service d2f85f
                        , getContents
Packit Service d2f85f
                        , writeFileWith
Packit Service d2f85f
                        , writeFile
Packit Service d2f85f
                        , putStrWith
Packit Service d2f85f
                        , putStr
Packit Service d2f85f
                        , putStrLnWith
Packit Service d2f85f
                        , putStrLn
Packit Service d2f85f
                        , hPutStrWith
Packit Service d2f85f
                        , hPutStr
Packit Service d2f85f
                        , hPutStrLnWith
Packit Service d2f85f
                        , hPutStrLn
Packit Service d2f85f
                        , hGetContents
Packit Service d2f85f
                        , toString
Packit Service d2f85f
                        , toText
Packit Service d2f85f
                        , fromString
Packit Service d2f85f
                        , fromText
Packit Service d2f85f
                        , toStringLazy
Packit Service d2f85f
                        , fromTextLazy
Packit Service d2f85f
                        , toTextLazy
Packit Service d2f85f
                        , fromStringLazy
Packit Service d2f85f
                        , encodePath
Packit Service d2f85f
                        , decodeArg
Packit Service d2f85f
                        )
Packit Service d2f85f
Packit Service d2f85f
where
Packit Service d2f85f
Packit Service d2f85f
import qualified Data.ByteString.Char8 as B
Packit Service d2f85f
import qualified Data.ByteString.Lazy.Char8 as BL
Packit Service d2f85f
import qualified Data.Text as T
Packit Service d2f85f
import qualified Data.Text.Encoding as T
Packit Service d2f85f
import qualified Data.Text.Lazy as TL
Packit Service d2f85f
import qualified Data.Text.Lazy.Encoding as TL
Packit Service d2f85f
import Prelude hiding (getContents, putStr, putStrLn, readFile, writeFile)
Packit Service d2f85f
import System.IO hiding (getContents, hGetContents, hPutStr, hPutStrLn, putStr,
Packit Service d2f85f
                  putStrLn, readFile, writeFile)
Packit Service d2f85f
import qualified System.IO as IO
Packit Service d2f85f
Packit Service d2f85f
readFile :: FilePath -> IO String
Packit Service d2f85f
readFile f = do
Packit Service d2f85f
  h <- openFile (encodePath f) ReadMode
Packit Service d2f85f
  hGetContents h
Packit Service d2f85f
Packit Service d2f85f
getContents :: IO String
Packit Service d2f85f
getContents = hGetContents stdin
Packit Service d2f85f
Packit Service d2f85f
writeFileWith :: Newline -> FilePath -> String -> IO ()
Packit Service d2f85f
writeFileWith eol f s =
Packit Service d2f85f
  withFile (encodePath f) WriteMode $ \h -> hPutStrWith eol h s
Packit Service d2f85f
Packit Service d2f85f
writeFile :: FilePath -> String -> IO ()
Packit Service d2f85f
writeFile = writeFileWith nativeNewline
Packit Service d2f85f
Packit Service d2f85f
putStrWith :: Newline -> String -> IO ()
Packit Service d2f85f
putStrWith eol s = hPutStrWith eol stdout s
Packit Service d2f85f
Packit Service d2f85f
putStr :: String -> IO ()
Packit Service d2f85f
putStr = putStrWith nativeNewline
Packit Service d2f85f
Packit Service d2f85f
putStrLnWith :: Newline -> String -> IO ()
Packit Service d2f85f
putStrLnWith eol s = hPutStrLnWith eol stdout s
Packit Service d2f85f
Packit Service d2f85f
putStrLn :: String -> IO ()
Packit Service d2f85f
putStrLn = putStrLnWith nativeNewline
Packit Service d2f85f
Packit Service d2f85f
hPutStrWith :: Newline -> Handle -> String -> IO ()
Packit Service d2f85f
hPutStrWith eol h s =
Packit Service d2f85f
  hSetNewlineMode h (NewlineMode eol eol) >>
Packit Service d2f85f
  hSetEncoding h utf8 >> IO.hPutStr h s
Packit Service d2f85f
Packit Service d2f85f
hPutStr :: Handle -> String -> IO ()
Packit Service d2f85f
hPutStr = hPutStrWith nativeNewline
Packit Service d2f85f
Packit Service d2f85f
hPutStrLnWith :: Newline -> Handle -> String -> IO ()
Packit Service d2f85f
hPutStrLnWith eol h s =
Packit Service d2f85f
  hSetNewlineMode h (NewlineMode eol eol) >>
Packit Service d2f85f
  hSetEncoding h utf8 >> IO.hPutStrLn h s
Packit Service d2f85f
Packit Service d2f85f
hPutStrLn :: Handle -> String -> IO ()
Packit Service d2f85f
hPutStrLn = hPutStrLnWith nativeNewline
Packit Service d2f85f
Packit Service d2f85f
hGetContents :: Handle -> IO String
Packit Service d2f85f
hGetContents = fmap toString . B.hGetContents
Packit Service d2f85f
-- hGetContents h = hSetEncoding h utf8_bom
Packit Service d2f85f
--                   >> hSetNewlineMode h universalNewlineMode
Packit Service d2f85f
--                   >> IO.hGetContents h
Packit Service d2f85f
Packit Service d2f85f
-- | Convert UTF8-encoded ByteString to Text, also
Packit Service d2f85f
-- removing '\r' characters.
Packit Service d2f85f
toText :: B.ByteString -> T.Text
Packit Service d2f85f
toText = T.decodeUtf8 . filterCRs . dropBOM
Packit Service d2f85f
  where dropBOM bs =
Packit Service d2f85f
         if "\xEF\xBB\xBF" `B.isPrefixOf` bs
Packit Service d2f85f
            then B.drop 3 bs
Packit Service d2f85f
            else bs
Packit Service d2f85f
        filterCRs = B.filter (/='\r')
Packit Service d2f85f
Packit Service d2f85f
-- | Convert UTF8-encoded ByteString to String, also
Packit Service d2f85f
-- removing '\r' characters.
Packit Service d2f85f
toString :: B.ByteString -> String
Packit Service d2f85f
toString = T.unpack . toText
Packit Service d2f85f
Packit Service d2f85f
-- | Convert UTF8-encoded ByteString to Text, also
Packit Service d2f85f
-- removing '\r' characters.
Packit Service d2f85f
toTextLazy :: BL.ByteString -> TL.Text
Packit Service d2f85f
toTextLazy = TL.decodeUtf8 . filterCRs . dropBOM
Packit Service d2f85f
  where dropBOM bs =
Packit Service d2f85f
         if "\xEF\xBB\xBF" `BL.isPrefixOf` bs
Packit Service d2f85f
            then BL.drop 3 bs
Packit Service d2f85f
            else bs
Packit Service d2f85f
        filterCRs = BL.filter (/='\r')
Packit Service d2f85f
Packit Service d2f85f
-- | Convert UTF8-encoded ByteString to String, also
Packit Service d2f85f
-- removing '\r' characters.
Packit Service d2f85f
toStringLazy :: BL.ByteString -> String
Packit Service d2f85f
toStringLazy = TL.unpack . toTextLazy
Packit Service d2f85f
Packit Service d2f85f
fromText :: T.Text -> B.ByteString
Packit Service d2f85f
fromText = T.encodeUtf8
Packit Service d2f85f
Packit Service d2f85f
fromTextLazy :: TL.Text -> BL.ByteString
Packit Service d2f85f
fromTextLazy = TL.encodeUtf8
Packit Service d2f85f
Packit Service d2f85f
fromString :: String -> B.ByteString
Packit Service d2f85f
fromString = fromText . T.pack
Packit Service d2f85f
Packit Service d2f85f
fromStringLazy :: String -> BL.ByteString
Packit Service d2f85f
fromStringLazy = fromTextLazy . TL.pack
Packit Service d2f85f
Packit Service d2f85f
encodePath :: FilePath -> FilePath
Packit Service d2f85f
encodePath = id
Packit Service d2f85f
Packit Service d2f85f
decodeArg :: String -> String
Packit Service d2f85f
decodeArg = id