etienne-moqueur/app/Main.hs
etienne 1068b16a67 Changed Prop's cssMap from Map String Css to IntMap String.
The cssMap now contains the rendered css together with its hash. That
way there is no need to give a component a name, and css is rendered
along the way and carried as a string.
2023-07-03 16:21:46 +02:00

77 lines
2 KiB
Haskell

module Main
( main
) where
import Data.Hashable ( hash )
import Data.String
import Hakyll
import Components
import Core.Compilers
import Core.Render ( )
import Routes
import Utils.FileTree
import Utils.Routes
import Kit.Templates.Archive
import Kit.Templates.Index
import Kit.Templates.Post ( postTemplate )
import Kit.Templates.Sitemap
resources :: Component ()
resources = do
mconcat [postTemplate, indexTemplate, archiveTemplate]
return ()
assets :: [FilePath]
assets = map tail . getPaths . getAssets $ resources
allCss :: String
allCss = getCss resources
css :: Compiler (Item String)
css = makeItem allCss
cssHash :: Identifier
cssHash = fromString . show . hash $ allCss
main :: IO ()
main = hakyll $ do
tags <- buildTags (patrn $ Post "*.md") (fromCapture . patrn $ Tag "*")
match (patrn $ Post "*.md") $ do
route $ setExtension "html"
compile $ do
pandocCompiler
>>= saveSnapshot "content"
>>= componentTemplate postTemplate defaultContext
. fmap demoteHeaders
create ["index.html"] $ do
route idRoute
compile $ do
pages <- recentFirst =<< loadAllSnapshots "posts/*.md" "content"
makeItem "" >>= componentTemplate indexTemplate (indexCtx tags pages)
create ["tags/index.html"] $ do
route idRoute
compile $ makeItem "" >>= componentTemplate archiveTemplate
(archiveCtx tags)
create [cssHash] $ do
route $ constRoute . tail . path $ DefaultStylesheet
compile css
match (fromList . map fromFilePath $ assets) $ do
route idRoute
compile copyFileCompiler
create ["sitemap.xml"] $ do
route idRoute
compile $ do
posts <- recentFirst =<< loadAll "posts/*.md"
let pages = posts
sitemapCtx = listField "pages" defaultContext (return pages)
makeItem "" >>= componentTemplate (pure sitemapTemplate) sitemapCtx