packages feed

neuron-1.0.0.0: src/app/Neuron/Web/HeadHtml.hs

{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Neuron.Web.HeadHtml
  ( HeadHtml,
    getHeadHtml,
    renderHeadHtml,
  )
where

import Development.Shake
import Reflex.Dom.Core
import Reflex.Dom.Pandoc (PandocBuilder)
import Reflex.Dom.Pandoc.PandocRaw (PandocRaw (..))
import Relude
import Rib.Shake (ribInputDir)
import System.FilePath ((</>))
import Text.Pandoc.Definition (Format (..))

newtype HeadHtml = HeadHtml (Maybe Text)

getHeadHtml :: Action HeadHtml
getHeadHtml = do
  headHtmlPath <- ribInputDir <&> (</> "head.html")
  doesFileExist headHtmlPath >>= \case
    True ->
      HeadHtml . Just . toText <$> readFile' headHtmlPath
    False ->
      pure $ HeadHtml Nothing

renderHeadHtml :: PandocBuilder t m => HeadHtml -> m ()
renderHeadHtml (HeadHtml headHtml) = case headHtml of
  Nothing ->
    -- Include the MathJax script if no custom head.html is provided.
    elAttr "script" ("id" =: "MathJax-script" <> "src" =: "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" <> "async" =: "") blank
  Just html ->
    elPandocRaw (Format "html") html