yesod/Yesod/Template.hs
2010-01-27 13:19:27 +02:00

68 lines
2.0 KiB
Haskell

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleContexts #-}
module Yesod.Template
( YesodTemplate (..)
, template
, NoSuchTemplate
, Template
, TemplateGroup
, TemplateFile (..)
, setAttribute
, loadTemplateGroup
) where
import Data.Object.Html
import Data.Typeable (Typeable)
import Control.Exception (Exception)
import Data.Object.Text (Text)
import Text.StringTemplate
import Data.Object.Json
import Web.Mime
import Yesod.Response
import Yesod.Yesod
import Yesod.Handler
type Template = StringTemplate Text
type TemplateGroup = STGroup Text
class Yesod y => YesodTemplate y where
getTemplateGroup :: y -> TemplateGroup
getTemplateGroup' :: YesodTemplate y => Handler y TemplateGroup
getTemplateGroup' = getTemplateGroup `fmap` getYesod
template :: YesodTemplate y
=> String -- ^ template name
-> HtmlObject -- ^ object
-> (HtmlObject -> Template -> IO Template)
-> Handler y ChooseRep
template tn ho f = do
tg <- getTemplateGroup'
t <- case getStringTemplate tn tg of
Nothing -> failure $ NoSuchTemplate tn
Just x -> return x
return $ chooseRep
[ (TypeHtml, tempToContent t ho f)
, (TypeJson, cs $ unJsonDoc $ cs ho)
]
newtype NoSuchTemplate = NoSuchTemplate String
deriving (Show, Typeable)
instance Exception NoSuchTemplate
tempToContent :: Template
-> HtmlObject
-> (HtmlObject -> Template -> IO Template)
-> Content
tempToContent t ho f = ioTextToContent $ fmap render $ f ho t
data TemplateFile = TemplateFile FilePath HtmlObject
instance HasReps TemplateFile where
chooseRep (TemplateFile fp (Mapping m)) _ = do
t <- fmap newSTMP $ readFile fp
let t' = setManyAttrib m t :: Template
return (TypeHtml, cs $ render t')
chooseRep _ _ = error "Please fix type of TemplateFile"
loadTemplateGroup :: FilePath -> IO TemplateGroup
loadTemplateGroup = directoryGroupRecursiveLazy