module Text.Strapped.Utils where
import Blaze.ByteString.Builder
import Blaze.ByteString.Builder.Char.Utf8
import Control.Monad
import Data.List hiding (find)
import Text.Strapped.Types
import Text.Strapped.Parser
import System.FilePath.Find
import System.FilePath.Posix (addTrailingPathSeparator)
import Text.ParserCombinators.Parsec
templateStoreFromList :: [(String, String)] -> Either ParseError TemplateStore
templateStoreFromList tmpls = do
templateTups <- forM tmpls (\(tn, t) -> fmap ((,) tn) $ parseTemplate t tn)
return (\n -> return $ lookup n templateTups)
templateStoreFromDirectory :: FilePath -> String -> IO (Either ParseError TemplateStore)
templateStoreFromDirectory dir ext = do
files <- find always (extension ==? ext) dirPath
tmpls <- forM files (\fn -> let fname = maybe [] id $ stripPrefix dirPath fn
in print fname >> readFile fn >>= (return . (,) fname))
return $ templateStoreFromList tmpls
where dirPath = addTrailingPathSeparator dir
putStore :: TemplateStore -> RenderConfig -> RenderConfig
putStore ts rc = rc { templateStore = ts }
showToBuilder :: Show a => a -> Builder
showToBuilder = fromShow