{-# LANGUAGE OverloadedStrings #-} import Data.List (sortOn) import Data.Time (defaultTimeLocale, formatTime) import Hakyll -------------------------------------------------------------------------------- main :: IO () main = hakyllWith defaultConfiguration{ deployCommand = "ipfs add -Q -r _site" } $do match "images/*" $ do route idRoute compile copyFileCompiler match "resources/*" $ do route idRoute compile copyFileCompiler match "css/*" $ do route idRoute compile compressCssCompiler match "js/*" $ do route idRoute compile compressCssCompiler match (fromList ["index.markdown", "contact.markdown"]) $ do route $ setExtension "html" compile $ pandocCompiler >>= loadAndApplyTemplate "templates/default.html" defaultContext >>= relativizeUrls match "posts/*" $ do route $ setExtension "html" compile $ pandocCompiler >>= loadAndApplyTemplate "templates/post.html" postCtx >>= loadAndApplyTemplate "templates/default.html" postCtx >>= relativizeUrls create ["posts.html"] $ do route idRoute compile $ do posts <- modFirst =<< loadAll "posts/*" let archiveCtx = listField "posts" postCtx (return posts) <> constField "title" "Posts" <> defaultContext makeItem "" >>= loadAndApplyTemplate "templates/guides.html" archiveCtx >>= loadAndApplyTemplate "templates/default.html" archiveCtx >>= relativizeUrls match "templates/*" $ compile templateBodyCompiler modFirst :: [Item a] -> Compiler [Item a] modFirst = fmap reverse . modified where modified = sortByM (getItemModificationTime . itemIdentifier) sortByM f xs = map fst . sortOn snd <$> mapM (\x -> (,) x <$> f x) xs -------------------------------------------------------------------------------- postCtx :: Context String postCtx = dateField "date" "%B %e, %Y" <> modifiedField "modified" "%B %e, %Y" <> defaultContext where modifiedField key format = field key $ \i -> do time <- getItemModificationTime $ itemIdentifier i return $ formatTime defaultTimeLocale format time