{-# LANGUAGE OverloadedStrings #-} import System.FilePath.Posix import Hakyll main :: IO () main = hakyll $ do match "favicon.ico" $ do route idRoute compile copyFileCompiler 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 "root/*" $ do route $ dropPrefix "root/" compile copyFileCompiler match "pastebin/*" $ do route $ setExtension "html" compile $ pandocCompiler >>= loadAndApplyTemplate "templates/pastebin.html" pastebinCtx >>= saveSnapshot "content" >>= loadAndApplyTemplate "templates/default.html" pastebinCtx >>= relativizeUrls 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 "pastebins.html" $ do route idRoute compile $ do pastebins <- recentFirst =<< loadAll "pastebin/*" let pastebinCtx = listField "pastebins" pastebinCtx (return pastebins) `mappend` defaultContext getResourceBody >>= applyAsTemplate pastebinCtx >>= loadAndApplyTemplate "templates/default.html" pastebinCtx >>= 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 ["atom.xml", "feed.xml"] $ do route idRoute compile $ do loadAllSnapshots "posts/*" "content" >>= recentFirst >>= renderAtom feedConfiguration feedCtx create ["rss.xml"] $ do route idRoute compile $ do let feedCtx = postCtx `mappend` constField "description" "This is the post description" posts <- recentFirst =<< loadAll "posts/*" renderRss feedConfiguration feedCtx posts match "templates/*" $ compile templateBodyCompiler postCtx :: Context String postCtx = dateField "date" "%B %e, %Y" `mappend` defaultContext pastebinCtx :: Context String pastebinCtx = postCtx feedCtx :: Context String feedCtx = bodyField "description" `mappend` defaultContext feedConfiguration :: FeedConfiguration feedConfiguration = FeedConfiguration { feedTitle = "EuAndreh" , feedDescription = "EuAndreh's blog" , feedAuthorName = "EuAndreh" , feedAuthorEmail = "eu@euandre.org" , feedRoot = "https://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 "/")