{-# LANGUAGE OverloadedStrings #-} import System.FilePath.Posix import Hakyll main :: IO () main = hakyll $ do match "css/*" $ do route idRoute compile compressCssCompiler match "images/*" $ do route idRoute compile copyFileCompiler match "static/*" $ do route idRoute compile copyFileCompiler match "fonts/*" $ do route idRoute compile copyFileCompiler match "pastebin/*.html" $ do route idRoute compile copyFileCompiler match "posts/*" $ do route $ setExtension "html" `composeRoutes` dropPrefix "posts/" `composeRoutes` dateFolders compile $ pandocCompiler >>= loadAndApplyTemplate "templates/post.html" postCtx >>= saveSnapshot "content" >>= loadAndApplyTemplate "templates/default.html" postCtx >>= relativizeUrls match "pages/*" $ do route $ setExtension "html" `composeRoutes` dropPrefix "pages/" compile $ pandocCompiler >>= loadAndApplyTemplate "templates/default.html" defaultContext >>= relativizeUrls match "index.html" $ do route idRoute compile $ do posts <- recentFirst =<< loadAll "posts/*" let indexCtx = listField "posts" postCtx (return posts) `mappend` constField "title" "Home" `mappend` defaultContext getResourceBody >>= applyAsTemplate indexCtx >>= loadAndApplyTemplate "templates/default.html" indexCtx >>= relativizeUrls create ["archive.html"] $ do route idRoute compile $ do posts <- recentFirst =<< loadAll "posts/*" let archiveCtx = listField "posts" postCtx (return posts) `mappend` constField "title" "Archives" `mappend` defaultContext makeItem "" >>= loadAndApplyTemplate "templates/archive.html" archiveCtx >>= loadAndApplyTemplate "templates/default.html" archiveCtx >>= relativizeUrls create ["atom.xml", "feed.xml"] $ do route idRoute compile $ do loadAllSnapshots "posts/*" "content" >>= fmap (take 10) . recentFirst >>= renderAtom feedConfiguration feedCtx create ["rss.xml"] $ do route idRoute compile $ do let feedCtx = postCtx `mappend` constField "description" "This is the post description" posts <- fmap (take 10) . recentFirst =<< loadAll "posts/*" renderRss feedConfiguration feedCtx posts match "templates/*" $ compile templateBodyCompiler postCtx :: Context String postCtx = dateField "date" "%B %e, %Y" `mappend` defaultContext feedCtx :: Context String feedCtx = bodyField "description" `mappend` defaultContext feedConfiguration :: FeedConfiguration feedConfiguration = FeedConfiguration { feedTitle = "EuAndreh" , feedDescription = "EuAndreh's blog" , feedAuthorName = "EuAndreh" , feedAuthorEmail = "blog@euandre.org" , feedRoot = "euandre.org" } dropPrefix :: String -> Routes dropPrefix prefix = gsubRoute prefix $ const "" dateFolders :: Routes dateFolders = gsubRoute "[0-9]{4}-[0-9]{2}-[0-9]{2}-" $ replaceAll "-" (const "/")