module Hakyllbars.Template
  ( applyTemplates,
    applyContent,
    applyContentWith,
    fileTemplate,
    applyCompiler,
    applyContext,
    applyTemplate,
    applyAsTemplate,
  )
where

import Control.Monad.State.Strict (evalStateT)
import Hakyll (defaultHakyllReaderOptions, defaultHakyllWriterOptions)
import Hakyllbars.Common
import Hakyllbars.Compiler (applyAsTemplate, applyTemplate)
import Hakyllbars.Context
import Hakyllbars.Pandoc (pandocCompilerWith)
import Text.Pandoc (ReaderOptions, WriterOptions)

applyTemplates :: TemplateRunner a () -> Item a -> Compiler (Item a)
applyTemplates :: forall a. TemplateRunner a () -> Item a -> Compiler (Item a)
applyTemplates TemplateRunner a ()
templates Item a
item =
  forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (TemplateRunner a ()
templates forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall a. TemplateRunner a (Item a)
tplItem) forall a b. (a -> b) -> a -> b
$
    TemplateState
      { tplContextStack :: [(Context a, Context a)]
tplContextStack = [],
        tplItemStack :: [Item a]
tplItemStack = [Item a
item],
        tplCallStack :: [String]
tplCallStack = [String
"item " forall a. [a] -> [a] -> [a]
++ forall a. Item a -> String
itemFilePath Item a
item]
      }

applyContent :: TemplateRunner String ()
applyContent :: TemplateRunner String ()
applyContent = ReaderOptions -> WriterOptions -> TemplateRunner String ()
applyContentWith ReaderOptions
defaultHakyllReaderOptions WriterOptions
defaultHakyllWriterOptions

applyContentWith :: ReaderOptions -> WriterOptions -> TemplateRunner String ()
applyContentWith :: ReaderOptions -> WriterOptions -> TemplateRunner String ()
applyContentWith ReaderOptions
readerOpts WriterOptions
writerOpts = do
  TemplateRunner String ()
applyAsTemplate
  forall a.
(Item a -> TemplateRunner a (Item a)) -> TemplateRunner a ()
tplModifyItem forall a b. (a -> b) -> a -> b
$ forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReaderOptions
-> WriterOptions -> Item String -> Compiler (Item String)
pandocCompilerWith ReaderOptions
readerOpts WriterOptions
writerOpts

fileTemplate :: FilePath -> TemplateRunner String ()
fileTemplate :: String -> TemplateRunner String ()
fileTemplate String
filePath =
  Identifier -> TemplateRunner String ()
applyTemplate (String -> Identifier
fromFilePath String
filePath)

applyCompiler :: (Item a -> Compiler (Item a)) -> TemplateRunner a ()
applyCompiler :: forall a. (Item a -> Compiler (Item a)) -> TemplateRunner a ()
applyCompiler Item a -> Compiler (Item a)
compiler =
  forall a.
(Item a -> TemplateRunner a (Item a)) -> TemplateRunner a ()
tplModifyItem forall a b. (a -> b) -> a -> b
$ forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. Item a -> Compiler (Item a)
compiler

applyContext :: Context a -> TemplateRunner a ()
applyContext :: forall a. Context a -> TemplateRunner a ()
applyContext = forall a. Context a -> TemplateRunner a ()
tplPushContext
{-# INLINE applyContext #-}