packages feed

hledger-web-0.15: Hledger/Web/EmbeddedFiles.hs

{-# LANGUAGE TemplateHaskell #-}
{-| 

Support files (static files and templates) used by the web app are
embedded in this module at compile time. Since hamlet can not easily use
these directly, we provide a way to write them out to the filesystem at
startup, when needed. This simplifies installation for end-users, and
customisation too.

-}
module Hledger.Web.EmbeddedFiles
    (
     files
    ,createFilesIfMissing
    )
where
import Control.Monad
import qualified Data.ByteString as B
import Data.FileEmbed (embedDir)
import System.Directory
import System.FilePath

import Hledger.Web.Settings (datadir)

-- | An embedded copy of all files below the the hledger-web data
-- directory (@.hledger\/web\/@) at compile time, as (FilePath,ByteString)
-- pairs.
files :: [(FilePath, B.ByteString)]
files = $(embedDir datadir)

-- | If the hledger-web data directory (@.hledger\/web\/@) does not exist in
-- the current directory, create and fill it with the web app support
-- files (templates, stylesheets, images etc.) Returns True if the
-- directory was missing.
createFilesIfMissing :: IO Bool
createFilesIfMissing = do
  exists <- doesDirectoryExist datadir
  if exists
   then return False
   else do
     createDirectoryIfMissing True datadir  
     setCurrentDirectory datadir
     forM_ files $ \(f,d) -> do
                              createDirectoryIfMissing True $ takeDirectory f
                              B.writeFile f d
     return True