module Text.Hakyll.Renderables
( CustomPage
, createCustomPage
, PagePath
, createPagePath
, CombinedRenderable
, combine
, combineWithURL
) where
import qualified Data.Map as M
import Text.Hakyll.Hakyll (Hakyll)
import Text.Hakyll.Page
import Text.Hakyll.Renderable
import Text.Hakyll.File
data CustomPage = CustomPage
{ customPageURL :: String,
customPageDependencies :: [FilePath],
customPageContext :: [(String, Either String (Hakyll String))]
}
createCustomPage :: String
-> [FilePath]
-> [(String, Either String (Hakyll String))]
-> CustomPage
createCustomPage = CustomPage
instance Renderable CustomPage where
getDependencies = customPageDependencies
getURL = customPageURL
toContext page = do
values <- mapM (either return id . snd) (customPageContext page)
let pairs = zip (map fst $ customPageContext page) values
return $ M.fromList $ ("url", customPageURL page) : pairs
data PagePath = PagePath FilePath
createPagePath :: FilePath -> PagePath
createPagePath = PagePath
instance Renderable PagePath where
getDependencies (PagePath path) = return path
getURL (PagePath path) = toURL path
toContext (PagePath path) = readPage path >>= toContext
data CombinedRenderable a b = CombinedRenderable a b
| CombinedRenderableWithURL FilePath a b
combine :: (Renderable a, Renderable b) => a -> b -> CombinedRenderable a b
combine = CombinedRenderable
combineWithURL :: (Renderable a, Renderable b)
=> FilePath
-> a
-> b
-> CombinedRenderable a b
combineWithURL = CombinedRenderableWithURL
instance (Renderable a, Renderable b)
=> Renderable (CombinedRenderable a b) where
getDependencies (CombinedRenderable a b) =
getDependencies a ++ getDependencies b
getDependencies (CombinedRenderableWithURL _ a b) =
getDependencies a ++ getDependencies b
getURL (CombinedRenderable a _) = getURL a
getURL (CombinedRenderableWithURL url _ _) = url
toContext (CombinedRenderable a b) = do
c1 <- toContext a
c2 <- toContext b
return $ c1 `M.union` c2
toContext (CombinedRenderableWithURL url a b) = do
c <- toContext (CombinedRenderable a b)
return $ M.singleton "url" url `M.union` c