From 80a28355e979d03ab2dad308758436ff5e32b2ea Mon Sep 17 00:00:00 2001 From: JJ Date: Sun, 29 Sep 2024 21:03:56 -0700 Subject: meow --- wiki.hs | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 wiki.hs (limited to 'wiki.hs') diff --git a/wiki.hs b/wiki.hs new file mode 100644 index 0000000..cd6e664 --- /dev/null +++ b/wiki.hs @@ -0,0 +1,63 @@ +{-# LANGUAGE OverloadedStrings #-} + +import Hakyll hiding (pandocCompiler) +import Text.Pandoc.Options +import Text.Pandoc.Highlighting + +-- Pass custom options to the Pandoc compiler +pandocCompiler :: Compiler (Item String) +pandocCompiler = pandocCompilerWith readerOptions writerOptions where + writerOptions = defaultHakyllWriterOptions { + writerExtensions = writerExtensions defaultHakyllWriterOptions + <> pandocExtensions, + writerHTMLMathMethod = MathML + } + readerOptions = defaultHakyllReaderOptions { + readerExtensions = readerExtensions defaultHakyllReaderOptions + <> pandocExtensions + <> extensionsFromList [Ext_lists_without_preceding_blankline] + } + +-- Applies the template specified in a post's metadata, if it exists +applyMetadataTemplate :: Context String -> Item String -> Compiler (Item String) +applyMetadataTemplate context item = do + field <- getMetadataField (itemIdentifier item) "layout" + case field of + Just path -> + let templatePath = "_templates/" ++ path ++ ".html" in + loadAndApplyTemplate (fromFilePath templatePath) context item + _ -> return item + +main :: IO () +main = hakyll $ do + -- Compile templates for future use + match "_templates/*" $ compile templateBodyCompiler + + -- Detect whether HTML files are standalone or in need of a template + match ("**.html" .||. "**.htm") $ do + route idRoute + compile $ do + identifier <- getUnderlying + field <- getMetadataField identifier "layout" + case field of + Just _ -> pandocCompiler + Nothing -> getResourceBody + >>= applyMetadataTemplate defaultContext + >>= relativizeUrls + + -- Match all other renderable files and apply their template, if it exists + match ("**.md" .||. "**.rst" .||. "**.org" .||. "**.adoc") $ do + route $ setExtension "html" + compile $ pandocCompiler + >>= applyMetadataTemplate defaultContext + >>= relativizeUrls + + -- Additionally copy non-HTML files raw, without front matter + match ("**.md" .||. "**.rst" .||. "**.org" .||. "**.adoc") $ version "raw" $ do + route idRoute + compile getResourceBody + + -- Copy all additional files verbatium + match "**" $ do + route idRoute + compile copyFileCompiler -- cgit v1.2.3-70-g09d2