module Text.Hakyll.CreateContext
( createPage
, createCustomPage
, createListing
, combine
, combineWithUrl
) where
import qualified Data.Map as M
import Control.Arrow (second)
import Control.Monad (liftM2)
import Control.Applicative ((<$>))
import Text.Hakyll.File
import Text.Hakyll.Context
import Text.Hakyll.HakyllAction
import Text.Hakyll.Render
import Text.Hakyll.Internal.Page
createPage :: FilePath -> HakyllAction () Context
createPage path = HakyllAction
{ actionDependencies = [path]
, actionUrl = Left $ toUrl path
, actionFunction = const (readPage path)
}
createCustomPage :: FilePath
-> [(String, Either String (HakyllAction () String))]
-> HakyllAction () Context
createCustomPage url association = HakyllAction
{ actionDependencies = dataDependencies
, actionUrl = Left $ return url
, actionFunction = \_ -> Context . M.fromList <$> assoc'
}
where
mtuple (a, b) = b >>= \b' -> return (a, b')
toHakyllString = second (either return runHakyllAction)
assoc' = mapM (mtuple . toHakyllString) $ ("url", Left url) : association
dataDependencies = map snd association >>= getDependencies
getDependencies (Left _) = []
getDependencies (Right x) = actionDependencies x
createListing :: FilePath
-> [FilePath]
-> [HakyllAction () Context]
-> [(String, Either String (HakyllAction () String))]
-> HakyllAction () Context
createListing url templates renderables additional =
createCustomPage url context
where
context = ("body", Right concatenation) : additional
concatenation = renderAndConcat templates renderables
combine :: HakyllAction () Context -> HakyllAction () Context
-> HakyllAction () Context
combine x y = HakyllAction
{ actionDependencies = actionDependencies x ++ actionDependencies y
, actionUrl = actionUrl x
, actionFunction = \_ ->
Context <$> liftM2 (M.union) (unContext <$> runHakyllAction x)
(unContext <$> runHakyllAction y)
}
combineWithUrl :: FilePath
-> HakyllAction () Context
-> HakyllAction () Context
-> HakyllAction () Context
combineWithUrl url x y = combine'
{ actionUrl = Left $ return url
, actionFunction = \_ ->
Context . M.insert "url" url . unContext <$> runHakyllAction combine'
}
where
combine' = combine x y