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