68 lines
2.0 KiB
Haskell
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
|