1 {-# LANGUAGE OverloadedStrings #-} 2 module 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 Web 14 import Files 15 import Web.Types 16 import Web.Generate 17 import 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 $ bufferedCopy allocatedPtr generatingFileWriteHandle 28 hPutChar generatingFileWriteHandle '\n') 29 [] 30 inputFiles 31 fileToGenInfo 32 where 33 bufferedCopy :: Ptr a -> Handle -> Handle -> IO () 34 bufferedCopy buffer output input = do 35 n <- hGetBufSome input buffer totalAlloc 36 when (n > 0) $ do 37 hPutBuf output buffer n 38 bufferedCopy buffer output input 39 totalAlloc = 32768 40 41 generateAllJS :: WebGenerator 42 generateAllJS = \f -> do 43 let debugOn = True 44 deps <- liftIO $ webDeps debugOn 45 appMinJs <- liftIO $ makeWebFilePath "app.min.js" 46 generateMerged (deps ++ [appMinJs]) f 47 48 generateAllCSS :: WebGenerator 49 generateAllCSS = \f -> do 50 css <- liftIO $ cssWebDeps False 51 generateMerged css f