module SourceFile where import qualified Data.Text.Lazy.Builder as B import Data.Text.Lazy.Builder (Builder) import Data.Text.Lazy (Text) import Pretty data SourceFile = SourceFile [Chunk] deriving (Show) data Chunk = CSkip Text | COcc Occurrence deriving (Show) data Occurrence = Occurrence { occName :: Text , occArgs :: [(Text, Text)] } -- prefix spacing, argument value deriving (Show) occurrenceToBuilder :: Bool -> Occurrence -> Builder occurrenceToBuilder useClr (Occurrence name args) = ansiBG '1' (B.fromLazyText name) <> mconcat [ansiBG '4' (B.fromLazyText pre) <> ansiBG '3' (B.fromLazyText val) | (pre, val) <- args] where ansiBG :: Char -> Builder -> Builder ansiBG c b | useClr && stdoutIsTTY = B.fromString ("\x1B[1;4" ++ c : "m") <> b <> B.fromString "\x1B[0m" | otherwise = b chunkToBuilder :: Bool -> Chunk -> Builder chunkToBuilder _ (CSkip s) = B.fromLazyText s chunkToBuilder useClr (COcc occ) = occurrenceToBuilder useClr occ sourceFileToBuilder :: Bool -> SourceFile -> Builder sourceFileToBuilder useClr (SourceFile cs) = mconcat (map (chunkToBuilder useClr) cs) instance Pretty SourceFile where pretty' = sourceFileToBuilder True instance Pretty Chunk where pretty' = chunkToBuilder True instance Pretty Occurrence where pretty' = occurrenceToBuilder True