module Text.Templating.Heist.Splices.Apply where
import Data.Maybe
import Data.Text (Text)
import qualified Data.Text.Encoding as T
import qualified Text.XmlHtml as X
import Text.Templating.Heist.Internal
import Text.Templating.Heist.Types
applyTag :: Text
applyTag = "apply"
applyAttr :: Text
applyAttr = "template"
rawApply :: (Monad m)
=> [X.Node]
-> TPath
-> [X.Node]
-> HeistT m Template
rawApply calledNodes newContext paramNodes = do
st <- getTS
processedParams <- runNodeList paramNodes
modifyTS (bindSplice "content" $ return processedParams)
setContext newContext
result <- runNodeList calledNodes
restoreTS st
return result
applyNodes :: Monad m => Template -> Text -> Splice m
applyNodes nodes template = do
st <- getTS
maybe (return [])
(\(t,ctx) -> do
addDoctype $ maybeToList $ X.docType $ dfDoc t
rawApply (X.docContent $ dfDoc t) ctx nodes)
(lookupTemplate (T.encodeUtf8 template) st)
applyImpl :: Monad m => Splice m
applyImpl = do
node <- getParamNode
case X.getAttribute applyAttr node of
Nothing -> return []
Just template -> applyNodes (X.childNodes node) template