diff options
-rw-r--r-- | stack.yaml | 5 | ||||
-rw-r--r-- | wiki.cabal | 10 | ||||
-rw-r--r-- | wiki.hs | 63 |
3 files changed, 78 insertions, 0 deletions
diff --git a/stack.yaml b/stack.yaml new file mode 100644 index 0000000..8897f63 --- /dev/null +++ b/stack.yaml @@ -0,0 +1,5 @@ +resolver: lts-22.30 +system-ghc: true +notify-if-nix-on-path: false +packages: +- . diff --git a/wiki.cabal b/wiki.cabal new file mode 100644 index 0000000..dc7710d --- /dev/null +++ b/wiki.cabal @@ -0,0 +1,10 @@ +name: wiki +version: 0.1 +build-type: Simple +cabal-version: >= 1.10 + +executable wiki + main-is: wiki.hs + build-depends: base == 4.*, hakyll == 4.16.*, pandoc == 3.* + ghc-options: -threaded -rtsopts -with-rtsopts=-N + default-language: Haskell2010 @@ -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 |