----------------------------------------------------------------------------- -- | -- Module : Static.Resources.Generation -- Copyright : (c) Scrive 2012 -- License : BSD-style (see the LICENSE file in the distribution) -- -- Maintainer : mariusz@scrive.com -- Stability : development -- Portability : portable -- -- Module for generaing joined js and css files from spec -- module Static.Resources.Generation ( generateResources ) where import Static.Resources.Types import Data.Hash.MD5 import Data.Time import Control.Monad import Data.Functor generateAgregatedResourceTypeContent :: ResourceType -> ResourceSet -> IO String generateAgregatedResourceTypeContent rt rs = do let files = map path $ filterByType (== rt) rs s <- forM files $ \p -> readFile p return $ (concat s) generateAgregatedCSSFile :: ResourceSet -> IO FilePath generateAgregatedCSSFile rs = do t <- show <$> getCurrentTime c <- generateAgregatedResourceTypeContent CSS rs let fn = (name rs) ++ "-" ++ (md5s $ Str $ t) ++ ".css" writeFile fn c return fn generateAgregatedJSFile :: ResourceSet -> IO FilePath generateAgregatedJSFile rs = do t <- show <$> getCurrentTime c <- generateAgregatedResourceTypeContent JS rs let fn = (name rs) ++ "-" ++ (md5s $ Str $ t) ++ ".js" writeFile fn c return fn generateResources :: ImportType -> ResourceSpec -> IO ResourceSetsForImport generateResources it spec = ResourceSetsForImport <$> forM (sets spec) (generateResourcesForSet it) -- | Change 'ResourceSet' to 'ResourceSetForImport'. Will generate files if needed. generateResourcesForSet :: ImportType -> ResourceSet -> IO ResourceSetForImport generateResourcesForSet Development rs = return $ ResourceSetForImport { set = rs , cssFiles = path <$> filterByType (== CSS) rs , jsFiles = path <$> filterByType (\t -> t == JS || t == JSX) rs } generateResourcesForSet Production rs = do cssF <- generateAgregatedCSSFile rs jsF <- generateAgregatedJSFile rs return $ ResourceSetForImport { set = rs , cssFiles = [cssF] , jsFiles = jsF : (path <$> filterByType (== JSX) rs) }