{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MultiParamTypeClasses #-} module Web.Wheb.Plugins.Strapped ( StrappedContainer(..) , StrappedApp (..) , renderTemplate , initStrapped , module Text.Strapped ) where import Control.Monad.Except import Web.Wheb import Web.Wheb.Plugins.Security import Text.Strapped import Data.Text.Lazy as T import Data.Text as TS data StrappedContainer m = StrappedContainer { renderconfig :: StrappedConfig , defaultBucket :: InputBucket m } class StrappedApp g m where getStrappedContainer :: g -> StrappedContainer m -- | Load Strapped from a directory matching the extention initStrapped :: MonadIO m => StrappedConfig -> FilePath -> String -> InitM g s m (StrappedContainer (WhebT g s m)) initStrapped config fp s = do mtmpls <- liftIO $ templateStoreFromDirectory config fp s case mtmpls of Left err -> error (show err) Right tmpls -> return $ StrappedContainer (config { templateStore = tmpls }) csrf_bucket where csrf_bucket = bucketFromList [ ("csrf_token", Func $ \_ -> lift $ liftM LitText getCSRFToken) , ("csrf_input", Func $ \_ -> lift $ do tok <- getCSRFToken return $ LitText $ "") , ("csrf_meta", Func $ \_ -> lift $ do tok <- getCSRFToken return $ LitText $ "")] -- | Render a template or throw an error renderTemplate :: (MonadIO m, StrappedApp g (WhebT g s m)) => String -> InputBucket (WhebT g s m) -> WhebHandlerT g s m renderTemplate tName bucket = do sc <- getWithApp getStrappedContainer result <- render (renderconfig sc) (combineBuckets bucket (defaultBucket sc)) tName case result of Left err -> throwError $ Error500 (T.pack $ show err) Right b -> builder "text/html" b