{-# language OverloadedStrings #-} {-# language FlexibleContexts #-} {-# language ViewPatterns #-} module SitePipe.Templating ( renderTemplate ) where import qualified Text.Mustache as M import qualified Data.Text as T import Data.Text.Lens import Control.Lens import Data.Aeson.Lens import Data.Aeson.Types import SitePipe.Types import Control.Monad.Writer import Control.Monad.Reader import qualified Text.Mustache.Types as MT -- | Given a template, produces a function compatible with 'SitePipe.Files.writeWith' -- which writes resources using the template. renderTemplate :: (ToJSON env) => M.Template -> env -> SiteM String renderTemplate template (toJSON -> env) = do gContext <- asks globalContext let fullContext = addContext gContext (MT.toMustache env) case M.checkedSubstitute template fullContext of ([], result) -> return (T.unpack result) (errs, r) -> do tell $ ["*** Warnings rendering " ++ path ++ "***"] ++ (fmap show errs) ++ ["------"] return (T.unpack r) where path = env ^. key "filepath" . _String . unpacked addContext (MT.Object context) (MT.Object e) = MT.Object (context <> e) addContext _ e = e