module Main where import Prolog import Hakyll import Data.List qualified as L import Data.Ord (Down (..)) import Hakyll.Alias import Hakyll.Util import Data.Alias (AliasMap) import Data.Name (Name (..), Name_) import Data.Person (Person_) import Data.Journal (Journal_) import Data.License (License_) import Data.Paper (Paper (..)) import Hakyll.Aeson (yamlCompiler) import Hakyll.Paper (papersCompiler, mkPaperContext, FieldContext (..)) import Hakyll.TeX.BibTeX (bibtexCompiler) import Hakyll.Web.Sass import Hakyll.Web.Redirect (createRedirects) import Text.Jasmine (minify) import WWW.Base (baseHakyll, domain, myHakyllWriterOptions, myHakyllReaderOptions) import WWW.Templates (myContext, defaultTemplate) import GHC.IO.Encoding qualified as E main :: IO () main = do E.setLocaleEncoding E.utf8 baseHakyll domain $ do match "templates/**" $ compile templateCompiler -- match "data/*.bib" $ compile bibtexCompiler match "data/papers.bib" $ compile papersCompiler match "data/people.yaml" $ compile $ yamlCompiler @(AliasMap Name_ Person_) match "data/licenses.yaml" $ compile $ yamlCompiler @(AliasMap StrictText License_) match "data/journals.yaml" $ compile $ yamlCompiler @(AliasMap StrictText Journal_) -- load any snippets match "**/_*.html" $ compile getResourceBody match "assets/**" $ do route $ dropParentRoute 1 compile copyFileCompiler -- match ("www/css/*.scss" .||. "www/css/*.sass") $ do -- route $ dropParentRoute 1 `composeRoutes` setExtension "css" -- compile $ compressCss <<$>> sassCompiler -- match "www/css/*.css" $ do -- route $ dropParentRoute 1 -- compile compressCssCompiler -- match "www/js/*.js" $ do -- route $ dropParentRoute 1 -- compile $ minify <<$>> getResourceLBS match "www/img/**" $ do route $ dropParentRoute 1 compile copyFileCompiler let baseCtxt :: Context String baseCtxt = fold $ [ myContext , personCtxt "data/people.yaml" , licenseCtxt "data/licenses.yaml" , journalCtxt "data/journals.yaml" ] -- let baseCtxt :: Compiler (Context String) -- baseCtxt = fold <$> sequence -- [ pure myContext -- , personCtxt @StrictText <$> loadBody "data/people.yaml" -- , licenseCtxt @StrictText <$> loadBody "data/licenses.yaml" -- , journalCtxt @StrictText <$> loadBody "data/journals.yaml" -- ] match "www/index.html" $ do route $ dropParentRoute 1 compile $ do getResourceBody >>= applyAsTemplate baseCtxt >>= applyTemplate defaultTemplate baseCtxt match "www/research/index.html" $ do route $ dropParentRoute 1 compile $ do papers <- loadBody @[Paper String] "data/papers.bib" let fixedPapers = L.sortOn Down $ papers <&> \p -> p { authors = (`filter` authors p) $ flip notElem [ Name "Cox" "Christopher" Nothing , Name "Wells" "Chris" Nothing ] -- Remove me from the author list } getResourceBody >>= applyAsTemplate (mkPaperContext (personCtxt "data/people.yaml" <> journalCtxt "data/journals.yaml") fixedPapers) >>= applyTemplate defaultTemplate baseCtxt match "www/teaching/index.md" $ do route $ dropParentRoute 1 `composeRoutes` setExtension ".html" -- compile $ myPandocCompiler >>= applyAsTemplate baseCtxt >>= applyTemplate defaultTemplate baseCtxt compile $ getResourceBody >>= applyAsTemplate baseCtxt >>= myRenderPandoc >>= applyTemplate defaultTemplate baseCtxt createRedirects $ [ ("teaching/books/index.html", "/books/index.html") ] match "www/links/index.md" $ do route $ dropParentRoute 1 `composeRoutes` setExtension ".html" compile $ getResourceBody >>= applyAsTemplate baseCtxt >>= myRenderPandoc >>= applyTemplate defaultTemplate baseCtxt -- match "www/contact/*.html" $ do -- route $ dropParentRoute 1 -- compile $ getResourceBody >>= applyAsTemplate baseCtxt >>= applyTemplate defaultTemplate baseCtxt -- -- match "www/code/*.html" $ do -- route $ dropParentRoute 1 -- compile $ getResourceBody >>= applyAsTemplate baseCtxt >>= applyTemplate defaultTemplate baseCtxt -- -- match "www/credits/*.html" $ do -- route $ dropParentRoute 1 -- compile $ myPandocCompiler >>= applyTemplate defaultTemplate baseCtxt -- compile any other html match "www/**/*.html" $ do route $ dropParentRoute 1 compile $ getResourceBody >>= applyTemplate defaultTemplate baseCtxt -- just copy anything else hanging around match "www/**" $ do route idRoute compile copyFileCompiler myPandocCompiler :: Compiler (Item String) myPandocCompiler = pandocCompilerWith myHakyllReaderOptions myHakyllWriterOptions myRenderPandoc :: Item String -> Compiler (Item String) myRenderPandoc = renderPandocWith myHakyllReaderOptions myHakyllWriterOptions