summaryrefslogtreecommitdiff
path: root/packages/code/kleidi-ca/app
diff options
context:
space:
mode:
Diffstat (limited to 'packages/code/kleidi-ca/app')
-rw-r--r--packages/code/kleidi-ca/app/Main.hs71
1 files changed, 71 insertions, 0 deletions
diff --git a/packages/code/kleidi-ca/app/Main.hs b/packages/code/kleidi-ca/app/Main.hs
new file mode 100644
index 0000000..406bbaf
--- /dev/null
+++ b/packages/code/kleidi-ca/app/Main.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+{-|
+Site layout:
+
+Index:
+ - short intro to site?
+ - recent posts
+-}
+
+import Hakyll
+import System.FilePath (replaceExtension, takeFileName)
+
+postCtx :: Context String
+postCtx = dateField "date" "%B %e, %Y" <> defaultContext
+
+-- | Static pages in the content/ directory are passed through, keeping their
+-- layout.
+staticContent :: Rules ()
+staticContent = match "content/*" $ do
+ route $ customRoute ((`replaceExtension` ".html") . takeFileName . toFilePath)
+ compile $ pandocCompiler
+ >>= loadAndApplyTemplate "templates/default.html" defaultContext
+ >>= relativizeUrls
+
+postsContent :: Rules ()
+postsContent = do
+ create ["posts/index.html"] $ do
+ route idRoute
+ compile $ do
+ posts <- loadAll "posts/*.markdown" >>= recentFirst
+ let archiveCtx = listField "posts" postCtx (pure posts)
+ <> constField "title" "Posts"
+ <> defaultContext
+ makeItem ""
+ >>= loadAndApplyTemplate "templates/post-list.html" archiveCtx
+ >>= loadAndApplyTemplate "templates/default.html" archiveCtx
+ >>= relativizeUrls
+
+ match "posts/*.markdown" $ do
+ route $ setExtension "html"
+ compile $ pandocCompiler
+ >>= loadAndApplyTemplate "templates/post.html" postCtx
+ >>= loadAndApplyTemplate "templates/default.html" postCtx
+ >>= relativizeUrls
+
+main :: IO ()
+main = hakyll $ do
+ match "images/*" $ do
+ route idRoute
+ compile copyFileCompiler
+
+ match "css/*" $ do
+ route idRoute
+ compile compressCssCompiler
+
+ staticContent
+ postsContent
+
+ match "index.html" $ do
+ route idRoute
+ compile $ do
+ posts <- fmap (take 3) . recentFirst =<< loadAll "posts/*.markdown"
+ let indexCtx = listField "posts" postCtx (return posts) `mappend` defaultContext
+
+ getResourceBody
+ >>= applyAsTemplate indexCtx
+ >>= loadAndApplyTemplate "templates/default.html" indexCtx
+ >>= relativizeUrls
+
+ match "templates/*" $ compile templateBodyCompiler