From 1a181be93f37a94b347b2f5f97a1fef57e11cf89 Mon Sep 17 00:00:00 2001 From: Kleidi Bujari Date: Thu, 27 Aug 2026 19:01:12 -0700 Subject: [kleidi.ca] init hakyll version of kleidi-ca --- packages/code/kleidi-ca/app/Main.hs | 71 +++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 packages/code/kleidi-ca/app/Main.hs (limited to 'packages/code/kleidi-ca/app/Main.hs') 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 -- cgit v1.3.1