import Data.Maybe import System.IO import System.Environment import Text.HTML.TagStream import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as S import System.Console.ANSI import qualified Data.Enumerator as E import qualified Data.Enumerator.Binary as E import qualified Data.Enumerator.List as EL import Blaze.ByteString.Builder (Builder) import Blaze.ByteString.Builder.Enumerator (unsafeBuilderToByteString, allocBuffer) color :: Color -> ByteString -> ByteString color c s = S.concat [ S.pack $ setSGRCode [SetColor Foreground Dull c] , s , S.pack $ setSGRCode [SetColor Foreground Dull White] ] hightlightStream :: Monad m => E.Enumeratee Token Builder m b hightlightStream = EL.map (showToken (color Red)) main :: IO () main = do args <- getArgs filename <- maybe (fail "pass file path") return (listToMaybe args) let iter = E.enumFile filename E.$= tokenStream E.$= hightlightStream E.$= unsafeBuilderToByteString (allocBuffer 4096) E.$$ E.iterHandle stdout E.run_ iter