{-# LANGUAGE OverloadedStrings #-} module Snap.Extras.SpliceUtils.Compiled where ------------------------------------------------------------------------------- import Blaze.ByteString.Builder.ByteString import Control.Monad.Trans import Data.Monoid import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.Encoding as T import Snap.Core import qualified Snap.Extras.SpliceUtils.Interpreted as I import Heist import Heist.Compiled import Text.XmlHtml ------------------------------------------------------------------------------- utilSplices :: MonadSnap m => [(Text, Splice m)] utilSplices = [ ("rqparam", paramSplice) , ("refererLink", refererCSplice) ] refererCSplice :: MonadSnap m => Splice m refererCSplice = return $ yieldRuntimeText $ return . maybe "/" T.decodeUtf8 =<< lift (getsRequest (getHeader "Referer")) ------------------------------------------------------------------------------ -- | Gets the value of a request parameter. Example use: -- -- paramSplice :: MonadSnap m => Splice m paramSplice = do node <- getParamNode let mat = getAttribute "name" node case mat of Nothing -> error $ (T.unpack $ elementTag node) ++ " must have a 'name' attribute" Just at -> return $ yieldRuntime $ do val <- lift $ getParam $ T.encodeUtf8 at return $ maybe mempty fromByteString val ------------------------------------------------------------------------------ -- | Searches a directory on disk and all its subdirectories for all files -- with names that don't begin with an underscore and end with a .js -- extension. It then returns script tags for each of these files. -- -- You can use this function to create a splice: -- -- > ("staticscripts", scriptsSplice "static/js" "/") -- -- Then when you use the @\@ tag in your templates, it will -- automatically include all the javascript code in the @static/js@ directory. scriptsSplice :: MonadIO m => FilePath -- ^ Path to the directory on disk holding the javascript -- files. -> String -- ^ A prefix to add to the src attribute of each script tag. -> Splice m scriptsSplice d prefix = runNodeList =<< I.scriptsSplice d prefix