1 {-# LANGUAGE OverloadedStrings #-}
    2 module Databrary.Web.All
    3   ( generateAllJS
    4   , generateAllCSS
    5   ) where
    6 
    7 import Control.Monad (when, forM_)
    8 import Control.Monad.IO.Class (liftIO)
    9 import Foreign.Ptr (Ptr)
   10 import Foreign.Marshal.Alloc (allocaBytes)
   11 import System.IO (withBinaryFile, IOMode(ReadMode, WriteMode), hPutChar, hGetBufSome, hPutBuf, Handle)
   12 
   13 import Databrary.Web
   14 import Databrary.Files
   15 import Databrary.Web.Types
   16 import Databrary.Web.Generate
   17 import Databrary.Web.Libs
   18 
   19 generateMerged :: [WebFilePath] -> WebGenerator
   20 generateMerged inputFiles = \fileToGenInfo@(fileToGen, _) -> do
   21   fp <- liftIO $ unRawFilePath $ webFileAbs fileToGen
   22   webRegenerate
   23     (allocaBytes totalAlloc $ \allocatedPtr ->
   24       withBinaryFile fp WriteMode $ \generatingFileWriteHandle ->
   25         forM_ inputFiles $ \inputFile -> do
   26           fps <- unRawFilePath $ webFileAbs inputFile
   27           withBinaryFile fps ReadMode $ (\inputFileReadHandle ->
   28             bufferedCopy allocatedPtr generatingFileWriteHandle inputFileReadHandle)
   29           hPutChar generatingFileWriteHandle '\n')
   30     []
   31     inputFiles
   32     fileToGenInfo
   33   where
   34   bufferedCopy :: (Ptr a) -> Handle -> Handle -> IO ()
   35   bufferedCopy buffer output input = do
   36     n <- hGetBufSome input buffer totalAlloc
   37     when (n > 0) $ do
   38       hPutBuf output buffer n
   39       bufferedCopy buffer output input
   40   totalAlloc = 32768
   41 
   42 generateAllJS :: WebGenerator
   43 generateAllJS = \f -> do
   44   let debugOn = True
   45   deps <- liftIO $ webDeps debugOn
   46   appMinJs <- liftIO $ makeWebFilePath "app.min.js"
   47   generateMerged (deps ++ [appMinJs]) f
   48 
   49 generateAllCSS :: WebGenerator
   50 generateAllCSS = \f -> do
   51   css <- liftIO $ cssWebDeps False
   52   generateMerged css f