packages feed

profiteur-0.3.0.0: src/Main.hs

--------------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
module Main
    ( main
    ) where


--------------------------------------------------------------------------------
import qualified Data.Aeson                 as Aeson
import qualified Data.Attoparsec.ByteString as AP
import qualified Data.ByteString            as B
import qualified Data.ByteString.Char8      as BC8
import qualified Data.ByteString.Lazy       as BL
import qualified Data.Text                  as T
import qualified Data.Text.Encoding         as T
import           System.Environment         (getArgs, getProgName)
import           System.Exit                (exitFailure)
import           System.FilePath            (takeBaseName)
import qualified System.IO                  as IO


--------------------------------------------------------------------------------
import           Paths_profiteur            (getDataFileName)
import           Profiteur.Core
import           Profiteur.Parser


--------------------------------------------------------------------------------
includeFile :: IO.Handle -> FilePath -> IO ()
includeFile h dataFile = do
    fileName <- getDataFileName dataFile
    BL.hPutStr h =<< BL.readFile fileName


--------------------------------------------------------------------------------
writeReport :: String -> NodeMap -> IO ()
writeReport profFile prof = IO.withBinaryFile htmlFile IO.WriteMode $ \h -> do
    BC8.hPutStrLn h $
        "<!DOCTYPE html>\n\
        \<html>\n\
        \  <head>\n\
        \    <meta charset=\"UTF-8\">\n\
        \    <title>" `mappend` T.encodeUtf8 title `mappend` "</title>"

    BC8.hPutStr h "<script type=\"text/javascript\">var $prof = "
    BL.hPutStr h $ Aeson.encode prof
    BC8.hPutStrLn h ";</script>"

    BC8.hPutStrLn h "<style>"
    includeFile h "data/css/main.css"
    BC8.hPutStrLn h "</style>"

    includeJs h "data/lib/jquery-1.11.0.min.js"
    includeJs h "data/js/unicode.js"
    includeJs h "data/js/model.js"
    includeJs h "data/js/resizing-canvas.js"
    includeJs h "data/js/node.js"
    includeJs h "data/js/selection.js"
    includeJs h "data/js/zoom.js"
    includeJs h "data/js/details.js"
    includeJs h "data/js/sorting.js"
    includeJs h "data/js/tree-map.js"
    includeJs h "data/js/tree-browser.js"
    includeJs h "data/js/main.js"

    BC8.hPutStrLn h
        "  </head>\n\
        \  <body>"
    includeFile h "data/html/body.html"
    BC8.hPutStrLn h
        "  </body>\
        \</html>"

    putStrLn $ "Wrote " ++ htmlFile
  where
    htmlFile = profFile ++ ".html"
    title    = T.pack $ takeBaseName profFile

    includeJs h file = do
        BC8.hPutStrLn h "<script type=\"text/javascript\">"
        includeFile h file
        BC8.hPutStrLn h "</script>"


--------------------------------------------------------------------------------
main :: IO ()
main = do
    progName <- getProgName
    args     <- getArgs
    case args of
        [profFile] -> do
            profOrErr <- AP.parseOnly parseFile <$> B.readFile profFile
            case profOrErr of
                Right prof ->
                    writeReport profFile $ nodeMapFromCostCentre prof
                Left err   -> do
                    putStrLn $ profFile ++ ": " ++ err
                    exitFailure
        _          -> do
            putStrLn $ "Usage: " ++ progName ++ " <prof file>"
            exitFailure