{-# LANGUAGE OverloadedStrings #-} import Hakyll import Data.Monoid (mappend) import Data.List (sortBy,isSuffixOf) import System.FilePath.Posix (takeBaseName,takeDirectory,()) import GHC.IO.Encoding main :: IO () main = do setLocaleEncoding utf8 hakyll $ do match "humans.txt" $ do route idRoute compile copyFileCompiler match "images/*" $ do route idRoute compile copyFileCompiler match "css/*" $ do route idRoute compile compressCssCompiler match (fromList ["about.md", "contact.md"]) $ do route $ cleanRoute compile $ pandocCompiler >>= loadAndApplyTemplate "templates/default.html" defaultContext >>= relativizeUrls >>= cleanIndexUrls match "archive.md" $ do route $ cleanRoute compile $ pandocCompiler >>= loadAndApplyTemplate "templates/archive.html" defaultContext >>= relativizeUrls >>= cleanIndexUrls compile $ do posts <- recentFirst =<< loadAll "posts/*" let archiveCtx = listField "posts" postCtx (return posts) `mappend` constField "title" "Archives" `mappend` defaultContext pandocCompiler >>= loadAndApplyTemplate "templates/archive.html" archiveCtx >>= loadAndApplyTemplate "templates/default.html" archiveCtx >>= relativizeUrls >>= cleanIndexUrls match "posts/*" $ do route $ cleanRoute compile $ pandocCompiler >>= loadAndApplyTemplate "templates/post.html" postCtx >>= loadAndApplyTemplate "templates/default.html" postCtx >>= relativizeUrls >>= cleanIndexUrls >>= cleanIndexHtmls create ["archive/index.html"] $ do route idRoute 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 >>= cleanIndexUrls >>= cleanIndexHtmls match "templates/*" $ compile templateBodyCompiler postCtx :: Context String postCtx = dateField "date" "%B %e, %Y" `mappend` defaultContext cleanRoute :: Routes cleanRoute = customRoute createIndexRoute where createIndexRoute ident = takeDirectory p takeBaseName p "index.html" where p = toFilePath ident cleanIndexUrls :: Item String -> Compiler (Item String) cleanIndexUrls = return . fmap (withUrls cleanIndex) cleanIndexHtmls :: Item String -> Compiler (Item String) cleanIndexHtmls = return . fmap (replaceAll pattern replacement) where pattern = "/index.html" replacement = const "/" cleanIndex :: String -> String cleanIndex url | idx `isSuffixOf` url = take (length url - length idx) url | otherwise = url where idx = "index.html"